From c8c9eac8c705a1677c306d94ab05459a593e3e1a Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Wed, 20 Oct 2021 14:03:59 -0700 Subject: expr: Fix octal escapes followed by octal digits --- expr.c | 6 ++++-- test/string-octal.c | 1 + test/string-octal.qbe | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 test/string-octal.c create mode 100644 test/string-octal.qbe diff --git a/expr.c b/expr.c index f7b8e6d..66ffd29 100644 --- a/expr.c +++ b/expr.c @@ -364,6 +364,7 @@ decodechar(const char *src, uint_least32_t *chr, bool *hexoct, const char *desc, { uint_least32_t c; size_t n; + int i; const char *s = src; if (*s == '\\') { @@ -392,8 +393,9 @@ decodechar(const char *src, uint_least32_t *chr, bool *hexoct, const char *desc, default: assert(isodigit(*s)); c = 0; - do c = c * 8 + (*s - '0'); - while (isodigit(*++s)); + i = 0; + do c = c * 8 + (*s++ - '0'); + while (++i < 3 && isodigit(*s)); if (hexoct) *hexoct = true; } diff --git a/test/string-octal.c b/test/string-octal.c new file mode 100644 index 0000000..85347fd --- /dev/null +++ b/test/string-octal.c @@ -0,0 +1 @@ +char *s = "\1\12\123\1234"; diff --git a/test/string-octal.qbe b/test/string-octal.qbe new file mode 100644 index 0000000..f4090fa --- /dev/null +++ b/test/string-octal.qbe @@ -0,0 +1,2 @@ +data $.Lstring.1 = align 1 { b "\001\012SS4\000", } +export data $s = align 8 { l $.Lstring.1, } -- cgit v1.2.3