- plug most install mode leaks.

CVS patchset: 5424
CVS date: 2002/05/07 01:07:41
This commit is contained in:
jbj 2002-05-07 01:07:41 +00:00
parent e6ba507f77
commit b4c604e75c
12 changed files with 86 additions and 28 deletions

View File

@ -111,6 +111,7 @@
- rework most of rpmdb.c prepatory to implementing duplicates.
- fix: 2 memory leaks in headerSprintf.
- fix: db mire's access out-of-bounds memory.
- plug most install mode leaks.
4.0.3 -> 4.0.4:
- solaris: translate i86pc to i386 (#57182).

View File

@ -743,10 +743,28 @@ static struct badDeps_s {
{ NULL, NULL }
};
#else
/*@unchecked@*/
static int badDepsInitialized = 0;
/*@unchecked@*/ /*@only@*/ /*@null@*/
static struct badDeps_s * badDeps = NULL;
#endif
/**
*/
static void freeBadDeps(void)
/*@globals badDeps, badDepsInitialized @*/
/*@modifies badDeps, badDepsInitialized @*/
{
if (badDeps) {
struct badDeps_s * bdp;
for (bdp = badDeps; bdp->pname != NULL && bdp->qname != NULL; bdp++)
bdp->pname = _free(bdp->pname);
badDeps = _free(badDeps);
}
badDepsInitialized = 0;
}
/**
* Check for dependency relations to be ignored.
*
@ -756,13 +774,13 @@ static struct badDeps_s * badDeps = NULL;
*/
static int ignoreDep(const transactionElement p,
const transactionElement q)
/*@*/
/*@globals badDeps, badDepsInitialized @*/
/*@modifies badDeps, badDepsInitialized @*/
{
struct badDeps_s * bdp;
static int _initialized = 0;
/*@-globs -mods@*/
if (!_initialized) {
if (!badDepsInitialized) {
char * s = rpmExpand("%{?_dependency_whiteout}", NULL);
const char ** av = NULL;
int ac = 0;
@ -794,7 +812,7 @@ static int ignoreDep(const transactionElement p,
}
av = _free(av);
s = _free(s);
_initialized++;
badDepsInitialized++;
}
/*@=globs =mods@*/
@ -1585,6 +1603,7 @@ assert(newOrderCount == ts->orderCount);
#else
rpmtransClean(ts);
#endif
freeBadDeps();
return 0;
}

View File

@ -66,6 +66,7 @@ rpmProblemSet rpmProblemSetFree(rpmProblemSet ps)
p->altNEVR = _free(p->altNEVR);
p->str1 = _free(p->str1);
}
ps->probs = _free(ps->probs);
}
(void) rpmpsUnlink(ps, "destroy");
/*@-refcounttrans -usereleased@*/

View File

@ -979,8 +979,10 @@ TFI_t fiNew(rpmTransactionSet ts, TFI_t fi,
fi->action = FA_UNKNOWN;
fi->flags = 0;
if (fi->actions == NULL)
if (fi->actions == NULL)
fi->actions = xcalloc(fi->fc, sizeof(*fi->actions));
fi->keep_header = (scareMem ? 1 : 0);
/* XXX TR_REMOVED needs CPIO_MAP_{ABSOLUTE,ADDDOT} CPIO_ALL_HARDLINKS */
@ -991,6 +993,7 @@ TFI_t fiNew(rpmTransactionSet ts, TFI_t fi,
xx = hge(h, RPMTAG_FILELANGS, NULL, (void **) &fi->flangs, NULL);
xx = hge(h, RPMTAG_FILEMD5S, NULL, (void **) &fi->fmd5s, NULL);
t = xmalloc(fi->fc * 16);
fi->md5s = t;
for (i = 0; i < fi->fc; i++) {
@ -1011,6 +1014,7 @@ TFI_t fiNew(rpmTransactionSet ts, TFI_t fi,
/* XXX TR_REMOVED doesn;t need fmtimes or frdevs */
xx = hge(h, RPMTAG_FILEMTIMES, NULL, (void **) &fi->fmtimes, NULL);
xx = hge(h, RPMTAG_FILERDEVS, NULL, (void **) &fi->frdevs, NULL);
fi->replacedSizes = xcalloc(fi->fc, sizeof(*fi->replacedSizes));
xx = hge(h, RPMTAG_FILEUSERNAME, NULL, (void **) &fi->fuser, NULL);
@ -1022,6 +1026,8 @@ TFI_t fiNew(rpmTransactionSet ts, TFI_t fi,
if (fi != NULL)
if (fi->te != NULL && fi->te->type == TR_ADDED) {
Header foo;
/* XXX DYING */
if (fi->actions == NULL)
fi->actions = xcalloc(fi->fc, sizeof(*fi->actions));
/*@-compdef@*/ /* FIX: fi-md5s undefined */
foo = relocateFileList(ts, fi, h, fi->actions);

View File

@ -309,6 +309,7 @@ void rpmtransClean(rpmTransactionSet ts)
if (ts->sig != NULL)
ts->sig = headerFreeData(ts->sig, ts->sigtype);
if (ts->dig != NULL)
ts->dig = pgpFreeDig(ts->dig);
}
@ -353,6 +354,11 @@ rpmTransactionSet rpmtransFree(rpmTransactionSet ts)
ts->order = _free(ts->order);
/*@=type =voidabstract @*/
if (ts->pkpkt != NULL)
ts->pkpkt = _free(ts->pkpkt);
ts->pkpktlen = 0;
memset(ts->pksignid, 0, sizeof(ts->pksignid));
/*@-nullstate@*/ /* FIX: partial annotations */
rpmtransClean(ts);
/*@=nullstate@*/
@ -428,6 +434,9 @@ rpmTransactionSet rpmtransCreateSet(rpmdb db, const char * rootDir)
ts->probs = NULL;
ts->sig = NULL;
ts->pkpkt = NULL;
ts->pkpktlen = 0;
memset(ts->pksignid, 0, sizeof(ts->pksignid));
ts->dig = NULL;
ts->nrefs = 0;

View File

@ -102,6 +102,12 @@ struct rpmTransactionSet_s {
int_32 sigtype; /*!< Current package signature data type. */
/*@null@*/ const void * sig; /*!< Current package signature. */
int_32 siglen; /*!< Current package signature length. */
/*@only@*/ /*@null@*/
const unsigned char * pkpkt;/*!< Current pubkey packet. */
size_t pkpktlen; /*!< Current pubkey packet length. */
unsigned char pksignid[8]; /*!< Current pubkey fingerprint. */
/*@null@*/
struct pgpDig_s * dig; /*!< Current signature/pubkey parametrs. */

View File

@ -926,9 +926,6 @@ rpmtsFindPubkey(rpmTransactionSet ts)
{
struct pgpDigParams_s * sigp = NULL;
rpmVerifySignatureReturn res;
/*@unchecked@*/ /*@only@*/ static const byte * pkpkt = NULL;
/*@unchecked@*/ static size_t pkpktlen = 0;
/*@unchecked@*/ static byte pksignid[8];
int xx;
if (ts->sig == NULL || ts->dig == NULL) {
@ -937,14 +934,16 @@ rpmtsFindPubkey(rpmTransactionSet ts)
}
sigp = &ts->dig->signature;
if (pkpkt == NULL || memcmp(sigp->signid, pksignid, sizeof(pksignid))) {
if (ts->pkpkt == NULL
|| memcmp(sigp->signid, ts->pksignid, sizeof(ts->pksignid)))
{
int ix = -1;
rpmdbMatchIterator mi;
Header h;
pkpkt = _free(pkpkt);
pkpktlen = 0;
memset(pksignid, 0, sizeof(pksignid));
ts->pkpkt = _free(ts->pkpkt);
ts->pkpktlen = 0;
memset(ts->pksignid, 0, sizeof(ts->pksignid));
/* Make sure the database is open. */
(void) rpmtsOpenDB(ts, ts->dbmode);
@ -959,7 +958,7 @@ rpmtsFindPubkey(rpmTransactionSet ts)
continue;
ix = rpmdbGetIteratorFileNum(mi);
if (ix >= pc
|| b64decode(pubkeys[ix], (void **) &pkpkt, &pkpktlen))
|| b64decode(pubkeys[ix], (void **) &ts->pkpkt, &ts->pkpktlen))
ix = -1;
pubkeys = headerFreeData(pubkeys, pt);
break;
@ -967,7 +966,7 @@ rpmtsFindPubkey(rpmTransactionSet ts)
mi = rpmdbFreeIterator(mi);
/* Was a matching pubkey found? */
if (ix < 0 || pkpkt == NULL) {
if (ix < 0 || ts->pkpkt == NULL) {
res = RPMSIG_NOKEY;
goto exit;
}
@ -976,15 +975,15 @@ rpmtsFindPubkey(rpmTransactionSet ts)
* Can the pubkey packets be parsed?
* Do the parameters match the signature?
*/
if (pgpPrtPkts(pkpkt, pkpktlen, NULL, 0)
if (pgpPrtPkts(ts->pkpkt, ts->pkpktlen, NULL, 0)
&& ts->dig->signature.pubkey_algo == ts->dig->pubkey.pubkey_algo
#ifdef NOTYET
&& ts->dig->signature.hash_algo == ts->dig->pubkey.hash_algo
#endif
&& !memcmp(ts->dig->signature.signid, ts->dig->pubkey.signid, 8))
{
pkpkt = _free(pkpkt);
pkpktlen = 0;
ts->pkpkt = _free(ts->pkpkt);
ts->pkpktlen = 0;
res = RPMSIG_NOKEY;
goto exit;
}
@ -992,7 +991,7 @@ rpmtsFindPubkey(rpmTransactionSet ts)
/* XXX Verify the pubkey signature. */
/* Packet looks good, save the signer id. */
memcpy(pksignid, sigp->signid, sizeof(pksignid));
memcpy(ts->pksignid, sigp->signid, sizeof(ts->pksignid));
rpmMessage(RPMMESS_DEBUG, "========== %s pubkey id %s\n",
(sigp->pubkey_algo == PGPPUBKEYALGO_DSA ? "DSA" :
@ -1003,9 +1002,9 @@ rpmtsFindPubkey(rpmTransactionSet ts)
#ifdef NOTNOW
{
if (pkpkt == NULL) {
if (ts->pkpkt == NULL) {
const char * pkfn = rpmExpand("%{_gpg_pubkey}", NULL);
if (pgpReadPkts(pkfn, &pkpkt, &pkpktlen) != PGPARMOR_PUBKEY) {
if (pgpReadPkts(pkfn, &ts->pkpkt, &ts->pkpktlen) != PGPARMOR_PUBKEY) {
pkfn = _free(pkfn);
res = RPMSIG_NOKEY;
goto exit;
@ -1016,7 +1015,7 @@ rpmtsFindPubkey(rpmTransactionSet ts)
#endif
/* Retrieve parameters from pubkey packet(s). */
xx = pgpPrtPkts(pkpkt, pkpktlen, ts->dig, 0);
xx = pgpPrtPkts(ts->pkpkt, ts->pkpktlen, ts->dig, 0);
/* Do the parameters match the signature? */
if (ts->dig->signature.pubkey_algo == ts->dig->pubkey.pubkey_algo

View File

@ -1572,12 +1572,14 @@ fileAction * actions = fi->actions;
fi->fstates = NULL;
fi->actions = NULL;
psm->fi = fiFree(psm->fi, 1);
(void) fiFree(fi, 0);
/*@-usereleased@*/
fi->magic = TFIMAGIC;
fi->te = p;
fi->record = 0;
(void) fiNew(ts, fi, h, RPMTAG_BASENAMES, 1);
psm->fi = rpmfiLink(fi, "tsInstall");
fi->fstates = _free(fi->fstates);
fi->fstates = fstates;
fi->actions = _free(fi->actions);
@ -1611,7 +1613,6 @@ fi->actions = actions;
p->fd = NULL;
/*@=type@*/
}
(void) fiFree(fi, 0);
/*@switchbreak@*/ break;
case TR_REMOVED:
rpmMessage(RPMMESS_DEBUG, "========== --- %s\n", teGetNEVR(p));
@ -1620,13 +1621,13 @@ fi->actions = actions;
if (psmStage(psm, PSM_PKGERASE))
ourrc++;
}
(void) fiFree(fi, 0);
/*@switchbreak@*/ break;
}
xx = rpmdbSync(ts->rpmdb);
(void) rpmfiUnlink(psm->fi, "tsInstall");
psm->fi = NULL;
psm->te = NULL;
p->fi = fiFree(fi, 1);
}
/*@=branchstate@*/
pi = teFreeIterator(pi);

View File

@ -20,7 +20,7 @@ Name: rpm
%define version @VERSION@
Version: %{version}
%{expand: %%define rpm_version %{version}}
Release: 0.12
Release: 0.13
Group: System Environment/Base
Source: ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.0.x/rpm-%{rpm_version}.tar.gz
Copyright: GPL
@ -525,6 +525,7 @@ fi
- rework most of rpmdb.c prepatory to implementing duplicates.
- fix: 2 memory leaks in headerSprintf.
- fix: db mire's access out-of-bounds memory.
- plug most install mode leaks.
* Fri May 3 2002 Jeff Johnson <jbj@redhat.com> 4.1-0.12
- use DBT_DB_MALLOC to eliminate re-malloc'ing header blobs.

View File

@ -104,8 +104,8 @@ Header XheaderLink(Header h, /*@null@*/ const char * msg,
{
if (h != NULL) h->nrefs++;
/*@-modfilesystem@*/
if (_h_debug > 0 && msg != NULL)
fprintf(stderr, "--> h %p ++ %d %s at %s:%u\n", h, (h != NULL ? h->nrefs : 0), msg, fn, ln);
if ((_h_debug > 0 || (h->flags & HEADERFLAG_DEBUG)) && msg != NULL)
fprintf(stderr, "--> h %p ++ %d blob %p flags %x %s at %s:%u\n", h, (h != NULL ? h->nrefs : 0), (h != NULL ? h->blob : NULL), (h != NULL ? h->flags : 0), msg, fn, ln);
/*@=modfilesystem@*/
/*@-refcounttrans -nullret @*/
return h;
@ -123,8 +123,8 @@ Header XheaderUnlink(/*@killref@*/ /*@null@*/ Header h,
/*@modifies h @*/
{
/*@-modfilesystem@*/
if (_h_debug > 0 && msg != NULL)
fprintf(stderr, "--> h %p -- %d %s at %s:%u\n", h, (h != NULL ? h->nrefs : 0), msg, fn, ln);
if ((_h_debug > 0 || (h->flags & HEADERFLAG_DEBUG)) && msg != NULL)
fprintf(stderr, "--> h %p -- %d blob %p flags %x %s at %s:%u\n", h, (h != NULL ? h->nrefs : 0), (h != NULL ? h->blob : NULL), (h != NULL ? h->flags : 0), msg, fn, ln);
/*@=modfilesystem@*/
if (h != NULL) h->nrefs--;
return NULL;

View File

@ -62,6 +62,7 @@ struct headerToken {
#define HEADERFLAG_SORTED (1 << 0) /*!< Are header entries sorted? */
#define HEADERFLAG_ALLOCATED (1 << 1) /*!< Is 1st header region allocated? */
#define HEADERFLAG_LEGACY (1 << 2) /*!< Header came from legacy source? */
#define HEADERFLAG_DEBUG (1 << 3) /*!< Debug this header? */
/*@refs@*/ int nrefs; /*!< Reference count. */
};

View File

@ -1065,6 +1065,20 @@ struct pgpDig_s * pgpFreeDig(/*@only@*/ /*@null@*/ struct pgpDig_s * dig)
/*@=branchstate@*/
dig->sha1ctx = NULL;
mp32bfree(&dig->p);
mp32bfree(&dig->q);
mp32nfree(&dig->g);
mp32nfree(&dig->y);
mp32nfree(&dig->hm);
mp32nfree(&dig->r);
mp32nfree(&dig->s);
mp32bfree(&dig->rsa_pk.n);
mp32nfree(&dig->rsa_pk.e);
mp32nfree(&dig->m);
mp32nfree(&dig->c);
mp32nfree(&dig->hm);
dig = _free(dig);
}
return dig;