diff options
| author | Mike Andrews <mra@xoba.com> | 2014-03-29 09:50:49 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2014-03-29 09:50:49 -0700 |
| commit | ece69f7c2b34d9267f3802cd11c1e5fca84e5474 (patch) | |
| tree | e038c44aafd52d5163cd6141e34cf2bd3ced4aa6 /src/cmd/ld/lib.c | |
| parent | 2ca99505f6cfc1390b5b69eecb35e46d0e36456d (diff) | |
| download | go-ece69f7c2b34d9267f3802cd11c1e5fca84e5474.tar.xz | |
cmd/ld: don't delete output binary if not "ordinary" file.
e.g., don't delete /dev/null. this fix inspired by gnu libiberty,
unlink-if-ordinary.c.
Fixes #7563
LGTM=iant
R=golang-codereviews, iant, 0intro
CC=golang-codereviews, r
https://golang.org/cl/76810045
Diffstat (limited to 'src/cmd/ld/lib.c')
| -rw-r--r-- | src/cmd/ld/lib.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c index 20383de1e1..888bc2ce0d 100644 --- a/src/cmd/ld/lib.c +++ b/src/cmd/ld/lib.c @@ -37,6 +37,9 @@ #include "../../pkg/runtime/funcdata.h" #include <ar.h> +#if !(defined(_WIN32) || defined(PLAN9)) +#include <sys/stat.h> +#endif enum { @@ -106,8 +109,13 @@ libinit(void) // 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. -#ifndef _WIN32 - remove(outfile); + // 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 cout = create(outfile, 1, 0775); if(cout < 0) { |
