File unpackmode0.diff of Package rpm.openSUSE_12.3_Update
--- ./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);