summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Prichard <dean.prichard@gmail.com>2010-01-28 16:11:38 -0800
committerDean Prichard <dean.prichard@gmail.com>2010-01-28 16:11:38 -0800
commita638d9e982f1f99f9aa012e74324981407f7cae7 (patch)
tree5de45ef1c8fe81c3314b673487a77441ab48e499
parent027474e8f80178ca431a3acf4883d6fec8fa7853 (diff)
downloadgolang-a638d9e982f1f99f9aa012e74324981407f7cae7.tar.gz
avoid overflow of symb buffer in 5a/6a/8a/5c/6c/8c
R=rsc CC=golang-dev http://codereview.appspot.com/194099 Committer: Russ Cox <rsc@golang.org>
-rw-r--r--src/cmd/5a/a.h4
-rw-r--r--src/cmd/5a/lex.c2
-rw-r--r--src/cmd/6a/a.h4
-rw-r--r--src/cmd/6a/lex.c1
-rw-r--r--src/cmd/8a/a.h4
-rw-r--r--src/cmd/8a/lex.c2
-rw-r--r--src/cmd/cc/cc.h4
-rw-r--r--src/cmd/cc/lex.c21
-rw-r--r--src/cmd/cc/lexbody20
-rw-r--r--src/cmd/cc/macbody2
10 files changed, 56 insertions, 8 deletions
diff --git a/src/cmd/5a/a.h b/src/cmd/5a/a.h
index 34591817f..a6b75e2b7 100644
--- a/src/cmd/5a/a.h
+++ b/src/cmd/5a/a.h
@@ -142,6 +142,7 @@ EXTERN int32 lineno;
EXTERN int nerrors;
EXTERN int32 nhunk;
EXTERN int ninclude;
+EXTERN int32 nsymb;
EXTERN Gen nullgen;
EXTERN char* outfile;
EXTERN int pass;
@@ -149,7 +150,7 @@ EXTERN char* pathname;
EXTERN int32 pc;
EXTERN int peekc;
EXTERN int sym;
-EXTERN char symb[NSYMB];
+EXTERN char* symb;
EXTERN int thechar;
EXTERN char* thestring;
EXTERN int32 thunk;
@@ -157,6 +158,7 @@ EXTERN Biobuf obuf;
void* alloc(int32);
void* allocn(void*, int32, int32);
+void ensuresymb(int32);
void errorexit(void);
void pushio(void);
void newio(void);
diff --git a/src/cmd/5a/lex.c b/src/cmd/5a/lex.c
index 540c12af5..53ffab283 100644
--- a/src/cmd/5a/lex.c
+++ b/src/cmd/5a/lex.c
@@ -57,6 +57,8 @@ main(int argc, char *argv[])
thechar = '5';
thestring = "arm";
+
+ ensuresymb(NSYMB);
memset(debug, 0, sizeof(debug));
cinit();
outfile = 0;
diff --git a/src/cmd/6a/a.h b/src/cmd/6a/a.h
index f1a045315..34b69b6ea 100644
--- a/src/cmd/6a/a.h
+++ b/src/cmd/6a/a.h
@@ -155,6 +155,7 @@ EXTERN int32 lineno;
EXTERN int nerrors;
EXTERN int32 nhunk;
EXTERN int ninclude;
+EXTERN int32 nsymb;
EXTERN Gen nullgen;
EXTERN char* outfile;
EXTERN int pass;
@@ -162,7 +163,7 @@ EXTERN char* pathname;
EXTERN int32 pc;
EXTERN int peekc;
EXTERN int sym;
-EXTERN char symb[NSYMB];
+EXTERN char* symb;
EXTERN int thechar;
EXTERN char* thestring;
EXTERN int32 thunk;
@@ -170,6 +171,7 @@ EXTERN Biobuf obuf;
void* alloc(int32);
void* allocn(void*, int32, int32);
+void ensuresymb(int32);
void errorexit(void);
void pushio(void);
void newio(void);
diff --git a/src/cmd/6a/lex.c b/src/cmd/6a/lex.c
index a1814b080..f5e99342f 100644
--- a/src/cmd/6a/lex.c
+++ b/src/cmd/6a/lex.c
@@ -61,6 +61,7 @@ main(int argc, char *argv[])
thechar = '6';
thestring = "amd64";
+ ensuresymb(NSYMB);
memset(debug, 0, sizeof(debug));
cinit();
outfile = 0;
diff --git a/src/cmd/8a/a.h b/src/cmd/8a/a.h
index c019ce4d6..9b38f5fbd 100644
--- a/src/cmd/8a/a.h
+++ b/src/cmd/8a/a.h
@@ -156,6 +156,7 @@ EXTERN int32 lineno;
EXTERN int nerrors;
EXTERN int32 nhunk;
EXTERN int ninclude;
+EXTERN int32 nsymb;
EXTERN Gen nullgen;
EXTERN char* outfile;
EXTERN int pass;
@@ -163,7 +164,7 @@ EXTERN char* pathname;
EXTERN int32 pc;
EXTERN int peekc;
EXTERN int sym;
-EXTERN char symb[NSYMB];
+EXTERN char* symb;
EXTERN int thechar;
EXTERN char* thestring;
EXTERN int32 thunk;
@@ -171,6 +172,7 @@ EXTERN Biobuf obuf;
void* alloc(int32);
void* allocn(void*, int32, int32);
+void ensuresymb(int32);
void errorexit(void);
void pushio(void);
void newio(void);
diff --git a/src/cmd/8a/lex.c b/src/cmd/8a/lex.c
index a00ac49f6..41d9c5190 100644
--- a/src/cmd/8a/lex.c
+++ b/src/cmd/8a/lex.c
@@ -60,6 +60,8 @@ main(int argc, char *argv[])
thechar = '8';
thestring = "386";
+
+ ensuresymb(NSYMB);
memset(debug, 0, sizeof(debug));
cinit();
outfile = 0;
diff --git a/src/cmd/cc/cc.h b/src/cmd/cc/cc.h
index 93b5f8bf7..62a33ae5e 100644
--- a/src/cmd/cc/cc.h
+++ b/src/cmd/cc/cc.h
@@ -492,6 +492,7 @@ EXTERN int32 nhunk;
EXTERN int ninclude;
EXTERN Node* nodproto;
EXTERN Node* nodcast;
+EXTERN int32 nsymb;
EXTERN Biobuf outbuf;
EXTERN Biobuf diagbuf;
EXTERN char* outfile;
@@ -500,7 +501,7 @@ EXTERN int peekc;
EXTERN int32 stkoff;
EXTERN Type* strf;
EXTERN Type* strl;
-EXTERN char symb[NSYMB];
+EXTERN char* symb;
EXTERN Sym* symstring;
EXTERN int taggen;
EXTERN Type* tfield;
@@ -573,6 +574,7 @@ int mpatov(char*, vlong*);
*/
void* allocn(void*, int32, int32);
void* alloc(int32);
+void ensuresymb(int32);
void cinit(void);
int compile(char*, char**, int);
void errorexit(void);
diff --git a/src/cmd/cc/lex.c b/src/cmd/cc/lex.c
index fd4b0b87b..b722ab15f 100644
--- a/src/cmd/cc/lex.c
+++ b/src/cmd/cc/lex.c
@@ -85,6 +85,7 @@ main(int argc, char *argv[])
char *defs[50], *p;
int nproc, nout, i, c, ndef;
+ ensuresymb(NSYMB);
memset(debug, 0, sizeof(debug));
tinit();
cinit();
@@ -392,7 +393,7 @@ newfile(char *s, int f)
Sym*
slookup(char *s)
{
-
+ ensuresymb(strlen(s));
strcpy(symb, s);
return lookup();
}
@@ -408,7 +409,9 @@ lookup(void)
if((uchar)symb[0] == 0xc2 && (uchar)symb[1] == 0xb7) {
// turn leading · into ""·
- memmove(symb+2, symb, strlen(symb)+1);
+ h = strlen(symb);
+ ensuresymb(h+2);
+ memmove(symb+2, symb, h+1);
symb[0] = '"';
symb[1] = '"';
}
@@ -1584,3 +1587,17 @@ allocn(void *p, int32 n, int32 d)
memset((char*)p+n, 0, d);
return p;
}
+
+void
+ensuresymb(int32 n)
+{
+ if(symb == nil) {
+ symb = alloc(NSYMB+1);
+ nsymb = NSYMB;
+ }
+
+ if(n > nsymb) {
+ symb = allocn(symb, nsymb, n+1-nsymb);
+ nsymb = n;
+ }
+}
diff --git a/src/cmd/cc/lexbody b/src/cmd/cc/lexbody
index c6246e95f..6be2bce92 100644
--- a/src/cmd/cc/lexbody
+++ b/src/cmd/cc/lexbody
@@ -126,6 +126,20 @@ allocn(void *p, int32 on, int32 n)
}
void
+ensuresymb(int32 n)
+{
+ if(symb == nil) {
+ symb = alloc(NSYMB+1);
+ nsymb = NSYMB;
+ }
+
+ if(n > nsymb) {
+ symb = allocn(symb, nsymb, n+1-nsymb);
+ nsymb = n;
+ }
+}
+
+void
setinclude(char *p)
{
int i;
@@ -209,7 +223,7 @@ newfile(char *s, int f)
Sym*
slookup(char *s)
{
-
+ ensuresymb(strlen(s));
strcpy(symb, s);
return lookup();
}
@@ -225,7 +239,9 @@ lookup(void)
if((uchar)symb[0] == 0xc2 && (uchar)symb[1] == 0xb7) {
// turn leading · into ""·
- memmove(symb+2, symb, strlen(symb)+1);
+ h = strlen(symb);
+ ensuresymb(h+2);
+ memmove(symb+2, symb, h+1);
symb[0] = '"';
symb[1] = '"';
}
diff --git a/src/cmd/cc/macbody b/src/cmd/cc/macbody
index 21d69bcc7..7d3acaa8e 100644
--- a/src/cmd/cc/macbody
+++ b/src/cmd/cc/macbody
@@ -140,6 +140,7 @@ dodefine(char *cp)
char *p;
int32 l;
+ ensuresymb(strlen(cp));
strcpy(symb, cp);
p = strchr(symb, '=');
if(p) {
@@ -574,6 +575,7 @@ macinc(void)
for(i=0; i<ninclude; i++) {
if(i == 0 && c0 == '>')
continue;
+ ensuresymb(strlen(include[i])+strlen(str)+2);
strcpy(symb, include[i]);
strcat(symb, "/");
if(strcmp(symb, "./") == 0)