GNU bug report logs -
#79433
9.7: cp(1): lchownat(2/3) fallback bogus?
Previous Next
Full log
View this message in rfc822 format
Paul Eggert wrote in
<3fe25ff1-2c46-4d2f-997f-3e9dc9c6ca69 <at> cs.ucla.edu>:
|On 2025-09-11 04:49, Steffen Nurpmeso wrote:
|> if (lchownat (dst_dirfd, relname, p->st.st_uid, p->st.st_gid\
|> )
|> != 0)
|> ...
|> error (0, errno, _("failed to preserve ownership \
|> for %s"),
|> quoteaf (dst_name));
|>
|> Here there is no lchownat(3/2),
|
|No kernel or C library has lchownat; that's a convenience function
|defined in coreutils/lib/openat.h (taken from Gnulib), equivalent to
|fchownat (..., AT_SYMLINK_NOFOLLOW).
|
|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)
^^
openat(AT_FDCWD, "c", O_RDONLY|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 3
newfstatat(3, "", {st_mode=S_IFLNK|0777, st_size=1, ...}, AT_EMPTY_PATH) = 0
close(3) = 0
fcntl(1, F_GETFL) = 0x2 (flags O_RDWR)
write(2, "cp: ", 4cp: ) = 4
write(2, "failed to preserve ownership for"..., 34failed to preserve ownership for c) = 34
write(2, ": Operation not supported", 25: Operation not supported) = 25
write(2, "\n", 1
) = 1
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
...
|What happens if you use fchownat directly? Something like the following:
That just works.
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
--End of <3fe25ff1-2c46-4d2f-997f-3e9dc9c6ca69 <at> cs.ucla.edu>
--steffen
|
|Der Kragenbaer, The moon bear,
|der holt sich munter he cheerfully and one by one
|einen nach dem anderen runter wa.ks himself off
|(By Robert Gernhardt)
This bug report was last modified 1 day ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.