summaryrefslogtreecommitdiff
path: root/src/ln.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ln.c')
-rw-r--r--src/ln.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/ln.c b/src/ln.c
index 568171e92..093b9e6f4 100644
--- a/src/ln.c
+++ b/src/ln.c
@@ -283,7 +283,12 @@ do_link (const char *source, const char *dest)
dest_backup = NULL;
}
}
- else if (unlink (dest) && errno != ENOENT)
+
+ /* Try to unlink DEST even if we may have renamed it. In some unusual
+ cases (when DEST and DEST_BACKUP are hard-links that refer to the
+ same file), rename succeeds and DEST remains. If we didn't remove
+ DEST in that case, the subsequent LINKFUNC call would fail. */
+ if (unlink (dest) && errno != ENOENT)
{
error (0, errno, _("cannot remove `%s'"), dest);
return 1;