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 <[email protected]>
---
 lib/libalpm/add.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

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"),
-- 
2.12.0

Reply via email to