Working draft

N38 gnu-long-name-empty

An empty GNU long name: the name in the header, or none?

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

Category
name
Default policy
rejects it
Files
N38-gnu-long-name-empty.tar test archive, 2,560 bytes sha256 3f2d690c72a4a6244e1c434d236c34c59eb8091a1ccd7c9f92ef64625cfffb55
N38-gnu-long-name-empty.jsonexpected result
N38-gnu-long-name-empty.txtannotated blocks
N38-gnu-long-name-empty.pygenerator script

The case

The archive has a GNU long name header of size 0, then a file whose header has GNU's magic and the name header-name.

A GNU long name replaces the name of the next member, and GNU's format does not say what an empty one means. If it applies, the pathname of the member is empty, and in POSIX an empty pathname does not resolve. This case is ambiguous because a reader can take the empty long name in one of three ways. A reader that ignores it extracts header-name. One that applies it gives the member an empty name, which is skipped, rejected or taken for .. One that takes the name of the long name header itself extracts the member as ././@LongLink. To a reader that does not know typeflag L, the member is header-name, after an empty file @LongLink.

Decision point: whether an empty GNU long name replaces the name in the header.

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.

N38-gnu-long-name-empty: every block of the archive0x000000header: GNU long name, an empty long namename [0,100): "././@LongLink" + 87 NULnamemode [100,108): "0000644" + NUL, 644 (octal)uid [108,116): "0000000" + NUL, 0gid [116,124): "0000000" + NUL, 0size [124,136): "00000000000" + NUL, 0mtime [136,148): "00000000000" + NUL, 0chksum [148,156): "011221\0 ", 4753: the unsigned sum of the header, this field as spacestypeflag [156,157): "L", GNU long namelinkname [157,257): 100 NULlinknamemagic [257,263): "ustar "version [263,265): " " + NULuname [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 "././@LongLink" + 87 NULmagic "ustar "version " " + NUL0x000200header: regular filename [0,100): "header-name" + 89 NULnamemode [100,108): "0000644" + NUL, 644 (octal)uid [108,116): "0000000" + NUL, 0gid [116,124): "0000000" + NUL, 0size [124,136): "00000000014" + NUL, 12mtime [136,148): "00000000000" + NUL, 0chksum [148,156): "011231\0 ", 4761: the unsigned sum of the header, this field as spacestypeflag [156,157): "0", regular filelinkname [157,257): 100 NULlinknamemagic [257,263): "ustar "version [263,265): " " + NULuname [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 "header-name" + 89 NULmagic "ustar "version " " + NUL0x000400data12 bytes, then 500 NUL to the end of the block; "which name?\n""which name?\n"0x0006002 zero blocks: the end-of-archive markerbytes 0 to 512 of 1024: 512 NUL0x0008002 zero blocks, continuedbytes 512 to 1024 of 1024: 512 NUL0x000a00end of fileNULprintable ASCIIspacecontrol character, such as a newlinebyte over 0x7fwritten by the case itself
Every block, as text
N38-gnu-long-name-empty: must reject

An empty GNU long name: the name in the header, or none?

The archive has a GNU long name header of size 0, then a file whose header has GNU's magic and the
name `header-name`.

A GNU long name replaces the name of the next member, and GNU's format does not say what an empty
one means. If it applies, the pathname of the member is empty, and in POSIX an empty
pathname does not resolve. This case is ambiguous because a reader can take the
empty long name in one of three ways. A reader that ignores it extracts `header-name`. One that
applies it gives the member an empty name, which is skipped, rejected or taken for `.`. One that
takes the name of the long name header itself extracts the member as `././@LongLink`. To a reader
that does not know typeflag `L`, the member is `header-name`, after an empty file `@LongLink`.

Decision point: whether an empty GNU long name replaces the name in the header.
Seen in: none of the scanned tarballs.
See also: N17, an empty name, and N22, an empty pax `path`.

0x000000  header: GNU long name, an empty long name
          name     [  0,100)  "././@LongLink" + 87 NUL
          mode     [100,108)  "0000644" + NUL  644 (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)  "011221\0 "  4753: the unsigned sum of the header, this field as spaces
          typeflag [156,157)  "L"  GNU long name
          linkname [157,257)  100 NUL
          magic    [257,263)  "ustar "
          version  [263,265)  " " + NUL
          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  header: regular file
          name     [  0,100)  "header-name" + 89 NUL
          mode     [100,108)  "0000644" + NUL  644 (octal)
          uid      [108,116)  "0000000" + NUL  0
          gid      [116,124)  "0000000" + NUL  0
          size     [124,136)  "00000000014" + NUL  12
          mtime    [136,148)  "00000000000" + NUL  0
          chksum   [148,156)  "011231\0 "  4761: 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 "
          version  [263,265)  " " + NUL
          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
0x000400  data
          12 bytes, then 500 NUL to the end of the block
          "which name?\n"
0x000600  2 zero blocks: the end-of-archive marker
0x000a00  end of file
Every byte, as a hex dump

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

00000000: 2e2f 2e2f 404c 6f6e 674c 696e 6b00 0000  ././@LongLink...
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 3030 3030 3000 3030 3030 3030 3030  0000000.00000000
00000090: 3030 3000 3031 3132 3231 0020 4c00 0000  000.011221. L...
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 2020 0000 0000 0000 0000  .ustar  ........
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: 6865 6164 6572 2d6e 616d 6500 0000 0000  header-name.....
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 3030 3030 3634 3400 3030 3030  ....0000644.0000
00000270: 3030 3000 3030 3030 3030 3000 3030 3030  000.0000000.0000
00000280: 3030 3030 3031 3400 3030 3030 3030 3030  0000014.00000000
00000290: 3030 3000 3031 3132 3331 0020 3000 0000  000.011231. 0...
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: 0075 7374 6172 2020 0000 0000 0000 0000  .ustar  ........
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 0030 3030 3030 3030  .........0000000
00000350: 0030 3030 3030 3030 0000 0000 0000 0000  .0000000........
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: 7768 6963 6820 6e61 6d65 3f0a 0000 0000  which name?.....
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  ................
00000800: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000810: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000820: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000830: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000840: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000850: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000860: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000870: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000880: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000890: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000008a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000008b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000008c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000008d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000008e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000008f0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000900: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000910: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000920: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000930: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000940: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000950: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000960: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000970: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000980: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000990: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000009a0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000009b0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000009c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000009d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000009e0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
000009f0: 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✅ rejectserror: tar: Substituting `.' for empty member name tar: .: Cannot open: File exists tar: Exiting with failure status due to previous errors
bsdtarbsdtar 3.8.11 - libarchive 3.8.11⚠️ acceptstree A: header-name (12 B, a578eb49)
BusyBox tarBusyBox v1.38.0, defconfig✅ rejectserror: tar: can't open '': No such file or directory
7-Zip7-Zip (z) 26.05 (x64)⚠️ acceptstree A: header-name (12 B, a578eb49)
Python tarfile, filter=data, as in pipCPython 3.15.2✅ rejectserror: IsADirectoryError: [Errno 21] Is a directory: 'DEST'
Python tarfile, filter=tarCPython 3.15.2✅ rejectserror: IsADirectoryError: [Errno 21] Is a directory: 'DEST'
Python tarfile, filter=fully_trustedCPython 3.15.2✅ rejectserror: IsADirectoryError: [Errno 21] Is a directory: 'DEST'
node-tartar 7.5.22⚠️ acceptstree A: header-name (12 B, a578eb49)
node-tar, stricttar 7.5.22⚠️ acceptstree A: header-name (12 B, a578eb49)
tar-fstar-fs 3.1.3, on tar-stream 3.2.2✅ rejectserror: Error: Unexpected end of data
Java Commons CompressCommons Compress 1.28.0, Expander, on Java 27.0.1.0.2✅ rejectserror: java.nio.file.FileSystemException: DEST: Is a directory
.NET System.Formats.TarSystem.Formats.Tar of .NET 10.0.14, ExtractToDirectory⚠️ acceptstree B: @LongLink (12 B, a578eb49)
PHP PharData, as in ComposerPharData of PHP 8.5.12, as Composer's TarDownloader calls it✅ rejectserror: UnexpectedValueException: phar error: "suite/archives/N38-gnu-long-name-empty.tar" is a corrupted tar file (invalid entry size)
Go containerd archive.Applycontainerd v2.4.2, archive.Apply, of go1.27.3⚠️ acceptstree A: header-name (12 B, a578eb49)
Rust tartar 0.4.46, unpack⚠️ acceptstree C: nothing
Rust astral-tokio-tarastral-tokio-tar 0.7.1, unpack⚠️ acceptstree C: nothing
Rust tar-codec, as in uvtar-codec 0.0.16, with the policies of uv 0.13✅ rejectserror: at byte 0: malformed GNU LongName metadata payload: declared payload size is zero
RubyGemsRubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz⚠️ acceptstree A: header-name (12 B, a578eb49)
R untar, internalutils::untar of R 4.6.2, tar = "internal"⚠️ crashesargument must be coercible to non-negative integer Warning message: In max(which(block > 0)) : no non-missing arguments to max; returning -Inf
Perl Archive::TarArchive::Tar 3.12 of Perl v5.44.0✅ rejectserror: status 1
Haskell tartar 0.7.2.0, extract, of GHC 9.14✅ rejectserror: Invalid file name in tar archive: ""
Julia Tar.jlTar 1.10.0 of Julia 1.13.3⚠️ crashesBoundsError: attempt to access 0-element view(::Vector{UInt8}, 1:0) with eltype UInt8 at index [0]
live-bootstrap untarmescc-tools-extra a151c245e512, as live-bootstrap pins it✅ rejectserror: unable to create long symlink
live-bootstrap untar, --non-strictmescc-tools-extra a151c245e512, as live-bootstrap pins it✅ rejectserror: non-strict mode enabled, preparing for chaos unable to create long symlink

Prevalence in release tarballs

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

ecosystemtarballswith itshare
Spack37,5530none
nixpkgs18,9900none
Guix10,1680none
PyPI10,0000none
crates.io5,0000none
RubyGems5,0000none
live-bootstrap1710none
total (distinct)82,5860none

See also