diff -up rpm-4.8.0/lib/fsm.c.fsm-sbits rpm-4.8.0/lib/fsm.c --- rpm-4.8.0/lib/fsm.c.fsm-sbits 2009-12-07 16:36:49.000000000 +0200 +++ rpm-4.8.0/lib/fsm.c 2010-06-03 11:14:53.000000000 +0300 @@ -1320,6 +1320,21 @@ static const char * rpmteTypeString(rpmt } } +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); + } +#if WITH_CAP + if (stb.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) { + (void) cap_set_file(path, NULL); + } +#endif + } +} + #define IS_DEV_LOG(_x) \ ((_x) != NULL && strlen(_x) >= (sizeof("/dev/log")-1) && \ rstreqn((_x), "/dev/log", sizeof("/dev/log")-1) && \ @@ -2024,11 +2039,8 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS 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)) rpmlog(RPMLOG_DEBUG, " %8s (%s) %s\n", cur, @@ -2037,6 +2049,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) && defined(__HPUX__) if (rc && errno == ETXTBSY) {