Skip to content
  • Miklos Szeredi's avatar
    shmem: fix nlink for rename overwrite directory · b928095b
    Miklos Szeredi authored
    
    
    If overwriting an empty directory with rename, then need to drop the extra
    nlink.
    
    Test prog:
    
    #include <stdio.h>
    #include <fcntl.h>
    #include <err.h>
    #include <sys/stat.h>
    
    int main(void)
    {
    	const char *test_dir1 = "test-dir1";
    	const char *test_dir2 = "test-dir2";
    	int res;
    	int fd;
    	struct stat statbuf;
    
    	res = mkdir(test_dir1, 0777);
    	if (res == -1)
    		err(1, "mkdir(\"%s\")", test_dir1);
    
    	res = mkdir(test_dir2, 0777);
    	if (res == -1)
    		err(1, "mkdir(\"%s\")", test_dir2);
    
    	fd = open(test_dir2, O_RDONLY);
    	if (fd == -1)
    		err(1, "open(\"%s\")", test_dir2);
    
    	res = rename(test_dir1, test_dir2);
    	if (res == -1)
    		err(1, "rename(\"%s\", \"%s\")", test_dir1, test_dir2);
    
    	res = fstat(fd, &statbuf);
    	if (res == -1)
    		err(1, "fstat(%i)", fd);
    
    	if (statbuf.st_nlink != 0) {
    		fprintf(stderr, "nlink is %lu, should be 0\n", statbuf.st_nlink);
    		return 1;
    	}
    
    	return 0;
    }
    
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    b928095b