File unpackmode0.diff of Package rpm.3337

--- ./lib/fsm.c.orig	2014-12-10 17:09:03.553251903 +0000
+++ ./lib/fsm.c	2014-12-10 17:08:52.529302643 +0000
@@ -764,12 +764,18 @@ static int expandRegular(FSM_t fsm)
 {
     FD_t wfd = NULL;
     const struct stat * st = &fsm->sb;
-    rpm_loff_t left = st->st_size;
+    rpm_loff_t size = rpmfiFSizeIndex(fsmGetFi(fsm), fsm->ix);
+    rpm_loff_t left = size;
     const unsigned char * fidigest = NULL;
     pgpHashAlgo digestalgo = 0;
     int rc = 0;
 
-    wfd = Fopen(fsm->path, "w.ufdio");
+    /* Create the file with 000 permissions. */
+    {
+	mode_t old_umask = umask(0777);
+	wfd = Fopen(fsm->path, "w.ufdio");
+	umask(old_umask);
+    }
     if (Ferror(wfd)) {
 	rc = CPIOERR_OPEN_FAILED;
 	goto exit;
@@ -781,7 +787,7 @@ static int expandRegular(FSM_t fsm)
 	fidigest = rpmfiFDigestIndex(fi, fsm->ix, NULL, NULL);
     }
 
-    if (st->st_size > 0 && fidigest)
+    if (size > 0 && fidigest)
 	fdInitDigest(wfd, digestalgo, 0);
 
     while (left) {
@@ -804,7 +810,7 @@ static int expandRegular(FSM_t fsm)
 	    (void) fsmNext(fsm, FSM_NOTIFY);
     }
 
-    if (st->st_size > 0 && fidigest) {
+    if (size > 0 && fidigest) {
 	void * digest = NULL;
 
 	(void) Fflush(wfd);
openSUSE Build Service is sponsored by