summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rpmio/digest.c90
-rw-r--r--rpmio/rpmio.c31
-rw-r--r--rpmio/rpmio_internal.h4
3 files changed, 45 insertions, 80 deletions
diff --git a/rpmio/digest.c b/rpmio/digest.c
index 707d6e0d1..0779b90de 100644
--- a/rpmio/digest.c
+++ b/rpmio/digest.c
@@ -251,25 +251,19 @@ DPRINTF((stderr, "*** Final(%p,%p,%p,%zd) hashctx %p digest %p\n", ctx, datap, l
void fdInitDigest(FD_t fd, pgpHashAlgo hashalgo, int flags)
{
- if (fd->ndigests < FDDIGEST_MAX) {
- fd->digests[fd->ndigests] = rpmDigestInit(hashalgo, flags);
- fd->ndigests++;
- fdstat_enter(fd, FDSTAT_DIGEST);
- fdstat_exit(fd, FDSTAT_DIGEST, (ssize_t) 0);
+ if (fd->digests == NULL) {
+ fd->digests = rpmDigestBundleNew();
}
+ fdstat_enter(fd, FDSTAT_DIGEST);
+ rpmDigestBundleAdd(fd->digests, hashalgo, flags);
+ fdstat_exit(fd, FDSTAT_DIGEST, (ssize_t) 0);
}
void fdUpdateDigests(FD_t fd, const unsigned char * buf, size_t buflen)
{
- int i;
-
- if (buf != NULL && buflen > 0)
- for (i = fd->ndigests - 1; i >= 0; i--) {
- DIGEST_CTX ctx = fd->digests[i];
- if (ctx == NULL)
- continue;
+ if (fd && fd->digests) {
fdstat_enter(fd, FDSTAT_DIGEST);
- (void) rpmDigestUpdate(ctx, buf, buflen);
+ rpmDigestBundleUpdate(fd->digests, buf, buflen);
fdstat_exit(fd, FDSTAT_DIGEST, (ssize_t) buflen);
}
}
@@ -279,56 +273,38 @@ void fdFiniDigest(FD_t fd, pgpHashAlgo hashalgo,
size_t * lenp,
int asAscii)
{
- int imax = -1;
- int i;
-
- for (i = fd->ndigests - 1; i >= 0; i--) {
- DIGEST_CTX ctx = fd->digests[i];
- if (ctx == NULL)
- continue;
- if (i > imax) imax = i;
- if (ctx->algo != hashalgo)
- continue;
+ if (fd && fd->digests) {
fdstat_enter(fd, FDSTAT_DIGEST);
- (void) rpmDigestFinal(ctx, datap, lenp, asAscii);
+ rpmDigestBundleFinal(fd->digests, hashalgo, datap, lenp, asAscii);
fdstat_exit(fd, FDSTAT_DIGEST, (ssize_t) 0);
- fd->digests[i] = NULL;
- break;
- }
- if (i < 0) {
- if (datap) *datap = NULL;
- if (lenp) *lenp = 0;
}
-
- fd->ndigests = imax;
- if (i < imax)
- fd->ndigests++; /* convert index to count */
}
-
void fdStealDigest(FD_t fd, pgpDig dig)
{
- int i;
- for (i = fd->ndigests - 1; i >= 0; i--) {
- DIGEST_CTX ctx = fd->digests[i];
- if (ctx == NULL)
- continue;
- switch (ctx->algo) {
- case PGPHASHALGO_MD5:
-assert(dig->md5ctx == NULL);
- dig->md5ctx = ctx;
- fd->digests[i] = NULL;
- break;
- case PGPHASHALGO_SHA1:
- case PGPHASHALGO_SHA256:
- case PGPHASHALGO_SHA384:
- case PGPHASHALGO_SHA512:
-assert(dig->sha1ctx == NULL);
- dig->sha1ctx = ctx;
- fd->digests[i] = NULL;
- break;
- default:
- break;
- }
+ if (fd && fd->digests) {
+ rpmDigestBundle bundle = fd->digests;
+ for (int i = bundle->index_max; i >= bundle->index_min; i--) {
+ DIGEST_CTX ctx = bundle->digests[i];
+ if (ctx == NULL)
+ continue;
+ switch (ctx->algo) {
+ case PGPHASHALGO_MD5:
+ assert(dig->md5ctx == NULL);
+ dig->md5ctx = ctx;
+ bundle->digests[i] = NULL;
+ break;
+ case PGPHASHALGO_SHA1:
+ case PGPHASHALGO_SHA256:
+ case PGPHASHALGO_SHA384:
+ case PGPHASHALGO_SHA512:
+ assert(dig->sha1ctx == NULL);
+ dig->sha1ctx = ctx;
+ bundle->digests[i] = NULL;
+ break;
+ default:
+ break;
+ }
+ }
}
}
diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c
index c7040302e..95f0b8d8f 100644
--- a/rpmio/rpmio.c
+++ b/rpmio/rpmio.c
@@ -241,8 +241,6 @@ DBGREFS(fd, (stderr, "--> fd %p ++ %d %s %s\n", fd, fd->nrefs, msg, fdbg(fd)))
*/
FD_t fdFree( FD_t fd, const char *msg)
{
- int i;
-
if (fd == NULL)
DBGREFS(0, (stderr, "--> fd %p -- %d %s\n", fd, FDNREFS(fd), msg));
FDSANE(fd);
@@ -251,14 +249,9 @@ DBGREFS(fd, (stderr, "--> fd %p -- %d %s %s\n", fd, fd->nrefs, msg, fdbg(fd)));
if (--fd->nrefs > 0)
return fd;
fd->stats = _free(fd->stats);
- for (i = fd->ndigests - 1; i >= 0; i--) {
- DIGEST_CTX *ctxp = fd->digests + i;
- if (*ctxp == NULL)
- continue;
- (void) rpmDigestFinal(*ctxp, NULL, NULL, 0);
- *ctxp = NULL;
+ if (fd->digests) {
+ fd->digests = rpmDigestBundleFree(fd->digests);
}
- fd->ndigests = 0;
free(fd);
}
return NULL;
@@ -288,9 +281,7 @@ FD_t fdNew(const char * msg)
fd->syserrno = 0;
fd->errcookie = NULL;
fd->stats = xcalloc(1, sizeof(*fd->stats));
-
- fd->ndigests = 0;
- memset(fd->digests, 0, sizeof(fd->digests));
+ fd->digests = NULL;
fd->fd_cpioPos = 0;
@@ -310,7 +301,7 @@ static ssize_t fdRead(void * cookie, char * buf, size_t count)
rc = read(fdFileno(fd), buf, (count > fd->bytesRemain ? fd->bytesRemain : count));
fdstat_exit(fd, FDSTAT_READ, rc);
- if (fd->ndigests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
+ if (fd->digests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
DBGIO(fd, (stderr, "==>\tfdRead(%p,%p,%ld) rc %ld %s\n", cookie, buf, (long)count, (long)rc, fdbg(fd)));
@@ -327,7 +318,7 @@ static ssize_t fdWrite(void * cookie, const char * buf, size_t count)
if (fd->bytesRemain == 0) return 0; /* XXX simulate EOF */
- if (fd->ndigests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
+ if (fd->digests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
if (count == 0) return 0;
@@ -870,7 +861,7 @@ DBGIO(fd, (stderr, "==>\tgzdRead(%p,%p,%u) rc %lx %s\n", cookie, buf, (unsigned)
}
} else if (rc >= 0) {
fdstat_exit(fd, FDSTAT_READ, rc);
- if (fd->ndigests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
+ if (fd->digests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
}
return rc;
}
@@ -883,7 +874,7 @@ static ssize_t gzdWrite(void * cookie, const char * buf, size_t count)
if (fd == NULL || fd->bytesRemain == 0) return 0; /* XXX simulate EOF */
- if (fd->ndigests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
+ if (fd->digests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
gzfile = gzdFileno(fd);
if (gzfile == NULL) return -2; /* XXX can't happen */
@@ -1071,7 +1062,7 @@ static ssize_t bzdRead(void * cookie, char * buf, size_t count)
fd->errcookie = bzerror(bzfile, &zerror);
} else if (rc >= 0) {
fdstat_exit(fd, FDSTAT_READ, rc);
- if (fd->ndigests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
+ if (fd->digests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
}
return rc;
}
@@ -1084,7 +1075,7 @@ static ssize_t bzdWrite(void * cookie, const char * buf, size_t count)
if (fd->bytesRemain == 0) return 0; /* XXX simulate EOF */
- if (fd->ndigests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
+ if (fd->digests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
bzfile = bzdFileno(fd);
fdstat_enter(fd, FDSTAT_WRITE);
@@ -1460,7 +1451,7 @@ static ssize_t lzdRead(void * cookie, char * buf, size_t count)
fd->errcookie = "Lzma: decoding error";
} else if (rc >= 0) {
fdstat_exit(fd, FDSTAT_READ, rc);
- if (fd->ndigests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
+ if (fd->digests && rc > 0) fdUpdateDigests(fd, (void *)buf, rc);
}
return rc;
}
@@ -1473,7 +1464,7 @@ static ssize_t lzdWrite(void * cookie, const char * buf, size_t count)
if (fd == NULL || fd->bytesRemain == 0) return 0; /* XXX simulate EOF */
- if (fd->ndigests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
+ if (fd->digests && count > 0) fdUpdateDigests(fd, (void *)buf, count);
lzfile = lzdFileno(fd);
diff --git a/rpmio/rpmio_internal.h b/rpmio/rpmio_internal.h
index 82dd43381..b00c35d7a 100644
--- a/rpmio/rpmio_internal.h
+++ b/rpmio/rpmio_internal.h
@@ -50,9 +50,7 @@ struct _FD_s {
FDSTAT_t stats; /* I/O statistics */
- int ndigests;
-#define FDDIGEST_MAX 4
- DIGEST_CTX digests[FDDIGEST_MAX];
+ rpmDigestBundle digests;
rpm_loff_t fd_cpioPos; /* cpio: */
};