Working draft

N47 gnu-long-link

A symlink with a long target, in a GNU long link name.

Accept(draft) Every implementation must accept this archive, and extract the expected tree below.

Category
name
Default policy
accepts it, as it allows a linkname of exactly 100 bytes, without NUL
Files
N47-gnu-long-link.tar test archive, 2,560 bytes sha256 3f665d69ae2f31dbfae53161c690a6c600ce68032e8dc554136315eb15ab3978
N47-gnu-long-link.jsonexpected result
N47-gnu-long-link.txtannotated blocks
N47-gnu-long-link.pygenerator script

The case

The archive has a GNU long link name header, of typeflag K, whose data is 120 ts, followed by a NUL. After it is a symlink, of typeflag 2, with the name l and GNU's magic. Its linkname field contains the first 100 ts.

The long link name replaces the linkname field, so l points to the 120 ts. This is GNU tar's own format for long link targets.

The expected tree:

pathkindcontents
lsymlink→ tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt

Seen in: tarballs produced by GNU tar.

The archive

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

N47-gnu-long-link: every block of the archive0x000000header: GNU long link 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): "00000000171" + NUL, 121mtime [136,148): "00000000000" + NUL, 0chksum [148,156): "011231\0 ", 4761: the unsigned sum of the header, this field as spacestypeflag [156,157): "K", GNU long link 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 " " + NUL0x000200data: GNU long name121 bytes: the name and a NUL, then 391 NUL; "tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt" + NUL"tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt…0x000400header: symlinkname [0,100): "l" + 99 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): "036033\0 ", 15387: the unsigned sum of the header, this field as spacestypeflag [156,157): "2", symlinklinkname [157,257): "tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"linknamemagic [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 "l" + 99 NULlinkname "tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"magic "ustar "version " " + NUL0x0006002 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
N47-gnu-long-link: must accept, and extract its tree

A symlink with a long target, in a GNU long link name.

The archive has a GNU long link name header, of typeflag `K`, whose data is 120 `t`s, followed by a
NUL. After it is a symlink, of typeflag `2`, with the name `l` and GNU's magic. Its linkname field
contains the first 100 `t`s.

The long link name replaces the linkname field, so `l` points to the 120 `t`s. This is GNU tar's
own format for long link targets.

Seen in: tarballs produced by GNU tar.
See also: N01, a long name of a file, and N27, a long target in a pax `linkpath`.

0x000000  header: GNU long link 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)  "00000000171" + NUL  121
          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)  "K"  GNU long link 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  data: GNU long name
          121 bytes: the name and a NUL, then 391 NUL
          "tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt" + NUL
0x000400  header: symlink
          name     [  0,100)  "l" + 99 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)  "036033\0 "  15387: the unsigned sum of the header, this field as spaces
          typeflag [156,157)  "2"  symlink
          linkname [157,257)  "tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt"
          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
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 3137 3100 3030 3030 3030 3030  0000171.00000000
00000090: 3030 3000 3031 3132 3331 0020 4b00 0000  000.011231. K...
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: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000210: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000220: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000230: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000240: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000250: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000260: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000270: 7474 7474 7474 7474 0000 0000 0000 0000  tttttttt........
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: 6c00 0000 0000 0000 0000 0000 0000 0000  l...............
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 3030 3030 3634 3400 3030 3030  ....0000644.0000
00000470: 3030 3000 3030 3030 3030 3000 3030 3030  000.0000000.0000
00000480: 3030 3030 3030 3000 3030 3030 3030 3030  0000000.00000000
00000490: 3030 3000 3033 3630 3333 0020 3274 7474  000.036033. 2ttt
000004a0: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
000004b0: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
000004c0: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
000004d0: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
000004e0: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
000004f0: 7474 7474 7474 7474 7474 7474 7474 7474  tttttttttttttttt
00000500: 7475 7374 6172 2020 0000 0000 0000 0000  tustar  ........
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 0030 3030 3030 3030  .........0000000
00000550: 0030 3030 3030 3030 0000 0000 0000 0000  .0000000........
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✅ acceptsthe expected tree
bsdtarbsdtar 3.8.11 - libarchive 3.8.11✅ acceptsthe expected tree
BusyBox tarBusyBox v1.38.0, defconfig✅ acceptsthe expected tree
7-Zip7-Zip (z) 26.05 (x64)✅ acceptsthe expected tree
Python tarfile, filter=data, as in pipCPython 3.15.2✅ acceptsthe expected tree
Python tarfile, filter=tarCPython 3.15.2✅ acceptsthe expected tree
Python tarfile, filter=fully_trustedCPython 3.15.2✅ acceptsthe expected tree
node-tartar 7.5.22✅ acceptsthe expected tree
node-tar, stricttar 7.5.22✅ acceptsthe expected tree
tar-fstar-fs 3.1.3, on tar-stream 3.2.2✅ acceptsthe expected tree
Java Commons CompressCommons Compress 1.28.0, Expander, on Java 27.0.1.0.2❌ another tree, or rejectstree A: l (0 B, e3b0c442)
.NET System.Formats.TarSystem.Formats.Tar of .NET 10.0.14, ExtractToDirectory✅ acceptsthe expected tree
PHP PharData, as in ComposerPharData of PHP 8.5.12, as Composer's TarDownloader calls it❌ another tree, or rejectserror: UnexpectedValueException: phar error: "suite/archives/N47-gnu-long-link.tar" is a tar file with an unsupported GNU long link entry
Go containerd archive.Applycontainerd v2.4.2, archive.Apply, of go1.27.3✅ acceptsthe expected tree
Rust tartar 0.4.46, unpack✅ acceptsthe expected tree
Rust astral-tokio-tarastral-tokio-tar 0.7.1, unpack✅ acceptsthe expected tree
Rust tar-codec, as in uvtar-codec 0.0.16, with the policies of uv 0.13✅ acceptsthe expected tree
RubyGemsRubyGems 4.0.20 of Ruby 4.0.9, extract_tar_gz❌ another tree, or rejectstree B: nothing
R untar, internalutils::untar of R 4.6.2, tar = "internal"✅ acceptsthe expected tree
Perl Archive::TarArchive::Tar 3.12 of Perl v5.44.0❌ another tree, or rejectstree C: @LongLink (121 B, bf3e00a9), l → tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
Haskell tartar 0.7.2.0, extract, of GHC 9.14✅ acceptsthe expected tree
Julia Tar.jlTar 1.10.0 of Julia 1.13.3✅ acceptsthe expected tree
live-bootstrap untarmescc-tools-extra a151c245e512, as live-bootstrap pins it❌ another tree, or rejectserror: unable to create long symlink
live-bootstrap untar, --non-strictmescc-tools-extra a151c245e512, as live-bootstrap pins it❌ another tree, or 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. The default policy accepts them.

ecosystemtarballswith itshare
Spack37,553140.04%
nixpkgs18,990150.08%
Guix10,16820.02%
PyPI10,00030.03%
crates.io5,0000none
RubyGems5,00010.02%
live-bootstrap1710none
total (distinct)82,586350.04%

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

See also