p7zip-project / p7zip

A new p7zip fork with additional codecs and improvements (forked from https://sourceforge.net/projects/sevenzip/ AND https://sourceforge.net/projects/p7zip/).
803 stars 111 forks source link

Bug: symlinks are stored as text files if added explicitly #235

Open slowpeek opened 4 months ago

slowpeek commented 4 months ago

Create test dir:

mkdir a
date > a/date.txt
ln -s date.txt a/link1

On archlinux with p7zip package version 17.05, pack a into 1.7z, a/* into 2.7z:

> 7za a -snl 1.7z a

7-Zip (a) [64] 17.05 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.05 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs x64)

Scanning the drive:
1 folder, 2 files, 37 bytes (1 KiB)

Creating archive: 1.7z

Items to compress: 3

Files read from disk: 2
Archive size: 223 bytes (1 KiB)
Everything is Ok
> 7za a -snl 2.7z a/*

7-Zip (a) [64] 17.05 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.05 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs x64)

Scanning the drive:
2 files, 58 bytes (1 KiB)

Creating archive: 2.7z

Items to compress: 2

Files read from disk: 2
Archive size: 209 bytes (1 KiB)
Everything is Ok

and check out whats inside:

> 7za l -ba -slt 1.7z | grep -E 'Path|Attr'
Path = a
Attributes = D_ drwxr-xr-x
Path = a/date.txt
Attributes = A_ -rw-r--r--
Path = a/link1
Attributes = A_ lrwxrwxrwx
> 7za l -ba -slt 2.7z | grep -E 'Path|Attr'
Path = a/date.txt
Attributes = A_ -rw-r--r--
Path = a/link1
Attributes = A_ -rw-r--r--

So, when I pack a as a whole, link1 is saved as a link. But when I pack a/link1 explicitly, it is saved as a text file.

Let's unpack 2.7z:

> mkdir 2; cd 2
> 7za x ../2.7z 

7-Zip (a) [64] 17.05 : Copyright (c) 1999-2021 Igor Pavlov : 2017-08-28
p7zip Version 17.05 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,2 CPUs x64)

Scanning the drive for archives:
1 file, 209 bytes (1 KiB)

Extracting archive: ../2.7z
--
Path = ../2.7z
Type = 7z
Physical Size = 209
Headers Size = 168
Method = LZMA2:12
Solid = +
Blocks = 1

Everything is Ok

Files: 2
Size:       37
Compressed: 209
> ls -l a
total 8
-rw-r--r-- 1 root root 29 Jun 23 23:28 date.txt
-rw-r--r-- 1 root root  8 Jun 23 23:28 link1
> cat a/link1; echo
date.txt

So, it packed link1 as a text file with the link target as its contents.

Other affected versions: 15.14 and 16.02

Not affected: 9.38. Its l -slt printer does not print posix attrs. Just unpack the archive to check if the symlink is there or use a newer binary to inspect.

Binaries built from 7zip.org sources are not affected. For example, 7zz version 21.07 from 7zip package in ubuntu 22.04.