diff options
author | Armin K <krejzi@email.com> | 2017-03-06 21:15:20 +0100 |
---|---|---|
committer | Andrew Gregory <andrew.gregory.8@gmail.com> | 2017-05-08 23:27:44 -0400 |
commit | 908769b54002e104b90ab2b3e5ca8066affd4394 (patch) | |
tree | 17e6a3131ba3582cf3bf0a450c77b70f9d1b1a8a | |
parent | 33dbe13a6b9da842de0fb6a1055651866bcf6440 (diff) | |
download | pacman-908769b54002e104b90ab2b3e5ca8066affd4394.tar.xz |
libalpm: Use archive_read_extract2
archive_read_extract() forces resolution of uid/gid to names
when extracting the tarball. This can lead to wrong file
ownership when using pacman with -r option and when uid/gid
differ in the host and in the chroot.
archive_read_extract2() uses uid's and gid's only. See also:
https://lists.archlinux.org/pipermail/pacman-dev/2017-March/021912.html
Signed-off-by: Armin K <krejzi@email.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
(cherry picked from commit 86f5c74694cb0403eaf11fa4734f307a0df345cb)
-rw-r--r-- | lib/libalpm/add.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index d132e522..065f3cea 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -110,6 +110,7 @@ static int perform_extraction(alpm_handle_t *handle, struct archive *archive, struct archive_entry *entry, const char *filename) { int ret; + struct archive *archive_writer; const int archive_flags = ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_TIME | @@ -118,7 +119,20 @@ static int perform_extraction(alpm_handle_t *handle, struct archive *archive, archive_entry_set_pathname(entry, filename); - ret = archive_read_extract(archive, entry, archive_flags); + archive_writer = archive_write_disk_new(); + if (archive_writer == NULL) { + _alpm_log(handle, ALPM_LOG_ERROR, _("cannot allocate disk archive object")); + alpm_logaction(handle, ALPM_CALLER_PREFIX, + "error: cannot allocate disk archive object"); + return 1; + } + + archive_write_disk_set_options(archive_writer, archive_flags); + + ret = archive_read_extract2(archive, entry, archive_writer); + + archive_write_free(archive_writer); + if(ret == ARCHIVE_WARN && archive_errno(archive) != ENOSPC) { /* operation succeeded but a "non-critical" error was encountered */ _alpm_log(handle, ALPM_LOG_WARNING, _("warning given when extracting %s (%s)\n"), |