N38 gnu-long-name-emptyAn empty GNU long name: the name in the header, or none?
Reject(draft) A strict parser must reject this archive.
N38-gnu-long-name-empty.tar |
test archive, 2,560 bytes
sha256 3f2d690c72a4a6244e1c434d236c34c59eb8091a1ccd7c9f92ef64625cfffb55 |
N38-gnu-long-name-empty.json | expected result |
N38-gnu-long-name-empty.txt | annotated blocks |
N38-gnu-long-name-empty.py | generator script |
The archive has a GNU long name header of size 0, then a file whose header has GNU's magic and the name header-name.
A GNU long name replaces the name of the next member, and GNU's format does not say what an empty one means. If it applies, the pathname of the member is empty, and in POSIX an empty pathname does not resolve. This case is ambiguous because a reader can take the empty long name in one of three ways. A reader that ignores it extracts header-name. One that applies it gives the member an empty name, which is skipped, rejected or taken for .. One that takes the name of the long name header itself extracts the member as ././@LongLink. To a reader that does not know typeflag L, the member is header-name, after an empty file @LongLink.
Decision point: whether an empty GNU long name replaces the name in the header.
Seen in: none of the scanned tarballs.
Every block of 512 bytes, to scale, with its offset. Hover over a field for its bytes.
N38-gnu-long-name-empty: must reject
An empty GNU long name: the name in the header, or none?
The archive has a GNU long name header of size 0, then a file whose header has GNU's magic and the
name `header-name`.
A GNU long name replaces the name of the next member, and GNU's format does not say what an empty
one means. If it applies, the pathname of the member is empty, and in POSIX an empty
pathname does not resolve. This case is ambiguous because a reader can take the
empty long name in one of three ways. A reader that ignores it extracts `header-name`. One that
applies it gives the member an empty name, which is skipped, rejected or taken for `.`. One that
takes the name of the long name header itself extracts the member as `././@LongLink`. To a reader
that does not know typeflag `L`, the member is `header-name`, after an empty file `@LongLink`.
Decision point: whether an empty GNU long name replaces the name in the header.
Seen in: none of the scanned tarballs.
See also: N17, an empty name, and N22, an empty pax `path`.
0x000000 header: GNU long name, an empty long name
name [ 0,100) "././@LongLink" + 87 NUL
mode [100,108) "0000644" + NUL 644 (octal)
uid [108,116) "0000000" + NUL 0
gid [116,124) "0000000" + NUL 0
size [124,136) "00000000000" + NUL 0
mtime [136,148) "00000000000" + NUL 0
chksum [148,156) "011221\0 " 4753: the unsigned sum of the header, this field as spaces
typeflag [156,157) "L" GNU long name
linkname [157,257) 100 NUL
magic [257,263) "ustar "
version [263,265) " " + NUL
uname [265,297) 32 NUL
gname [297,329) 32 NUL
devmajor [329,337) "0000000" + NUL 0
devminor [337,345) "0000000" + NUL 0
prefix [345,500) 155 NUL
pad [500,512) 12 NUL
0x000200 header: regular file
name [ 0,100) "header-name" + 89 NUL
mode [100,108) "0000644" + NUL 644 (octal)
uid [108,116) "0000000" + NUL 0
gid [116,124) "0000000" + NUL 0
size [124,136) "00000000014" + NUL 12
mtime [136,148) "00000000000" + NUL 0
chksum [148,156) "011231\0 " 4761: the unsigned sum of the header, this field as spaces
typeflag [156,157) "0" regular file
linkname [157,257) 100 NUL
magic [257,263) "ustar "
version [263,265) " " + NUL
uname [265,297) 32 NUL
gname [297,329) 32 NUL
devmajor [329,337) "0000000" + NUL 0
devminor [337,345) "0000000" + NUL 0
prefix [345,500) 155 NUL
pad [500,512) 12 NUL
0x000400 data
12 bytes, then 500 NUL to the end of the block
"which name?\n"
0x000600 2 zero blocks: the end-of-archive marker
0x000a00 end of file
As xxd writes it: xxd -r makes the archive of it.
00000000: 2e2f 2e2f 404c 6f6e 674c 696e 6b00 0000 ././@LongLink... 00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000060: 0000 0000 3030 3030 3634 3400 3030 3030 ....0000644.0000 00000070: 3030 3000 3030 3030 3030 3000 3030 3030 000.0000000.0000 00000080: 3030 3030 3030 3000 3030 3030 3030 3030 0000000.00000000 00000090: 3030 3000 3031 3132 3231 0020 4c00 0000 000.011221. L... 000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000100: 0075 7374 6172 2020 0000 0000 0000 0000 .ustar ........ 00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000140: 0000 0000 0000 0000 0030 3030 3030 3030 .........0000000 00000150: 0030 3030 3030 3030 0000 0000 0000 0000 .0000000........ 00000160: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000170: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000180: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000190: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000001f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000200: 6865 6164 6572 2d6e 616d 6500 0000 0000 header-name..... 00000210: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000220: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000230: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000240: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000250: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000260: 0000 0000 3030 3030 3634 3400 3030 3030 ....0000644.0000 00000270: 3030 3000 3030 3030 3030 3000 3030 3030 000.0000000.0000 00000280: 3030 3030 3031 3400 3030 3030 3030 3030 0000014.00000000 00000290: 3030 3000 3031 3132 3331 0020 3000 0000 000.011231. 0... 000002a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000002f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000300: 0075 7374 6172 2020 0000 0000 0000 0000 .ustar ........ 00000310: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000320: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000330: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000340: 0000 0000 0000 0000 0030 3030 3030 3030 .........0000000 00000350: 0030 3030 3030 3030 0000 0000 0000 0000 .0000000........ 00000360: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000370: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000380: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000390: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000003f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000400: 7768 6963 6820 6e61 6d65 3f0a 0000 0000 which name?..... 00000410: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000420: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000430: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000440: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000450: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000460: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000470: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000480: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000490: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000004f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000500: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000510: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000520: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000530: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000540: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000550: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000560: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000570: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000580: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000590: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000005f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000600: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000610: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000620: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000630: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000640: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000650: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000660: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000670: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000680: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000690: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000006f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000700: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000710: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000720: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000730: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000740: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000750: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000760: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000770: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000780: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000790: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000007f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000800: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000810: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000820: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000830: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000840: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000850: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000860: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000870: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000880: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000890: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000008a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000008b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000008c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000008d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000008e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000008f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000900: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000910: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000920: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000930: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000940: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000950: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000960: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000970: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000980: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000990: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000009a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000009b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000009c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000009d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000009e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000009f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
In the outcome column, ✅ means that the implementation follows the default policy.
| implementation | version | outcome | what it makes of it |
|---|---|---|---|
| GNU tar | tar (GNU tar) 1.35 | ✅ rejects | error: tar: Substituting `.' for empty member name tar: .: Cannot open: File exists tar: Exiting with failure status due to previous errors |
| bsdtar | bsdtar 3.8.11 - libarchive 3.8.11 | ⚠️ accepts | tree A: header-name (12 B, a578eb49) |
| BusyBox tar | BusyBox v1.38.0, defconfig | ✅ rejects | error: tar: can't open '': No such file or directory |
| 7-Zip | 7-Zip (z) 26.05 (x64) | ⚠️ accepts | tree A: header-name (12 B, a578eb49) |
| Python tarfile, filter=data, as in pip | CPython 3.15.2 | ✅ rejects | error: IsADirectoryError: [Errno 21] Is a directory: 'DEST' |
| Python tarfile, filter=tar | CPython 3.15.2 | ✅ rejects | error: IsADirectoryError: [Errno 21] Is a directory: 'DEST' |
| Python tarfile, filter=fully_trusted | CPython 3.15.2 | ✅ rejects | error: IsADirectoryError: [Errno 21] Is a directory: 'DEST' |
| node-tar | tar 7.5.22 | ⚠️ accepts | tree A: header-name (12 B, a578eb49) |
| node-tar, strict | tar 7.5.22 | ⚠️ accepts | tree A: header-name (12 B, a578eb49) |
| tar-fs | tar-fs 3.1.3, on tar-stream 3.2.2 | ✅ rejects | error: Error: Unexpected end of data |
| Java Commons Compress | Commons Compress 1.28.0, Expander, on Java 27.0.1.0.2 | ✅ rejects | error: java.nio.file.FileSystemException: DEST: Is a directory |
| .NET System.Formats.Tar | System.Formats.Tar of .NET 10.0.14, ExtractToDirectory | ⚠️ accepts | tree B: @LongLink (12 B, a578eb49) |
| PHP PharData, as in Composer | PharData of PHP 8.5.12, as Composer's TarDownloader calls it | ✅ rejects | error: UnexpectedValueException: phar error: "suite/archives/N38-gnu-long-name-empty.tar" is a corrupted tar file (invalid entry size) |
| Go containerd archive.Apply | containerd v2.4.2, archive.Apply, of go1.27.3 | ⚠️ accepts | tree A: header-name (12 B, a578eb49) |
| Rust tar | tar 0.4.46, unpack | ⚠️ accepts | tree C: nothing |
| Rust astral-tokio-tar | astral-tokio-tar 0.7.1, unpack | ⚠️ accepts | tree C: nothing |
| Rust tar-codec, as in uv | tar-codec 0.0.16, with the policies of uv 0.13 | ✅ rejects | error: at byte 0: malformed GNU LongName metadata payload: declared payload size is zero |
| RubyGems | RubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz | ⚠️ accepts | tree A: header-name (12 B, a578eb49) |
| R untar, internal | utils::untar of R 4.6.2, tar = "internal" | ⚠️ crashes | argument must be coercible to non-negative integer Warning message: In max(which(block > 0)) : no non-missing arguments to max; returning -Inf |
| Perl Archive::Tar | Archive::Tar 3.12 of Perl v5.44.0 | ✅ rejects | error: status 1 |
| Haskell tar | tar 0.7.2.0, extract, of GHC 9.14 | ✅ rejects | error: Invalid file name in tar archive: "" |
| Julia Tar.jl | Tar 1.10.0 of Julia 1.13.3 | ⚠️ crashes | BoundsError: attempt to access 0-element view(::Vector{UInt8}, 1:0) with eltype UInt8 at index [0] |
| live-bootstrap untar | mescc-tools-extra a151c245e512, as live-bootstrap pins it | ✅ rejects | error: unable to create long symlink |
| live-bootstrap untar, --non-strict | mescc-tools-extra a151c245e512, as live-bootstrap pins it | ✅ rejects | error: non-strict mode enabled, preparing for chaos unable to create long symlink |
The table below shows how many release tarballs have the features of this test case.
| ecosystem | tarballs | with it | share |
|---|---|---|---|
| Spack | 37,553 | 0 | none |
| nixpkgs | 18,990 | 0 | none |
| Guix | 10,168 | 0 | none |
| PyPI | 10,000 | 0 | none |
| crates.io | 5,000 | 0 | none |
| RubyGems | 5,000 | 0 | none |
| live-bootstrap | 171 | 0 | none |
| total (distinct) | 82,586 | 0 | none |