Ondřej Vašík wrote:
> As reported in
> http://lists.gnu.org/archive/html/bug-coreutils/2009-08/msg00342.html by
> Ernest N. Mamikonyan, cp/mv fails to preserve extended attributes for
> read-only source files.
> Following patch fixes the issue for me, although maybe it's not perfect
> solution. But I don't know about better one at the moment.
> Test included...
Thanks for that, and especially the test.
It looks to me that the cause of this is actually a bug
in fsetxattr() (called by attr_copy_fd) as it's being
passed a writable fd, but still giving permission denied?
rsync does copy the xattrs as it uses a different approach,
which you can see comparing the strace output of cp and
rsync below:
strace -f rsync -X xattr xattr-copy
open(".xattr-copy.w0p0Cr", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 1
fchmod(1, 0600) = 0
mmap2(NULL, 266240, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb7dd5000
write(1, "t\n"..., 2) = 2
close(1) = 0
lstat64(".xattr-copy.w0p0Cr", {st_mode=S_IFREG|0600, st_size=2, ...}) = 0
llistxattr(".xattr-copy.w0p0Cr", 0x9000038, 1024) = 0
lsetxattr(".xattr-copy.w0p0Cr", "user.test", "test", 4, 0) = 0
chmod(".xattr-copy.w0p0Cr", 0444) = 0
rename(".xattr-copy.w0p0Cr", "xattr-copy1") = 0
strace cp --preserve=xattr xattr xattr-copy
open("xattr-copy", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0444) = 4
fstat64(4, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "t\n"..., 32768) = 2
write(4, "t\n"..., 2) = 2
read(3, ""..., 32768) = 0
flistxattr(3, (nil), 0) = 10
flistxattr(3, 0xbff59780, 10) = 10
open("/etc/xattr.conf", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or
directory)
fgetxattr(3, "user.test", 0x0, 0) = 4
fgetxattr(3, "user.test", "test", 4) = 4
fsetxattr(4, "user.test", "test", 4, 0) = -1 EACCES (Permission denied
BTW, I think you forgot to restore the permissions in your patch.
cheers,
Pádraig.