RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/lib/ librpm.vers package.c rpmlib.h rpmrol...

From: Jeff Johnson <jbj@rpm5.org>
Date: Sat 29 Sep 2007 - 18:23:40 CEST
Message-Id: <20070929162340.B835B34845F@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   29-Sep-2007 18:23:40
  Branch: HEAD                             Handle: 2007092917233901

  Modified files:
    rpm                     CHANGES
    rpm/lib                 librpm.vers package.c rpmlib.h rpmrollback.c
                            rpmts.c rpmts.h
    rpm/rpmdb               hdrNVR.c header.h librpmdb.vers pkgio.c

  Log:
    - jbj: add _RPMTS_PRINT to keep rpmrollback.c happy.
    - jbj: rearrange package.c internals to new locations.

  Summary:
    Revision    Changes     Path
    1.1646      +2  -0      rpm/CHANGES
    1.19        +0  -6      rpm/lib/librpm.vers
    2.162       +0  -501    rpm/lib/package.c
    2.436       +0  -19     rpm/lib/rpmlib.h
    1.13        +1  -0      rpm/lib/rpmrollback.c
    2.100       +4  -0      rpm/lib/rpmts.c
    2.76        +2  -2      rpm/lib/rpmts.h
    1.10        +156 -0     rpm/rpmdb/hdrNVR.c
    1.24        +19 -0      rpm/rpmdb/header.h
    1.17        +7  -0      rpm/rpmdb/librpmdb.vers
    1.6         +407 -2     rpm/rpmdb/pkgio.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1645 -r1.1646 CHANGES
  --- rpm/CHANGES	29 Sep 2007 01:20:51 -0000	1.1645
  +++ rpm/CHANGES	29 Sep 2007 16:23:39 -0000	1.1646
  @@ -1,4 +1,6 @@
   4.5 -> 5.0:
  +    - jbj: add _RPMTS_PRINT to keep rpmrollback.c happy.
  +    - jbj: rearrange package.c internals to new locations.
       - jbj: start eliminating rpmtsSetSig by inlining.
       - jbj: eliminate rpmtsSigFoo() getters.
       - jbj: finish refactoring vsflags out of rpmts.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/librpm.vers
  ============================================================================
  $ cvs diff -u -r1.18 -r1.19 librpm.vers
  --- rpm/lib/librpm.vers	29 Sep 2007 00:07:43 -0000	1.18
  +++ rpm/lib/librpm.vers	29 Sep 2007 16:23:39 -0000	1.19
  @@ -33,9 +33,6 @@
       getStringBuf;
       giFlags;
       global_depFlags;
  -    headerCheck;
  -    headerMergeLegacySigs;
  -    headerRegenSigHeader;
       IDTXfree;
       IDTXglob;
       IDTXgrow;
  @@ -333,7 +330,6 @@
       rpmtsCheckDSIProblems;
       rpmtsChrootDone;
       rpmtsClean;
  -    rpmtsCleanDig;
       rpmtsCloseDB;
       rpmtsCloseSDB;
       rpmtsColor;
  @@ -342,7 +338,6 @@
       _rpmts_debug;
       rpmtsDbmode;
       rpmtsDFlags;
  -    rpmtsDig;
       rpmtsDoARBGoal;
       rpmtsElement;
       rpmtsEmpty;
  @@ -368,7 +363,6 @@
       rpmtsOrder;
       rpmtsPRCO;
       rpmtsProblems;
  -    rpmtsPubkey;
       rpmtsRebuildDB;
       rpmtsREContext;
       rpmtsRelocateElement;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/package.c
  ============================================================================
  $ cvs diff -u -r2.161 -r2.162 package.c
  --- rpm/lib/package.c	29 Sep 2007 01:20:51 -0000	2.161
  +++ rpm/lib/package.c	29 Sep 2007 16:23:39 -0000	2.162
  @@ -42,159 +42,6 @@
   extern int _nolead;
   extern int _nosigh;
   
  -void headerMergeLegacySigs(Header h, const Header sigh)
  -{
  -    HFD_t hfd = (HFD_t) headerFreeData;
  -    HeaderIterator hi;
  -    int_32 tag, type, count;
  -    const void * ptr;
  -    int xx;
  -
  -    if (h == NULL || sigh == NULL)
  -	return;
  -
  -    for (hi = headerInitIterator(sigh);
  -        headerNextIterator(hi, &tag, &type, &ptr, &count);
  -        ptr = hfd(ptr, type))
  -    {
  -	switch (tag) {
  -	/* XXX Translate legacy signature tag values. */
  -	case RPMSIGTAG_SIZE:
  -	    tag = RPMTAG_SIGSIZE;
  -	    /*@switchbreak@*/ break;
  -#if defined(SUPPORT_RPMV3_BROKEN)
  -	case RPMSIGTAG_LEMD5_1:
  -	    tag = RPMTAG_SIGLEMD5_1;
  -	    /*@switchbreak@*/ break;
  -	case RPMSIGTAG_LEMD5_2:
  -	    tag = RPMTAG_SIGLEMD5_2;
  -	    /*@switchbreak@*/ break;
  -#endif
  -#if defined(SUPPORT_RPMV3_VERIFY_RSA)
  -	case RPMSIGTAG_PGP:
  -	    tag = RPMTAG_SIGPGP;
  -	    /*@switchbreak@*/ break;
  -	case RPMSIGTAG_PGP5:
  -	    tag = RPMTAG_SIGPGP5;
  -	    /*@switchbreak@*/ break;
  -#endif
  -	case RPMSIGTAG_MD5:
  -	    tag = RPMTAG_SIGMD5;
  -	    /*@switchbreak@*/ break;
  -#if defined(SUPPORT_RPMV3_VERIFY_DSA)
  -	case RPMSIGTAG_GPG:
  -	    tag = RPMTAG_SIGGPG;
  -	    /*@switchbreak@*/ break;
  -#endif
  -	case RPMSIGTAG_PAYLOADSIZE:
  -	    tag = RPMTAG_ARCHIVESIZE;
  -	    /*@switchbreak@*/ break;
  -	case RPMSIGTAG_SHA1:
  -	case RPMSIGTAG_DSA:
  -	case RPMSIGTAG_RSA:
  -	default:
  -	    if (!(tag >= HEADER_SIGBASE && tag < HEADER_TAGBASE))
  -		continue;
  -	    /*@switchbreak@*/ break;
  -	}
  -	if (ptr == NULL) continue;	/* XXX can't happen */
  -	if (!headerIsEntry(h, tag)) {
  -	    if (hdrchkType(type))
  -		continue;
  -	    if (count < 0 || hdrchkData(count))
  -		continue;
  -	    switch(type) {
  -	    case RPM_NULL_TYPE:
  -		continue;
  -		/*@notreached@*/ /*@switchbreak@*/ break;
  -	    case RPM_CHAR_TYPE:
  -	    case RPM_INT8_TYPE:
  -	    case RPM_INT16_TYPE:
  -	    case RPM_INT32_TYPE:
  -		if (count != 1)
  -		    continue;
  -		/*@switchbreak@*/ break;
  -	    case RPM_STRING_TYPE:
  -	    case RPM_BIN_TYPE:
  -		if (count >= 16*1024)
  -		    continue;
  -		/*@switchbreak@*/ break;
  -	    case RPM_STRING_ARRAY_TYPE:
  -	    case RPM_I18NSTRING_TYPE:
  -		continue;
  -		/*@notreached@*/ /*@switchbreak@*/ break;
  -	    }
  - 	    xx = headerAddEntry(h, tag, type, ptr, count);
  -	}
  -    }
  -    hi = headerFreeIterator(hi);
  -}
  -
  -Header headerRegenSigHeader(const Header h, int noArchiveSize)
  -{
  -    HFD_t hfd = (HFD_t) headerFreeData;
  -    Header sigh = headerNew();
  -    HeaderIterator hi;
  -    int_32 tag, stag, type, count;
  -    const void * ptr;
  -    int xx;
  -
  -    for (hi = headerInitIterator(h);
  -        headerNextIterator(hi, &tag, &type, &ptr, &count);
  -        ptr = hfd(ptr, type))
  -    {
  -	switch (tag) {
  -	/* XXX Translate legacy signature tag values. */
  -	case RPMTAG_SIGSIZE:
  -	    stag = RPMSIGTAG_SIZE;
  -	    /*@switchbreak@*/ break;
  -#if defined(SUPPORT_RPMV3_BROKEN)
  -	case RPMTAG_SIGLEMD5_1:
  -	    stag = RPMSIGTAG_LEMD5_1;
  -	    /*@switchbreak@*/ break;
  -	case RPMTAG_SIGLEMD5_2:
  -	    stag = RPMSIGTAG_LEMD5_2;
  -	    /*@switchbreak@*/ break;
  -#endif
  -#if defined(SUPPORT_RPMV3_VERIFY_RSA)
  -	case RPMTAG_SIGPGP:
  -	    stag = RPMSIGTAG_PGP;
  -	    /*@switchbreak@*/ break;
  -	case RPMTAG_SIGPGP5:
  -	    stag = RPMSIGTAG_PGP5;
  -	    /*@switchbreak@*/ break;
  -#endif
  -	case RPMTAG_SIGMD5:
  -	    stag = RPMSIGTAG_MD5;
  -	    /*@switchbreak@*/ break;
  -#if defined(SUPPORT_RPMV3_VERIFY_DSA)
  -	case RPMTAG_SIGGPG:
  -	    stag = RPMSIGTAG_GPG;
  -	    /*@switchbreak@*/ break;
  -#endif
  -	case RPMTAG_ARCHIVESIZE:
  -	    /* XXX rpm-4.1 and later has archive size in signature header. */
  -	    if (noArchiveSize)
  -		continue;
  -	    stag = RPMSIGTAG_PAYLOADSIZE;
  -	    /*@switchbreak@*/ break;
  -	case RPMTAG_SHA1HEADER:
  -	case RPMTAG_DSAHEADER:
  -	case RPMTAG_RSAHEADER:
  -	default:
  -	    if (!(tag >= HEADER_SIGBASE && tag < HEADER_TAGBASE))
  -		continue;
  -	    stag = tag;
  -	    /*@switchbreak@*/ break;
  -	}
  -	if (ptr == NULL) continue;	/* XXX can't happen */
  -	if (!headerIsEntry(sigh, stag))
  -	    xx = headerAddEntry(sigh, stag, type, ptr, count);
  -    }
  -    hi = headerFreeIterator(hi);
  -    return sigh;
  -}
  -
   /**
    * Remember current key id.
    * @param dig		container
  @@ -238,354 +85,6 @@
       return 0;
   }
   
  -/**
  - * Check header consistency, performing headerGetEntry() the hard way.
  - *
  - * Sanity checks on the header are performed while looking for a
  - * header-only digest or signature to verify the blob. If found,
  - * the digest or signature is verified.
  - *
  - * @param ts		transaction set
  - * @param uh		unloaded header blob
  - * @param uc		no. of bytes in blob (or 0 to disable)
  - * @retval *msg		signature verification msg
  - * @return		RPMRC_OK/RPMRC_NOTFOUND/RPMRC_FAIL
  - */
  -rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, const char ** msg)
  -{
  -    pgpDig dig = rpmtsDig(ts);
  -    char buf[8*BUFSIZ];
  -    int_32 * ei = (int_32 *) uh;
  -/*@-boundsread@*/
  -    int_32 il = ntohl(ei[0]);
  -    int_32 dl = ntohl(ei[1]);
  -/*@-castexpose@*/
  -    entryInfo pe = (entryInfo) &ei[2];
  -/*@=castexpose@*/
  -/*@=boundsread@*/
  -    int_32 ildl[2];
  -    int_32 pvlen = sizeof(ildl) + (il * sizeof(*pe)) + dl;
  -    unsigned char * dataStart = (unsigned char *) (pe + il);
  -    indexEntry entry = memset(alloca(sizeof(*entry)), 0, sizeof(*entry));
  -    entryInfo info = memset(alloca(sizeof(*info)), 0, sizeof(*info));
  -    const void * sig = NULL;
  -    unsigned char * b;
  -    rpmVSFlags vsflags = pgpGetVSFlags(dig);
  -    rpmop op;
  -    int siglen = 0;
  -    int blen;
  -    size_t nb;
  -    int_32 ril = 0;
  -    unsigned char * regionEnd = NULL;
  -    rpmRC rc = RPMRC_FAIL;	/* assume failure */
  -    int xx;
  -    int i;
  -    static int hclvl;
  -
  -    hclvl++;
  -/*@-boundswrite@*/
  -    buf[0] = '\0';
  -/*@=boundswrite@*/
  -
  -    /* Is the blob the right size? */
  -    if (uc > 0 && pvlen != uc) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"),
  -		(int)uc, (int)il, (int)dl);
  -	goto exit;
  -    }
  -
  -    /* Check (and convert) the 1st tag element. */
  -    xx = headerVerifyInfo(1, dl, pe, &entry->info, 0);
  -    if (xx != -1) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
  -		0, entry->info.tag, entry->info.type,
  -		entry->info.offset, entry->info.count);
  -	goto exit;
  -    }
  -
  -    /* Is there an immutable header region tag? */
  -/*@-sizeoftype@*/
  -    if (!(entry->info.tag == RPMTAG_HEADERIMMUTABLE
  -       && entry->info.type == RPM_BIN_TYPE
  -       && entry->info.count == REGION_TAG_COUNT))
  -    {
  -	rc = RPMRC_NOTFOUND;
  -	goto exit;
  -    }
  -/*@=sizeoftype@*/
  -
  -    /* Is the offset within the data area? */
  -    if (entry->info.offset >= dl) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("region offset: BAD, tag %d type %d offset %d count %d\n"),
  -		entry->info.tag, entry->info.type,
  -		entry->info.offset, entry->info.count);
  -	goto exit;
  -    }
  -
  -    /* Is there an immutable header region tag trailer? */
  -    regionEnd = dataStart + entry->info.offset;
  -/*@-sizeoftype@*/
  -/*@-bounds@*/
  -    (void) memcpy(info, regionEnd, REGION_TAG_COUNT);
  -/*@=bounds@*/
  -    regionEnd += REGION_TAG_COUNT;
  -
  -    xx = headerVerifyInfo(1, dl, info, &entry->info, 1);
  -    if (xx != -1 ||
  -	!(entry->info.tag == RPMTAG_HEADERIMMUTABLE
  -       && entry->info.type == RPM_BIN_TYPE
  -       && entry->info.count == REGION_TAG_COUNT))
  -    {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("region trailer: BAD, tag %d type %d offset %d count %d\n"),
  -		entry->info.tag, entry->info.type,
  -		entry->info.offset, entry->info.count);
  -	goto exit;
  -    }
  -/*@=sizeoftype@*/
  -/*@-boundswrite@*/
  -    memset(info, 0, sizeof(*info));
  -/*@=boundswrite@*/
  -
  -    /* Is the no. of tags in the region less than the total no. of tags? */
  -    ril = entry->info.offset/sizeof(*pe);
  -    if ((entry->info.offset % sizeof(*pe)) || ril > il) {
  -	(void) snprintf(buf, sizeof(buf),
  -		_("region size: BAD, ril(%d) > il(%d)\n"), ril, il);
  -	goto exit;
  -    }
  -
  -    /* Find a header-only digest/signature tag. */
  -    for (i = ril; i < il; i++) {
  -	xx = headerVerifyInfo(1, dl, pe+i, &entry->info, 0);
  -	if (xx != -1) {
  -	    (void) snprintf(buf, sizeof(buf),
  -		_("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
  -		i, entry->info.tag, entry->info.type,
  -		entry->info.offset, entry->info.count);
  -	    goto exit;
  -	}
  -
  -	switch (entry->info.tag) {
  -	case RPMTAG_SHA1HEADER:
  -	    if (vsflags & RPMVSF_NOSHA1HEADER)
  -		/*@switchbreak@*/ break;
  -	    blen = 0;
  -/*@-boundsread@*/
  -	    for (b = dataStart + entry->info.offset; *b != '\0'; b++) {
  -		if (strchr("0123456789abcdefABCDEF", *b) == NULL)
  -		    /*@innerbreak@*/ break;
  -		blen++;
  -	    }
  -	    if (entry->info.type != RPM_STRING_TYPE || *b != '\0' || blen != 40)
  -	    {
  -		(void) snprintf(buf, sizeof(buf), _("hdr SHA1: BAD, not hex\n"));
  -		goto exit;
  -	    }
  -/*@=boundsread@*/
  -	    if (info->tag == 0) {
  -/*@-boundswrite@*/
  -		*info = entry->info;	/* structure assignment */
  -/*@=boundswrite@*/
  -		siglen = blen + 1;
  -	    }
  -	    /*@switchbreak@*/ break;
  -	case RPMTAG_RSAHEADER:
  -	    if (vsflags & RPMVSF_NORSAHEADER)
  -		/*@switchbreak@*/ break;
  -	    if (entry->info.type != RPM_BIN_TYPE) {
  -		(void) snprintf(buf, sizeof(buf), _("hdr RSA: BAD, not binary\n"));
  -		goto exit;
  -	    }
  -/*@-boundswrite@*/
  -	    *info = entry->info;	/* structure assignment */
  -/*@=boundswrite@*/
  -	    siglen = info->count;
  -	    /*@switchbreak@*/ break;
  -	case RPMTAG_DSAHEADER:
  -	    if (vsflags & RPMVSF_NODSAHEADER)
  -		/*@switchbreak@*/ break;
  -	    if (entry->info.type != RPM_BIN_TYPE) {
  -		(void) snprintf(buf, sizeof(buf), _("hdr DSA: BAD, not binary\n"));
  -		goto exit;
  -	    }
  -/*@-boundswrite@*/
  -	    *info = entry->info;	/* structure assignment */
  -/*@=boundswrite@*/
  -	    siglen = info->count;
  -	    /*@switchbreak@*/ break;
  -	default:
  -	    /*@switchbreak@*/ break;
  -	}
  -    }
  -    rc = RPMRC_NOTFOUND;
  -
  -exit:
  -    /* Return determined RPMRC_OK/RPMRC_FAIL conditions. */
  -    if (rc != RPMRC_NOTFOUND) {
  -/*@-boundswrite@*/
  -	buf[sizeof(buf)-1] = '\0';
  -	if (msg) *msg = xstrdup(buf);
  -/*@=boundswrite@*/
  -	hclvl--;
  -	return rc;
  -    }
  -
  -    /* If no header-only digest/signature, then do simple sanity check. */
  -    if (info->tag == 0) {
  -	xx = headerVerifyInfo(ril-1, dl, pe+1, &entry->info, 0);
  -	if (xx != -1) {
  -	    (void) snprintf(buf, sizeof(buf),
  -		_("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
  -		xx+1, entry->info.tag, entry->info.type,
  -		entry->info.offset, entry->info.count);
  -	    rc = RPMRC_FAIL;
  -	} else {
  -	    (void) snprintf(buf, sizeof(buf), "Header sanity check: OK\n");
  -	    rc = RPMRC_OK;
  -	}
  -/*@-boundswrite@*/
  -	buf[sizeof(buf)-1] = '\0';
  -	if (msg) *msg = xstrdup(buf);
  -/*@=boundswrite@*/
  -	hclvl--;
  -	return rc;
  -    }
  -
  -    /* Verify header-only digest/signature. */
  -assert(dig);
  -    dig->nbytes = 0;
  -
  -/*@-boundsread@*/
  -    sig = memcpy(xmalloc(siglen), dataStart + info->offset, siglen);
  -/*@=boundsread@*/
  -    {
  -	const void * osig = pgpGetSig(dig);
  -	int_32 osigtype = pgpGetSigtype(dig);
  -	if (osig && osigtype)
  -	    osig = headerFreeData(osig, osigtype);
  -	(void) pgpSetSig(dig, info->tag, info->type, sig, info->count);
  -    }
  -
  -    switch (info->tag) {
  -    case RPMTAG_RSAHEADER:
  -	/* Parse the parameters from the OpenPGP packets that will be needed. */
  -	xx = pgpPrtPkts(sig, info->count, dig, (_print_pkts & rpmIsDebug()));
  -	if (dig->signature.version != 3 && dig->signature.version != 4) {
  -	    rpmMessage(RPMMESS_ERROR,
  -		_("skipping header with unverifiable V%u signature\n"),
  -		dig->signature.version);
  -	    rpmtsCleanDig(ts);
  -	    rc = RPMRC_FAIL;
  -	    goto exit;
  -	}
  -
  -	ildl[0] = htonl(ril);
  -	ildl[1] = (regionEnd - dataStart);
  -	ildl[1] = htonl(ildl[1]);
  -
  -	op = pgpStatsAccumulator(dig, 10);	/* RPMTS_OP_DIGEST */
  -	(void) rpmswEnter(op, 0);
  -	dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
  -
  -	b = NULL; nb = 0;
  -	(void) headerGetMagic(NULL, &b, &nb);
  -	if (b && nb > 0) {
  -	    (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  -	    dig->nbytes += nb;
  -	}
  -
  -	b = (unsigned char *) ildl;
  -	nb = sizeof(ildl);
  -        (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  -        dig->nbytes += nb;
  -
  -	b = (unsigned char *) pe;
  -	nb = (htonl(ildl[0]) * sizeof(*pe));
  -        (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  -        dig->nbytes += nb;
  -
  -	b = (unsigned char *) dataStart;
  -	nb = htonl(ildl[1]);
  -        (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  -        dig->nbytes += nb;
  -	(void) rpmswExit(op, dig->nbytes);
  -
  -	break;
  -    case RPMTAG_DSAHEADER:
  -	/* Parse the parameters from the OpenPGP packets that will be needed. */
  -	xx = pgpPrtPkts(sig, info->count, dig, (_print_pkts & rpmIsDebug()));
  -	if (dig->signature.version != 3 && dig->signature.version != 4) {
  -	    rpmMessage(RPMMESS_ERROR,
  -		_("skipping header with unverifiable V%u signature\n"),
  -		dig->signature.version);
  -	    rpmtsCleanDig(ts);
  -	    rc = RPMRC_FAIL;
  -	    goto exit;
  -	}
  -	/*@fallthrough@*/
  -    case RPMTAG_SHA1HEADER:
  -/*@-boundswrite@*/
  -	ildl[0] = htonl(ril);
  -	ildl[1] = (regionEnd - dataStart);
  -	ildl[1] = htonl(ildl[1]);
  -/*@=boundswrite@*/
  -
  -	op = pgpStatsAccumulator(dig, 10);	/* RPMTS_OP_DIGEST */
  -	(void) rpmswEnter(op, 0);
  -	dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
  -
  -	b = NULL; nb = 0;
  -	(void) headerGetMagic(NULL, &b, &nb);
  -	if (b && nb > 0) {
  -	    (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  -	    dig->nbytes += nb;
  -	}
  -
  -	b = (unsigned char *) ildl;
  -	nb = sizeof(ildl);
  -        (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  -        dig->nbytes += nb;
  -
  -	b = (unsigned char *) pe;
  -	nb = (htonl(ildl[0]) * sizeof(*pe));
  -        (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  -        dig->nbytes += nb;
  -
  -	b = (unsigned char *) dataStart;
  -	nb = htonl(ildl[1]);
  -        (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  -        dig->nbytes += nb;
  -	(void) rpmswExit(op, dig->nbytes);
  -
  -	break;
  -    default:
  -	sig = _free(sig);
  -	break;
  -    }
  -
  -/*@-boundswrite@*/
  -    buf[0] = '\0';
  -/*@=boundswrite@*/
  -    rc = rpmVerifySignature(dig, buf);
  -
  -/*@-boundswrite@*/
  -    buf[sizeof(buf)-1] = '\0';
  -    if (msg) *msg = xstrdup(buf);
  -/*@=boundswrite@*/
  -
  -    /* XXX headerCheck can recurse, free info only at top level. */
  -    if (hclvl == 1)
  -	rpmtsCleanDig(ts);
  -    if (info->tag == RPMTAG_SHA1HEADER)
  -	sig = _free(sig);
  -    hclvl--;
  -    return rc;
  -}
  -
   rpmRC rpmReadHeader(rpmts ts, void * _fd, Header *hdrp, const char ** msg)
   {
       pgpDig dig = rpmtsDig(ts);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmlib.h
  ============================================================================
  $ cvs diff -u -r2.435 -r2.436 rpmlib.h
  --- rpm/lib/rpmlib.h	28 Sep 2007 22:26:49 -0000	2.435
  +++ rpm/lib/rpmlib.h	29 Sep 2007 16:23:39 -0000	2.436
  @@ -112,25 +112,6 @@
    */
   typedef /*@abstract@*/ /*@refcounted@*/ struct rpmgi_s * rpmgi;
   
  -/** \ingroup header
  - * Translate and merge legacy signature tags into header.
  - * @todo Remove headerSort() through headerInitIterator() modifies sig.
  - * @param h		header
  - * @param sigh		signature header
  - */
  -void headerMergeLegacySigs(Header h, const Header sigh)
  -	/*@modifies h, sigh @*/;
  -
  -/** \ingroup header
  - * Regenerate signature header.
  - * @todo Remove headerSort() through headerInitIterator() modifies h.
  - * @param h		header
  - * @param noArchiveSize	don't copy archive size tag (pre rpm-4.1)
  - * @return		regenerated signature header
  - */
  -Header headerRegenSigHeader(const Header h, int noArchiveSize)
  -	/*@modifies h @*/;
  -
   /**
    * Automatically generated table of tag name/value pairs.
    */
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmrollback.c
  ============================================================================
  $ cvs diff -u -r1.12 -r1.13 rpmrollback.c
  --- rpm/lib/rpmrollback.c	5 Sep 2007 23:08:01 -0000	1.12
  +++ rpm/lib/rpmrollback.c	29 Sep 2007 16:23:39 -0000	1.13
  @@ -13,6 +13,7 @@
   #define	_RPMTE_INTERNAL		/* XXX findErases needs rpmte internals. */
   #include "rpmte.h"		/* XXX: rpmteChain */
   #define	_RPMTS_INTERNAL		/* XXX ts->teErase, ts->probs */
  +#define _RPMTS_PRINT
   #include "rpmts.h"
   
   #include "manifest.h"
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmts.c
  ============================================================================
  $ cvs diff -u -r2.99 -r2.100 rpmts.c
  --- rpm/lib/rpmts.c	29 Sep 2007 00:07:43 -0000	2.99
  +++ rpm/lib/rpmts.c	29 Sep 2007 16:23:39 -0000	2.100
  @@ -715,6 +715,7 @@
       return ps;
   }
   
  +#ifdef	DYING
   void rpmtsCleanDig(rpmts ts)
   {
       if (ts && ts->dig) {
  @@ -727,6 +728,7 @@
   	ts->dig = pgpFreeDig(ts->dig);
       }
   }
  +#endif
   
   void rpmtsClean(rpmts ts)
   {
  @@ -1101,6 +1103,7 @@
       return otid;
   }
   
  +#ifdef	DYING
   int rpmtsSetSig(rpmts ts,
   		int_32 sigtag, int_32 sigtype, const void * sig, int_32 siglen)
   {
  @@ -1130,6 +1133,7 @@
   {
       return pgpGetPubkey(rpmtsDig(ts));
   }
  +#endif
   
   rpmdb rpmtsGetRdb(rpmts ts)
   {
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmts.h
  ============================================================================
  $ cvs diff -u -r2.75 -r2.76 rpmts.h
  --- rpm/lib/rpmts.h	29 Sep 2007 00:07:43 -0000	2.75
  +++ rpm/lib/rpmts.h	29 Sep 2007 16:23:39 -0000	2.76
  @@ -1010,7 +1010,7 @@
   	/*@modifies ts, h, rpmGlobalMacroContext, fileSystem, internalState @*/;
   
   #if !defined(SWIG)
  -#if defined(_RPMTS_INTERNAL)
  +#if defined(_RPMTS_PRINT)
   /**
    * Print current transaction set contents.
    * @param ts		transaction set
  @@ -1038,7 +1038,7 @@
       tsi = rpmtsiFree(tsi);
       return 0;
   }
  -#endif	/* defined(_RPMTS_INTERNAL) */
  +#endif	/* defined(_RPMTS_PRINT) */
   #endif	/* !defined(SWIG) */
   
   #ifdef __cplusplus
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrNVR.c
  ============================================================================
  $ cvs diff -u -r1.9 -r1.10 hdrNVR.c
  --- rpm/rpmdb/hdrNVR.c	19 Aug 2007 17:43:04 -0000	1.9
  +++ rpm/rpmdb/hdrNVR.c	29 Sep 2007 16:23:40 -0000	1.10
  @@ -6,6 +6,9 @@
   #include <rpmlib.h>
   #include <rpmio.h>
   #include <rpmmacro.h>
  +
  +#include "header_internal.h"		/* XXX hdrchkType(), hdrchkData() */
  +
   #include "debug.h"
   
   /**
  @@ -195,3 +198,156 @@
   
       return hcolor;
   }
  +
  +void headerMergeLegacySigs(Header h, const Header sigh)
  +{
  +    HFD_t hfd = (HFD_t) headerFreeData;
  +    HeaderIterator hi;
  +    int_32 tag, type, count;
  +    const void * ptr;
  +    int xx;
  +
  +    if (h == NULL || sigh == NULL)
  +	return;
  +
  +    for (hi = headerInitIterator(sigh);
  +        headerNextIterator(hi, &tag, &type, &ptr, &count);
  +        ptr = hfd(ptr, type))
  +    {
  +	switch (tag) {
  +	/* XXX Translate legacy signature tag values. */
  +	case RPMSIGTAG_SIZE:
  +	    tag = RPMTAG_SIGSIZE;
  +	    /*@switchbreak@*/ break;
  +#if defined(SUPPORT_RPMV3_BROKEN)
  +	case RPMSIGTAG_LEMD5_1:
  +	    tag = RPMTAG_SIGLEMD5_1;
  +	    /*@switchbreak@*/ break;
  +	case RPMSIGTAG_LEMD5_2:
  +	    tag = RPMTAG_SIGLEMD5_2;
  +	    /*@switchbreak@*/ break;
  +#endif
  +#if defined(SUPPORT_RPMV3_VERIFY_RSA)
  +	case RPMSIGTAG_PGP:
  +	    tag = RPMTAG_SIGPGP;
  +	    /*@switchbreak@*/ break;
  +	case RPMSIGTAG_PGP5:
  +	    tag = RPMTAG_SIGPGP5;
  +	    /*@switchbreak@*/ break;
  +#endif
  +	case RPMSIGTAG_MD5:
  +	    tag = RPMTAG_SIGMD5;
  +	    /*@switchbreak@*/ break;
  +#if defined(SUPPORT_RPMV3_VERIFY_DSA)
  +	case RPMSIGTAG_GPG:
  +	    tag = RPMTAG_SIGGPG;
  +	    /*@switchbreak@*/ break;
  +#endif
  +	case RPMSIGTAG_PAYLOADSIZE:
  +	    tag = RPMTAG_ARCHIVESIZE;
  +	    /*@switchbreak@*/ break;
  +	case RPMSIGTAG_SHA1:
  +	case RPMSIGTAG_DSA:
  +	case RPMSIGTAG_RSA:
  +	default:
  +	    if (!(tag >= HEADER_SIGBASE && tag < HEADER_TAGBASE))
  +		continue;
  +	    /*@switchbreak@*/ break;
  +	}
  +	if (ptr == NULL) continue;	/* XXX can't happen */
  +	if (!headerIsEntry(h, tag)) {
  +	    if (hdrchkType(type))
  +		continue;
  +	    if (count < 0 || hdrchkData(count))
  +		continue;
  +	    switch(type) {
  +	    case RPM_NULL_TYPE:
  +		continue;
  +		/*@notreached@*/ /*@switchbreak@*/ break;
  +	    case RPM_CHAR_TYPE:
  +	    case RPM_INT8_TYPE:
  +	    case RPM_INT16_TYPE:
  +	    case RPM_INT32_TYPE:
  +		if (count != 1)
  +		    continue;
  +		/*@switchbreak@*/ break;
  +	    case RPM_STRING_TYPE:
  +	    case RPM_BIN_TYPE:
  +		if (count >= 16*1024)
  +		    continue;
  +		/*@switchbreak@*/ break;
  +	    case RPM_STRING_ARRAY_TYPE:
  +	    case RPM_I18NSTRING_TYPE:
  +		continue;
  +		/*@notreached@*/ /*@switchbreak@*/ break;
  +	    }
  + 	    xx = headerAddEntry(h, tag, type, ptr, count);
  +	}
  +    }
  +    hi = headerFreeIterator(hi);
  +}
  +
  +Header headerRegenSigHeader(const Header h, int noArchiveSize)
  +{
  +    HFD_t hfd = (HFD_t) headerFreeData;
  +    Header sigh = headerNew();
  +    HeaderIterator hi;
  +    int_32 tag, stag, type, count;
  +    const void * ptr;
  +    int xx;
  +
  +    for (hi = headerInitIterator(h);
  +        headerNextIterator(hi, &tag, &type, &ptr, &count);
  +        ptr = hfd(ptr, type))
  +    {
  +	switch (tag) {
  +	/* XXX Translate legacy signature tag values. */
  +	case RPMTAG_SIGSIZE:
  +	    stag = RPMSIGTAG_SIZE;
  +	    /*@switchbreak@*/ break;
  +#if defined(SUPPORT_RPMV3_BROKEN)
  +	case RPMTAG_SIGLEMD5_1:
  +	    stag = RPMSIGTAG_LEMD5_1;
  +	    /*@switchbreak@*/ break;
  +	case RPMTAG_SIGLEMD5_2:
  +	    stag = RPMSIGTAG_LEMD5_2;
  +	    /*@switchbreak@*/ break;
  +#endif
  +#if defined(SUPPORT_RPMV3_VERIFY_RSA)
  +	case RPMTAG_SIGPGP:
  +	    stag = RPMSIGTAG_PGP;
  +	    /*@switchbreak@*/ break;
  +	case RPMTAG_SIGPGP5:
  +	    stag = RPMSIGTAG_PGP5;
  +	    /*@switchbreak@*/ break;
  +#endif
  +	case RPMTAG_SIGMD5:
  +	    stag = RPMSIGTAG_MD5;
  +	    /*@switchbreak@*/ break;
  +#if defined(SUPPORT_RPMV3_VERIFY_DSA)
  +	case RPMTAG_SIGGPG:
  +	    stag = RPMSIGTAG_GPG;
  +	    /*@switchbreak@*/ break;
  +#endif
  +	case RPMTAG_ARCHIVESIZE:
  +	    /* XXX rpm-4.1 and later has archive size in signature header. */
  +	    if (noArchiveSize)
  +		continue;
  +	    stag = RPMSIGTAG_PAYLOADSIZE;
  +	    /*@switchbreak@*/ break;
  +	case RPMTAG_SHA1HEADER:
  +	case RPMTAG_DSAHEADER:
  +	case RPMTAG_RSAHEADER:
  +	default:
  +	    if (!(tag >= HEADER_SIGBASE && tag < HEADER_TAGBASE))
  +		continue;
  +	    stag = tag;
  +	    /*@switchbreak@*/ break;
  +	}
  +	if (ptr == NULL) continue;	/* XXX can't happen */
  +	if (!headerIsEntry(sigh, stag))
  +	    xx = headerAddEntry(sigh, stag, type, ptr, count);
  +    }
  +    hi = headerFreeIterator(hi);
  +    return sigh;
  +}
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.h
  ============================================================================
  $ cvs diff -u -r1.23 -r1.24 header.h
  --- rpm/rpmdb/header.h	8 Sep 2007 23:44:00 -0000	1.23
  +++ rpm/rpmdb/header.h	29 Sep 2007 16:23:40 -0000	1.24
  @@ -912,6 +912,25 @@
   uint_32 hGetColor(Header h)
   	/*@modifies h @*/;
   
  +/** \ingroup header
  + * Translate and merge legacy signature tags into header.
  + * @todo Remove headerSort() through headerInitIterator() modifies sig.
  + * @param h		header
  + * @param sigh		signature header
  + */
  +void headerMergeLegacySigs(Header h, const Header sigh)
  +	/*@modifies h, sigh @*/;
  +
  +/** \ingroup header
  + * Regenerate signature header.
  + * @todo Remove headerSort() through headerInitIterator() modifies h.
  + * @param h		header
  + * @param noArchiveSize	don't copy archive size tag (pre rpm-4.1)
  + * @return		regenerated signature header
  + */
  +Header headerRegenSigHeader(const Header h, int noArchiveSize)
  +	/*@modifies h @*/;
  +
   #ifdef __cplusplus
   }
   #endif
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/librpmdb.vers
  ============================================================================
  $ cvs diff -u -r1.16 -r1.17 librpmdb.vers
  --- rpm/rpmdb/librpmdb.vers	8 Sep 2007 18:55:46 -0000	1.16
  +++ rpm/rpmdb/librpmdb.vers	29 Sep 2007 16:23:40 -0000	1.17
  @@ -27,6 +27,7 @@
       _hdr_loadops;
       _hdr_stats;
       hdrVec;
  +    headerCheck;
       headerCompoundFormats;
       headerDefaultFormats;
       headerDump;
  @@ -34,7 +35,9 @@
       headerGetRawEntry;
       headerMacrosLoad;
       headerMacrosUnload;
  +    headerMergeLegacySigs;
       headerNEVRA;
  +    headerRegenSigHeader;
       headerVerifyInfo;
       hGetColor;
       _init;
  @@ -82,6 +85,10 @@
       rpmTagTable;
       rpmTagTableSize;
       rpmTags;
  +    rpmtsCleanDig;
  +    rpmtsDig;
  +    rpmtsPubkey;
  +    rpmtsSetSig;
       sqlitevec;
       XrpmdbLink;
       XrpmdbUnlink;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/pkgio.c
  ============================================================================
  $ cvs diff -u -r1.5 -r1.6 pkgio.c
  --- rpm/rpmdb/pkgio.c	9 Sep 2007 05:02:44 -0000	1.5
  +++ rpm/rpmdb/pkgio.c	29 Sep 2007 16:23:40 -0000	1.6
  @@ -11,17 +11,69 @@
   
   #include <netinet/in.h>
   
  -#include <rpmio.h>
  +#include <rpmio_internal.h>
   #include <rpmlib.h>
   
  +#define	_RPMTS_INTERNAL
  +#include "rpmts.h"
  +
   #include "header_internal.h"
   #include <pkgio.h>
   #include "debug.h"
   
  -
   /*@access entryInfo @*/		/* XXX rdSignature */
   /*@access indexEntry @*/	/* XXX rdSignature */
   
  +/*@unchecked@*/
  +static int _print_pkts = 0;
  +
  +/*===============================================*/
  +
  +void rpmtsCleanDig(rpmts ts)
  +{
  +    if (ts && ts->dig) {
  +	int opx;
  +	opx = RPMTS_OP_DIGEST;
  +        (void) rpmswAdd(rpmtsOp(ts, opx), pgpStatsAccumulator(ts->dig, opx));
  +	opx = RPMTS_OP_SIGNATURE;
  +        (void) rpmswAdd(rpmtsOp(ts, opx), pgpStatsAccumulator(ts->dig, opx));
  +	(void) rpmtsSetSig(ts, 0, 0, NULL, 0);	/* XXX headerFreeData */
  +	ts->dig = pgpFreeDig(ts->dig);
  +    }
  +}
  +
  +int rpmtsSetSig(rpmts ts,
  +		int_32 sigtag, int_32 sigtype, const void * sig, int_32 siglen)
  +{
  +    int ret = 0;
  +    if (ts != NULL) {
  +	const void * osig = pgpGetSig(rpmtsDig(ts));
  +	int_32 osigtype = pgpGetSigtype(rpmtsDig(ts));
  +	if (osig && osigtype)
  +	    osig = headerFreeData(osig, osigtype);
  +	ret = pgpSetSig(rpmtsDig(ts), sigtag, sigtype, sig, siglen);
  +    }
  +    return ret;
  +}
  +
  +pgpDig rpmtsDig(rpmts ts)
  +{
  +/*@-mods@*/ /* FIX: hide lazy malloc for now */
  +    if (ts->dig == NULL) {
  +        ts->dig = pgpNewDig(0);
  +        (void) pgpSetFindPubkey(ts->dig, (int (*)(void *, void *))rpmtsFindPubkey, ts);
  +    }
  +/*@=mods@*/
  +    return ts->dig;
  +}
  +
  +pgpDigParams rpmtsPubkey(const rpmts ts)
  +{
  +    return pgpGetPubkey(rpmtsDig(ts));
  +}
  +
  +/*===============================================*/
  +
   /**
    * The lead data structure.
    * The lead needs to be 8 byte aligned.
  @@ -166,6 +218,7 @@
       return rc;
   }
   
  +/*===============================================*/
   
   /*@unchecked@*/
   extern int _newmagic;
  @@ -441,6 +494,358 @@
       return rc;
   }
   
  +/*===============================================*/
  +
  +/**
  + * Check header consistency, performing headerGetEntry() the hard way.
  + *
  + * Sanity checks on the header are performed while looking for a
  + * header-only digest or signature to verify the blob. If found,
  + * the digest or signature is verified.
  + *
  + * @param ts		transaction set
  + * @param uh		unloaded header blob
  + * @param uc		no. of bytes in blob (or 0 to disable)
  + * @retval *msg		signature verification msg
  + * @return		RPMRC_OK/RPMRC_NOTFOUND/RPMRC_FAIL
  + */
  +rpmRC headerCheck(rpmts ts, const void * uh, size_t uc, const char ** msg)
  +{
  +    pgpDig dig = rpmtsDig(ts);
  +    char buf[8*BUFSIZ];
  +    int_32 * ei = (int_32 *) uh;
  +/*@-boundsread@*/
  +    int_32 il = ntohl(ei[0]);
  +    int_32 dl = ntohl(ei[1]);
  +/*@-castexpose@*/
  +    entryInfo pe = (entryInfo) &ei[2];
  +/*@=castexpose@*/
  +/*@=boundsread@*/
  +    int_32 ildl[2];
  +    int_32 pvlen = sizeof(ildl) + (il * sizeof(*pe)) + dl;
  +    unsigned char * dataStart = (unsigned char *) (pe + il);
  +    indexEntry entry = memset(alloca(sizeof(*entry)), 0, sizeof(*entry));
  +    entryInfo info = memset(alloca(sizeof(*info)), 0, sizeof(*info));
  +    const void * sig = NULL;
  +    unsigned char * b;
  +    rpmVSFlags vsflags = pgpGetVSFlags(dig);
  +    rpmop op;
  +    int siglen = 0;
  +    int blen;
  +    size_t nb;
  +    int_32 ril = 0;
  +    unsigned char * regionEnd = NULL;
  +    rpmRC rc = RPMRC_FAIL;	/* assume failure */
  +    int xx;
  +    int i;
  +    static int hclvl;
  +
  +    hclvl++;
  +/*@-boundswrite@*/
  +    buf[0] = '\0';
  +/*@=boundswrite@*/
  +
  +    /* Is the blob the right size? */
  +    if (uc > 0 && pvlen != uc) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("blob size(%d): BAD, 8 + 16 * il(%d) + dl(%d)\n"),
  +		(int)uc, (int)il, (int)dl);
  +	goto exit;
  +    }
  +
  +    /* Check (and convert) the 1st tag element. */
  +    xx = headerVerifyInfo(1, dl, pe, &entry->info, 0);
  +    if (xx != -1) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
  +		0, entry->info.tag, entry->info.type,
  +		entry->info.offset, entry->info.count);
  +	goto exit;
  +    }
  +
  +    /* Is there an immutable header region tag? */
  +/*@-sizeoftype@*/
  +    if (!(entry->info.tag == RPMTAG_HEADERIMMUTABLE
  +       && entry->info.type == RPM_BIN_TYPE
  +       && entry->info.count == REGION_TAG_COUNT))
  +    {
  +	rc = RPMRC_NOTFOUND;
  +	goto exit;
  +    }
  +/*@=sizeoftype@*/
  +
  +    /* Is the offset within the data area? */
  +    if (entry->info.offset >= dl) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("region offset: BAD, tag %d type %d offset %d count %d\n"),
  +		entry->info.tag, entry->info.type,
  +		entry->info.offset, entry->info.count);
  +	goto exit;
  +    }
  +
  +    /* Is there an immutable header region tag trailer? */
  +    regionEnd = dataStart + entry->info.offset;
  +/*@-sizeoftype@*/
  +/*@-bounds@*/
  +    (void) memcpy(info, regionEnd, REGION_TAG_COUNT);
  +/*@=bounds@*/
  +    regionEnd += REGION_TAG_COUNT;
  +
  +    xx = headerVerifyInfo(1, dl, info, &entry->info, 1);
  +    if (xx != -1 ||
  +	!(entry->info.tag == RPMTAG_HEADERIMMUTABLE
  +       && entry->info.type == RPM_BIN_TYPE
  +       && entry->info.count == REGION_TAG_COUNT))
  +    {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("region trailer: BAD, tag %d type %d offset %d count %d\n"),
  +		entry->info.tag, entry->info.type,
  +		entry->info.offset, entry->info.count);
  +	goto exit;
  +    }
  +/*@=sizeoftype@*/
  +/*@-boundswrite@*/
  +    memset(info, 0, sizeof(*info));
  +/*@=boundswrite@*/
  +
  +    /* Is the no. of tags in the region less than the total no. of tags? */
  +    ril = entry->info.offset/sizeof(*pe);
  +    if ((entry->info.offset % sizeof(*pe)) || ril > il) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("region size: BAD, ril(%d) > il(%d)\n"), ril, il);
  +	goto exit;
  +    }
  +
  +    /* Find a header-only digest/signature tag. */
  +    for (i = ril; i < il; i++) {
  +	xx = headerVerifyInfo(1, dl, pe+i, &entry->info, 0);
  +	if (xx != -1) {
  +	    (void) snprintf(buf, sizeof(buf),
  +		_("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
  +		i, entry->info.tag, entry->info.type,
  +		entry->info.offset, entry->info.count);
  +	    goto exit;
  +	}
  +
  +	switch (entry->info.tag) {
  +	case RPMTAG_SHA1HEADER:
  +	    if (vsflags & RPMVSF_NOSHA1HEADER)
  +		/*@switchbreak@*/ break;
  +	    blen = 0;
  +/*@-boundsread@*/
  +	    for (b = dataStart + entry->info.offset; *b != '\0'; b++) {
  +		if (strchr("0123456789abcdefABCDEF", *b) == NULL)
  +		    /*@innerbreak@*/ break;
  +		blen++;
  +	    }
  +	    if (entry->info.type != RPM_STRING_TYPE || *b != '\0' || blen != 40)
  +	    {
  +		(void) snprintf(buf, sizeof(buf), _("hdr SHA1: BAD, not hex\n"));
  +		goto exit;
  +	    }
  +/*@=boundsread@*/
  +	    if (info->tag == 0) {
  +/*@-boundswrite@*/
  +		*info = entry->info;	/* structure assignment */
  +/*@=boundswrite@*/
  +		siglen = blen + 1;
  +	    }
  +	    /*@switchbreak@*/ break;
  +	case RPMTAG_RSAHEADER:
  +	    if (vsflags & RPMVSF_NORSAHEADER)
  +		/*@switchbreak@*/ break;
  +	    if (entry->info.type != RPM_BIN_TYPE) {
  +		(void) snprintf(buf, sizeof(buf), _("hdr RSA: BAD, not binary\n"));
  +		goto exit;
  +	    }
  +/*@-boundswrite@*/
  +	    *info = entry->info;	/* structure assignment */
  +/*@=boundswrite@*/
  +	    siglen = info->count;
  +	    /*@switchbreak@*/ break;
  +	case RPMTAG_DSAHEADER:
  +	    if (vsflags & RPMVSF_NODSAHEADER)
  +		/*@switchbreak@*/ break;
  +	    if (entry->info.type != RPM_BIN_TYPE) {
  +		(void) snprintf(buf, sizeof(buf), _("hdr DSA: BAD, not binary\n"));
  +		goto exit;
  +	    }
  +/*@-boundswrite@*/
  +	    *info = entry->info;	/* structure assignment */
  +/*@=boundswrite@*/
  +	    siglen = info->count;
  +	    /*@switchbreak@*/ break;
  +	default:
  +	    /*@switchbreak@*/ break;
  +	}
  +    }
  +    rc = RPMRC_NOTFOUND;
  +
  +exit:
  +    /* Return determined RPMRC_OK/RPMRC_FAIL conditions. */
  +    if (rc != RPMRC_NOTFOUND) {
  +/*@-boundswrite@*/
  +	buf[sizeof(buf)-1] = '\0';
  +	if (msg) *msg = xstrdup(buf);
  +/*@=boundswrite@*/
  +	hclvl--;
  +	return rc;
  +    }
  +
  +    /* If no header-only digest/signature, then do simple sanity check. */
  +    if (info->tag == 0) {
  +	xx = headerVerifyInfo(ril-1, dl, pe+1, &entry->info, 0);
  +	if (xx != -1) {
  +	    (void) snprintf(buf, sizeof(buf),
  +		_("tag[%d]: BAD, tag %d type %d offset %d count %d\n"),
  +		xx+1, entry->info.tag, entry->info.type,
  +		entry->info.offset, entry->info.count);
  +	    rc = RPMRC_FAIL;
  +	} else {
  +	    (void) snprintf(buf, sizeof(buf), "Header sanity check: OK\n");
  +	    rc = RPMRC_OK;
  +	}
  +/*@-boundswrite@*/
  +	buf[sizeof(buf)-1] = '\0';
  +	if (msg) *msg = xstrdup(buf);
  +/*@=boundswrite@*/
  +	hclvl--;
  +	return rc;
  +    }
  +
  +    /* Verify header-only digest/signature. */
  +assert(dig);
  +    dig->nbytes = 0;
  +
  +/*@-boundsread@*/
  +    sig = memcpy(xmalloc(siglen), dataStart + info->offset, siglen);
  +/*@=boundsread@*/
  +    {
  +	const void * osig = pgpGetSig(dig);
  +	int_32 osigtype = pgpGetSigtype(dig);
  +	if (osig && osigtype)
  +	    osig = headerFreeData(osig, osigtype);
  +	(void) pgpSetSig(dig, info->tag, info->type, sig, info->count);
  +    }
  +
  +    switch (info->tag) {
  +    case RPMTAG_RSAHEADER:
  +	/* Parse the parameters from the OpenPGP packets that will be needed. */
  +	xx = pgpPrtPkts(sig, info->count, dig, (_print_pkts & rpmIsDebug()));
  +	if (dig->signature.version != 3 && dig->signature.version != 4) {
  +	    rpmMessage(RPMMESS_ERROR,
  +		_("skipping header with unverifiable V%u signature\n"),
  +		dig->signature.version);
  +	    rpmtsCleanDig(ts);
  +	    rc = RPMRC_FAIL;
  +	    goto exit;
  +	}
  +
  +	ildl[0] = htonl(ril);
  +	ildl[1] = (regionEnd - dataStart);
  +	ildl[1] = htonl(ildl[1]);
  +
  +	op = pgpStatsAccumulator(dig, 10);	/* RPMTS_OP_DIGEST */
  +	(void) rpmswEnter(op, 0);
  +	dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
  +
  +	b = NULL; nb = 0;
  +	(void) headerGetMagic(NULL, &b, &nb);
  +	if (b && nb > 0) {
  +	    (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  +	    dig->nbytes += nb;
  +	}
  +
  +	b = (unsigned char *) ildl;
  +	nb = sizeof(ildl);
  +        (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  +        dig->nbytes += nb;
  +
  +	b = (unsigned char *) pe;
  +	nb = (htonl(ildl[0]) * sizeof(*pe));
  +        (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  +        dig->nbytes += nb;
  +
  +	b = (unsigned char *) dataStart;
  +	nb = htonl(ildl[1]);
  +        (void) rpmDigestUpdate(dig->hdrmd5ctx, b, nb);
  +        dig->nbytes += nb;
  +	(void) rpmswExit(op, dig->nbytes);
  +
  +	break;
  +    case RPMTAG_DSAHEADER:
  +	/* Parse the parameters from the OpenPGP packets that will be needed. */
  +	xx = pgpPrtPkts(sig, info->count, dig, (_print_pkts & rpmIsDebug()));
  +	if (dig->signature.version != 3 && dig->signature.version != 4) {
  +	    rpmMessage(RPMMESS_ERROR,
  +		_("skipping header with unverifiable V%u signature\n"),
  +		dig->signature.version);
  +	    rpmtsCleanDig(ts);
  +	    rc = RPMRC_FAIL;
  +	    goto exit;
  +	}
  +	/*@fallthrough@*/
  +    case RPMTAG_SHA1HEADER:
  +/*@-boundswrite@*/
  +	ildl[0] = htonl(ril);
  +	ildl[1] = (regionEnd - dataStart);
  +	ildl[1] = htonl(ildl[1]);
  +/*@=boundswrite@*/
  +
  +	op = pgpStatsAccumulator(dig, 10);	/* RPMTS_OP_DIGEST */
  +	(void) rpmswEnter(op, 0);
  +	dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
  +
  +	b = NULL; nb = 0;
  +	(void) headerGetMagic(NULL, &b, &nb);
  +	if (b && nb > 0) {
  +	    (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  +	    dig->nbytes += nb;
  +	}
  +
  +	b = (unsigned char *) ildl;
  +	nb = sizeof(ildl);
  +        (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  +        dig->nbytes += nb;
  +
  +	b = (unsigned char *) pe;
  +	nb = (htonl(ildl[0]) * sizeof(*pe));
  +        (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  +        dig->nbytes += nb;
  +
  +	b = (unsigned char *) dataStart;
  +	nb = htonl(ildl[1]);
  +        (void) rpmDigestUpdate(dig->hdrsha1ctx, b, nb);
  +        dig->nbytes += nb;
  +	(void) rpmswExit(op, dig->nbytes);
  +
  +	break;
  +    default:
  +	sig = _free(sig);
  +	break;
  +    }
  +
  +/*@-boundswrite@*/
  +    buf[0] = '\0';
  +/*@=boundswrite@*/
  +    rc = rpmVerifySignature(dig, buf);
  +
  +/*@-boundswrite@*/
  +    buf[sizeof(buf)-1] = '\0';
  +    if (msg) *msg = xstrdup(buf);
  +/*@=boundswrite@*/
  +
  +    /* XXX headerCheck can recurse, free info only at top level. */
  +    if (hclvl == 1)
  +	rpmtsCleanDig(ts);
  +    if (info->tag == RPMTAG_SHA1HEADER)
  +	sig = _free(sig);
  +    hclvl--;
  +    return rc;
  +}
  +
  +/*===============================================*/
  +
   size_t rpmpkgSizeof(const char * fn)
   {
       size_t len = 0;
  @@ .
Received on Sat Sep 29 18:23:40 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.