F08 end-truncated-in-memberAn archive that ends inside the data of a member.
Reject(draft) A strict parser must reject this archive.
F08-end-truncated-in-member.tar |
test archive, 1,024 bytes
sha256 35037d1ee6f615792e618cecf2ab53fa7864e5884d5d648340761968f3ad9378 |
F08-end-truncated-in-member.json | expected result |
F08-end-truncated-in-member.txt | annotated blocks |
F08-end-truncated-in-member.py | generator script |
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.
Every block of 512 bytes, to scale, with its offset. Hover over a field for its bytes.
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
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
| implementation | version | outcome | what it makes of it |
|---|---|---|---|
| GNU tar | tar (GNU tar) 1.35 | ✅ as the verdict says | error: tar: Unexpected EOF in archive tar: Unexpected EOF in archive tar: Error is not recoverable: exiting now |
| bsdtar | bsdtar 3.8.10 - libarchive 3.8.10 | ✅ as the verdict says | error: a: Truncated tar archive detected while reading data: Unknown error -1 bsdtar: Error exit delayed from previous errors |
| BusyBox tar | BusyBox v1.38.0, defconfig | ✅ as the verdict says | error: tar: short read |
| 7-Zip | 7-Zip (z) 26.05 (x64) | ✅ as the verdict says | error: ERRORS: Unexpected end of archive ERROR: Data Error : a |
| Python tarfile, filter=data, as in pip | CPython 3.15.2 | ✅ as the verdict says | error: ReadError: unexpected end of data |
| Python tarfile, filter=tar | CPython 3.15.2 | ✅ as the verdict says | error: ReadError: unexpected end of data |
| Python tarfile, filter=fully_trusted | CPython 3.15.2 | ✅ as the verdict says | error: ReadError: unexpected end of data |
| node-tar | tar 7.5.22 | ✅ as the verdict says | error: Error: TAR_BAD_ARCHIVE: Truncated input (needed 512 more bytes, only 0 available) |
| node-tar, strict | tar 7.5.22 | ✅ as the verdict says | error: Error: TAR_BAD_ARCHIVE: Truncated input (needed 512 more bytes, only 0 available) |
| tar-fs | tar-fs 3.1.3, on tar-stream 3.2.2 | ✅ as the verdict says | error: Error: Unexpected end of data |
| Java Commons Compress | Commons Compress 1.28.0, Expander, on Java 27.0.1.0.2 | ✅ as the verdict says | error: java.io.IOException: Truncated TAR archive |
| .NET System.Formats.Tar | System.Formats.Tar of .NET 10.0.14, ExtractToDirectory | ✅ as the verdict says | error: EndOfStreamException: Unable to read beyond the end of the stream. |
| PHP PharData, as in Composer | PharData of PHP 8.5.12, as Composer's TarDownloader calls it | ✅ as the verdict says | error: UnexpectedValueException: phar error: "suite/archives/F08-end-truncated-in-member.tar" is a corrupted tar file (truncated) |
| Go containerd archive.Apply | containerd v2.4.2, archive.Apply, of go1.27.3 | ✅ as the verdict says | error: unexpected EOF |
| Rust tar | tar 0.4.46, unpack | ✅ as the verdict says | error: failed to unpack `DEST/a` |
| Rust astral-tokio-tar | astral-tokio-tar 0.7.0, unpack | ✅ as the verdict says | error: failed to unpack `DEST/a` |
| Rust tar-codec, as in uv | tar-codec 0.0.15, with the policies of uv 0.13 | ✅ as the verdict says | error: at byte 1024: unexpected end of stream: Member payload needs 512 more bytes |
| RubyGems | RubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz | ✅ as the verdict says | error: EOFError: end of file reached |
| R untar, internal | utils::untar of R 4.6.1, tar = "internal" | ✅ as the verdict says | error: incomplete block on file |
| Perl Archive::Tar | Archive::Tar 3.12 of Perl v5.44.0 | ✅ as the verdict says | error: 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 tar | tar 0.7.2.0, extract, of GHC 9.14 | ✅ as the verdict says | error: TruncatedArchive |
| Julia Tar.jl | Tar 1.10.0 of Julia 1.13.3 | ✅ as the verdict says | error: EOFError: read end of file |
| live-bootstrap untar | mescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc | ✅ as the verdict says | error: 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-strict | mescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc | ✅ as the verdict says | error: 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 … |
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.
F04: an archive cut short after a complete member, or one without an end-of-archive marker, which is rejected as well.