aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--expr.c6
-rw-r--r--test/string-octal.c1
-rw-r--r--test/string-octal.qbe2
3 files changed, 7 insertions, 2 deletions
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, }