From ece69f7c2b34d9267f3802cd11c1e5fca84e5474 Mon Sep 17 00:00:00 2001 From: Mike Andrews Date: Sat, 29 Mar 2014 09:50:49 -0700 Subject: [PATCH] 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 --- src/cmd/ld/lib.c | 12 ++++++++++-- 1 file 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 +#if !(defined(_WIN32) || defined(PLAN9)) +#include +#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) { -- 2.48.1