summaryrefslogtreecommitdiff
path: root/sys/src/cmd/cc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-04-25 22:16:44 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-04-25 22:16:44 +0200
commit7feab4dc5913c8d072d57e9cc7cc7b3815037fe8 (patch)
tree62b834b7657d63cdd85d984d15474c20101148ef /sys/src/cmd/cc
parent4adb1d68d1a958c2ee3c5cfe2e26968e13dcfc1b (diff)
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
Diffstat (limited to 'sys/src/cmd/cc')
-rw-r--r--sys/src/cmd/cc/cc.h2
-rw-r--r--sys/src/cmd/cc/lex.c3
-rw-r--r--sys/src/cmd/cc/lexbody2
-rw-r--r--sys/src/cmd/cc/macbody24
4 files changed, 13 insertions, 18 deletions
diff --git a/sys/src/cmd/cc/cc.h b/sys/src/cmd/cc/cc.h
index 92ce0f8f4..357de549d 100644
--- a/sys/src/cmd/cc/cc.h
+++ b/sys/src/cmd/cc/cc.h
@@ -143,6 +143,8 @@ EXTERN struct
int c;
} fi;
+#define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
+
struct Io
{
Io* link;
diff --git a/sys/src/cmd/cc/lex.c b/sys/src/cmd/cc/lex.c
index 73d994968..7c22cb464 100644
--- a/sys/src/cmd/cc/lex.c
+++ b/sys/src/cmd/cc/lex.c
@@ -430,7 +430,6 @@ syminit(Sym *s)
#define EOF (-1)
#define IGN (-2)
#define ESC (1<<20)
-#define GETC() ((--fi.c < 0)? filbuf(): (*fi.p++ & 0xff))
enum
{
@@ -756,7 +755,7 @@ talph:
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;
diff --git a/sys/src/cmd/cc/lexbody b/sys/src/cmd/cc/lexbody
index 2dcb9696e..7996c8ba1 100644
--- a/sys/src/cmd/cc/lexbody
+++ b/sys/src/cmd/cc/lexbody
@@ -238,7 +238,7 @@ l1:
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;
diff --git a/sys/src/cmd/cc/macbody b/sys/src/cmd/cc/macbody
index c78aada98..ec15369f7 100644
--- a/sys/src/cmd/cc/macbody
+++ b/sys/src/cmd/cc/macbody
@@ -350,7 +350,7 @@ macdef(void)
}
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 @@ macexpand(Sym *s, char *b, int blen)
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,32 +576,23 @@ macinc(void)
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)
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: