Working draft

F08 end-truncated-in-member

An archive that ends inside the data of a member.

Reject(draft) A strict parser must reject this archive.

Category
framing
Default policy
rejects it
Files
F08-end-truncated-in-member.tar test archive, 1,024 bytes sha256 35037d1ee6f615792e618cecf2ab53fa7864e5884d5d648340761968f3ad9378
F08-end-truncated-in-member.jsonexpected result
F08-end-truncated-in-member.txtannotated blocks
F08-end-truncated-in-member.pygenerator script

The case

The size field in the header of a is 1024, but the archive ends after 512 bytes of its data.

Decision point: whether a member that is cut short is extracted.

Seen in: none of the scanned tarballs.

The archive

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

F08-end-truncated-in-member: every block of the archive0x000000header: regular file, size 1024name [0,100): "a" + 99 NULnamemode [100,108): "0000644" + NUL, 644 (octal)uid [108,116): "0000000" + NUL, 0gid [116,124): "0000000" + NUL, 0size [124,136): "00000002000" + NUL, 1024mtime [136,148): "00000000000" + NUL, 0chksum [148,156): "007340\0 ", 3808: 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 NUL0x000200data: the first 512 of the 1024 bytes, and then the file ends512 bytes; "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…0x000400end of fileNULprintable ASCIIspacecontrol character, such as a newlinebyte over 0x7fwritten by the case itself
Every block, as text
F08-end-truncated-in-member: must reject

An archive that ends inside the data of a member.

The size field in the header of `a` is 1024, but the archive ends after 512 bytes of its data.

Decision point: whether a member that is cut short is extracted.
Seen in: none of the scanned tarballs.
See also: F04, an archive cut short after a complete member, or one without an end-of-archive
marker, which is rejected as well.

0x000000  header: regular file, size 1024
          name     [  0,100)  "a" + 99 NUL
          mode     [100,108)  "0000644" + NUL  644 (octal)
          uid      [108,116)  "0000000" + NUL  0
          gid      [116,124)  "0000000" + NUL  0
          size     [124,136)  "00000002000" + NUL  1024
          mtime    [136,148)  "00000000000" + NUL  0
          chksum   [148,156)  "007340\0 "  3808: 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: the first 512 of the 1024 bytes, and then the file ends
          512 bytes
          "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
0x000400  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 3030 3030 3634 3400 3030 3030  ....0000644.0000
00000070: 3030 3000 3030 3030 3030 3000 3030 3030  000.0000000.0000
00000080: 3030 3032 3030 3000 3030 3030 3030 3030  0002000.00000000
00000090: 3030 3000 3030 3733 3430 0020 3000 0000  000.007340. 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: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000210: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000220: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000230: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000240: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000250: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000260: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000270: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000280: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000290: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000002a0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000002b0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000002c0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000002d0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000002e0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000002f0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000300: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000310: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000320: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000330: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000340: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000350: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000360: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000370: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000380: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
00000390: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000003a0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000003b0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000003c0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000003d0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000003e0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx
000003f0: 7878 7878 7878 7878 7878 7878 7878 7878  xxxxxxxxxxxxxxxx

What implementations make of it

implementationversionoutcomewhat it makes of it
GNU tartar (GNU tar) 1.35✅ as the verdict sayserror: tar: Unexpected EOF in archive tar: Unexpected EOF in archive tar: Error is not recoverable: exiting now
bsdtarbsdtar 3.8.10 - libarchive 3.8.10✅ as the verdict sayserror: a: Truncated tar archive detected while reading data: Unknown error -1 bsdtar: Error exit delayed from previous errors
BusyBox tarBusyBox v1.38.0, defconfig✅ as the verdict sayserror: tar: short read
7-Zip7-Zip (z) 26.05 (x64)✅ as the verdict sayserror: ERRORS: Unexpected end of archive ERROR: Data Error : a
Python tarfile, filter=data, as in pipCPython 3.15.2✅ as the verdict sayserror: ReadError: unexpected end of data
Python tarfile, filter=tarCPython 3.15.2✅ as the verdict sayserror: ReadError: unexpected end of data
Python tarfile, filter=fully_trustedCPython 3.15.2✅ as the verdict sayserror: ReadError: unexpected end of data
node-tartar 7.5.22✅ as the verdict sayserror: Error: TAR_BAD_ARCHIVE: Truncated input (needed 512 more bytes, only 0 available)
node-tar, stricttar 7.5.22✅ as the verdict sayserror: Error: TAR_BAD_ARCHIVE: Truncated input (needed 512 more bytes, only 0 available)
tar-fstar-fs 3.1.3, on tar-stream 3.2.2✅ as the verdict sayserror: Error: Unexpected end of data
Java Commons CompressCommons Compress 1.28.0, Expander, on Java 27.0.1.0.2✅ as the verdict sayserror: java.io.IOException: Truncated TAR archive
.NET System.Formats.TarSystem.Formats.Tar of .NET 10.0.14, ExtractToDirectory✅ as the verdict sayserror: EndOfStreamException: Unable to read beyond the end of the stream.
PHP PharData, as in ComposerPharData of PHP 8.5.12, as Composer's TarDownloader calls it✅ as the verdict sayserror: UnexpectedValueException: phar error: "suite/archives/F08-end-truncated-in-member.tar" is a corrupted tar file (truncated)
Go containerd archive.Applycontainerd v2.4.2, archive.Apply, of go1.27.3✅ as the verdict sayserror: unexpected EOF
Rust tartar 0.4.46, unpack✅ as the verdict sayserror: failed to unpack `DEST/a`
Rust astral-tokio-tarastral-tokio-tar 0.7.0, unpack✅ as the verdict sayserror: failed to unpack `DEST/a`
Rust tar-codec, as in uvtar-codec 0.0.15, with the policies of uv 0.13✅ as the verdict sayserror: at byte 1024: unexpected end of stream: Member payload needs 512 more bytes
RubyGemsRubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz✅ as the verdict sayserror: EOFError: end of file reached
R untar, internalutils::untar of R 4.6.1, tar = "internal"✅ as the verdict sayserror: incomplete block on file
Perl Archive::TarArchive::Tar 3.12 of Perl v5.44.0✅ as the verdict sayserror: Read error on tarfile (missing data) 'a' at offset unknown at contrib/matrix/runners/perl/extract.pl line 12. Read error on tarfile (missing data) 'a' at offset unknown
Haskell tartar 0.7.2.0, extract, of GHC 9.14✅ as the verdict sayserror: TruncatedArchive
Julia Tar.jlTar 1.10.0 of Julia 1.13.3✅ as the verdict sayserror: EOFError: read end of file
live-bootstrap untarmescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc✅ as the verdict sayserror: Short read on suite/archives/F08-end-truncated-in-member.tar: Expected 512, got The extraction of suite/archives/F08-end-truncated-in-member.tar produced errors 0
live-bootstrap untar, --non-strictmescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc✅ as the verdict sayserror: non-strict mode enabled, preparing for chaos Short read on suite/archives/F08-end-truncated-in-member.tar: Expected 512, got The extraction of suite/archives/F08-end-truncated-in-member.tar produced …

Prevalence in release tarballs

This case is not measured in release tarballs: tarscan.py stops at an archive cut short with an error, which none of the scanned tarballs has.

See also