1
0
mirror of https://github.com/golang/go synced 2024-11-12 09:50:21 -07:00

cmd/ld: don't delete output binary if not "ordinary" file (redux).

following on CL https://golang.org/cl/76810045 and
issue 7563, i now see there's another "remove(outfile)" a few
dozen lines down that also needs fixing.

LGTM=iant
R=golang-codereviews, iant
CC=0intro, golang-codereviews, r
https://golang.org/cl/89030043
This commit is contained in:
Mike Andrews 2014-04-18 15:37:55 -07:00 committed by Ian Lance Taylor
parent 75b74ea8ff
commit 7c7aaa4156

View File

@ -83,6 +83,23 @@ Lflag(char *arg)
ctxt->libdir[ctxt->nlibdir++] = arg;
}
/*
* Unix doesn't like it when we write to a running (or, sometimes,
* recently run) binary, so remove the output file before writing it.
* On Windows 7, remove() can force a subsequent create() to fail.
* S_ISREG() does not exist on Plan 9.
*/
static void
mayberemoveoutfile(void)
{
#if !(defined(_WIN32) || defined(PLAN9))
struct stat st;
if(lstat(outfile, &st) == 0 && !S_ISREG(st.st_mode))
return;
#endif
remove(outfile);
}
void
libinit(void)
{
@ -106,17 +123,7 @@ libinit(void)
}
Lflag(smprint("%s/pkg/%s_%s%s%s", goroot, goos, goarch, suffixsep, suffix));
// Unix doesn't like it when we write to a running (or, sometimes,
// recently run) binary, so remove the output file before writing it.
// On Windows 7, remove() can force the following create() to fail.
// S_ISREG() does not exist on Plan 9.
#if !(defined(_WIN32) || defined(PLAN9))
{
struct stat st;
if(lstat(outfile, &st) == 0 && S_ISREG(st.st_mode))
remove(outfile);
}
#endif
mayberemoveoutfile();
cout = create(outfile, 1, 0775);
if(cout < 0) {
diag("cannot create %s: %r", outfile);
@ -139,7 +146,7 @@ errorexit(void)
{
if(nerrors) {
if(cout >= 0)
remove(outfile);
mayberemoveoutfile();
exits("error");
}
exits(0);