Paul you guessed correctly:

bash-4.2# touch file
bash-4.2# ln -s file symlink
bash-4.2# ./symlink-test 
bash-4.2# echo $?
1
bash-4.2# truss ./symlink-test
execve("./symlink-test", 0x2FF22CD4, 0x20013588)  argc: 1
kopenxat(-2, "symlink", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR, 0) = 3
kfcntl(1, F_GETFL, 0x2FF22FFC)                  = 2
kfcntl(2, F_GETFL, 0x2FF22FFC)                  = 2
_exit(1)
bash-4.2# 


On 26 Jul 2012, at 18:27, Paul Eggert wrote:

> On 07/26/2012 03:33 AM, Jez Wain wrote:
>> On the new server, which produced the erroneous result,
>> fcntl.h defines both O_NOFOLLOW and AT_SYMLINK_NOFOLLOW
> 
> OK, thanks, but why do you later mention
> _XOPEN_SOURCE?  Is that relevant?
> 

 _XOPEN_SOURCE is only relevant in that the O_NOFOLLOW definition depends on 
_XOPEN_SOURCE as being defined as > 700:

bash-4.2# grep -p O_NOFOLLOW /usr/include/fcntl.h 
#if _XOPEN_SOURCE >= 700
#define O_CLOEXEC       _FCLOEXEC       /* sets FD_CLOEXEC on open      */
#define O_NOFOLLOW      _FNOFOLLOW      /* do not follow symlinks       */
#define O_TTY_INIT      _FTTYINIT       /* sets conforming tty state    */
#endif /* _XOPEN_SOURCE >= 700 */

Recall that the O_NOFOLLOW has been introduced only in the latest version of 
AIX.  Early versions of AIXv7, 6, 5, and 4 don't have this definition. 

Jez


> It sounds like we need to add a test for this AIX bug,
> and then put a workaround into tar.  Let's start with the
> test.  Suppose you compile the following test program:
> 
>  #include <fcntl.h>
> 
>  int
>  main (void)
>  {
>    int flags = O_NOFOLLOW | O_WRONLY | O_CREAT;
>    mode_t perms = S_IRUSR | S_IWUSR;
>    return openat (AT_FDCWD, "symlink", flags, perms) < 0 ? 0 : 1;
>  }
> 
> Put this into a.out, and then run these shell commands:
> 
>   rm -f file symlink
>   touch file
>   ln -s file symlink
>   truss ./a.out
> 
> What does the tail end of the "truss" output say,
> starting with the first mention of "symlink"?
> On a working system, openat should fail and the
> program should exit with status 0.  My guess is
> that on AIX openat succeeds, and the program exits
> with status 1.

Reply via email to