diff options
author | Russ Cox <rsc@golang.org> | 2010-08-11 22:17:20 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2010-08-11 22:17:20 -0700 |
commit | 26dde76cee3508fc666b15a94d8201e09d2fb805 (patch) | |
tree | 436040426649dd3d7f075ea47efd43a46ea100a3 | |
parent | 14e0df34fd0feab41e377964d55a23e8b4e05f4e (diff) | |
download | go-26dde76cee3508fc666b15a94d8201e09d2fb805.tar.gz go-26dde76cee3508fc666b15a94d8201e09d2fb805.zip |
gopack: handle long lines in export data
Also, if the header is bad, exit with a non-zero status.
Other calls to Brdline in the tree, by category:
Reading symbol name from object file:
./cmd/5l/obj.c:486: name = Brdline(f, '\0');
./cmd/6l/obj.c:535: name = Brdline(f, '\0');
./cmd/8l/obj.c:564: name = Brdline(f, '\0');
./libmach/sym.c:292: cp = Brdline(bp, '\0');
Reading archive header line (fixed, short):
./cmd/gc/lex.c:287: if((a = Brdline(b, '\n')) == nil)
./cmd/gc/lex.c:303: if((p = Brdline(b, '\n')) == nil)
Reading object file header line (fixed, short):
./cmd/ld/lib.c:421: line = Brdline(f, '\n');
Reading undefined symbol list (unused code):
./cmd/ld/lib.c:773: while((l = Brdline(b, '\n')) != nil){
Implementing Brdstr:
./libbio/brdstr.c:36: p = Brdline(bp, delim);
The symbol names ones will cause a problem loudly if they
fail: they'll error out with symbol name too long. This means
that you can't define an enormous struct without giving the
type a name and then stick it in an interface, because the
type's symbol name will be too long for the object file.
Since this will be a loud failure instead of a silent one,
I'm willing to wait until it comes up in practice.
R=r
CC=golang-dev
https://golang.org/cl/1982041
-rw-r--r-- | src/cmd/gopack/ar.c | 19 | ||||
-rw-r--r-- | test/fixedbugs/bug302.dir/main.go | 5 | ||||
-rw-r--r-- | test/fixedbugs/bug302.go | 2 | ||||
-rwxr-xr-x | test/run | 2 |
4 files changed, 22 insertions, 6 deletions
diff --git a/src/cmd/gopack/ar.c b/src/cmd/gopack/ar.c index 377366ec48..5c8cd75efd 100644 --- a/src/cmd/gopack/ar.c +++ b/src/cmd/gopack/ar.c @@ -601,17 +601,21 @@ scanobj(Biobuf *b, Arfile *ap, long size) if (obj < 0) { /* not an object file */ if (!gflag || strcmp(file, pkgdef) != 0) { /* don't clear allobj if it's pkg defs */ fprint(2, "gopack: non-object file %s\n", file); + errors++; allobj = 0; } d = dirfstat(Bfildes(b)); - if (d != nil && d->length == 0) + if (d != nil && d->length == 0) { fprint(2, "gopack: zero length file %s\n", file); + errors++; + } free(d); Bseek(b, offset, 0); return; } if (lastobj >= 0 && obj != lastobj) { fprint(2, "gopack: inconsistent object file %s\n", file); + errors++; allobj = 0; Bseek(b, offset, 0); return; @@ -619,6 +623,7 @@ scanobj(Biobuf *b, Arfile *ap, long size) lastobj = obj; if (!readar(b, obj, offset+size, 0)) { fprint(2, "gopack: invalid symbol reference in file %s\n", file); + errors++; allobj = 0; Bseek(b, offset, 0); return; @@ -718,8 +723,8 @@ foundstart: first = 1; start = end = 0; for (n=0; n<size; n+=Blinelen(b)) { - line = Brdline(b, '\n'); - if (line == 0) + line = Brdstr(b, '\n', 0); + if (line == nil) goto bad; if (first && strstrn(line, Blinelen(b), "package ")) { if (Blinelen(b) > sizeof(pkgbuf)-1) @@ -742,14 +747,19 @@ foundstart: safe = 0; start = Boffset(b); // after package statement first = 0; + free(line); continue; } - if(line[0] == '$' && line[1] == '$') + if(line[0] == '$' && line[1] == '$') { + free(line); goto foundend; + } end = Boffset(b); // before closing $$ + free(line); } bad: fprint(2, "gopack: bad package import section in %s\n", file); + errors++; return; foundend: @@ -795,6 +805,7 @@ objsym(Sym *s, void *p) if(s->type == 'T' && duplicate(as->name, &ofile)) { dupfound = 1; fprint(2, "duplicate text symbol: %s and %s: %s\n", as->file, ofile, as->name); + errors++; free(as->name); free(as); return; diff --git a/test/fixedbugs/bug302.dir/main.go b/test/fixedbugs/bug302.dir/main.go index 4013199585..9f874d08f5 100644 --- a/test/fixedbugs/bug302.dir/main.go +++ b/test/fixedbugs/bug302.dir/main.go @@ -4,4 +4,9 @@ package main +// Check that the export information is correct in p.6. import _ "./p" + +// Check that it's still correct in pp.a (which contains p.6). +import _ "./pp" + diff --git a/test/fixedbugs/bug302.go b/test/fixedbugs/bug302.go index 2a1d922d30..e9edb94ac8 100644 --- a/test/fixedbugs/bug302.go +++ b/test/fixedbugs/bug302.go @@ -1,4 +1,4 @@ -// $G $D/bug302.dir/p.go && $G $D/bug302.dir/main.go +// $G $D/bug302.dir/p.go && gopack grc pp.a p.$A && $G $D/bug302.dir/main.go // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -101,7 +101,7 @@ done | # clean up some stack noise /Segmentation fault/d /^qemu: uncaught target signal 11 (Segmentation fault) - exiting/d' > run.out -rm -f $RUNFILE $TMP1FILE $TMP2FILE *.$A $A.out +rm -f $RUNFILE $TMP1FILE $TMP2FILE *.$A *.a $A.out diffmsg="" if ! diff golden.out run.out then |