File fixsbits.diff of Package rpm
--- lib/fsm.c.orig 2010-06-04 13:05:35.598307000 +0000
+++ lib/fsm.c 2010-06-04 13:06:57.501726000 +0000
@@ -1421,6 +1421,16 @@ static int fsmStat(/*@special@*/ /*@part
}
#endif
+static void removeSBITS(const char *path)
+{
+ struct stat stb;
+ if (lstat(path, &stb) == 0 && S_ISREG(stb.st_mode)) {
+ if ((stb.st_mode & 06000) != 0) {
+ (void) chmod(path, stb.st_mode & 0777);
+ }
+ }
+}
+
#define IS_DEV_LOG(_x) \
((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \
!strncmp((_x), "/dev/log", sizeof("/dev/log")-1) && \
@@ -2132,11 +2142,8 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS
/*@notreached@*/ break;
case FSM_UNLINK:
- if (fsm->mapFlags & CPIO_SBIT_CHECK) {
- struct stat stb;
- if (Lstat(fsm->path, &stb) == 0 && S_ISREG(stb.st_mode) && (stb.st_mode & 06000) != 0)
- chmod(fsm->path, stb.st_mode & 0777);
- }
+ if (fsm->mapFlags & CPIO_SBIT_CHECK)
+ removeSBITS(fsm->path);
rc = Unlink(fsm->path);
if (_fsm_debug && (stage & FSM_SYSCALL))
rpmMessage(RPMMESS_DEBUG, " %8s (%s) %s\n", cur,
@@ -2145,6 +2152,8 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS
rc = (errno == ENOENT ? CPIOERR_ENOENT : CPIOERR_UNLINK_FAILED);
break;
case FSM_RENAME:
+ if (fsm->mapFlags & CPIO_SBIT_CHECK)
+ removeSBITS(fsm->path);
rc = Rename(fsm->opath, fsm->path);
#if defined(ETXTBSY)
if (rc && errno == ETXTBSY) {