diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-06-18 02:00:55 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-06-18 02:00:55 +0200 |
commit | d86b4c3907a78ab8785bcd6342ca233d0fe23ed0 (patch) | |
tree | 82c99ea6266a0587236e7b17f39dc541ebbe1936 /archival | |
parent | 0cc25945d8e6821d967bb97266774f9ee6c07197 (diff) | |
download | busybox-w32-d86b4c3907a78ab8785bcd6342ca233d0fe23ed0.tar.gz busybox-w32-d86b4c3907a78ab8785bcd6342ca233d0fe23ed0.tar.bz2 busybox-w32-d86b4c3907a78ab8785bcd6342ca233d0fe23ed0.zip |
data_extract_all: do not chmod symlink. Closes 2053
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'archival')
-rw-r--r-- | archival/libunarchive/data_extract_all.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c index 815261036..c4ffe7ef8 100644 --- a/archival/libunarchive/data_extract_all.c +++ b/archival/libunarchive/data_extract_all.c | |||
@@ -152,35 +152,32 @@ void FAST_FUNC data_extract_all(archive_handle_t *archive_handle) | |||
152 | bb_error_msg_and_die("unrecognized file type"); | 152 | bb_error_msg_and_die("unrecognized file type"); |
153 | } | 153 | } |
154 | 154 | ||
155 | if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_OWNER)) { | 155 | if (!S_ISLNK(file_header->mode)) { |
156 | #if ENABLE_FEATURE_TAR_UNAME_GNAME | 156 | if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_OWNER)) { |
157 | if (!(archive_handle->ah_flags & ARCHIVE_NUMERIC_OWNER)) { | ||
158 | uid_t uid = file_header->uid; | 157 | uid_t uid = file_header->uid; |
159 | gid_t gid = file_header->gid; | 158 | gid_t gid = file_header->gid; |
160 | 159 | #if ENABLE_FEATURE_TAR_UNAME_GNAME | |
161 | if (file_header->tar__uname) { | 160 | if (!(archive_handle->ah_flags & ARCHIVE_NUMERIC_OWNER)) { |
161 | if (file_header->tar__uname) { | ||
162 | //TODO: cache last name/id pair? | 162 | //TODO: cache last name/id pair? |
163 | struct passwd *pwd = getpwnam(file_header->tar__uname); | 163 | struct passwd *pwd = getpwnam(file_header->tar__uname); |
164 | if (pwd) uid = pwd->pw_uid; | 164 | if (pwd) uid = pwd->pw_uid; |
165 | } | 165 | } |
166 | if (file_header->tar__gname) { | 166 | if (file_header->tar__gname) { |
167 | struct group *grp = getgrnam(file_header->tar__gname); | 167 | struct group *grp = getgrnam(file_header->tar__gname); |
168 | if (grp) gid = grp->gr_gid; | 168 | if (grp) gid = grp->gr_gid; |
169 | } | ||
169 | } | 170 | } |
171 | #endif | ||
170 | /* GNU tar 1.15.1 uses chown, not lchown */ | 172 | /* GNU tar 1.15.1 uses chown, not lchown */ |
171 | chown(file_header->name, uid, gid); | 173 | chown(file_header->name, uid, gid); |
172 | } else | 174 | } |
173 | #endif | ||
174 | chown(file_header->name, file_header->uid, file_header->gid); | ||
175 | } | ||
176 | if (!S_ISLNK(file_header->mode)) { | ||
177 | /* uclibc has no lchmod, glibc is even stranger - | 175 | /* uclibc has no lchmod, glibc is even stranger - |
178 | * it has lchmod which seems to do nothing! | 176 | * it has lchmod which seems to do nothing! |
179 | * so we use chmod... */ | 177 | * so we use chmod... */ |
180 | if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_PERM)) { | 178 | if (!(archive_handle->ah_flags & ARCHIVE_DONT_RESTORE_PERM)) { |
181 | chmod(file_header->name, file_header->mode); | 179 | chmod(file_header->name, file_header->mode); |
182 | } | 180 | } |
183 | /* same for utime */ | ||
184 | if (archive_handle->ah_flags & ARCHIVE_RESTORE_DATE) { | 181 | if (archive_handle->ah_flags & ARCHIVE_RESTORE_DATE) { |
185 | struct timeval t[2]; | 182 | struct timeval t[2]; |
186 | 183 | ||