ok, so if we now have discovered that it is +t that makes the difference and also that it is not a bash bug, I wonder what kernel version are you running? did Chet tests include sticky bit and the same kernel?
pg On 28 Jul 2016, at 19:46, László Házy wrote: > I did, and then everything works. Then, I set the sticky bit on the new > directory containing the link (as /var/tmp has it), and the file status query > does not work. So it is the sticky bit which prevents [[ -f file ]] from > returning the correct status on a symlink for anyone else (even root) than > the user who created the symlink. From my limited knowledge, the sticky bit > is supposed to prevent file and directory removal, not status query. Am I > missing something? > > Thanks. > > > > On Thu, 2016-07-28 at 19:12 +0200, Piotr Grzybowski wrote: >> hi, >> >> could you move the test away from the tmp directory and try again, in some >> other fresh dir? >> >> pg >> >> On 28 Jul 2016, at 18:52, László Házy wrote: >> >> >>> >>> Thanks for the effort Chet. Here are the results of some tests I have done, >>> including what you requested. Note that I have SELinux as disabled. >>> >>> [root]$ getenforce >>> Disabled >>> >>> >>> [user1]# cat /home/user1/file >>> This is file. >>> >>> [user2]# cat /home/user1/file >>> This is file. >>> >>> >>> >>> [user1]# cat /var/tmp/link >>> cat: /var/tmp/link: Permission denied >>> >>> [user2]$ cat /var/tmp/link >>> This is file. >>> >>> >>> >>> [user1]$ stat /home/user1/file >>> File: ‘/home/user1/file’ >>> Size: 14 Blocks: 8 IO Block: 4096 regular file >>> Device: 803h/2051d Inode: 3414083 Links: 1 >>> Access: (0644/-rw-r--r--) Uid: ( 501/ user1) Gid: ( 100/ users) >>> Access: 2016-07-28 12:08:34.186872745 -0400 >>> Modify: 2016-07-28 12:08:30.879845375 -0400 >>> Change: 2016-07-28 12:08:30.950845962 -0400 >>> Birth: - >>> >>> [user2]# stat /home/user1/file >>> File: ‘/home/user1/file’ >>> Size: 14 Blocks: 8 IO Block: 4096 regular file >>> Device: 803h/2051d Inode: 3414083 Links: 1 >>> Access: (0644/-rw-r--r--) Uid: ( 501/ user1) Gid: ( 100/ users) >>> Access: 2016-07-28 12:08:34.186872745 -0400 >>> Modify: 2016-07-28 12:08:30.879845375 -0400 >>> Change: 2016-07-28 12:08:30.950845962 -0400 >>> Birth: - >>> >>> >>> >>> [user1]# stat /var/tmp/link >>> File: ‘/var/tmp/link’ -> ‘/home/user1/file’ >>> Size: 17 Blocks: 0 IO Block: 4096 symbolic link >>> Device: 808h/2056d Inode: 131183 Links: 1 >>> Access: (0777/lrwxrwxrwx) Uid: ( 500/ user2) Gid: ( 100/ users) >>> Access: 2016-07-27 12:17:07.899994243 -0400 >>> Modify: 2016-07-27 12:17:07.398991028 -0400 >>> Change: 2016-07-27 12:17:07.398991028 -0400 >>> Birth: - >>> >>> [user2]# stat /var/tmp/link >>> File: ‘/var/tmp/link’ -> ‘/home/user1/file’ >>> Size: 17 Blocks: 0 IO Block: 4096 symbolic link >>> Device: 808h/2056d Inode: 131183 Links: 1 >>> Access: (0777/lrwxrwxrwx) Uid: ( 500/ user2) Gid: ( 100/ users) >>> Access: 2016-07-27 12:17:07.899994243 -0400 >>> Modify: 2016-07-27 12:17:07.398991028 -0400 >>> Change: 2016-07-27 12:17:07.398991028 -0400 >>> Birth: - >>> >>> >>> >>> Then, I created the /home/user1/test.sh script with the following content: >>> #!/bin/bash >>> >>> [[ -f /var/tmp/link ]] >>> echo $? >>> >>> End of /home/user1/test.sh. >>> >>> >>> >>> [user1]$ strace ./test.sh >>> execve("./test.sh", ["./test.sh"], [/* 59 vars */]) = 0 >>> brk(NULL) = 0x80d51000 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb77b5000 >>> access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or >>> directory) >>> open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 >>> fstat64(3, {st_mode=S_IFREG|0644, st_size=128315, ...}) = 0 >>> mmap2(NULL, 128315, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7795000 >>> close(3) = 0 >>> open("/lib/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3 >>> read(3, >>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220^\0\0004\0\0\0"..., >>> 512) = 512 >>> fstat64(3, {st_mode=S_IFREG|0755, st_size=142888, ...}) = 0 >>> mmap2(NULL, 141008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = >>> 0xb7772000 >>> mmap2(0xb7791000, 16384, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1f000) = 0xb7791000 >>> close(3) = 0 >>> open("/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 >>> read(3, >>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\n\0\0004\0\0\0"..., >>> 512) = 512 >>> fstat64(3, {st_mode=S_IFREG|0755, st_size=18272, ...}) = 0 >>> mmap2(NULL, 16508, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = >>> 0xb776d000 >>> mmap2(0xb7770000, 8192, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0xb7770000 >>> close(3) = 0 >>> open("/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> read(3, >>> "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260\206\1\0004\0\0\0"..., >>> 512) = 512 >>> fstat64(3, {st_mode=S_IFREG|0755, st_size=2125576, ...}) = 0 >>> mmap2(NULL, 1886780, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) >>> = 0xb75a0000 >>> mmap2(0xb7767000, 12288, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c7000) = 0xb7767000 >>> mmap2(0xb776a000, 10812, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb776a000 >>> close(3) = 0 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb759f000 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb759e000 >>> set_thread_area({entry_number:-1, base_addr:0xb759e700, limit:1048575, >>> seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, >>> seg_not_present:0, useable:1}) = 0 (entry_number:6) >>> mprotect(0xb7767000, 8192, PROT_READ) = 0 >>> mprotect(0xb7770000, 4096, PROT_READ) = 0 >>> mprotect(0xb7791000, 12288, PROT_READ) = 0 >>> mprotect(0x801be000, 8192, PROT_READ) = 0 >>> mprotect(0xb77dc000, 4096, PROT_READ) = 0 >>> munmap(0xb7795000, 128315) = 0 >>> open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3 >>> close(3) = 0 >>> brk(NULL) = 0x80d51000 >>> brk(0x80d72000) = 0x80d72000 >>> brk(NULL) = 0x80d72000 >>> open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 >>> fstat64(3, {st_mode=S_IFREG|0644, st_size=111950656, ...}) = 0 >>> mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb739e000 >>> mmap2(NULL, 1253376, PROT_READ, MAP_PRIVATE, 3, 0x1079000) = 0xb726c000 >>> close(3) = 0 >>> getuid32() = 501 >>> getgid32() = 100 >>> geteuid32() = 501 >>> getegid32() = 100 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> brk(NULL) = 0x80d72000 >>> open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3 >>> fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb77b4000 >>> read(3, "MemTotal: 8239856 kB\nMemF"..., 1024) = 1024 >>> close(3) = 0 >>> munmap(0xb77b4000, 4096) = 0 >>> rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTART}, {SIG_DFL, [], SA_RESTART}, >>> 8) = 0 >>> rt_sigaction(SIGINT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGINT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> rt_sigaction(SIGQUIT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> uname({sysname="Linux", nodename="ws021", ...}) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3 >>> fstat64(3, {st_mode=S_IFREG|0644, st_size=26252, ...}) = 0 >>> mmap2(NULL, 26252, PROT_READ, MAP_SHARED, 3, 0) = 0xb77ae000 >>> close(3) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> stat64("/home/user1", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 >>> stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 >>> getpid() = 8430 >>> getppid() = 8428 >>> getpgrp() = 8428 >>> rt_sigaction(SIGCHLD, {0x80107930, [], SA_RESTART}, {SIG_DFL, [], >>> SA_RESTART}, 8) = 0 >>> ugetrlimit(RLIMIT_NPROC, {rlim_cur=64221, rlim_max=64221}) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> open("./test.sh", O_RDONLY|O_LARGEFILE) = 3 >>> ioctl(3, TCGETS, 0xbfaeb1ec) = -1 ENOTTY (Inappropriate ioctl >>> for device) >>> _llseek(3, 0, [0], SEEK_CUR) = 0 >>> read(3, "#!/bin/bash\n\n[[ -f /var/tmp/link"..., 80) = 45 >>> _llseek(3, 0, [0], SEEK_SET) = 0 >>> ugetrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0 >>> fcntl64(255, F_GETFD) = -1 EBADF (Bad file descriptor) >>> dup2(3, 255) = 255 >>> close(3) = 0 >>> fcntl64(255, F_SETFD, FD_CLOEXEC) = 0 >>> fcntl64(255, F_GETFL) = 0x8000 (flags >>> O_RDONLY|O_LARGEFILE) >>> fstat64(255, {st_mode=S_IFREG|0755, st_size=45, ...}) = 0 >>> _llseek(255, 0, [0], SEEK_CUR) = 0 >>> read(255, "#!/bin/bash\n\n[[ -f /var/tmp/link"..., 45) = 45 >>> stat64("/var/tmp/link", 0xbfaeb038) = -1 EACCES (Permission denied) >>> fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb77ad000 >>> write(1, "1\n", 21 >>> ) = 2 >>> read(255, "", 45) = 0 >>> rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 >>> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 >>> exit_group(0) = ? >>> +++ exited with 0 +++ >>> >>> >>> [user2]# cd /home/user1 >>> [user2]# strace ./test.sh >>> execve("./test.sh", ["./test.sh"], [/* 58 vars */]) = 0 >>> brk(NULL) = 0x80d1c000 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb7778000 >>> access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or >>> directory) >>> open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 >>> fstat64(3, {st_mode=S_IFREG|0644, st_size=128315, ...}) = 0 >>> mmap2(NULL, 128315, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7758000 >>> close(3) = 0 >>> open("/lib/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3 >>> read(3, >>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220^\0\0004\0\0\0"..., >>> 512) = 512 >>> fstat64(3, {st_mode=S_IFREG|0755, st_size=142888, ...}) = 0 >>> mmap2(NULL, 141008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = >>> 0xb7735000 >>> mmap2(0xb7754000, 16384, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1f000) = 0xb7754000 >>> close(3) = 0 >>> open("/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 >>> read(3, >>> "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\n\0\0004\0\0\0"..., >>> 512) = 512 >>> fstat64(3, {st_mode=S_IFREG|0755, st_size=18272, ...}) = 0 >>> mmap2(NULL, 16508, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = >>> 0xb7730000 >>> mmap2(0xb7733000, 8192, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0xb7733000 >>> close(3) = 0 >>> open("/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 >>> read(3, >>> "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260\206\1\0004\0\0\0"..., >>> 512) = 512 >>> fstat64(3, {st_mode=S_IFREG|0755, st_size=2125576, ...}) = 0 >>> mmap2(NULL, 1886780, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) >>> = 0xb7563000 >>> mmap2(0xb772a000, 12288, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c7000) = 0xb772a000 >>> mmap2(0xb772d000, 10812, PROT_READ|PROT_WRITE, >>> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb772d000 >>> close(3) = 0 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb7562000 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb7561000 >>> set_thread_area({entry_number:-1, base_addr:0xb7561700, limit:1048575, >>> seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, >>> seg_not_present:0, useable:1}) = 0 (entry_number:6) >>> mprotect(0xb772a000, 8192, PROT_READ) = 0 >>> mprotect(0xb7733000, 4096, PROT_READ) = 0 >>> mprotect(0xb7754000, 12288, PROT_READ) = 0 >>> mprotect(0x801ba000, 8192, PROT_READ) = 0 >>> mprotect(0xb779f000, 4096, PROT_READ) = 0 >>> munmap(0xb7758000, 128315) = 0 >>> open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3 >>> close(3) = 0 >>> brk(NULL) = 0x80d1c000 >>> brk(0x80d3d000) = 0x80d3d000 >>> brk(NULL) = 0x80d3d000 >>> open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 >>> fstat64(3, {st_mode=S_IFREG|0644, st_size=111950656, ...}) = 0 >>> mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7361000 >>> mmap2(NULL, 1253376, PROT_READ, MAP_PRIVATE, 3, 0x1079000) = 0xb722f000 >>> close(3) = 0 >>> getuid32() = 500 >>> getgid32() = 100 >>> geteuid32() = 500 >>> getegid32() = 100 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> brk(NULL) = 0x80d3d000 >>> open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3 >>> fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb7777000 >>> read(3, "MemTotal: 8239856 kB\nMemF"..., 1024) = 1024 >>> close(3) = 0 >>> munmap(0xb7777000, 4096) = 0 >>> rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTART}, {SIG_DFL, [], SA_RESTART}, >>> 8) = 0 >>> rt_sigaction(SIGINT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGINT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> rt_sigaction(SIGQUIT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0 >>> uname({sysname="Linux", nodename="ws021", ...}) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3 >>> fstat64(3, {st_mode=S_IFREG|0644, st_size=26252, ...}) = 0 >>> mmap2(NULL, 26252, PROT_READ, MAP_SHARED, 3, 0) = 0xb7771000 >>> close(3) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> stat64("/home/user1", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 >>> stat64(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 >>> getpid() = 8451 >>> getppid() = 8449 >>> getpgrp() = 8449 >>> rt_sigaction(SIGCHLD, {0x80103930, [], SA_RESTART}, {SIG_DFL, [], >>> SA_RESTART}, 8) = 0 >>> ugetrlimit(RLIMIT_NPROC, {rlim_cur=64221, rlim_max=64221}) = 0 >>> rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0 >>> open("./test.sh", O_RDONLY|O_LARGEFILE) = 3 >>> ioctl(3, TCGETS, 0xbff880dc) = -1 ENOTTY (Inappropriate ioctl >>> for device) >>> _llseek(3, 0, [0], SEEK_CUR) = 0 >>> read(3, "#!/bin/bash\n\n[[ -f /var/tmp/link"..., 80) = 45 >>> _llseek(3, 0, [0], SEEK_SET) = 0 >>> ugetrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=4*1024}) = 0 >>> fcntl64(255, F_GETFD) = -1 EBADF (Bad file descriptor) >>> dup2(3, 255) = 255 >>> close(3) = 0 >>> fcntl64(255, F_SETFD, FD_CLOEXEC) = 0 >>> fcntl64(255, F_GETFL) = 0x8000 (flags >>> O_RDONLY|O_LARGEFILE) >>> fstat64(255, {st_mode=S_IFREG|0755, st_size=45, ...}) = 0 >>> _llseek(255, 0, [0], SEEK_CUR) = 0 >>> read(255, "#!/bin/bash\n\n[[ -f /var/tmp/link"..., 45) = 45 >>> stat64("/var/tmp/link", {st_mode=S_IFREG|0644, st_size=14, ...}) = 0 >>> fstat64(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 3), ...}) = 0 >>> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >>> 0xb7770000 >>> write(1, "0\n", 20 >>> ) = 2 >>> read(255, "", 45) = 0 >>> rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 >>> rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 >>> exit_group(0) = ? >>> +++ exited with 0 +++ >>> >>> >>> >>> >>> >>> >>> >>> On Wed, 2016-07-27 at 18:33 -0400, Chet Ramey wrote: >>> >>>> >>>> On 7/27/16 3:34 PM, László Házy wrote: >>>> >>>> >>>>> >>>>> >>>>> You have probably not done the first command: "[user1]$ chmod g+rx >>>>> /home/user1". In my case, there is no access problem. I can ls and cd. >>>>> Thing is, even root gets the wrong answer if it does the "is file?" query. >>>>> >>>>> >>>> >>>> >>>> >>>> I performed that command, but I tore it all down and rebuilt it anyway. >>>> Running a system call tracer (strace) shows that stat ("/var/tmp/link", ) >>>> returns -1 with errno == EACCES. `cat' displays "Permission Denied", and >>>> `cp' says "cannot stat". >>>> >>>> What does strace show when you run it as user1 with a script that contains >>>> >>>> [[ -f /var/tmp/link ]] >>>> echo $? >>>> >>>> ? >>>> >>>> >>>> >>> >> >> >>