[PATCH v5] fstat: add test and documentation for an edge case.

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Jun 25 19:18:20 GMT 2025


Ah right, I will review this one as well.

On 25/06/25 15:49, Matteo Croce wrote:
> Ah I think because it depends on another I've sent earlier:
> 
> https://patchwork.sourceware.org/project/glibc/patch/20250614095903.202272-1-technoboy85@gmail.com/
> 
> I didn't sent as a series because I've already sent the first one earlier.
> 
> Il giorno mer 25 giu 2025 alle ore 20:36 Adhemerval Zanella Netto
> <adhemerval.zanella@linaro.org> ha scritto:
>>
>>
>>
>> On 24/06/25 13:40, Matteo Croce wrote:
>>> From: Matteo Croce <teknoraver@meta.com>
>>>
>>> The fstatat behaviour when the target is a dangling symlink is different
>>> if flags contains AT_SYMLINK_NOFOLLOW or not.
>>> Add a test for this and document it.
>>> ---
>>>  io/tst-stat.c       | 17 ++++++++++++++++-
>>>  manual/filesys.texi |  5 +++--
>>>  2 files changed, 19 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/io/tst-stat.c b/io/tst-stat.c
>>> index 61bdbfb638..aeea435ca1 100644
>>> --- a/io/tst-stat.c
>>> +++ b/io/tst-stat.c
>>> @@ -62,12 +62,23 @@ fstatat_check (int fd, const char *path, struct stat *st)
>>>    TEST_COMPARE (fstatat (fd, path, st, 0), 0);
>>>  }
>>>
>>> +static void
>>> +fstatat_link (const char *path, struct stat *st)
>>> +{
>>> +  TEST_COMPARE (fstatat (AT_FDCWD, path, st, 0), -1);
>>> +  TEST_COMPARE (errno, ENOENT);
>>> +
>>> +  TEST_COMPARE (fstatat (AT_FDCWD, path, st, AT_SYMLINK_NOFOLLOW), 0);
>>> +  TEST_COMPARE (!S_ISLNK(st->st_mode), 0);
>>> +}
>>> +
>>>  typedef void (*test_t)(int, const char *path, struct stat *);
>>>
>>>  static int
>>>  do_test (void)
>>>  {
>>>    char *path;
>>> +  const char *linkame = "tst-fstat.linkname";
>>>    int fd = create_temp_file ("tst-fstat.", &path);
>>>    TEST_VERIFY_EXIT (fd >= 0);
>>>    support_write_file_string (path, "abc");
>>> @@ -81,13 +92,13 @@ do_test (void)
>>>      printf ("warning: timestamp with nanoseconds not supported\n");
>>>
>>>    struct statx stx;
>>> +  struct stat st;
>>>    TEST_COMPARE (statx (fd, path, 0, STATX_BASIC_STATS, &stx), 0);
>>>
>>>    test_t tests[] = { stat_check, lstat_check, fstat_check, fstatat_check };
>>>
>>>    for (int i = 0; i < array_length (tests); i++)
>>>      {
>>> -      struct stat st;
>>>        tests[i](fd, path, &st);
>>>
>>>        TEST_COMPARE (stx.stx_dev_major, major (st.st_dev));
>>> @@ -111,6 +122,10 @@ do_test (void)
>>>       }
>>>      }
>>>
>>> +  TEST_COMPARE (symlink ("tst-fstat.target", linkame), 0);
>>> +  add_temp_file (linkame);
>>> +  fstatat_link (linkame, &st);
>>> +
>>>    return 0;
>>>  }
>>>
>>> diff --git a/manual/filesys.texi b/manual/filesys.texi
>>> index d0ced84bf6..4406201dab 100644
>>> --- a/manual/filesys.texi
>>> +++ b/manual/filesys.texi
>>> @@ -2397,8 +2397,9 @@ The descriptor @var{filedes} is not associated with a directory, and
>>>  @var{filename} is a relative file name.
>>>
>>>  @item ENOENT
>>> -The file named by @var{filename} does not exist, or @var{filename} is an
>>> -empty string and @var{flags} does not contain @code{AT_EMPTY_PATH}.
>>> +The file named by @var{filename} does not exist, it's a dangling symbolic link
>>> +and @var{flags} does not contain @code{AT_SYMLINK_NOFOLLOW}, or @var{filename}
>>> +is an empty string and @var{flags} does not contain @code{AT_EMPTY_PATH}.
>>>  @end table
>>
>> This manual changes does not apply, both the CI and trying manually the ENOENT
>> entry does not exists for fstatat [1].  I am not sure what happened here.
>>
>> [1] https://patchwork.sourceware.org/project/glibc/patch/20250624164013.459729-1-technoboy85@gmail.com/
>>
>>>
>>>  When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
>>
> 
> 



More information about the Libc-alpha mailing list