diff options
Diffstat (limited to 'archival/libunarchive')
-rw-r--r-- | archival/libunarchive/data_extract_all.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c index 8b1ee2a..a2dfcb9 100644 --- a/archival/libunarchive/data_extract_all.c +++ b/archival/libunarchive/data_extract_all.c @@ -114,22 +114,24 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) } if (!(archive_handle->ah_flags & ARCHIVE_NOPRESERVE_OWN)) { -#if ENABLE_FEATURE_TAR_UNAME_GNAME - uid_t uid = file_header->uid; - gid_t gid = file_header->gid; + if (ENABLE_FEATURE_TAR_UNAME_GNAME + && !(archive_handle->ah_flags & ARCHIVE_NUMERIC_OWNER) + ) { + uid_t uid = file_header->uid; + gid_t gid = file_header->gid; - if (file_header->uname) { - struct passwd *pwd = getpwnam(file_header->uname); - if (pwd) uid = pwd->pw_uid; - } - if (file_header->gname) { - struct group *grp = getgrnam(file_header->gname); - if (grp) gid = grp->gr_gid; + if (file_header->uname) { + struct passwd *pwd = getpwnam(file_header->uname); + if (pwd) uid = pwd->pw_uid; + } + if (file_header->gname) { + struct group *grp = getgrnam(file_header->gname); + if (grp) gid = grp->gr_gid; + } + lchown(file_header->name, uid, gid); + } else { + lchown(file_header->name, file_header->uid, file_header->gid); } - lchown(file_header->name, uid, gid); -#else - lchown(file_header->name, file_header->uid, file_header->gid); -#endif } if ((file_header->mode & S_IFMT) != S_IFLNK) { /* uclibc has no lchmod, glibc is even stranger - |