Hi,

I believe that there’s a bug in how unpack over symlinks is handled. On extract 
newer records in tar stream should by default overwrite older extracted items. 
In GNU tar this doesn’t work if older record is a symlink which target starts 
with root (/).

This is tested on version 1.30 built from source, archive dated 2017-12-17 
06:43.

Consider three cases:

case 1:

(tar tv output)
lrwxrwxrwx admin/admin       0 2018-05-17 15:27 foo -> bar
-rw-r--r-- admin/admin       6 2018-05-17 15:27 foo

(tar x, then find -ls)
266605    4 drwxr-xr-x   2 admin    admin        4096 May 17 15:40 unpack1
266606    4 -rw-r--r--   1 admin    admin           6 May 17 15:27 unpack1/foo

case 2:

(tar tv output)
lrwxrwxrwx admin/admin       0 2018-05-17 15:25 foo -> /bar
-rw-r--r-- admin/admin       6 2018-05-17 15:25 foo

(tar x, then find -ls)
266607    4 drwxr-xr-x   2 admin    admin        4096 May 17 15:40 unpack2
266608    0 lrwxrwxrwx   1 admin    admin           4 May 17 15:25 unpack2/foo 
-> /bar

(

case 3:

(tar tv output)
lrwxrwxrwx admin/admin       0 2018-05-17 15:39 foo -> dir/bar
-rw-r--r-- admin/admin       6 2018-05-17 15:39 foo

(tar x, then find -ls)
266612    4 drwxr-xr-x   2 admin    admin        4096 May 17 15:40 unpack3
266613    4 -rw-r--r--   1 admin    admin           6 May 17 15:39 unpack3/foo

I expect all of them upon extraction produce a regular file, but case 2 leaves 
symlink instead.

You can find more listings as well as comparison against bsdtar here: 
https://gist.github.com/artyom/926ec9c49a2077f2820053274f0b1b16



Reply via email to