Move open + close of files during install to separate functions

- internal rpmteOpen() and rpmteClose() functions replacing copy-paste
  slop between rpmtsRun() and runTransScripts()
- eliminates bunch of rpmte privacy violations
- rpmtsRun() doesn't need the file descriptor for anything, might as well
  keep it hidden
This commit is contained in:
Panu Matilainen 2008-11-14 13:05:41 +02:00
parent 0b0fe33d3c
commit ee59836299
3 changed files with 55 additions and 71 deletions

View File

@ -606,3 +606,46 @@ rpmte rpmtsiNext(rpmtsi tsi, rpmElementType type)
} }
return te; return te;
} }
int rpmteOpen(rpmte te, rpmts ts)
{
int rc = 0;
if (te == NULL || ts == NULL)
goto exit;
te->h = NULL;
te->fd = rpmtsNotify(ts, te, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
if (te->fd != NULL) {
rpmVSFlags ovsflags;
rpmRC pkgrc;
ovsflags = rpmtsSetVSFlags(ts, rpmtsVSFlags(ts) | RPMVSF_NEEDPAYLOAD);
pkgrc = rpmReadPackageFile(ts, rpmteFd(te), rpmteNEVRA(te), &te->h);
rpmtsSetVSFlags(ts, ovsflags);
switch (pkgrc) {
default:
rpmteClose(te, ts);
break;
case RPMRC_NOTTRUSTED:
case RPMRC_NOKEY:
case RPMRC_OK:
rc = 1;
break;
}
}
exit:
return rc;
}
int rpmteClose(rpmte te, rpmts ts)
{
int rc = 0;
if (te != NULL && ts != NULL) {
rpmtsNotify(ts, te, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
te->fd = NULL;
te->h = headerFree(te->h);
rc = 1;
}
return rc;
}

View File

@ -75,5 +75,11 @@ struct rpmtsi_s {
int oc; /*!< iterator index. */ int oc; /*!< iterator index. */
}; };
RPM_GNUC_INTERNAL
int rpmteOpen(rpmte te, rpmts ts);
RPM_GNUC_INTERNAL
int rpmteClose(rpmte te, rpmts ts);
#endif /* _RPMTE_INTERNAL_H */ #endif /* _RPMTE_INTERNAL_H */

View File

@ -755,30 +755,7 @@ static int runTransScripts(rpmts ts, rpmTag stag)
if (!havescript) if (!havescript)
continue; continue;
p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_OPEN_FILE, 0, 0); if (rpmteOpen(p, ts)) {
p->h = NULL;
if (rpmteFd(p) != NULL) {
rpmVSFlags ovsflags = rpmtsVSFlags(ts);
rpmVSFlags vsflags = ovsflags | RPMVSF_NEEDPAYLOAD;
rpmRC rpmrc;
ovsflags = rpmtsSetVSFlags(ts, vsflags);
rpmrc = rpmReadPackageFile(ts, rpmteFd(p),
rpmteNEVR(p), &p->h);
vsflags = rpmtsSetVSFlags(ts, ovsflags);
switch (rpmrc) {
default:
/* FIX: notify annotations */
p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
p->fd = NULL;
break;
case RPMRC_NOTTRUSTED:
case RPMRC_NOKEY:
case RPMRC_OK:
break;
}
}
if (rpmteFd(p) != NULL) {
p->fi = rpmfiFree(p->fi); p->fi = rpmfiFree(p->fi);
fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, RPMFI_KEEPHEADER); fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, RPMFI_KEEPHEADER);
if (fi != NULL) { /* XXX can't happen */ if (fi != NULL) { /* XXX can't happen */
@ -791,13 +768,10 @@ static int runTransScripts(rpmts ts, rpmTag stag)
} }
} }
psm = rpmpsmNew(ts, p, p->fi); psm = rpmpsmNew(ts, p, p->fi);
assert(psm != NULL);
xx = rpmpsmScriptStage(psm, stag, progtag); xx = rpmpsmScriptStage(psm, stag, progtag);
psm = rpmpsmFree(psm); psm = rpmpsmFree(psm);
(void) rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0); rpmteClose(p, ts);
p->fd = NULL;
p->h = headerFree(p->h);
} }
} }
pi = rpmtsiFree(pi); pi = rpmtsiFree(pi);
@ -1271,9 +1245,8 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
/* FIX: fi reload needs work */ /* FIX: fi reload needs work */
while ((p = rpmtsiNext(pi, 0)) != NULL) { while ((p = rpmtsiNext(pi, 0)) != NULL) {
rpmalKey pkgKey; rpmalKey pkgKey;
int gotfd, async; int async;
gotfd = 0;
if ((fi = rpmtsiFi(pi)) == NULL) if ((fi = rpmtsiFi(pi)) == NULL)
continue; /* XXX can't happen */ continue; /* XXX can't happen */
@ -1290,38 +1263,8 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
rpmlog(RPMLOG_DEBUG, "========== +++ %s %s-%s 0x%x\n", rpmlog(RPMLOG_DEBUG, "========== +++ %s %s-%s 0x%x\n",
rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p)); rpmteNEVR(p), rpmteA(p), rpmteO(p), rpmteColor(p));
p->h = NULL;
/* FIX: rpmte not opaque */ if (rpmteOpen(p, ts)) {
{
p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_OPEN_FILE, 0, 0);
if (rpmteFd(p) != NULL) {
rpmVSFlags ovsflags = rpmtsVSFlags(ts);
rpmVSFlags vsflags = ovsflags | RPMVSF_NEEDPAYLOAD;
rpmRC rpmrc;
ovsflags = rpmtsSetVSFlags(ts, vsflags);
rpmrc = rpmReadPackageFile(ts, rpmteFd(p),
rpmteNEVR(p), &p->h);
vsflags = rpmtsSetVSFlags(ts, ovsflags);
switch (rpmrc) {
default:
/* FIX: notify annotations */
p->fd = rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE,
0, 0);
p->fd = NULL;
ourrc++;
break;
case RPMRC_NOTTRUSTED:
case RPMRC_NOKEY:
case RPMRC_OK:
break;
}
if (rpmteFd(p) != NULL) gotfd = 1;
}
}
if (rpmteFd(p) != NULL) {
/* /*
* XXX Sludge necessary to tranfer existing fstates/actions * XXX Sludge necessary to tranfer existing fstates/actions
* XXX around a recreated file info set. * XXX around a recreated file info set.
@ -1374,20 +1317,12 @@ int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet)
ourrc++; ourrc++;
lastFailKey = pkgKey; lastFailKey = pkgKey;
} }
rpmteClose(p, ts);
} else { } else {
ourrc++; ourrc++;
lastFailKey = pkgKey; lastFailKey = pkgKey;
} }
if (gotfd) {
/* FIX: check rc */
(void) rpmtsNotify(ts, p, RPMCALLBACK_INST_CLOSE_FILE, 0, 0);
p->fd = NULL;
}
p->h = headerFree(p->h);
(void) rpmswExit(rpmtsOp(ts, RPMTS_OP_INSTALL), 0); (void) rpmswExit(rpmtsOp(ts, RPMTS_OP_INSTALL), 0);
break; break;