chown(2) clears S_ISUID and S_ISGID, even when chown is
authorErik Andersen <andersen@codepoet.org>
Mon, 27 Dec 1999 23:48:33 +0000 (23:48 -0000)
committerErik Andersen <andersen@codepoet.org>
Mon, 27 Dec 1999 23:48:33 +0000 (23:48 -0000)
called as root.  Changed ordering of chown and chmod so
SGID and SUID file permissions don't get munged.
 -Erik

archival/tar.c
tar.c

index 438770c..bff2482 100644 (file)
@@ -520,8 +520,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
     if (hardLink) {
        if (link (hp->linkName, name) < 0)
            perror (name);
-       chmod(name, mode);
        chown(name, uid, gid);
+       chmod(name, mode);
        return;
     }
 
@@ -529,8 +529,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
 #ifdef S_ISLNK
        if (symlink (hp->linkName, name) < 0)
            perror (name);
-       chmod(name, mode);
        chown(name, uid, gid);
+       chmod(name, mode);
 #else
        fprintf (stderr, "Cannot create symbolic links\n");
 #endif
@@ -546,8 +546,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
      */
     if (S_ISDIR (mode)) {
        createPath (name, mode);
-       chmod(name, mode);
        chown(name, uid, gid);
+       chmod(name, mode);
 
        return;
     }
@@ -585,8 +585,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
        return;
     }
     if (tostdoutFlag == FALSE) {
-       fchmod(outFd, mode);
        fchown(outFd, uid, gid);
+       fchmod(outFd, mode);
     }
 
     /* 
diff --git a/tar.c b/tar.c
index 438770c..bff2482 100644 (file)
--- a/tar.c
+++ b/tar.c
@@ -520,8 +520,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
     if (hardLink) {
        if (link (hp->linkName, name) < 0)
            perror (name);
-       chmod(name, mode);
        chown(name, uid, gid);
+       chmod(name, mode);
        return;
     }
 
@@ -529,8 +529,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
 #ifdef S_ISLNK
        if (symlink (hp->linkName, name) < 0)
            perror (name);
-       chmod(name, mode);
        chown(name, uid, gid);
+       chmod(name, mode);
 #else
        fprintf (stderr, "Cannot create symbolic links\n");
 #endif
@@ -546,8 +546,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
      */
     if (S_ISDIR (mode)) {
        createPath (name, mode);
-       chmod(name, mode);
        chown(name, uid, gid);
+       chmod(name, mode);
 
        return;
     }
@@ -585,8 +585,8 @@ readHeader (const TarHeader * hp, int fileCount, char **fileTable)
        return;
     }
     if (tostdoutFlag == FALSE) {
-       fchmod(outFd, mode);
        fchown(outFd, uid, gid);
+       fchmod(outFd, mode);
     }
 
     /*