If we sucessfully renamed a file that has multiple links to it, unlink()
authorWayne Davison <wayned@samba.org>
Thu, 22 Jul 2004 22:52:39 +0000 (22:52 +0000)
committerWayne Davison <wayned@samba.org>
Thu, 22 Jul 2004 22:52:39 +0000 (22:52 +0000)
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

index b2f6de0..ed08fae 100644 (file)
--- 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 */
        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,
 
        /* 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);
                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);
                }
        }
        set_perms(backup_dir_buf, file, NULL, 0);