ref: 7feab4dc5913c8d072d57e9cc7cc7b3815037fe8
parent: 4adb1d68d1a958c2ee3c5cfe2e26968e13dcfc1b
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Apr 25 18:16:44 EDT 2020
cc: simplify macexpand() and off-by-one error the caller of macexpand() needs one more byte in the buffer to append peekc. make macexpand() actually check for buffer overflow. just use strdup() to duplicate include file name instead of the hunk dance. move GETC() macro in cc.h
--- a/sys/src/cmd/cc/cc.h
+++ b/sys/src/cmd/cc/cc.h
@@ -143,6 +143,8 @@
int c;
} fi;
+#define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
+
struct Io
{
Io* link;
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -430,7 +430,6 @@
#define EOF (-1)
#define IGN (-2)
#define ESC (1<<20)
-#define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
enum
{
@@ -756,7 +755,7 @@
if(s->macro) {
newio();
cp = ionext->b;
- macexpand(s, cp, sizeof(ionext->b));
+ macexpand(s, cp, sizeof(ionext->b)-1);
pushio();
ionext->link = iostack;
iostack = ionext;
--- a/sys/src/cmd/cc/lexbody
+++ b/sys/src/cmd/cc/lexbody
@@ -238,7 +238,7 @@
if(s->macro) {
newio();
cp = ionext->b;
- macexpand(s, cp, sizeof(ionext->b));
+ macexpand(s, cp, sizeof(ionext->b)-1);
pushio();
ionext->link = iostack;
iostack = ionext;
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -350,7 +350,7 @@
}
base = allocn(base, len, 1);
base[len++] = c;
- c = ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff));
+ c = GETC();
if(c == '\n')
lineno++;
if(c == -1) {
@@ -387,7 +387,10 @@
char *arg[NARG], *cp, *ob, *eb, *ecp, dots;
if(*s->macro == 0) {
+ b[blen-1] = 0;
strncpy(b, s->macro+1, blen);
+ if(b[blen-1] != '\0')
+ goto toobig;
if(debug['m'])
print("#expand %s %s\n", s->name, b);
return;
@@ -573,14 +576,13 @@
if(c != '\n')
goto bad;
f = -1;
- c = 0;
for(i=0; i<ninclude; i++) {
if(i == 0 && c0 == '>')
continue;
- c = snprint(symb, NSYMB, "%s/%s", include[i], str)+1;
- if(strncmp(symb, "./", 2) == 0){
+ c = snprint(symb, NSYMB, "%s/%s", include[i], str);;
+ while(strncmp(symb, "./", 2) == 0){
c -= 2;
- memmove(symb, symb+2, c);
+ memmove(symb, symb+2, c+1);
}
f = open(symb, 0);
if(f >= 0)
@@ -587,18 +589,10 @@
break;
}
if(f < 0)
- c = snprint(symb, NSYMB, "%s", str)+1;
- while(c & 3)
- c++;
- while(nhunk < c)
- gethunk();
- hp = hunk;
- memmove(hunk, symb, c);
- nhunk -= c;
- hunk += c;
+ snprint(symb, NSYMB, "%s", str);
newio();
pushio();
- newfile(hp, f);
+ newfile(strdup(symb), f);
return;
bad: