Fixed a bug where tar would not set the user and group on device
authorErik Andersen <andersen@codepoet.org>
Tue, 28 Dec 1999 00:17:46 +0000 (00:17 -0000)
committerErik Andersen <andersen@codepoet.org>
Tue, 28 Dec 1999 00:17:46 +0000 (00:17 -0000)
special files.
 -Erik

Changelog
archival/tar.c
tar.c

index 8b0b0be..8edf3a6 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -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
 
index bff2482..7167d95 100644 (file)
@@ -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.
diff --git a/tar.c b/tar.c
index bff2482..7167d95 100644 (file)
--- a/tar.c
+++ b/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.