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

Reply via email to