Do not abort if chown/chmod fails but the file is already correct
authorMichael Schroeder <mls@suse.de>
Tue, 17 May 2011 12:46:54 +0000 (15:46 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Tue, 17 May 2011 12:46:54 +0000 (15:46 +0300)
- 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 <pmatilai@redhat.com>
lib/fsm.c

index f50c6f0..d94d6be 100644 (file)
--- 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()) {