Escape backslashes in crypto test data.
embed_test_data.go assumes that it's working with 8KB chunks. However,
if the input file contains a '\' then the Go code thinks that it counts
as a byte, but the C compiler will probably merge it with the following
char and thus that string will be slightly too short. ASAN will detect
the out-of-bounds read when 8192 bytes are copied from the string.
Change-Id: If40ccfd39ea013bd6935fcc313cfe188fe985f67
Reviewed-on: https://boringssl-review.googlesource.com/30444
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/util/embed_test_data.go b/util/embed_test_data.go
index a083848..5376fdd 100644
--- a/util/embed_test_data.go
+++ b/util/embed_test_data.go
@@ -44,6 +44,8 @@
buf.WriteString(`\v`)
case '"':
buf.WriteString(`\"`)
+ case '\\':
+ buf.WriteString(`\\`)
default:
// printable ascii code [32, 126]
if 32 <= b && b <= 126 {
@@ -100,19 +102,21 @@
for i, arg := range os.Args[1:] {
data, err := ioutil.ReadFile(arg)
if err != nil {
- fmt.Fprintf(os.Stderr, "Error reading %s: %s.\n", data, err)
+ fmt.Fprintf(os.Stderr, "Error reading %s: %s.\n", arg, err)
os.Exit(1)
}
+ fmt.Printf("static const size_t kLen%d = %d;\n\n", i, len(data))
+
fmt.Printf("static const char *kData%d[] = {\n", i)
- for i := 0; i < len(data); i += chunkSize {
+ for len(data) > 0 {
chunk := chunkSize
- if chunk > len(data)-i {
- chunk = len(data) - i
+ if chunk > len(data) {
+ chunk = len(data)
}
- fmt.Printf(" %s,\n", quote(data[i:i+chunk]))
+ fmt.Printf(" %s,\n", quote(data[:chunk]))
+ data = data[chunk:]
}
fmt.Printf("};\n")
- fmt.Printf("static const size_t kLen%d = %d;\n\n", i, len(data))
}
fmt.Printf(`static std::string AssembleString(const char **data, size_t len) {