summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog6
-rw-r--r--archival/tar.c16
-rw-r--r--tar.c16
3 files changed, 17 insertions, 21 deletions
diff --git a/Changelog b/Changelog
index 8b0b0be..8edf3a6 100644
--- 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
diff --git a/archival/tar.c b/archival/tar.c
index bff2482..7167d95 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.
diff --git a/tar.c b/tar.c
index bff2482..7167d95 100644
--- 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.