1
0
mirror of https://github.com/golang/go synced 2024-11-25 04:07:55 -07:00

gopack: preserve safe flag when not adding unsafe objects to archive

R=dsymonds
CC=golang-dev
https://golang.org/cl/4436060
This commit is contained in:
Russ Cox 2011-04-27 09:20:53 -04:00
parent c3e6e6ec09
commit 5eeaca12d3

View File

@ -144,6 +144,7 @@ char *file; /* current file or member being worked on */
Biobuf bout; Biobuf bout;
Biobuf bar; Biobuf bar;
char *prefix; char *prefix;
int pkgdefsafe; /* was __.PKGDEF marked safe? */
void arcopy(Biobuf*, Arfile*, Armember*); void arcopy(Biobuf*, Arfile*, Armember*);
int arcreate(char*); int arcreate(char*);
@ -177,6 +178,7 @@ void scanpkg(Biobuf*, long);
void select(int*, long); void select(int*, long);
void setcom(void(*)(char*, int, char**)); void setcom(void(*)(char*, int, char**));
void skip(Biobuf*, vlong); void skip(Biobuf*, vlong);
void checksafe(Biobuf*, vlong);
int symcomp(void*, void*); int symcomp(void*, void*);
void trim(char*, char*, int); void trim(char*, char*, int);
void usage(void); void usage(void);
@ -322,9 +324,9 @@ rcmd(char *arname, int count, char **files)
skip(&bar, bp->size); skip(&bar, bp->size);
continue; continue;
} }
/* pitch pkgdef file */ /* pitch pkgdef file but remember whether it was marked safe */
if (gflag && strcmp(file, pkgdef) == 0) { if (gflag && strcmp(file, pkgdef) == 0) {
skip(&bar, bp->size); checksafe(&bar, bp->size);
continue; continue;
} }
/* /*
@ -773,7 +775,8 @@ scanpkg(Biobuf *b, long size)
goto foundstart; goto foundstart;
} }
// fprint(2, "gopack: warning: no package import section in %s\n", file); // fprint(2, "gopack: warning: no package import section in %s\n", file);
safe = 0; // non-Go file (C or assembly) if(b != &bar || !pkgdefsafe)
safe = 0; // non-Go file (C or assembly)
return; return;
foundstart: foundstart:
@ -807,7 +810,7 @@ foundstart:
pkgname = armalloc(pkg - data + 1); pkgname = armalloc(pkg - data + 1);
memmove(pkgname, data, pkg - data); memmove(pkgname, data, pkg - data);
pkgname[pkg-data] = '\0'; pkgname[pkg-data] = '\0';
if(strcmp(pkg, " safe\n") != 0) if(strcmp(pkg, " safe\n") != 0 && (b != &bar || !pkgdefsafe))
safe = 0; safe = 0;
start = Boffset(b); // after package statement start = Boffset(b); // after package statement
first = 0; first = 0;
@ -1094,6 +1097,36 @@ skip(Biobuf *bp, vlong len)
Bseek(bp, len, 1); Bseek(bp, len, 1);
} }
void
checksafe(Biobuf *bp, vlong len)
{
char *p;
vlong end;
if (len & 01)
len++;
end = Boffset(bp) + len;
p = Brdline(bp, '\n');
if(p == nil || strncmp(p, "go object ", 10) != 0)
goto done;
for(;;) {
p = Brdline(bp, '\n');
if(p == nil || Boffset(bp) >= end)
goto done;
if(strncmp(p, "$$\n", 3) == 0)
break;
}
p = Brdline(bp, '\n');
if(p == nil || Boffset(bp) > end)
goto done;
if(Blinelen(bp) > 8+6 && strncmp(p, "package ", 8) == 0 && strncmp(p+Blinelen(bp)-6, " safe\n", 6) == 0)
pkgdefsafe = 1;
done:
Bseek(bp, end, 0);
}
/* /*
* Stream the three temp files to an archive * Stream the three temp files to an archive
*/ */