diff options
author | Erik Andersen | 2000-01-23 02:14:20 +0000 |
---|---|---|
committer | Erik Andersen | 2000-01-23 02:14:20 +0000 |
commit | 06936df16411fff0fdc338cae28385d66cabcef8 (patch) | |
tree | 570cf3d9aea702854ebc8cf65d02a6c85cca09fa /archival | |
parent | de552874d2074ac48ea4b834d61c54e1b6971be3 (diff) | |
download | busybox-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.c | 27 |
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; + } } /* |