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 :)
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 +++
