diff options
author | Peter Korsgaard <peter@korsgaard.com> | 2021-11-26 16:38:57 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-12-12 23:34:43 +0100 |
commit | cb91a818c8f7730d8f3b30b5b4e75fd21496609f (patch) | |
tree | c0ec5abaee98272d40dcdbc2912d7b46b9e68a0d | |
parent | e67b80f4739c4075b51b0a575701b73928fe0bf1 (diff) | |
download | busybox-w32-cb91a818c8f7730d8f3b30b5b4e75fd21496609f.tar.gz busybox-w32-cb91a818c8f7730d8f3b30b5b4e75fd21496609f.tar.bz2 busybox-w32-cb91a818c8f7730d8f3b30b5b4e75fd21496609f.zip |
libarchive/get_header_ar.c: fix extraction of archives from binutils in deterministic mode
GNU binutils in deterministic mode (ar rD or built with
--enable-deterministic-archives) hard codes file mode to 0644 (NOT 0100644)
since https://github.com/bminor/binutils-gdb/commit/36e4dce69dd2
This confuses busybox ar x (data_extract_all):
touch a; ar rD a.ar a
ar: creating a.ar
busybox ar x a.ar
ar: unrecognized file type
hexdump -C a.ar
00000000 21 3c 61 72 63 68 3e 0a 61 2f 20 20 20 20 20 20 |!<arch>.a/ |
00000010 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 | 0 |
00000020 20 20 20 20 30 20 20 20 20 20 30 20 20 20 20 20 | 0 0 |
00000030 36 34 34 20 20 20 20 20 30 20 20 20 20 20 20 20 |644 0 |
00000040 20 20 60 0a | `.|
As a workaround, force the mode bits to S_IFREG, as nothing else makes sense
for ar.
function old new delta
get_header_ar 539 542 +3
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | archival/libarchive/get_header_ar.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/archival/libarchive/get_header_ar.c b/archival/libarchive/get_header_ar.c index 3a19d6ff7..6bd897392 100644 --- a/archival/libarchive/get_header_ar.c +++ b/archival/libarchive/get_header_ar.c | |||
@@ -92,8 +92,12 @@ char FAST_FUNC get_header_ar(archive_handle_t *archive_handle) | |||
92 | /* Only size is always present, the rest may be missing in | 92 | /* Only size is always present, the rest may be missing in |
93 | * long filename pseudo file. Thus we decode the rest | 93 | * long filename pseudo file. Thus we decode the rest |
94 | * after dealing with long filename pseudo file. | 94 | * after dealing with long filename pseudo file. |
95 | * | ||
96 | * GNU binutils in deterministic mode hard codes mode to 0644 (NOT | ||
97 | * 0100644). AR archives can only contain files, so force file | ||
98 | * mode. | ||
95 | */ | 99 | */ |
96 | typed->mode = read_num(ar.formatted.mode, 8, sizeof(ar.formatted.mode)); | 100 | typed->mode = read_num(ar.formatted.mode, 8, sizeof(ar.formatted.mode)) | S_IFREG; |
97 | typed->gid = read_num(ar.formatted.gid, 10, sizeof(ar.formatted.gid)); | 101 | typed->gid = read_num(ar.formatted.gid, 10, sizeof(ar.formatted.gid)); |
98 | typed->uid = read_num(ar.formatted.uid, 10, sizeof(ar.formatted.uid)); | 102 | typed->uid = read_num(ar.formatted.uid, 10, sizeof(ar.formatted.uid)); |
99 | typed->mtime = read_num(ar.formatted.date, 10, sizeof(ar.formatted.date)); | 103 | typed->mtime = read_num(ar.formatted.date, 10, sizeof(ar.formatted.date)); |