Working draft

K07 dir-name-empty-with-prefix

A directory with an empty name field and a prefix.

Accept(draft) Every implementation must accept this archive, and extract the expected tree below.

Category
kind
Default policy
accepts it, as it allows the ustar prefix field
Files
K07-dir-name-empty-with-prefix.tar test archive, 1,536 bytes sha256 e5358bf154e268e6dbfb4e4931d47c72ac2a16a7f95519be5768e5c22b2786dc
K07-dir-name-empty-with-prefix.jsonexpected result
K07-dir-name-empty-with-prefix.txtannotated blocks
K07-dir-name-empty-with-prefix.pygenerator script

The case

The archive has one directory, of typeflag 5, with an empty name field and the prefix dir.

In POSIX, the pathname is the prefix, followed by /, followed by the name. The name is empty here, so the pathname is dir/. The typeflag and the trailing slash both make the member a directory dir.

The expected tree:

pathkindcontents
dir/directory

Seen in: not measured, as the scans do not record an empty name field. Python's tarfile writes one, with the prefix, for a directory whose last component is 100 bytes or longer, in a path of at most 155 bytes, in the ustar format.

The archive

Every block of 512 bytes, to scale, with its offset. Hover over a field for its bytes.

K07-dir-name-empty-with-prefix: every block of the archive0x000000header: directory, an empty name, and the prefix dirname [0,100): 100 NULnamemode [100,108): "0000755" + NUL, 755 (octal)uid [108,116): "0000000" + NUL, 0gid [116,124): "0000000" + NUL, 0size [124,136): "00000000000" + NUL, 0mtime [136,148): "00000000000" + NUL, 0chksum [148,156): "007704\0 ", 4036: the unsigned sum of the header, this field as spacestypeflag [156,157): "5", directorylinkname [157,257): 100 NULlinknamemagic [257,263): "ustar" + NULversion [263,265): "00"uname [265,297): 32 NULunamegname [297,329): 32 NULgnamedevmajor [329,337): "0000000" + NUL, 0devminor [337,345): "0000000" + NUL, 0prefix [345,500): "dir" + 152 NULprefixpad [500,512): 12 NULprefix "dir" + 152 NUL0x0002002 zero blocks: the end-of-archive markerbytes 0 to 512 of 1024: 512 NUL0x0004002 zero blocks, continuedbytes 512 to 1024 of 1024: 512 NUL0x000600end of fileNULprintable ASCIIspacecontrol character, such as a newlinebyte over 0x7fwritten by the case itself
Every block, as text
K07-dir-name-empty-with-prefix: must accept, and extract its tree

A directory with an empty name field and a prefix.

The archive has one directory, of typeflag `5`, with an empty name field and the prefix `dir`.

In POSIX, the pathname is the prefix, followed by `/`, followed by the name. The name is
empty here, so the pathname is `dir/`. The typeflag and the trailing slash both make the member a
directory `dir`.

Seen in: not measured, as the scans do not record an empty name field. Python's `tarfile` writes
one, with the prefix, for a directory whose last component is 100 bytes or longer, in a path of at
most 155 bytes, in the ustar format.
See also: K04, the same with a regular file.

0x000000  header: directory, an empty name, and the prefix dir
          name     [  0,100)  100 NUL
          mode     [100,108)  "0000755" + NUL  755 (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)  "007704\0 "  4036: the unsigned sum of the header, this field as spaces
          typeflag [156,157)  "5"  directory
          linkname [157,257)  100 NUL
          magic    [257,263)  "ustar" + NUL
          version  [263,265)  "00"
          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)  "dir" + 152 NUL
          pad      [500,512)  12 NUL
0x000200  2 zero blocks: the end-of-archive marker
0x000600  end of file
Every byte, as a hex dump

As xxd writes it: xxd -r makes the archive of it.

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
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 3735 3500 3030 3030  ....0000755.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 3030 3737 3034 0020 3500 0000  000.007704. 5...
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 0030 3000 0000 0000 0000  .ustar.00.......
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 0064 6972 0000 0000  .0000000.dir....
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: 0000 0000 0000 0000 0000 0000 0000 0000  ................
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 0000 0000 0000 0000 0000 0000  ................
00000270: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000280: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000290: 0000 0000 0000 0000 0000 0000 0000 0000  ................
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: 0000 0000 0000 0000 0000 0000 0000 0000  ................
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 0000 0000 0000 0000  ................
00000350: 0000 0000 0000 0000 0000 0000 0000 0000  ................
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: 0000 0000 0000 0000 0000 0000 0000 0000  ................
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  ................

What implementations make of it

In the outcome column, ✅ means that the implementation follows the default policy.

implementationversionoutcomewhat it makes of it
GNU tartar (GNU tar) 1.35✅ acceptsthe expected tree
bsdtarbsdtar 3.8.11 - libarchive 3.8.11✅ acceptsthe expected tree
BusyBox tarBusyBox v1.38.0, defconfig✅ acceptsthe expected tree
7-Zip7-Zip (z) 26.05 (x64)✅ acceptsthe expected tree
Python tarfile, filter=data, as in pipCPython 3.15.2✅ acceptsthe expected tree
Python tarfile, filter=tarCPython 3.15.2✅ acceptsthe expected tree
Python tarfile, filter=fully_trustedCPython 3.15.2✅ acceptsthe expected tree
node-tartar 7.5.22✅ acceptsthe expected tree
node-tar, stricttar 7.5.22✅ acceptsthe expected tree
tar-fstar-fs 3.1.3, on tar-stream 3.2.2✅ acceptsthe expected tree
Java Commons CompressCommons Compress 1.28.0, Expander, on Java 27.0.1.0.2✅ acceptsthe expected tree
.NET System.Formats.TarSystem.Formats.Tar of .NET 10.0.14, ExtractToDirectory✅ acceptsthe expected tree
PHP PharData, as in ComposerPharData of PHP 8.5.12, as Composer's TarDownloader calls it❌ another tree, or rejectstree A: nothing
Go containerd archive.Applycontainerd v2.4.2, archive.Apply, of go1.27.3✅ acceptsthe expected tree
Rust tartar 0.4.46, unpack✅ acceptsthe expected tree
Rust astral-tokio-tarastral-tokio-tar 0.7.1, unpack✅ acceptsthe expected tree
Rust tar-codec, as in uvtar-codec 0.0.16, with the policies of uv 0.13✅ acceptsthe expected tree
RubyGemsRubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz✅ acceptsthe expected tree
R untar, internalutils::untar of R 4.6.2, tar = "internal"✅ acceptsthe expected tree
Perl Archive::TarArchive::Tar 3.12 of Perl v5.44.0❌ another tree, or rejectserror: status 1
Haskell tartar 0.7.2.0, extract, of GHC 9.14✅ acceptsthe expected tree
Julia Tar.jlTar 1.10.0 of Julia 1.13.3✅ acceptsthe expected tree
live-bootstrap untarmescc-tools-extra a151c245e512, as live-bootstrap pins it❌ another tree, or rejectstree A: nothing
live-bootstrap untar, --non-strictmescc-tools-extra a151c245e512, as live-bootstrap pins it❌ another tree, or rejectstree A: nothing

Prevalence in release tarballs

The table below shows how many release tarballs have the features of this test case. The default policy accepts them.

ecosystemtarballswith itshare
Spack37,5535,45914.54%
nixpkgs18,9906213.27%
Guix10,1683393.33%
PyPI10,00080.08%
crates.io5,000100.20%
RubyGems5,000661.32%
live-bootstrap17131.75%
total (distinct)82,5866,3177.65%

See a sample of these 6,317 tarballs, with the sha256 of each and an example from it.

See also