{"action":"closed","issue":{"url":"https://api.github.com/repos/libarchive/libarchive/issues/682","repository_url":"https://api.github.com/repos/libarchive/libarchive","labels_url":"https://api.github.com/repos/libarchive/libarchive/issues/682/labels{/name}","comments_url":"https://api.github.com/repos/libarchive/libarchive/issues/682/comments","events_url":"https://api.github.com/repos/libarchive/libarchive/issues/682/events","html_url":"https://github.com/libarchive/libarchive/issues/682","id":147519899,"number":682,"title":"Broken 512-byte gnutar filenames","user":{"login":"aichingm","id":6470959,"avatar_url":"https://avatars.githubusercontent.com/u/6470959?v=3","gravatar_id":"","url":"https://api.github.com/users/aichingm","html_url":"https://github.com/aichingm","followers_url":"https://api.github.com/users/aichingm/followers","following_url":"https://api.github.com/users/aichingm/following{/other_user}","gists_url":"https://api.github.com/users/aichingm/gists{/gist_id}","starred_url":"https://api.github.com/users/aichingm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aichingm/subscriptions","organizations_url":"https://api.github.com/users/aichingm/orgs","repos_url":"https://api.github.com/users/aichingm/repos","events_url":"https://api.github.com/users/aichingm/events{/privacy}","received_events_url":"https://api.github.com/users/aichingm/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/libarchive/libarchive/milestones/3","html_url":"https://github.com/libarchive/libarchive/milestones/3.3","labels_url":"https://api.github.com/repos/libarchive/libarchive/milestones/3/labels","id":1800208,"number":3,"title":"3.3","description":"","creator":{"login":"kientzle","id":1398793,"avatar_url":"https://avatars.githubusercontent.com/u/1398793?v=3","gravatar_id":"","url":"https://api.github.com/users/kientzle","html_url":"https://github.com/kientzle","followers_url":"https://api.github.com/users/kientzle/followers","following_url":"https://api.github.com/users/kientzle/following{/other_user}","gists_url":"https://api.github.com/users/kientzle/gists{/gist_id}","starred_url":"https://api.github.com/users/kientzle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kientzle/subscriptions","organizations_url":"https://api.github.com/users/kientzle/orgs","repos_url":"https://api.github.com/users/kientzle/repos","events_url":"https://api.github.com/users/kientzle/events{/privacy}","received_events_url":"https://api.github.com/users/kientzle/received_events","type":"User","site_admin":false},"open_issues":3,"closed_issues":1,"state":"open","created_at":"2016-06-01T02:10:56Z","updated_at":"2016-06-01T04:03:26Z","due_on":null,"closed_at":null},"comments":4,"created_at":"2016-04-11T18:55:26Z","updated_at":"2016-06-01T04:03:27Z","closed_at":"2016-06-01T04:03:26Z","body":"Hey devs,\r\n\r\n## System:\r\n\r\n    uname-a\r\n    Linux monster 4.4.5-1-ARCH #1 SMP PREEMPT Thu Mar 10 07:38:19 CET 2016 x86_64 GNU/Linux\r\n-\r\n    bsdtar --version\r\n    bsdtar 3.1.2 - libarchive 3.1.2\r\n\r\n## Summary\r\n\r\nI was trying to archive a directory structure (see the test file on how to recreate it) with `bsdtar --format=gnutar --cvf test.tar env.gnu`at first glace every thing looked nice and the `v` options showed my all the directories in the tree and one file in the deepest directory - nice! Some time later I wanted to check the contents of `test.tar` so I fired up bsdtar again `bsdtar --tvf test.tar` but one directory was missing in the outputted list. \r\n\r\nMy directory structure looks like:\r\n\r\n    env.gnu\r\n    env.gnu/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/FILE\r\n\r\n\r\n## Expectation\r\nAs I said I was expecting that all the directories would be listed by `-tvf` but:\r\n\r\n    env.gnu/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir/this_is_an_extreme_long_dir\r\n\r\nbsdtar does not list this one (18 times `this_is_an_extreme_long_dir`). \r\n\r\n\r\n## So I started digging\r\nand what I found was: \r\nThe problem just exists if a directory has the exact length of 512 if my math is right (8+18*28).\r\n \r\nAs this is a gnutar archive long file names will be stored in a `/./@LongLink`'s (type L) body. The size of this header says `00001001` (dec: 513) which means that the next 511 bytes after the body should be `\\0`s, that is not the case. The case is that the next header starts right after the 512 byte long body of the `/./@LongLink` (no padding was added or the size is wrongly calculated) which I think is the _failure_ here!\r\n\r\nMaybe this Image helps a bit. Blue is the body of the `/./@LongLink` header. \r\n![bsdtar_test](https://cloud.githubusercontent.com/assets/6470959/14438670/837fe896-0027-11e6-974c-d8ceed3c821b.png)\r\n\r\n\r\n\r\n\r\n## Test\r\n    #!/bin/bash\r\n    \r\n    function test_bsdtar {\r\n        #create the directory structure and files\r\n        mkdir env.gnu\r\n        cd env.gnu\r\n        mkdir -p $(printf \"$1/%.0s\" {1..20})\r\n        touch \"$(printf \"$1/%.0s\" {1..20})FILE\"\r\n        cd ..\r\n    \r\n        # create the tar file and store the verbose output| grep only the file names         | remove tailing slashes > redirect to a file \r\n        bsdtar --format=gnutar -cvf test.tar env.gnu 2>&1 | grep -E \"[^ ]+$\" --only-matching | sed 's/\\/$//' > create.out\r\n        #list contents of the tar | grep only the file names         | remove tailing slashes > redirect to a file\r\n        bsdtar -tvf test.tar 2>&1 | grep -E \"[^ ]+$\" --only-matching | sed 's/\\/$//' > list.out\r\n    \r\n        #DIFF\r\n        echo \"diff the output of the creation vs the output from -tvf\"\r\n        diff create.out list.out\r\n        echo\r\n       #WC -l\r\n        echo echo the line counts of the outputs. first -cvf. second -tvf\r\n        wc -l create.out\r\n        wc -l list.out\r\n        echo \r\n    \r\n        #remove artefacts\r\n        rm -R env.gnu\r\n        rm test.tar\r\n        rm create.out\r\n        rm list.out\r\n    }\r\n    \r\n    \r\n    #this fails\r\n    echo THIS FAILS\r\n    test_bsdtar \"this_is_an_extreme_long_dir\"\r\n    test_bsdtar \"abc_def_ghi_jkl_mno_pqr_stu\"\r\n    #this works\r\n    echo THIS WORKS\r\n    test_bsdtar \"abc_def_ghi_jkl_mno_pqr_st\"\r\n    test_bsdtar \"abc_def_ghi_jkl_mno_pqr_stu_\"\r\n\r\nIf anything is unclear please do not hesitate to ask. I'm more than willing to help where I can!"}}
{"actor":{"display_login":"kientzle"}}