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