diff options
author | Erik Andersen <andersen@codepoet.org> | 1999-12-28 00:17:46 +0000 |
---|---|---|
committer | Erik Andersen <andersen@codepoet.org> | 1999-12-28 00:17:46 +0000 |
commit | 00266d3df6ba8dcc6247f112372a0ce5a8ab2c32 (patch) | |
tree | ca61fc301d4f1ee06b0a03bd352b672360b88eda | |
parent | 69ba6b2956202728a3da3489caa383fa6e7b114f (diff) | |
download | busybox-00266d3df6ba8dcc6247f112372a0ce5a8ab2c32.tar.gz |
Fixed a bug where tar would not set the user and group on device
special files.
-Erik
-rw-r--r-- | Changelog | 6 | ||||
-rw-r--r-- | archival/tar.c | 16 | ||||
-rw-r--r-- | tar.c | 16 |
3 files changed, 17 insertions, 21 deletions
@@ -10,9 +10,9 @@ * Added 'grep -q' thanks to a patch from "Konstantin Boldyshev" <konst@voshod.com>. * Implemented sort. -beppu - * Fixed tar SGID and SUID bug. Seems that chown(2) clears S_ISUID and - S_ISGID, even when chown is called as root. I changed the ordering - of chown and chmod so SGID and SUID file permissions don't get munged. + * Fixed a bug where tar would set, and then clear SGID and SUID bits. + * Fixed a bug where tar would not set the user and group on device + special files. -Erik Andersen diff --git a/archival/tar.c b/archival/tar.c index bff248212..7167d95cd 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -577,17 +577,15 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable) } else { outFd = open (name, O_WRONLY | O_CREAT | O_TRUNC, mode); } + if (outFd < 0) { + perror (name); + skipFileFlag = TRUE; + return; + } + chown(name, uid, gid); + chmod(name, mode); } - if (outFd < 0) { - perror (name); - skipFileFlag = TRUE; - return; - } - if (tostdoutFlag == FALSE) { - fchown(outFd, uid, gid); - fchmod(outFd, mode); - } /* * If the file is empty, then that's all we need to do. @@ -577,17 +577,15 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable) } else { outFd = open (name, O_WRONLY | O_CREAT | O_TRUNC, mode); } + if (outFd < 0) { + perror (name); + skipFileFlag = TRUE; + return; + } + chown(name, uid, gid); + chmod(name, mode); } - if (outFd < 0) { - perror (name); - skipFileFlag = TRUE; - return; - } - if (tostdoutFlag == FALSE) { - fchown(outFd, uid, gid); - fchmod(outFd, mode); - } /* * If the file is empty, then that's all we need to do. |