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:   12-Mar-2009 19:57:47
  Branch: HEAD                             Handle: 2009031218574700

  Modified files:
    rpm/rpmio               rpmio.c

  Log:
    - jbj: yarn: protect all of fdFree with the usage lock.

  Summary:
    Revision    Changes     Path
    1.162       +28 -29     rpm/rpmio/rpmio.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmio/rpmio.c
  ============================================================================
  $ cvs diff -u -r1.161 -r1.162 rpmio.c
  --- rpm/rpmio/rpmio.c 12 Mar 2009 18:21:26 -0000      1.161
  +++ rpm/rpmio/rpmio.c 12 Mar 2009 18:57:47 -0000      1.162
  @@ -284,13 +284,10 @@
   DBGREFS(0, (stderr, "--> fd  %p ++ %d %s at %s:%u\n", cookie, -9, msg, file, 
line));
   #endif
       fd = c2f(cookie);
  -    if (fd && fd->use) {
  -     int nrefs;
  +    if (fd) {
        yarnPossess(fd->use);
  -     nrefs = yarnPeekLock(fd->use);
  +DBGREFS(fd, (stderr, "--> fd  %p ++ %ld %s at %s:%u %s\n", fd, 
yarnPeekLock(fd->use), msg, file, line, fdbg(fd)));
        yarnTwist(fd->use, BY, 1);
  -     nrefs++;
  -DBGREFS(fd, (stderr, "--> fd  %p ++ %d %s at %s:%u %s\n", fd, nrefs, msg, 
file, line, fdbg(fd)));
       }
       return fd;
   }
  @@ -309,38 +306,40 @@
   assert(fd != NULL);
   #else
   if (fd == NULL)
  -DBGREFS(0, (stderr, "--> fd  %p -- %d %s at %s:%u\n", fd, -9, msg, file, 
line));
  +DBGREFS(0, (stderr, "--> fd  %p -- %ld %s at %s:%u\n", fd, -9L, msg, file, 
line));
   #endif
       FDSANE(fd);
       if (fd) {
  -     int nrefs;
        yarnPossess(fd->use);
  -     nrefs = yarnPeekLock(fd->use);
  -     yarnTwist(fd->use, BY, -1);
  -     nrefs--;
  -DBGREFS(fd, (stderr, "--> fd  %p -- %d %s at %s:%u %s\n", fd, nrefs, msg, 
file, line, fdbg(fd)));
  -     if (nrefs > 0)
  -         /*...@-refcounttrans -retal...@*/ return fd; /*...@=refcounttrans 
=retal...@*/
  -     fd->opath = _free(fd->opath);
  -     fd->stats = _free(fd->stats);
  -     for (i = fd->ndigests - 1; i >= 0; i--) {
  -         FDDIGEST_t fddig = fd->digests + i;
  -         if (fddig->hashctx == NULL)
  -             continue;
  -         (void) rpmDigestFinal(fddig->hashctx, NULL, NULL, 0);
  -         fddig->hashctx = NULL;
  -     }
  -     fd->ndigests = 0;
  -     fd->contentType = _free(fd->contentType);
  -     fd->contentDisposition = _free(fd->contentDisposition);
  +DBGREFS(fd, (stderr, "--> fd  %p -- %ld %s at %s:%u %s\n", fd, 
yarnPeekLock(fd->use), msg, file, line, fdbg(fd)));
  +     if (yarnPeekLock(fd->use) == 1) {
  +         yarnLock use = fd->use;
  +         fd->opath = _free(fd->opath);
  +         fd->stats = _free(fd->stats);
  +         for (i = fd->ndigests - 1; i >= 0; i--) {
  +             FDDIGEST_t fddig = fd->digests + i;
  +             if (fddig->hashctx == NULL)
  +                 continue;
  +             (void) rpmDigestFinal(fddig->hashctx, NULL, NULL, 0);
  +             fddig->hashctx = NULL;
  +         }
  +         fd->ndigests = 0;
  +         fd->contentType = _free(fd->contentType);
  +         fd->contentDisposition = _free(fd->contentDisposition);
   /*...@-onlytrans@*/
   #ifdef WITH_XAR
  -     fd->xar = rpmxarFree(fd->xar);
  +         fd->xar = rpmxarFree(fd->xar);
   #endif
  -     fd->dig = pgpDigFree(fd->dig);
  +         fd->dig = pgpDigFree(fd->dig);
   /*...@=onlytrans@*/
  -     memset(fd, 0, sizeof(*fd));     /* XXX trash and burn */
  -     /*...@-refcounttrans@*/ free(fd); /*...@=refcounttrans@*/
  +         memset(fd, 0, sizeof(*fd)); /* XXX trash and burn */
  +         /*...@-refcounttrans@*/ fd = _free(fd); /*...@=refcounttrans@*/
  +         yarnTwist(use, BY, -1);
  +         use = yarnFreeLock(use);
  +         return NULL;
  +     }
  +     yarnTwist(fd->use, BY, -1);
  +     /*...@-refcounttrans -retal...@*/ return fd; /*...@=refcounttrans 
=retal...@*/
       }
       return NULL;
   }
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                rpm-cvs@rpm5.org

Reply via email to