]> Cypherpunks repositories - gostls13.git/commitdiff
ld: defend against some broken object files
authorRuss Cox <rsc@golang.org>
Thu, 14 Apr 2011 14:42:48 +0000 (10:42 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 14 Apr 2011 14:42:48 +0000 (10:42 -0400)
Fixes #1698.
Fixes #1699.

R=ken2
CC=golang-dev
https://golang.org/cl/4419041

src/cmd/5l/obj.c
src/cmd/6l/obj.c
src/cmd/8l/obj.c
src/cmd/ld/data.c
src/cmd/ld/lib.c
src/cmd/ld/lib.h

index f252f9fc562035cdf803f604911f12d7087cc94b..c82494bc533ae79ae794239f0a9bbf1000b3e857 100644 (file)
@@ -581,7 +581,7 @@ loop:
                        diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn);
                        errorexit();
                }
-               savedata(s, p);
+               savedata(s, p, pn);
                unmal(p, sizeof *p);
                break;
 
index 6b43d2df436360ed0d059f7dd90164cc032a537b..9e35fa5630106d7bdc0e499a3d1f73987c655413 100644 (file)
@@ -356,6 +356,15 @@ zaddr(char *pn, Biobuf *f, Adr *a, Sym *h[])
                        return;
                }
        }
+       
+       switch(t) {
+       case D_FILE:
+       case D_FILE1:
+       case D_AUTO:
+       case D_PARAM:
+               if(s == S)
+                       mangle(pn);
+       }
 
        u = mal(sizeof(*u));
        u->link = curauto;
@@ -559,7 +568,7 @@ loop:
                        diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn);
                        errorexit();
                }
-               savedata(s, p);
+               savedata(s, p, pn);
                unmal(p, sizeof *p);
                goto loop;
 
index d505dc10e507218017d731552b271e7469dc2534..d512304b4e1c79b8a481741f96e84946e9a0a2e2 100644 (file)
@@ -600,7 +600,7 @@ loop:
                        diag("multiple initialization for %s: in both %s and %s", s->name, s->file, pn);
                        errorexit();
                }
-               savedata(s, p);
+               savedata(s, p, pn);
                unmal(p, sizeof *p);
                goto loop;
 
index d27416dac12623cdcd3eeb4753ed4862ecc1f261..14f1e9fe85021ffaf885682294cca143a2139c28 100644 (file)
@@ -312,7 +312,7 @@ symgrow(Sym *s, int32 siz)
 }
 
 void
-savedata(Sym *s, Prog *p)
+savedata(Sym *s, Prog *p, char *pn)
 {
        int32 off, siz, i, fl;
        uchar *cast;
@@ -321,8 +321,10 @@ savedata(Sym *s, Prog *p)
 
        off = p->from.offset;
        siz = p->datasize;
+       if(off < 0 || siz < 0 || off >= 1<<30 || siz >= 100)
+               mangle(pn);
        symgrow(s, off+siz);
-       
+
        switch(p->to.type) {
        default:
                diag("bad data: %P", p);
index 8cd570463c8dd70fd2d309b964cb37ceb868f5ec..2b1674ff29b46adea65aed6038559a1e00faeeb7 100644 (file)
@@ -438,7 +438,7 @@ ldobj(Biobuf *f, char *pkg, int64 len, char *pn, int whence)
                return;
        }
        t = smprint("%s %s %s", getgoos(), thestring, getgoversion());
-       if(strcmp(line+10, t) != 0) {
+       if(strcmp(line+10, t) != 0 && !debug['f']) {
                diag("%s: object is [%s] expected [%s]", pn, line+10, t);
                free(t);
                return;
index 646aeb53565ab1a4a73273de2c069475af570a2a..8b603a04a68bb1e9447f5118de06fa9f47148746 100644 (file)
@@ -173,7 +173,7 @@ void        datblk(int32, int32);
 Sym*   datsort(Sym*);
 void   reloc(void);
 void   relocsym(Sym*);
-void   savedata(Sym*, Prog*);
+void   savedata(Sym*, Prog*, char*);
 void   symgrow(Sym*, int32);
 vlong  addstring(Sym*, char*);
 vlong  adduint32(Sym*, uint32);