summaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
authorErik Andersen2000-01-23 02:14:20 +0000
committerErik Andersen2000-01-23 02:14:20 +0000
commit06936df16411fff0fdc338cae28385d66cabcef8 (patch)
tree570cf3d9aea702854ebc8cf65d02a6c85cca09fa /archival
parentde552874d2074ac48ea4b834d61c54e1b6971be3 (diff)
downloadbusybox-06936df16411fff0fdc338cae28385d66cabcef8.zip
busybox-06936df16411fff0fdc338cae28385d66cabcef8.tar.gz
Fix a bug where tar could change perms and ownership of dirs pointed
to by symlink within a tarball. -Erik
Diffstat (limited to 'archival')
-rw-r--r--archival/tar.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/archival/tar.c b/archival/tar.c
index adae6c9..21ef24d 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -542,8 +542,10 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
printf ("x %s\n", outName);
if (hardLink) {
- if (link (hp->linkName, outName) < 0)
+ if (link (hp->linkName, outName) < 0) {
perror (outName);
+ return;
+ }
/* Set the file time */
utb.actime = mtime;
utb.modtime = mtime;
@@ -556,8 +558,10 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
if (softLink) {
#ifdef S_ISLNK
- if (symlink (hp->linkName, outName) < 0)
+ if (symlink (hp->linkName, outName) < 0) {
perror (outName);
+ return;
+ }
/* Try to change ownership of the symlink.
* If libs doesn't support that, don't bother.
* Changing the pointed-to file is the Wrong Thing(tm).
@@ -582,15 +586,16 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
* If the file is a directory, then just create the path.
*/
if (S_ISDIR (mode)) {
- createPath (outName, mode);
- /* Set the file time */
- utb.actime = mtime;
- utb.modtime = mtime;
- utime (outName, &utb);
- /* Set the file permissions */
- chown(outName, uid, gid);
- chmod(outName, mode);
- return;
+ if (createPath (outName, mode)==TRUE) {
+ /* Set the file time */
+ utb.actime = mtime;
+ utb.modtime = mtime;
+ utime (outName, &utb);
+ /* Set the file permissions */
+ chown(outName, uid, gid);
+ chmod(outName, mode);
+ return;
+ }
}
/*