aboutsummaryrefslogtreecommitdiffstats
path: root/prog/encoding.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-01-28 16:14:31 +0100
committerDmitry Vyukov <dvyukov@google.com>2019-01-31 11:35:53 +0100
commit8e579f27d6d48260d8d52d56da3e08b1ed81bdd4 (patch)
tree695b21a4e110a73b0cd81476b23fb33bd7f33e5c /prog/encoding.go
parentaa432daf55aba3936abb40d197956ccdba8b2085 (diff)
prog: fix escaping of C strings
C's \xHH hex constants in strings accept any number of hex digits (not just 2 or 4). So later non-hex escaped chars glue to the \x construct. Use \OOO instead as it accepts at most 3 octal digits.
Diffstat (limited to 'prog/encoding.go')
-rw-r--r--prog/encoding.go20
1 files changed, 15 insertions, 5 deletions
diff --git a/prog/encoding.go b/prog/encoding.go
index d7f25afe2..81c06313c 100644
--- a/prog/encoding.go
+++ b/prog/encoding.go
@@ -733,7 +733,7 @@ func serializeData(buf *bytes.Buffer, data []byte, readable bool) {
return
}
buf.WriteByte('\'')
- encodeData(buf, data, true)
+ encodeData(buf, data, true, false)
buf.WriteByte('\'')
}
@@ -741,10 +741,10 @@ func EncodeData(buf *bytes.Buffer, data []byte, readable bool) {
if !readable && isReadableData(data) {
readable = true
}
- encodeData(buf, data, readable)
+ encodeData(buf, data, readable, true)
}
-func encodeData(buf *bytes.Buffer, data []byte, readable bool) {
+func encodeData(buf *bytes.Buffer, data []byte, readable, cstr bool) {
for _, v := range data {
if !readable {
lo, hi := byteToHex(v)
@@ -776,8 +776,18 @@ func encodeData(buf *bytes.Buffer, data []byte, readable bool) {
if isPrintable(v) {
buf.WriteByte(v)
} else {
- lo, hi := byteToHex(v)
- buf.Write([]byte{'\\', 'x', hi, lo})
+ if cstr {
+ // We would like to use hex encoding with \x,
+ // but C's \x is hard to use: it can contain _any_ number of hex digits
+ // (not just 2 or 4), so later non-hex encoded chars will glue to \x.
+ c0 := (v>>6)&0x7 + '0'
+ c1 := (v>>3)&0x7 + '0'
+ c2 := (v>>0)&0x7 + '0'
+ buf.Write([]byte{'\\', c0, c1, c2})
+ } else {
+ lo, hi := byteToHex(v)
+ buf.Write([]byte{'\\', 'x', hi, lo})
+ }
}
}
}