Working draft

live-bootstrap untar, --non-strict

Version
mescc-tools-extra a151c245e512, as live-bootstrap pins it, built with cc
Other configurations

This implementation follows the default policy in 18 of 78 cases:

The default policy is a working draft. Where an implementation does not do as it says, that can be a choice rather than a bug.

On the other 60, it does not:

↑Writes outside the destination (3)

casewhat it iswhat it makes of it
N12 name-absoluteAn absolute name, which points outside the directory the archive is extracted to.writes outside: /tmp/tar-minefield-absolute (89 B, 3b7f22a5)
N16 name-dotdotA name with .., which climbs out of the directory the archive is extracted to.writes outside: x/y/tar-minefield-escaped (85 B, fc503701)
S11 tree-through-symlinkA member written through a symlink, which points out of the destination.writes outside: x/y/tar-minefield-through-symlink (89 B, 3b7f22a5)

!Accepts cases to reject (49)

casewhat it iswhat it makes of it
F03 end-lone-zero-blockAn end-of-archive marker of one zero block, not two.extracts a (2 B, 87428fc5)
F06 checksum-signedA checksum that only matches as the signed sum of the header.extracts a (2 B, 87428fc5)
F07 end-archive-afterAnother archive after the end-of-archive marker.extracts a (2 B, 87428fc5)
F09 end-zero-block-then-memberA zero block, then another member: the end of the archive, or not?extracts a (2 B, 87428fc5)
F11 magic-odd-versionThe POSIX magic with a version that is neither 00 nor NULs.extracts a (2 B, 87428fc5)
F12 number-size-gapA size with a space among its digits, which reads as two sizes.extracts a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F13 pax-newline-in-pathA newline in a pax path, which split on lines is another record.extracts PaxHeader (25 B, 19000a4f), plain (12 B, a578eb49)
F15 pax-size-on-dirA pax size on a directory, which takes the next header for its data.extracts PaxHeader (12 B, 609af461), dir/, dir/smuggled (0 B, e3b0c442)
F16 type-unknownAn unknown typeflag with a size: data, or no data?extracts unknown (512 B, 917dba8e)
F19 pax-global-between-extended-and-memberA global pax header between an extended header and its member.extracts PaxHeader (17 B, 45b5e3aa), header-name (12 B, a578eb49), pax_global_header (19 B, d0b8d0ef)
F20 pax-global-sizeA global pax header with a size, which frames every member after it, or none.extracts a (0 B, e3b0c442), pax_global_header (12 B, 609af461), smuggled (0 B, e3b0c442)
F21 pax-size-emptyAn empty pax size, which in POSIX removes the size rather than giving one.extracts PaxHeader (8 B, facaf1d1), a (512 B, 917dba8e)
F22 pax-size-negativeA negative pax size, which a member cannot have.extracts PaxHeader (13 B, db55a159), a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F23 pax-size-plusA pax size with a plus sign, +512, which conversions of strings to numbers accept.extracts PaxHeader (13 B, 7cc19464), a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F24 pax-size-leading-spaceA pax size with a leading space, 512, which conversions of strings to numbers skip.extracts PaxHeader (13 B, 62deb37f), a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F25 pax-size-not-ascii-digitsA pax size in Arabic-Indic digits, ٥١٢, which some conversions of strings read as 512.extracts PaxHeader (15 B, 33c621af), a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F26 pax-size-leading-zeroA pax size with a leading zero, 0777: 777 in decimal, as POSIX says, or 511 in octal.extracts PaxHeader (13 B, fa5ee474), a (0 B, e3b0c442), smuggled-1 (0 B, e3b0c442), smuggled-2 (0 B, e3b0c442)
F27 pax-size-too-largeA pax size of 2^64 + 512, which wraps around to 512 in 64 bits.extracts PaxHeader (29 B, 45e3bb26), a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F28 pax-newline-in-commentA newline in a pax comment, which split on lines leaves a size record.extracts PaxHeader (25 B, 99e4ec94), a (0 B, e3b0c442), smuggled (0 B, e3b0c442)
F33 size-on-dirA size in the header of a directory, which takes the next header for its data.extracts dir/, dir/smuggled (0 B, e3b0c442)
F34 size-on-hardlinkA size in the header of a hard link, in a pax archive, which takes the next header for its data.extracts PaxHeader (11 B, 2fb5f8c5), a (2 B, 87428fc5)
F35 pax-size-on-hardlinkA pax size on a hard link, which takes the next header for its data.extracts PaxHeader (12 B, 609af461), a (2 B, 87428fc5), smuggled (0 B, e3b0c442)
F36 pax-record-length-shortA pax record whose length is one byte short, so that it ends just before its newline.extracts PaxHeader (17 B, 51e09037), from-header (12 B, a578eb49)
N09 extended-two-pax-headersTwo pax extended headers for one member, with different paths.extracts PaxHeader (15 B, 7c8761f1), header-name (12 B, a578eb49)
N10 format-starA ustar prefix whose end reads as star's times, with star's tar\0 at offset 508.extracts a (2 B, 87428fc5)
N11 gnu-prefix-fieldThe prefix field of a header with GNU magic, which GNU tar uses for times in incremental archives.extracts a (2 B, 87428fc5)
N13 name-backslashA backslash in a name: a character on Unix, a separator on Windows.extracts a\b (21 B, 15acfc39)
N14 name-bytes-after-nulBytes after the NUL that ends a name.extracts a (10 B, ef476e8d)
N17 name-emptyA member with an empty name.extracts nothing
N19 pax-nul-in-pathA NUL inside a pax path.extracts PaxHeader (12 B, 6f855603), header-name (12 B, 627be4bf)
N20 pax-repeated-keyOne pax key twice in one extended header.extracts PaxHeader (29 B, 14422e4d), header-name (12 B, a578eb49)
N21 pax-global-pathA global pax header with a path.extracts a (2 B, 87428fc5), b (2 B, 02638299), pax_global_header (20 B, d5acb589)
N22 pax-path-emptyAn empty pax path, which in POSIX removes the path rather than giving one.extracts PaxHeader (8 B, b6553e3e), from-header (12 B, a578eb49)
N24 pax-hdrcharset-binaryhdrcharset=BINARY, which declares a pax path that is not UTF-8 as bytes.extracts PaxHeader (34 B, dfe2f7e0), cafe (12 B, a578eb49)
N25 symlink-empty-targetA symlink with an empty target.extracts nothing
N26 pax-global-path-then-emptyA global path, then a global header that removes it with an empty value.extracts a (12 B, a578eb49), pax_global_header (8 B, b6553e3e)
K01 kind-trailing-slash-fileA regular file whose name ends in a slash: a file, or a directory?extracts a/
K02 linkname-on-fileA regular file with a link target.extracts a (19 B, bc345849)
K03 symlink-trailing-slashA symlink whose name ends in a slash.extracts target/
S03 hardlink-missing-targetA hardlink to a member that is not in the archive.extracts nothing
S04 hardlink-to-itselfA hardlink to itself.extracts a (2 B, 87428fc5)
S05 hardlink-to-later-memberA hardlink to a member that comes later.extracts f (2 B, 092fcfbb)
S06 hardlink-to-symlinkA hardlink to a symlink: a link to the symlink, or to its target?extracts f (2 B, 092fcfbb), s → f
S07 tree-duplicate-file-differsThe same file twice, with different contents: the first copy, or the last?extracts a (5 B, 761d1fb1)
S08 tree-duplicate-file-dirA file, then a directory of the same name.extracts a (13 B, 294e546a)
S09 tree-duplicate-file-identicalThe same file twice, with the same contents.extracts a (5 B, a6328afc)
S10 tree-symlink-then-fileA symlink, then a file of the same name: replace the link, or write through it?extracts a → target, target (28 B, d5a04bbb)
S12 tree-under-fileA member under a file.extracts a (7 B, da69f286)
S13 hardlink-empty-targetA hardlink with an empty target.extracts a (2 B, 87428fc5)

✗Rejects cases to accept, or extracts another tree (8)

casewhat it iswhat it makes of it
F17 pax-global-commentThe global pax header with only a comment, as git archive writes it.extracts pax_global_header (52 B, e00a4a95), project/, project/README (6 B, 5891b5b5)
F31 pax-xattr-not-utf8An xattr in a pax header whose value is not UTF-8, as libarchive and star write them.extracts PaxHeader (29 B, e2035909), a (2 B, 87428fc5)
N01 gnu-long-nameA name over 100 bytes, in a GNU long name.error: non-strict mode enabled, preparing for chaos unable to create long symlink
N02 name-fills-fieldA name of exactly 100 bytes, which fills the name field without a NUL.extracts nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn0000644 (5 B, 0e716a5f)
N03 pax-long-nameA name over 100 bytes, in a pax path.extracts PaxHeader (131 B, 8cc43c67), dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd/, dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd/fffffffffffffffffffffffffffffffffffffff0000644 (5 B, bbdbb75b)
N04 ustar-prefixA long name split between the ustar prefix and name fields.extracts file (9 B, 7dd9c6f9)
F14 pax-size-disagreesA pax size that disagrees with the header's, so that a reader of the header's misses a member.extracts PaxHeader (9 B, 33638443), a (512 B, 917dba8e)
F18 pax-global-comment-after-membersA global pax header with only a comment, after the first member.extracts a (2 B, 87428fc5), b (2 B, 02638299), pax_global_header (19 B, 89c2f7ac)