]> git.wh0rd.org - dump.git/blobdiff - restore/tape.c
Use lchown instead of chown (security problem of symlinks ownership)
[dump.git] / restore / tape.c
index 9e1e28c2594a70d94f4bc21ab66d49f34b9ca692..754da610152cb9732c855c854209486f4466c3ff 100644 (file)
@@ -2,8 +2,7 @@
  *     Ported to Linux's Second Extended File System as part of the
  *     dump and restore backup suit
  *     Remy Card <card@Linux.EU.Org>, 1994-1997
- *      Stelian Pop <pop@cybercable.fr>, 1999 
- *
+ *     Stelian Pop <pop@cybercable.fr>, 1999 
  */
 
 /*
  */
 
 #ifndef lint
-#if 0
-static char sccsid[] = "@(#)tape.c     8.9 (Berkeley) 5/1/95";
-#endif
 static const char rcsid[] =
-       "$Id: tape.c,v 1.3 1999/10/11 12:59:21 stelian Exp $";
+       "$Id: tape.c,v 1.7 1999/11/05 22:02:19 tiniou Exp $";
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -583,7 +579,9 @@ extractfile(char *name)
                }
                if (linkit(lnkbuf, name, SYMLINK) == FAIL)
                        return (FAIL);
-               (void) chown(name, luid, lgid);
+#ifdef HAVE_LCHOWN
+               (void) lchown(name, luid, lgid);
+#endif
                return (GOOD);
        }
 
@@ -602,10 +600,11 @@ extractfile(char *name)
                }
                (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) chmod(name, mode);
+               if (flags)
 #ifdef  __linux__
-               (void) fsetflags(name, flags);
+                       (void) fsetflags(name, flags);
 #else
-               (void) chflags(name, flags);
+                       (void) chflags(name, flags);
 #endif
                skipfile();
                utimes(name, timep);
@@ -627,10 +626,14 @@ extractfile(char *name)
                }
                (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) chmod(name, mode);
+               if (flags)
 #ifdef __linux__
-               (void) fsetflags(name, flags);
+                       {
+                       warn("%s: fsetflags called on a special file", name);
+                       (void) fsetflags(name, flags);
+                       }
 #else
-               (void) chflags(name, flags);
+                       (void) chflags(name, flags);
 #endif
                skipfile();
                utimes(name, timep);
@@ -652,10 +655,11 @@ extractfile(char *name)
                }
                (void) fchown(ofile, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) fchmod(ofile, mode);
+               if (flags)
 #ifdef __linux__
-               (void) fsetflags(ofile, flags);
+                       (void) setflags(ofile, flags);
 #else
-               (void) fchflags(ofile, flags);
+                       (void) fchflags(ofile, flags);
 #endif
                getfile(xtrfile, xtrskip);
                (void) close(ofile);