[PATCH] libarchive/get_header_ar.c: fix extraction of archives from binutils in deterministic mode
Peter Korsgaard
peter at korsgaard.com
Fri Dec 10 13:29:41 UTC 2021
>>>>> "Peter" == Peter Korsgaard <peter at korsgaard.com> writes:
> 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.
Ping?
> Signed-off-by: Peter Korsgaard <peter at korsgaard.com>
> ---
> archival/libarchive/get_header_ar.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
> 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)
> /* Only size is always present, the rest may be missing in
> * long filename pseudo file. Thus we decode the rest
> * after dealing with long filename pseudo file.
> + *
> + * GNU binutils in deterministic mode hard codes mode to 0644 (NOT
> + * 0100644). AR archives can only contain files, so force file
> + * mode.
> */
> - typed->mode = read_num(ar.formatted.mode, 8, sizeof(ar.formatted.mode));
> + typed->mode = read_num(ar.formatted.mode, 8, sizeof(ar.formatted.mode)) | S_IFREG;
> typed-> gid = read_num(ar.formatted.gid, 10, sizeof(ar.formatted.gid));
> typed-> uid = read_num(ar.formatted.uid, 10, sizeof(ar.formatted.uid));
> typed-> mtime = read_num(ar.formatted.date, 10, sizeof(ar.formatted.date));
> --
> 2.20.1
--
Bye, Peter Korsgaard
More information about the busybox
mailing list