Home
cc1: Don't use strlen concatenating strings - scc - simple c99 compiler HTML git clone git://git.simple-cc.org/scc DIR Log DIR Files DIR Refs DIR Submodules DIR README DIR LICENSE --- DIR commit 03dbb2f6ade20e9de9f3128f92c5a5496cf4183b DIR parent 438fb6e08b28ac019fb017c5caf1967ef51d0e1f HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.com> Date: Mon, 7 Oct 2024 16:40:58 +0200 cc1: Don't use strlen concatenating strings Adjacents strings must be concatenated, but the process was assuming strings without embeddeding NUL characters (using strlen), but this is not true as they can be embedded using character escape sequences. For that reason we have to use the number of elements defined in the type associated to the string constant. Diffstat: M src/cmd/cc/cc1/expr.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) --- DIR diff --git a/src/cmd/cc/cc1/expr.c b/src/cmd/cc/cc1/expr.c @@ -656,17 +656,18 @@ adjstrings(Symbol *sym) tp = sym->type; s = sym->u.s; - for (len = strlen(s);; len += n) { + for (len = tp->n.elem;; len += n) { next(); if (yytoken != STRING) break; t = yylval.sym->u.s; - n = strlen(t); - s = xrealloc(s, len + n + 1); - memcpy(s+len, t, n); + n = yylval.sym->type->n.elem - 1; + + s = xrealloc(s, len + n); + memcpy(s + len - 1, t, n); s[len + n] = '\0'; } - ++len; + if (tp->n.elem != len) { sym->type = mktype(chartype, ARY, len, NULL); sym->u.s = s;