races, getcwd vs rename

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello!

Our applications are sometimes getting ENOENT from getcwd() though
the CWD was never really unlinked. Looking into the code of getcwd(),
it appears that the (d_unlinked(pwd.dentry)) check is not properly
protected against a concurrent d_move(), which unhashes and then
rehashes the dentry. I wrote a trivial reproducer for this issue (see below).
The reproducer gets ENOENT when a getcwd() call races with rename().

Is this the expected behaviour? My understanding is that rename() should be
atomic.

Thank you,
Andrew

root@panda:/mnt/sss# cat zzz.c 
#include <pthread.h> 
#include <sys/stat.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <errno.h> 

void *thread_main(void *unused) 
{ 
       int rc; 

       for (;;) { 
               rc = rename("/tmp/t-a", "/tmp/t-b"); 
               assert(rc == 0); 
               rc = rename("/tmp/t-b", "/tmp/t-a"); 
               assert(rc == 0); 
       } 

       return NULL; 
} 

int main(void) 
{ 
       int rc, i; 
       pthread_t ptt; 

       rmdir("/tmp/t-a"); 
       rmdir("/tmp/t-b"); 

       rc = mkdir("/tmp/t-a", 0666); 
       assert(rc == 0); 

       rc = chdir("/tmp/t-a"); 
       assert(rc == 0); 

       rc = pthread_create(&ptt, NULL, thread_main, NULL); 
       assert(rc == 0); 

       for (i = 0;; i++) { 
               char buf[100], *b; 
               b = getcwd(buf, sizeof(buf)); 
               if (b == NULL) { 
                       printf("getcwd failed on iter %d with %d\n", i, 
                              errno); 
                       break; 
               } 
       } 

       return 0; 
} 
root@panda:/mnt/sss# gcc -pthread zzz.c     
root@panda:/mnt/sss# ./a.out  
getcwd failed on iter 1225 with 2 
root@panda:/mnt/sss# ./a.out  
getcwd failed on iter 327 with 2 
root@panda:/mnt/sss# ./a.out  
getcwd failed on iter 637 with 2


--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux