Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7za extracting symlinks as text files on some filesystem #164

Open
mboisson opened this issue Nov 18, 2021 · 3 comments
Open

7za extracting symlinks as text files on some filesystem #164

mboisson opened this issue Nov 18, 2021 · 3 comments

Comments

@mboisson
Copy link

Hi,
I have a .7z file which contains symbolic links. If I extract it on a xfs filesystem, it extracts symlinks correctly. If I extract it on a CephFS filesystem, it saves symlinks as text files which contain the path to their targets, i.e.

cat /home/mboisson/STAR-CCM+16.06.008/hdf5/1.10.5-cda-004/linux-x86_64-2.12/gnu7.1/libhdf5_hl_cpp.so.100
libhdf5_hl_cpp.so.100.1.3

CephFS does support symbolic links, so I'm not sure why 7za is not doing the right thing.

@mboisson
Copy link
Author

mboisson commented Nov 18, 2021

Here is a small test on CephFS:

rm -rf testdir unpack; mkdir testdir; cd testdir; touch b; ln -s b a; cd ..; ls -rl testdir; 7za a testdir.7z testdir; 7za x -y -ounpack testdir.7z; ls -l unpack/testdir/; cat unpack/testdir/a

total 1
-rw-rw-r-- 1 mboisson mboisson 0 18 nov 19:09 b
lrwxrwxrwx 1 mboisson mboisson 1 18 nov 19:09 a -> b

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

Open archive: testdir.7z
--
Path = testdir.7z
Type = 7z
Physical Size = 174
Headers Size = 169
Method = LZMA2:12
Solid = -
Blocks = 1

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

Updating archive: testdir.7z

Items to compress: 3


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

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

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

Extracting archive: testdir.7z
--
Path = testdir.7z
Type = 7z
Physical Size = 174
Headers Size = 169
Method = LZMA2:12
Solid = -
Blocks = 1


ERROR: E_FAIL

Archives with Errors: 1

total 1
-rw-rw-r-- 1 mboisson mboisson 1 18 nov 19:09 a
-rw-rw-r-- 1 mboisson mboisson 0 18 nov 19:09 b
b

And the same on a xfs:

rm -rf testdir unpack; mkdir testdir; cd testdir; touch b; ln -s b a; cd ..; ls -rl testdir; 7za a testdir.7z testdir; 7za x -y -ounpack testdir.7z; ls -l unpack/testdir/; cat unpack/testdir/a
total 0
-rw-rw-r-- 1 mboisson mboisson 0 18 nov 19:11 b
lrwxrwxrwx 1 mboisson mboisson 1 18 nov 19:11 a -> b

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

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

Creating archive: testdir.7z

Items to compress: 3


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

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

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

Extracting archive: testdir.7z
--
Path = testdir.7z
Type = 7z
Physical Size = 175
Headers Size = 170
Method = LZMA2:12
Solid = -
Blocks = 1

Everything is Ok

Folders: 1
Files: 2
Size:       1
Compressed: 175
total 0
lrwxrwxrwx 1 mboisson mboisson 1 18 nov 19:11 a -> b
-rw-rw-r-- 1 mboisson mboisson 0 18 nov 19:11 b

@mboisson
Copy link
Author

mboisson commented Nov 18, 2021

I debugged p7zip, and it turns out that the issue is that lstat yields a value of 0 for st_dev. This causes this test to fail and return without transforming the files into symlinks.

https://github.com/jinfeihan57/p7zip/blob/master/CPP/Windows/FileDir.cpp#L862

Why is _dev == 0 an abort condition for converting files into symlinks ?

If I comment this test, then the extraction works just fine.

@mboisson
Copy link
Author

I applied this patch to our local build, but I would like to know what unforeseen consequence this may have

https://github.com/ComputeCanada/easybuild-easyconfigs/blob/087dac6111dd08e5d85a310467dcd551b8ac7d35/easybuild/easyconfigs/p/p7zip/p7zip-17.04-CephFS.patch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant