From 394bcdb5e34b3eb7d34f04ad2285a3b289d9f318 Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Thu, 22 Jul 2004 22:52:39 +0000 Subject: [PATCH] If we sucessfully renamed a file that has multiple links to it, unlink() it to ensure that rename() didn't lie to us (which it does if you try to rename() a file over another link to the same file). --- backup.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backup.c b/backup.c index b2f6de0e..ed08fae6 100644 --- a/backup.c +++ b/backup.c @@ -158,7 +158,8 @@ static int keep_backup(char *fname) file = make_file(fname, NULL, NO_EXCLUDES); /* the file could have disappeared */ - if (!file) return 1; + if (!file) + return 1; /* make a complete pathname for backup file */ if (stringjoin(backup_dir_buf + backup_dir_len, backup_dir_remainder, @@ -234,6 +235,10 @@ static int keep_backup(char *fname) if (robust_move(fname, backup_dir_buf) != 0) { rsyserr(FERROR, errno, "keep_backup failed: %s -> \"%s\"", full_fname(fname), backup_dir_buf); + } else if (st.st_nlink > 1) { + /* If someone has hard-linked the file into the backup + * dir, rename() can return success but do nothing! */ + robust_unlink(fname); /* Just in case... */ } } set_perms(backup_dir_buf, file, NULL, 0); -- 2.34.1