RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 19-Mar-2009 17:29:24 Branch: HEAD Handle: 2009031916292400 Modified files: rpm CHANGES rpm/rpmio librpmio.vers rpmio.c rpmpgp.c rpmpgp.h Log: - yarn: convert pgpDig refcount to usage mutex (avoid recurse deadlock). Summary: Revision Changes Path 1.2846 +1 -0 rpm/CHANGES 2.96 +0 -2 rpm/rpmio/librpmio.vers 1.167 +2 -0 rpm/rpmio/rpmio.c 2.99 +30 -29 rpm/rpmio/rpmpgp.c 2.80 +7 -9 rpm/rpmio/rpmpgp.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.2845 -r1.2846 CHANGES --- rpm/CHANGES 19 Mar 2009 14:57:20 -0000 1.2845 +++ rpm/CHANGES 19 Mar 2009 16:29:24 -0000 1.2846 @@ -1,5 +1,6 @@ 5.2a3 -> 5.2a4: + - jbj: yarn: convert pgpDig refcount to usage mutex (avoid recurse deadlock). - jbj: yarn: convert rpmts refcount to usage mutex (avoid recurse deadlock). - jbj: rpmps: fix: avoid reusing items from pool for now. - proyvind: libcpuinfo may now return 64bit feature only if PER_LINUX_32BIT @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/librpmio.vers ============================================================================ $ cvs diff -u -r2.95 -r2.96 librpmio.vers --- rpm/rpmio/librpmio.vers 18 Mar 2009 18:47:51 -0000 2.95 +++ rpm/rpmio/librpmio.vers 19 Mar 2009 16:29:24 -0000 2.96 @@ -204,8 +204,6 @@ pgpDigClean; pgpDigFree; pgpDigNew; - XpgpDigLink; - XpgpDigUnlink; pgpDigVSFlags; _pgp_debug; _pgp_print; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmio.c ============================================================================ $ cvs diff -u -r1.166 -r1.167 rpmio.c --- rpm/rpmio/rpmio.c 18 Mar 2009 18:36:37 -0000 1.166 +++ rpm/rpmio/rpmio.c 19 Mar 2009 16:29:24 -0000 1.167 @@ -3153,6 +3153,7 @@ void rpmioClean(void) { + extern rpmioPool _digPool; extern rpmioPool _urlPool; #if defined(WITH_LUA) @@ -3170,6 +3171,7 @@ urlFreeCache(); _urlPool = rpmioFreePool(_urlPool); + _digPool = rpmioFreePool(_digPool); _fdPool = rpmioFreePool(_fdPool); rpmlogClose(); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmpgp.c ============================================================================ $ cvs diff -u -r2.98 -r2.99 rpmpgp.c --- rpm/rpmio/rpmpgp.c 12 Dec 2008 13:47:06 -0000 2.98 +++ rpm/rpmio/rpmpgp.c 19 Mar 2009 16:29:24 -0000 2.99 @@ -1011,28 +1011,19 @@ /*...@unchecked@*/ pgpVSFlags pgpDigVSFlags; -pgpDig XpgpDigUnlink(pgpDig dig, const char * msg, const char * fn, unsigned ln) -{ - if (dig == NULL) return NULL; -/*...@-modfilesys@*/ -if (_pgp_debug < 0 && msg != NULL) -fprintf(stderr, "--> dig %p -- %d %s at %s:%u\n", dig, dig->nrefs, msg, fn, ln); -/*...@=modfilesys@*/ - dig->nrefs--; - return NULL; -} +/*...@unchecked@*/ /*...@null@*/ +rpmioPool _digPool; -pgpDig XpgpDigLink(pgpDig dig, const char * msg, const char * fn, unsigned ln) +static pgpDig digGetPool(/*...@null@*/ rpmioPool pool) + /*...@modifies pool @*/ { - if (dig == NULL) return NULL; - dig->nrefs++; - -/*...@-modfilesys@*/ -if (_pgp_debug < 0 && msg != NULL) -fprintf(stderr, "--> dig %p ++ %d %s at %s:%u\n", dig, dig->nrefs, msg, fn, ln); -/*...@=modfilesys@*/ + pgpDig dig; - /*...@-refcounttrans@*/ return dig; /*...@=refcounttrans@*/ + if (_digPool == NULL) { + _digPool = rpmioNewPool("dig", sizeof(*dig), -1, _pgp_debug); + pool = _digPool; + } + return (pgpDig) rpmioGetPool(pool, sizeof(*dig)); } void pgpDigClean(pgpDig dig) @@ -1070,18 +1061,31 @@ pgpDig pgpDigFree(pgpDig dig) { - if (dig != NULL) { + if (dig == NULL) + return NULL; /*...@-onlytrans@*/ - if (dig->nrefs > 1) - return pgpDigUnlink(dig, "pgpDigFree"); + yarnPossess(dig->use); +/*...@-modfilesys@*/ +if (_pgp_debug < 0) +fprintf(stderr, "--> dig %p -- %ld %s at %s:%u\n", dig, yarnPeekLock(dig->use), "pgpDigFree", __FILE__, __LINE__); +/*...@=modfilesys@*/ + if (yarnPeekLock(dig->use) <= 1L) { + yarnLock use = dig->use; /* Lose the header tag data. */ /* XXX this free should be done somewhere else. */ dig->sig = _free(dig->sig); + /* XXX there's a recursion here ... release and reacquire the lock */ +#ifndef BUGGY + yarnRelease(dig->use); +#endif /* Dump the signature/pubkey data. */ pgpDigClean(dig); +#ifndef BUGGY + yarnPossess(dig->use); +#endif if (dig->hdrsha1ctx != NULL) (void) rpmDigestFinal(dig->hdrsha1ctx, NULL, NULL, 0); @@ -1103,19 +1107,16 @@ dig->impl = pgpImplFree(dig->impl); - (void) pgpDigUnlink(dig, "pgpDigFree"); /*...@=onlytrans@*/ - /*...@-refcounttrans -userelea...@*/ - memset(dig, 0, sizeof(*dig)); /* XXX trash and burn */ - dig = _free(dig); - /*...@=refcounttrans =userelea...@*/ - } + dig = (pgpDig) rpmioPutPool((rpmioItem)dig); + } else + yarnTwist(dig->use, BY, -1); return NULL; } pgpDig pgpDigNew(/*...@unused@*/ pgpVSFlags vsflags) { - pgpDig dig = xcalloc(1, sizeof(*dig)); + pgpDig dig = digGetPool(_digPool); dig->vsflags = pgpDigVSFlags; dig->impl = pgpImplInit(); return pgpDigLink(dig, "pgpDigNew"); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmpgp.h ============================================================================ $ cvs diff -u -r2.79 -r2.80 rpmpgp.h --- rpm/rpmio/rpmpgp.h 14 Dec 2008 01:32:06 -0000 2.79 +++ rpm/rpmio/rpmpgp.h 19 Mar 2009 16:29:24 -0000 2.80 @@ -13,6 +13,7 @@ #include <string.h> #include <popt.h> #include <rpmiotypes.h> +#include <yarn.h> #if defined(_RPMPGP_INTERNAL) #include <rpmsw.h> @@ -47,6 +48,10 @@ * Container for values parsed from an OpenPGP signature and public key. */ struct pgpDig_s { + yarnLock use; /*!< use count -- return to pool when zero */ +/*...@shared@*/ /*...@null@*/ + void *pool; /*!< pool (or NULL if malloc'd) */ + struct pgpDigParams_s signature; struct pgpDigParams_s pubkey; @@ -64,8 +69,6 @@ /*...@modifies *_ts, *_dig @*/;/*!< Find pubkey, i.e. rpmtsFindPubkey(). */ /*...@null@*/ void * _ts; /*!< Find pubkey argument, i.e. rpmts. */ -/*...@refs@*/ - int nrefs; /*!< Reference count. */ rpmuint8_t ** ppkts; int npkts; @@ -1378,13 +1381,8 @@ /*...@unused@*/ /*...@newref@*/ /*...@null@*/ pgpDig pgpDigLink (/*...@null@*/ pgpDig dig, /*...@null@*/ const char * msg) /*...@modifies dig @*/; - -/** @todo Remove debugging entry from the ABI. */ -/*...@newref@*/ /*...@null@*/ -pgpDig XpgpDigLink (/*...@null@*/ pgpDig dig, /*...@null@*/ const char * msg, - const char * fn, unsigned ln) - /*...@modifies dig @*/; -#define pgpDigLink(_dig, _msg) XpgpDigLink(_dig, _msg, __FILE__, __LINE__) +#define pgpDigLink(_dig, _msg) \ + ((pgpDig)rpmioLinkPoolItem((rpmioItem)(_dig), _msg, __FILE__, __LINE__)) /** \ingroup rpmpgp * Destroy a container for parsed OpenPGP packates. @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org