Fix possible buffer overflows in package strconv

This commit is contained in:
gingerBill
2019-03-25 21:26:23 +00:00
parent 9e6d488063
commit 6b18b90222
+17
View File
@@ -211,10 +211,15 @@ append_float :: proc(buf: []byte, f: f64, fmt: byte, prec, bit_size: int) -> str
quote :: proc(buf: []byte, s: string) -> string { quote :: proc(buf: []byte, s: string) -> string {
write_byte :: inline proc(buf: []byte, i: ^int, bytes: ..byte) { write_byte :: inline proc(buf: []byte, i: ^int, bytes: ..byte) {
if i^ >= len(buf) do return;
n := copy(buf[i^:], bytes[:]); n := copy(buf[i^:], bytes[:]);
i^ += n; i^ += n;
} }
if buf == nil {
return "";
}
c :: '"'; c :: '"';
i := 0; i := 0;
@@ -230,27 +235,39 @@ quote :: proc(buf: []byte, s: string) -> string {
write_byte(buf, &i, digits[s[0]>>4]); write_byte(buf, &i, digits[s[0]>>4]);
write_byte(buf, &i, digits[s[0]&0xf]); write_byte(buf, &i, digits[s[0]&0xf]);
} }
if i < len(buf) {
s := quote_rune(buf[i:], r); s := quote_rune(buf[i:], r);
i += len(s); i += len(s);
} }
}
write_byte(buf, &i, c); write_byte(buf, &i, c);
return string(buf[:i]); return string(buf[:i]);
} }
quote_rune :: proc(buf: []byte, r: rune) -> string { quote_rune :: proc(buf: []byte, r: rune) -> string {
write_byte :: inline proc(buf: []byte, i: ^int, bytes: ..byte) { write_byte :: inline proc(buf: []byte, i: ^int, bytes: ..byte) {
if i^ < len(buf) {
n := copy(buf[i^:], bytes[:]); n := copy(buf[i^:], bytes[:]);
i^ += n; i^ += n;
} }
}
write_string :: inline proc(buf: []byte, i: ^int, s: string) { write_string :: inline proc(buf: []byte, i: ^int, s: string) {
if i^ < len(buf) {
n := copy(buf[i^:], cast([]byte)s); n := copy(buf[i^:], cast([]byte)s);
i^ += n; i^ += n;
} }
}
write_rune :: inline proc(buf: []byte, i: ^int, r: rune) { write_rune :: inline proc(buf: []byte, i: ^int, r: rune) {
if i^ < len(buf) {
b, w := utf8.encode_rune(r); b, w := utf8.encode_rune(r);
n := copy(buf[i^:], b[:w]); n := copy(buf[i^:], b[:w]);
i^ += n; i^ += n;
} }
}
if buf == nil {
return "";
}
i := 0; i := 0;
write_byte(buf, &i, '\''); write_byte(buf, &i, '\'');