]> Cypherpunks repositories - gostls13.git/commitdiff
avoid overflow of symb buffer in 5a/6a/8a/5c/6c/8c
authorDean Prichard <dean.prichard@gmail.com>
Fri, 29 Jan 2010 00:11:38 +0000 (16:11 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 29 Jan 2010 00:11:38 +0000 (16:11 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/194099

src/cmd/5a/a.h
src/cmd/5a/lex.c
src/cmd/6a/a.h
src/cmd/6a/lex.c
src/cmd/8a/a.h
src/cmd/8a/lex.c
src/cmd/cc/cc.h
src/cmd/cc/lex.c
src/cmd/cc/lexbody
src/cmd/cc/macbody

index 34591817f687a6af3ff5a73e086c8ede61ad32f1..a6b75e2b7e52d124ba71a28b6d80fbe02da691ee 100644 (file)
@@ -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);
index 540c12af59b34792ec816bbbbcdafabc6982926e..53ffab28315109b232091fc6d1921ae18cfd6b45 100644 (file)
@@ -57,6 +57,8 @@ main(int argc, char *argv[])
 
        thechar = '5';
        thestring = "arm";
+
+       ensuresymb(NSYMB);
        memset(debug, 0, sizeof(debug));
        cinit();
        outfile = 0;
index f1a0453156aa42647bb73c3aa2bd38508f42a18f..34b69b6ea7c1530242ef520bdbd6bc7360547339 100644 (file)
@@ -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);
index a1814b0805e363aef0d16cd88a7e0a3e41d4c478..f5e99342f89cbf0872389aa70c11edc4d8ed97eb 100644 (file)
@@ -61,6 +61,7 @@ main(int argc, char *argv[])
        thechar = '6';
        thestring = "amd64";
 
+       ensuresymb(NSYMB);
        memset(debug, 0, sizeof(debug));
        cinit();
        outfile = 0;
index c019ce4d66da068c87f4ba86a6f53ef7423e6cf2..9b38f5fbd184a5fef1ec86a660cb35ce21c1b4b1 100644 (file)
@@ -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);
index a00ac49f6c718966fdc7de69380f510a30932edb..41d9c519048febc90e33f44a1765762307f78641 100644 (file)
@@ -60,6 +60,8 @@ main(int argc, char *argv[])
 
        thechar = '8';
        thestring = "386";
+
+       ensuresymb(NSYMB);
        memset(debug, 0, sizeof(debug));
        cinit();
        outfile = 0;
index 93b5f8bf792fa409906d986246415030ff39769e..62a33ae5e75b5535c6fed362a5090e5c5f073ec1 100644 (file)
@@ -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);
index fd4b0b87b2f60b2517c649b9cda9dd70e43010fe..b722ab15f65520aec589d194773946002ce27483 100644 (file)
@@ -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;
+       }
+}
index c6246e95ffb3e9ae9b33573a9aef3d0885ff45cf..6be2bce92f9fc5f5b85964dfdcb96aa440b3b40d 100644 (file)
@@ -125,6 +125,20 @@ allocn(void *p, int32 on, int32 n)
        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;
+       }
+}
+
 void
 setinclude(char *p)
 {
@@ -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] = '"';
        }
index 21d69bcc78d605c226bd08f696105a1d7fca4c2c..7d3acaa8e042c3d3047b101ef2a9c4c86111968d 100644 (file)
@@ -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)