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 86f5c74694
)
This commit is contained in:
parent
33dbe13a6b
commit
908769b540
1 changed files with 15 additions and 1 deletions
|
@ -110,6 +110,7 @@ static int perform_extraction(alpm_handle_t *handle, struct archive *archive,
|
||||||
struct archive_entry *entry, const char *filename)
|
struct archive_entry *entry, const char *filename)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
struct archive *archive_writer;
|
||||||
const int archive_flags = ARCHIVE_EXTRACT_OWNER |
|
const int archive_flags = ARCHIVE_EXTRACT_OWNER |
|
||||||
ARCHIVE_EXTRACT_PERM |
|
ARCHIVE_EXTRACT_PERM |
|
||||||
ARCHIVE_EXTRACT_TIME |
|
ARCHIVE_EXTRACT_TIME |
|
||||||
|
@ -118,7 +119,20 @@ static int perform_extraction(alpm_handle_t *handle, struct archive *archive,
|
||||||
|
|
||||||
archive_entry_set_pathname(entry, filename);
|
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) {
|
if(ret == ARCHIVE_WARN && archive_errno(archive) != ENOSPC) {
|
||||||
/* operation succeeded but a "non-critical" error was encountered */
|
/* operation succeeded but a "non-critical" error was encountered */
|
||||||
_alpm_log(handle, ALPM_LOG_WARNING, _("warning given when extracting %s (%s)\n"),
|
_alpm_log(handle, ALPM_LOG_WARNING, _("warning given when extracting %s (%s)\n"),
|
||||||
|
|
Loading…
Add table
Reference in a new issue