aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/ld
diff options
context:
space:
mode:
authorMike Andrews <mra@xoba.com>2014-03-29 09:50:49 -0700
committerIan Lance Taylor <iant@golang.org>2014-03-29 09:50:49 -0700
commitece69f7c2b34d9267f3802cd11c1e5fca84e5474 (patch)
treee038c44aafd52d5163cd6141e34cf2bd3ced4aa6 /src/cmd/ld
parent2ca99505f6cfc1390b5b69eecb35e46d0e36456d (diff)
downloadgo-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')
-rw-r--r--src/cmd/ld/lib.c12
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) {