From: Michael Schroeder Date: Tue, 17 May 2011 12:46:54 +0000 (+0300) Subject: Do not abort if chown/chmod fails but the file is already correct X-Git-Tag: rpm-4.10.0-beta1~576 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=09d554da62ce84823849138a55a2ba0e72dd17f0;p=platform%2Fupstream%2Frpm.git Do not abort if chown/chmod fails but the file is already correct - This small patch makes rpm not abort the installation if chown()/chmod() failed but the files already have the correct ownership/mode. It also allows a failed mtime update on directories. Signed-off-by: Panu Matilainen --- diff --git a/lib/fsm.c b/lib/fsm.c index f50c6f0..d94d6be 100644 --- a/lib/fsm.c +++ b/lib/fsm.c @@ -1446,6 +1446,11 @@ static int fsmRename(FSM_t fsm) static int fsmChown(FSM_t fsm) { int rc = chown(fsm->path, fsm->sb.st_uid, fsm->sb.st_gid); + if (rc < 0) { + struct stat st; + if (lstat(fsm->path, &st) == 0 && st.st_uid == fsm->sb.st_uid && st.st_gid == fsm->sb.st_gid) + rc = 0; + } if (_fsm_debug && (FSM_CHOWN & FSM_SYSCALL)) rpmlog(RPMLOG_DEBUG, " %8s (%s, %d, %d) %s\n", fileStageString(FSM_CHOWN), fsm->path, (int)fsm->sb.st_uid, (int)fsm->sb.st_gid, @@ -1458,6 +1463,11 @@ static int fsmLChown(FSM_t fsm) { int rc = 0; rc = lchown(fsm->path, fsm->sb.st_uid, fsm->sb.st_gid); + if (rc < 0) { + struct stat st; + if (lstat(fsm->path, &st) == 0 && st.st_uid == fsm->sb.st_uid && st.st_gid == fsm->sb.st_gid) + rc = 0; + } if (_fsm_debug && (FSM_LCHOWN & FSM_SYSCALL)) rpmlog(RPMLOG_DEBUG, " %8s (%s, %d, %d) %s\n", fileStageString(FSM_LCHOWN), fsm->path, (int)fsm->sb.st_uid, (int)fsm->sb.st_gid, @@ -1469,6 +1479,11 @@ static int fsmLChown(FSM_t fsm) static int fsmChmod(FSM_t fsm) { int rc = chmod(fsm->path, (fsm->sb.st_mode & 07777)); + if (rc < 0) { + struct stat st; + if (lstat(fsm->path, &st) == 0 && (st.st_mode & 07777) == (fsm->sb.st_mode & 07777)) + rc = 0; + } if (_fsm_debug && (FSM_CHMOD & FSM_SYSCALL)) rpmlog(RPMLOG_DEBUG, " %8s (%s, 0%04o) %s\n", fileStageString(FSM_CHMOD), fsm->path, (unsigned)(fsm->sb.st_mode & 07777), @@ -2029,6 +2044,9 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; st->st_mtime = rpmfiFMtimeIndex(fi, fsm->ix); rc = fsmUtime(fsm); st->st_mtime = mtime; + /* utime error is not critical for directories */ + if (rc && S_ISDIR(st->st_mode)) + rc = 0; } #if WITH_CAP if (!rc && !S_ISDIR(st->st_mode) && !getuid()) {