On 2025-09-13 07:56, Steffen Nurpmeso wrote:

  |What does "strace cp -a xb xc" say? I see this:

   geteuid()                               = 1000
   openat(AT_FDCWD, "c", O_RDONLY|O_PATH|O_DIRECTORY) = -1 ENOENT (No such file 
or directory)
   newfstatat(AT_FDCWD, "b", {st_mode=S_IFLNK|0777, st_size=1, ...}, 
AT_SYMLINK_NOFOLLOW) = 0
   newfstatat(AT_FDCWD, "c", 0x7ffdf869dea0, AT_SYMLINK_NOFOLLOW) = -1 ENOENT 
(No such file or directory)
   readlink("b", "a", 2)                   = 1
   symlinkat("a", AT_FDCWD, "c")           = 0
   newfstatat(AT_FDCWD, "c", {st_mode=S_IFLNK|0777, st_size=1, ...}, 
AT_SYMLINK_NOFOLLOW) = 0
   lchown("c", 1000, 1000)                 = 0
   fchmodat2(AT_FDCWD, "c", 0777, AT_SYMLINK_NOFOLLOW) = -1 ENOSYS (Function 
not implemented)
^^

So far the bug report has been about lchownat. But now you're saying that cp fails because fchmodat2 fails. So it sounds like we have been barking up the wrong tree by worrying about the chown-related syscalls, and that we should instead worry about chmod-related syscalls.


I do not know how

   $ grep -r fchmodat2 /usr/include/
   /usr/include/bits/syscall.h:#ifdef __NR_fchmodat2
   /usr/include/bits/syscall.h:# define SYS_fchmodat2 __NR_fchmodat2

gets into there, the kernel definitely does not have that as via
grep.  Generated at glibc build time via

     # install kernel headers
     make -C /usr/src/linux mrproper
     make -C /usr/src/linux INSTALL_HDR_PATH=$PKG/usr headers_install

Recent glibc fchmodat uses fchmodat2 if available. It assumes fchmodat2 is available if __ASSUME_FCHMODAT2 is nonzero, and __ASSUME_FCHMODAT2 is nonzero if you build glibc with headers from Linux kernel 6.6 or later.

It sounds like your glibc was built with __ASSUME_FCHMODAT2 = 1, but is running atop an older kernel lacking fchmodat2. If so, that would explain the abovementioned symptoms, and it would be a bug in how your glibc was built, not a coreutils bug.



Reply via email to