Working draft

F01 number-leading-space

Numeric fields padded with spaces rather than zeros, as old tars wrote them.

Tolerate(draft) A strict parser may reject this archive. If it accepts it, it must extract the tree below.

Category
framing
Default policy
accepts number.mode.leading-space: octal padded with spaces, not zeros, which implementations read alike; accepts number.size.leading-space: octal padded with spaces, not zeros, which implementations read alike
Files
F01-number-leading-space.tar test archive, 2,048 bytes sha256 477e9cbc49f296f979de55483e30823676c8fbe0864ad85c8e7cb1099ceb8d74
F01-number-leading-space.jsonexpected result
F01-number-leading-space.txtannotated blocks
F01-number-leading-space.pygenerator script

The case

The mode, uid, gid, size and mtime fields are padded with spaces, such as 7 for the size of a. In POSIX, numeric fields are leading zero-filled octal numbers.

The tree to extract:

pathkindcontents
afile7 bytes, sha256 e47fbedb

Seen in: hundreds of tarballs, many from CPAN: the same as F32, whose checksum is padded too.

The archive

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

F01-number-leading-space: every block of the archive0x000000header: regular filename [0,100): "a" + 99 NULnamemode [100,108): " 644 " + NULuid [108,116): " 0 " + NULgid [116,124): " 0 " + NULsize [124,136): " 7 "mtime [136,148): " 0 "chksum [148,156): "006345\0 ", 3301: the unsigned sum of the header, this field as spacestypeflag [156,157): "0", regular filelinkname [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): 155 NULprefixpad [500,512): 12 NULname "a" + 99 NULmode " 644 " + NULuid " 0 " + NULgid " 0 " + NULsize " 7 "mtime " 0 "0x000200data7 bytes, then 505 NUL to the end of the block; "spaces\n""spaces\n"0x0004002 zero blocks: the end-of-archive markerbytes 0 to 512 of 1024: 512 NUL0x0006002 zero blocks, continuedbytes 512 to 1024 of 1024: 512 NUL0x000800end of fileNULprintable ASCIIspacecontrol character, such as a newlinebyte over 0x7fwritten by the case itself
Every block, as text
F01-number-leading-space: tolerated: a strict parser may reject it; if it accepts it, it must extract its tree, and the default policy accepts it

Numeric fields padded with spaces rather than zeros, as old tars wrote them.

The mode, uid, gid, size and mtime fields are padded with spaces, such as `          7 ` for the
size of `a`. In POSIX, numeric fields are leading zero-filled octal numbers.

Seen in: hundreds of tarballs, many from CPAN: the same as F32, whose checksum is padded too.

0x000000  header: regular file
          name     [  0,100)  "a" + 99 NUL
          mode     [100,108)  "   644 " + NUL
          uid      [108,116)  "     0 " + NUL
          gid      [116,124)  "     0 " + NUL
          size     [124,136)  "          7 "
          mtime    [136,148)  "          0 "
          chksum   [148,156)  "006345\0 "  3301: 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" + 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)  155 NUL
          pad      [500,512)  12 NUL
0x000200  data
          7 bytes, then 505 NUL to the end of the block
          "spaces\n"
0x000400  2 zero blocks: the end-of-archive marker
0x000800  end of file
Every byte, as a hex dump

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

00000000: 6100 0000 0000 0000 0000 0000 0000 0000  a...............
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 2020 2036 3434 2000 2020 2020  ....   644 .    
00000070: 2030 2000 2020 2020 2030 2000 2020 2020   0 .     0 .    
00000080: 2020 2020 2020 3720 2020 2020 2020 2020        7         
00000090: 2020 3020 3030 3633 3435 0020 3000 0000    0 006345. 0...
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 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: 7370 6163 6573 0a00 0000 0000 0000 0000  spaces..........
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  ................
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  ................

What implementations make of it

implementationversionoutcomewhat it makes of it
GNU tartar (GNU tar) 1.35➕ acceptsthe tree of the case
bsdtarbsdtar 3.8.10 - libarchive 3.8.10➕ acceptsthe tree of the case
BusyBox tarBusyBox v1.38.0, defconfig➕ acceptsthe tree of the case
7-Zip7-Zip (z) 26.05 (x64)➕ acceptsthe tree of the case
Python tarfile, filter=data, as in pipCPython 3.15.2➕ acceptsthe tree of the case
Python tarfile, filter=tarCPython 3.15.2➕ acceptsthe tree of the case
Python tarfile, filter=fully_trustedCPython 3.15.2➕ acceptsthe tree of the case
node-tartar 7.5.22➕ acceptsthe tree of the case
node-tar, stricttar 7.5.22➕ acceptsthe tree of the case
tar-fstar-fs 3.1.3, on tar-stream 3.2.2➕ acceptsthe tree of the case
Java Commons CompressCommons Compress 1.28.0, Expander, on Java 27.0.1.0.2➕ acceptsthe tree of the case
.NET System.Formats.TarSystem.Formats.Tar of .NET 10.0.14, ExtractToDirectory➕ acceptsthe tree of the case
PHP PharData, as in ComposerPharData of PHP 8.5.12, as Composer's TarDownloader calls it➕ acceptsthe tree of the case
Go containerd archive.Applycontainerd v2.4.2, archive.Apply, of go1.27.3➕ acceptsthe tree of the case
Rust tartar 0.4.46, unpack➕ acceptsthe tree of the case
Rust astral-tokio-tarastral-tokio-tar 0.7.0, unpack➕ acceptsthe tree of the case
Rust tar-codec, as in uvtar-codec 0.0.15, with the policies of uv 0.13➖ rejectserror: at byte 0: invalid tar size field: found [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 55, 32]
RubyGemsRubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz➕ acceptsthe tree of the case
R untar, internalutils::untar of R 4.6.1, tar = "internal"➕ acceptsthe tree of the case
Perl Archive::TarArchive::Tar 3.12 of Perl v5.44.0➕ acceptsthe tree of the case
Haskell tartar 0.7.2.0, extract, of GHC 9.14➕ acceptsthe tree of the case
Julia Tar.jlTar 1.10.0 of Julia 1.13.3➕ acceptsthe tree of the case
live-bootstrap untarmescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc➕ acceptsthe tree of the case
live-bootstrap untar, --non-strictmescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc➕ acceptsthe tree of the case

Prevalence in release tarballs

Release tarballs of Spack, nixpkgs, Guix and live-bootstrap, and samples of PyPI, crates.io and RubyGems with number.mode.leading-space, number.size.leading-space. The default policy accepts them.

ecosystemtarballswith itshare
Spack37,5531960.52%
nixpkgs18,9905452.87%
Guix10,1682722.68%
PyPI10,0000none
crates.io5,0000none
RubyGems5,0000none
live-bootstrap17184.68%
total (distinct)82,5868190.99%

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