summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorArmin K <krejzi@email.com>2017-03-06 21:15:20 +0100
committerAllan McRae <allan@archlinux.org>2017-04-12 03:44:56 +0200
commit86f5c74694cb0403eaf11fa4734f307a0df345cb (patch)
tree5c92c7fdaa0631432b2e71e7401097ba34936a52 /lib
parent1af766987f66c63b029578374d679a353960d46d (diff)
downloadpacman-86f5c74694cb0403eaf11fa4734f307a0df345cb.tar.gz
pacman-86f5c74694cb0403eaf11fa4734f307a0df345cb.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>
Diffstat (limited to 'lib')
-rw-r--r--lib/libalpm/add.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index c5bed817..0beed01c 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"),