Hi,

This is on Linux 6.8.0, with GNU tar 1.35:

$ uname -srm
Linux 6.8.0-50-generic x86_64

$ tar --version
tar (GNU tar) 1.35
...

The attached file foo.tar was created through

$ tar cvf foo.tar foo/a_symlink_before foo/a_file foo/a_symlink_after 
foo/a_symlink_before
foo/a_file
foo/a_symlink_after

When I unpack it on a CIFS file system, 'tar' emits a warning and, at the
end, fails with status 2.

$ stat -f .
  File: "."
    ID: 0        Namelen: 255     Type: cifs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 961041617  Free: 22131034   Available: 21999962
Inodes: Total: 244097024  Free: 237015499

$ mount
...
//<NAS>/<SHARE> on <MOUNTPOINT> type cifs 
(rw,relatime,vers=1.0,cache=strict,username=bruno,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.178.30,soft,unix,posixpaths,serverino,mapposix,acl,rsize=8192,wsize=8192,bsize=1048576,retrans=1,echo_interval=60,actimeo=1,closetimeo=1)
...

$ tar xf ~/foo.tar
tar: foo/a_symlink_before: Cannot utime: No such file or directory
tar: Exiting with failure status due to previous errors
$ echo $?
2

For analysis, here's the same thing again with system call traces.

$ rm -rf foo
$ strace -o /tmp/tar.log tar xf ~/foo.tar
tar: foo/a_symlink_before: Cannot utime: No such file or directory
tar: Exiting with failure status due to previous errors

Compare the system calls that extract 'foo/a_symlink_before':

symlinkat("a_file", AT_FDCWD, "foo/a_symlink_before") = -1 ENOENT (No such file 
or directory)
mkdirat(AT_FDCWD, "foo", 0775)          = 0
symlinkat("a_file", AT_FDCWD, "foo/a_symlink_before") = 0
utimensat(AT_FDCWD, "foo/a_symlink_before", [UTIME_OMIT, {tv_sec=1734793193, 
tv_nsec=0} /* 2024-12-21T15:59:53+0100 */], AT_SYMLINK_NOFOLLOW) = -1 ENOENT 
(No such file or directory)
...
newfstatat(AT_FDCWD, "foo/a_symlink_before", {st_mode=S_IFLNK|0777, st_size=6, 
...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat2(AT_FDCWD, "foo/a_symlink_before", 0775, AT_SYMLINK_NOFOLLOW) = -1 
EOPNOTSUPP (Operation not supported)

with those that extract 'foo/a_symlink_after':

symlinkat("a_file", AT_FDCWD, "foo/a_symlink_after") = 0
utimensat(AT_FDCWD, "foo/a_symlink_after", [UTIME_OMIT, {tv_sec=1734793016, 
tv_nsec=0} /* 2024-12-21T15:56:56+0100 */], AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "foo/a_symlink_after", {st_mode=S_IFLNK|0777, st_size=6, 
...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat2(AT_FDCWD, "foo/a_symlink_after", 0775, AT_SYMLINK_NOFOLLOW) = -1 
EOPNOTSUPP (Operation not supported)

To me, it looks like 'tar' correctly passes the flag AT_SYMLINK_NOFOLLOW but
the utimensat() call ignores it.

Possible suggestion: Report it as a bug to the Linux kernel people?
Alternate suggestion: Delay utimensat() calls until the end of the 'tar' run?
  (Then 'tar' would have set wrong time stamps but exited with code 0.)

Bruno

PS: The real file on which I experienced this first is
https://github.com/llvm/llvm-project/releases/download/llvmorg-19.1.5/LLVM-19.1.5-Linux-X64.tar.xz
but I did not want to bother you with a 1.5 GiB test file and
with a 480 MB log file :)

Attachment: foo.tar
Description: Unix tar archive

execve("/arch/local/x86_64-linux-gnu/bin/tar", ["tar", "xf", "/home/bruno/foo.tar"], 0x7fff2e8c6ef0 /* 94 vars */) = 0
brk(NULL)                               = 0x5ec5ef00b000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7a70814bf000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=133871, ...}) = 0
mmap(NULL, 133871, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7a708149e000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=38984, ...}) = 0
mmap(NULL, 36896, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7a7081494000
mmap(0x7a7081496000, 20480, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7a7081496000
mmap(0x7a708149b000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7a708149b000
mmap(0x7a708149c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8000) = 0x7a708149c000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=174472, ...}) = 0
mmap(NULL, 181960, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7a7081467000
mmap(0x7a708146d000, 118784, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7a708146d000
mmap(0x7a708148a000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x23000) = 0x7a708148a000
mmap(0x7a7081490000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x29000) = 0x7a7081490000
mmap(0x7a7081492000, 5832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7a7081492000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\243\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
fstat(3, {st_mode=S_IFREG|0755, st_size=2125328, ...}) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2170256, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7a7081200000
mmap(0x7a7081228000, 1605632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x7a7081228000
mmap(0x7a70813b0000, 323584, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b0000) = 0x7a70813b0000
mmap(0x7a70813ff000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1fe000) = 0x7a70813ff000
mmap(0x7a7081405000, 52624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7a7081405000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=625344, ...}) = 0
mmap(NULL, 627472, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7a7081166000
mmap(0x7a7081168000, 450560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7a7081168000
mmap(0x7a70811d6000, 163840, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0x7a70811d6000
mmap(0x7a70811fe000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x97000) = 0x7a70811fe000
close(3)                                = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7a7081465000
arch_prctl(ARCH_SET_FS, 0x7a7081466200) = 0
set_tid_address(0x7a70814664d0)         = 1343582
set_robust_list(0x7a70814664e0, 24)     = 0
rseq(0x7a7081466b20, 0x20, 0, 0x53053053) = 0
mprotect(0x7a70813ff000, 16384, PROT_READ) = 0
mprotect(0x7a70811fe000, 4096, PROT_READ) = 0
mprotect(0x7a7081490000, 4096, PROT_READ) = 0
mprotect(0x7a708149c000, 4096, PROT_READ) = 0
mprotect(0x5ec5e92d7000, 8192, PROT_READ) = 0
mprotect(0x7a70814f7000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0x7a708149e000, 133871)          = 0
statfs("/sys/fs/selinux", 0x7ffed4acdef0) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffed4acdef0)      = -1 ENOENT (No such file or directory)
getrandom("\x9c\x9a\x5d\xff\x2f\x91\x78\xfe", 8, GRND_NONBLOCK) = 8
brk(NULL)                               = 0x5ec5ef00b000
brk(0x5ec5ef02c000)                     = 0x5ec5ef02c000
openat(AT_FDCWD, "/proc/filesystems", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\ttmpfs\nnodev\tbd"..., 1024) = 505
read(3, "", 1024)                       = 0
close(3)                                = 0
access("/etc/selinux/config", F_OK)     = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=27919920, ...}) = 0
mmap(NULL, 27919920, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7a707f600000
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2996, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2996
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/arch/local/x86_64-linux-gnu/share/locale/en_US.UTF-8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/arch/local/x86_64-linux-gnu/share/locale/en_US.utf8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/arch/local/x86_64-linux-gnu/share/locale/en_US/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/arch/local/x86_64-linux-gnu/share/locale/en.UTF-8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/arch/local/x86_64-linux-gnu/share/locale/en.utf8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/arch/local/x86_64-linux-gnu/share/locale/en/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US.UTF-8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US.utf8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en.utf8/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/tar.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fcntl(0, F_GETFD)                       = 0
fcntl(1, F_GETFD)                       = 0
fcntl(2, F_GETFD)                       = 0
rt_sigaction(SIGCHLD, {sa_handler=SIG_DFL, sa_mask=[CHLD], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7a7081245320}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
geteuid()                               = 1000
umask(000)                              = 002
umask(002)                              = 000
openat(AT_FDCWD, "/home/bruno/foo.tar", O_RDONLY) = 3
read(3, "foo/a_symlink_before\0\0\0\0\0\0\0\0\0\0\0\0"..., 10240) = 10240
fstat(3, {st_mode=S_IFREG|0664, st_size=10240, ...}) = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
newfstatat(AT_FDCWD, "/etc/nsswitch.conf", {st_mode=S_IFREG|0644, st_size=558, ...}, 0) = 0
newfstatat(AT_FDCWD, "/", {st_mode=S_IFDIR|0755, st_size=4096, ...}, 0) = 0
openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=558, ...}) = 0
read(4, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 558
read(4, "", 4096)                       = 0
fstat(4, {st_mode=S_IFREG|0644, st_size=558, ...}) = 0
close(4)                                = 0
openat(AT_FDCWD, "/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=2860, ...}) = 0
lseek(4, 0, SEEK_SET)                   = 0
read(4, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 2860
close(4)                                = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
newfstatat(AT_FDCWD, "/etc/nsswitch.conf", {st_mode=S_IFREG|0644, st_size=558, ...}, 0) = 0
openat(AT_FDCWD, "/etc/group", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=1177, ...}) = 0
lseek(4, 0, SEEK_SET)                   = 0
read(4, "root:x:0:\ndaemon:x:1:\nbin:x:2:\ns"..., 4096) = 1177
close(4)                                = 0
symlinkat("a_file", AT_FDCWD, "foo/a_symlink_before") = -1 ENOENT (No such file or directory)
mkdirat(AT_FDCWD, "foo", 0775)          = 0
symlinkat("a_file", AT_FDCWD, "foo/a_symlink_before") = 0
utimensat(AT_FDCWD, "foo/a_symlink_before", [UTIME_OMIT, {tv_sec=1734793193, tv_nsec=0} /* 2024-12-21T15:59:53+0100 */], AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)
write(2, "tar: ", 5)                    = 5
write(2, "foo/a_symlink_before: Cannot uti"..., 34) = 34
openat(AT_FDCWD, "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale-langpack/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, ": No such file or directory", 27) = 27
write(2, "\n", 1)                       = 1
newfstatat(AT_FDCWD, "foo/a_symlink_before", {st_mode=S_IFLNK|0777, st_size=6, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat2(AT_FDCWD, "foo/a_symlink_before", 0775, AT_SYMLINK_NOFOLLOW) = -1 EOPNOTSUPP (Operation not supported)
openat(AT_FDCWD, "foo/a_file", O_WRONLY|O_CREAT|O_EXCL|O_NOCTTY|O_NONBLOCK|O_CLOEXEC, 0664) = 4
write(4, "blub\n", 5)                   = 5
utimensat(4, NULL, [UTIME_OMIT, {tv_sec=1734793009, tv_nsec=0} /* 2024-12-21T15:56:49+0100 */], 0) = 0
close(4)                                = 0
symlinkat("a_file", AT_FDCWD, "foo/a_symlink_after") = 0
utimensat(AT_FDCWD, "foo/a_symlink_after", [UTIME_OMIT, {tv_sec=1734793016, tv_nsec=0} /* 2024-12-21T15:56:56+0100 */], AT_SYMLINK_NOFOLLOW) = 0
newfstatat(AT_FDCWD, "foo/a_symlink_after", {st_mode=S_IFLNK|0777, st_size=6, ...}, AT_SYMLINK_NOFOLLOW) = 0
fchmodat2(AT_FDCWD, "foo/a_symlink_after", 0775, AT_SYMLINK_NOFOLLOW) = -1 EOPNOTSUPP (Operation not supported)
close(3)                                = 0
write(2, "tar: ", 5)                    = 5
write(2, "Exiting with failure status due "..., 50) = 50
write(2, "\n", 1)                       = 1
close(1)                                = 0
close(2)                                = 0
exit_group(2)                           = ?
+++ exited with 2 +++

Reply via email to