RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
  Module: rpm                              Date:   26-Nov-2007 03:03:11
  Branch: HEAD                             Handle: 2007112602030802

  Modified files:
    rpm                     CHANGES TODO
    rpm/build               files.c parsePreamble.c
    rpm/lib                 psm.c rpmchecksig.c rpmds.c rpmte.c
    rpm/perl                RPM_Header.xs RPM_Spec.xs rpmxs.c
    rpm/python              header-py.c rpmts-py.c
    rpm/rpmdb               hdrNVR.c hdrfmt.c hdrinline.h header.c header.h
                            librpmdb.vers rpmdb.c rpmtag.h

  Log:
    - insure that HE_t in headerGet/headerNext is initialized sanely.
    - python: lose rpmMergeHeaderFoo methods.
    - eliminate headerFreeData, w00t!, just free all tag data.
    - finalize headerInit/headerNext/headerFini, add to the ABI.

  Summary:
    Revision    Changes     Path
    1.1888      +4  -0      rpm/CHANGES
    1.26        +16 -19     rpm/TODO
    1.295       +7  -7      rpm/build/files.c
    2.148       +12 -9      rpm/build/parsePreamble.c
    2.269       +4  -4      rpm/lib/psm.c
    1.201       +10 -9      rpm/lib/rpmchecksig.c
    2.86        +3  -0      rpm/lib/rpmds.c
    2.72        +4  -4      rpm/lib/rpmte.c
    1.16        +19 -11     rpm/perl/RPM_Header.xs
    1.7         +1  -0      rpm/perl/RPM_Spec.xs
    1.7         +5  -5      rpm/perl/rpmxs.c
    1.86        +13 -144    rpm/python/header-py.c
    1.81        +9  -3      rpm/python/rpmts-py.c
    1.39        +32 -28     rpm/rpmdb/hdrNVR.c
    1.43        +157 -125   rpm/rpmdb/hdrfmt.c
    1.43        +0  -82     rpm/rpmdb/hdrinline.h
    1.136       +92 -98     rpm/rpmdb/header.c
    1.77        +0  -76     rpm/rpmdb/header.h
    1.34        +3  -0      rpm/rpmdb/librpmdb.vers
    1.222       +1  -4      rpm/rpmdb/rpmdb.c
    1.15        +26 -0      rpm/rpmdb/rpmtag.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1887 -r1.1888 CHANGES
  --- rpm/CHANGES       24 Nov 2007 23:55:00 -0000      1.1887
  +++ rpm/CHANGES       26 Nov 2007 02:03:08 -0000      1.1888
  @@ -1,4 +1,8 @@
   5.0a2 -> 5.0a3:
  +    - jbj: insure that HE_t in headerGet/headerNext is initialized sanely.
  +    - jbj: python: lose rpmMergeHeaderFoo methods.
  +    - jbj: eliminate headerFreeData, w00t!, just free all tag data.
  +    - jbj: finalize headerInit/headerNext/headerFini, add to the ABI.
       - jbj: include <header.h> only where needed, doco remaining destruction.
       - jbj: finalize headerMod, add to the ABI, remove HME_t goop.
       - jbj: finalize headerDel, add to the ABI, remove HRE_t goop.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/TODO
  ============================================================================
  $ cvs diff -u -r1.25 -r1.26 TODO
  --- rpm/TODO  24 Nov 2007 19:04:09 -0000      1.25
  +++ rpm/TODO  26 Nov 2007 02:03:08 -0000      1.26
  @@ -53,9 +53,6 @@
       - rse: xar/ has weak (think RPM_CHECK_LIB) support its third-party 
libraries LibXML, OpenSSL, etc.
       - jbj: RPM_I18NSTRING_TYPE is likely still wonky, certainly true for
        rpm-python h['summary'] access.
  -    - jbj: C++ and C have different rules regarding typedef'd enums like 
rpmTag.
  -     The definitions and usage are currently split awkwardly between
  -     rpmtag.h and header.h.
       - jbj: markReplacedFiles() subtly rewrites header back into rpmdb
        with altered RPMTAG_FILESTATES data. get/del/add sequence
        is needed instead.
  @@ -64,25 +61,25 @@
        returning rpmRC in some cases now, with accidental collision with
        PART_FOO values that drive the spec file parser. Renumbering enum
        rpmParseState to avoid the collisions should fix most of the problem.
  -    - jbj: choose between db-4.5.20 and db-4.6.18. db-4.5.20 may have fewer
  -     upgrade/downgrade issues because of the db-4.6.18 DB_HASH change,
  +    - jbj: choose between db-4.5.20 and db-4.6.21. db-4.5.20 may have fewer
  +     upgrade/downgrade issues because of the db-4.6.21 DB_HASH change,
        but rpm-5.0 already uses DB_BTREE for Packages.
  -    - jbj: this memory leak seen with "valgrind rpm -qa" no idea what pkg 
yet:
  -     ==5186== 112 bytes in 16 blocks are definitely lost in loss record 2 of 
2
  -     ==5186==    at 0x4805525: malloc (vg_replace_malloc.c:149)
  -     ==5186==    by 0x48E3923: formatValue (header.c:3403)
  -     ==5186==    by 0x48E3FAB: singleSprintf (header.c:3557)
  -     ==5186==    by 0x48E4C1E: headerSprintf (header.c:3872)
  -     ==5186==    by 0x487C075: headerSprintf (hdrinline.h:515)
  -     ==5186==    by 0x487BFFB: queryHeader (query.c:118)
  -     ==5186==    by 0x487B4A9: showQueryPackage (query.c:162)
  -     ==5186==    by 0x487C29D: rpmgiShowMatches (query.c:410)
  -     ==5186==    by 0x487C48D: rpmQueryVerify (query.c:475)
  -     ==5186==    by 0x487D4AC: rpmcliArgIter (query.c:739)
  -     ==5186==    by 0x487DB08: rpmcliQuery (query.c:855)
  -     ==5186==    by 0x46F9: main (rpmqv.c:738)
       - jbj: rpm-5.0 is almost compilation warning free, some effort to remove
        the Mickey Mouse warnings that remain should be undertaken.
  +    - jbj: headerNEVRA now malloc's the returned strinsg. rpmbuild likely has
  +     a few new memory leaks (install/erase/query paths are clean).
  +    - jbj: memory leak seen with repackaging
  +==4811== 249 bytes in 3 blocks are definitely lost in loss record 1 of 1
  +==4811==    at 0x4805525: malloc (vg_replace_malloc.c:149)
  +==4811==    by 0x48E1C14: copyEntry (header.c:1446)
  +==4811==    by 0x48E33A6: headerNext (header.c:2208)
  +==4811==    by 0x48DF183: headerRegenSigHeader (hdrNVR.c:303)
  +==4811==    by 0x4877D11: rpmpsmStage (psm.c:1904)
  +==4811==    by 0x4876C7D: rpmpsmNext (psm.c:1580)
  +==4811==    by 0x48790C2: rpmpsmStage (psm.c:2244)
  +==4811==    by 0x48A9C83: rpmtsRun (transaction.c:1689)
  +==4811==    by 0x4897D28: rpmErase (rpminstall.c:627)
  +==4811==    by 0x43FC: main (rpmqv.c:678)
   
     o to be resolved before RPM 5.0.0:
       - rse: NEWS polishing
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/files.c
  ============================================================================
  $ cvs diff -u -r1.294 -r1.295 files.c
  --- rpm/build/files.c 24 Nov 2007 23:55:00 -0000      1.294
  +++ rpm/build/files.c 26 Nov 2007 02:03:08 -0000      1.295
  @@ -17,7 +17,7 @@
   #include <rpmio_internal.h>
   #include <fts.h>
   
  -#include <header.h>          /* XXX headerIsEntry, headerFreeData, 
headerInitIterator, headerNextIterator, headerFreeIterator, headerMacrosLoad, 
headerMacrosUnload */
  +#include <header.h>          /* XXX headerIsEntry, headerMacrosLoad, 
headerMacrosUnload */
   #include <rpmbuild.h>
   
   #include "cpio.h"
  @@ -1666,8 +1666,8 @@
       if (fl->buildRootURL)
        fi->astriplen = strlen(fl->buildRootURL);
       fi->striplen = 0;
  -    fi->fuser = headerFreeData(fi->fuser, -1);               /* XXX memory 
leak */
  -    fi->fgroup = headerFreeData(fi->fgroup, -1);     /* XXX memory leak */
  +    fi->fuser = _free(fi->fuser);
  +    fi->fgroup = _free(fi->fgroup);
   
       /* Make the cpio list */
       if (fi->dil != NULL)     /* XXX can't happen */
  @@ -2528,9 +2528,9 @@
       /* Only specific tags are added to the source package header */
       /[EMAIL PROTECTED]@*/
     if (!spec->sourceHdrInit) {
  -    for (hi = headerInitIterator(spec->packages->header);
  -     headerNextIterator(hi, &he->tag, &he->t, &he->p, &he->c);
  -     he->p.ptr = headerFreeData(he->p.ptr, he->t))
  +    for (hi = headerInit(spec->packages->header);
  +     headerNext(hi, he, 0);
  +     he->p.ptr = _free(he->p.ptr))
       {
        switch (he->tag) {
        case RPMTAG_NAME:
  @@ -2563,7 +2563,7 @@
            /[EMAIL PROTECTED]@*/ break;
        }
       }
  -    hi = headerFreeIterator(hi);
  +    hi = headerFini(hi);
       /[EMAIL PROTECTED]@*/
   
       if (spec->BANames && spec->BACount > 0) {
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/parsePreamble.c
  ============================================================================
  $ cvs diff -u -r2.147 -r2.148 parsePreamble.c
  --- rpm/build/parsePreamble.c 24 Nov 2007 23:55:00 -0000      2.147
  +++ rpm/build/parsePreamble.c 26 Nov 2007 02:03:08 -0000      2.148
  @@ -7,7 +7,7 @@
   
   #include <rpmio_internal.h>
   
  -#include <header.h>          /* XXX headerIsEntry, headerInitIterator, 
headerNextIterator, headerFreeIterator, headerAddI18NString, headerCopyTags */
  +#include <header.h>          /* XXX headerIsEntry, headerAddI18NString, 
headerCopyTags */
   #define      _RPMEVR_INTERNAL
   #include <rpmbuild.h>
   #include "debug.h"
  @@ -306,21 +306,24 @@
   static int checkForDuplicates(Header h, const char * NVR)
        /[EMAIL PROTECTED] h @*/
   {
  -    int res = 0;
  -    rpmTag lastTag, tag;
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       HeaderIterator hi;
  +    rpmTag lastTag = 0;
  +    int res = 0;
       
  -    for (hi = headerInitIterator(h), lastTag = 0;
  -     headerNextIterator(hi, &tag, NULL, NULL, NULL);
  -     lastTag = tag)
  +    for (hi = headerInit(h);
  +     headerNext(hi, he, 0);
  +     he->p.ptr = _free(he->p.ptr))
       {
  -     if (tag != lastTag)
  +     if (he->tag != lastTag) {
  +         lastTag = he->tag;
            continue;
  +     }
        rpmlog(RPMLOG_ERR, _("Duplicate %s entries in package: %s\n"),
  -                  tagName(tag), NVR);
  +                  tagName(he->tag), NVR);
        res = 1;
       }
  -    hi = headerFreeIterator(hi);
  +    hi = headerFini(hi);
   
       return res;
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/psm.c
  ============================================================================
  $ cvs diff -u -r2.268 -r2.269 psm.c
  --- rpm/lib/psm.c     24 Nov 2007 23:55:01 -0000      2.268
  +++ rpm/lib/psm.c     26 Nov 2007 02:03:09 -0000      2.269
  @@ -1855,15 +1855,15 @@
                        /* XXX this is headerCopy w/o headerReload() */
                        psm->oh = headerNew();
   
  -                     for (hi = headerInitExtension(oh);
  -                          headerNextExtension(hi, he, 0);
  -                          he->p.ptr = headerFreeData(he->p.ptr, he->t))
  +                     for (hi = headerInit(oh);
  +                          headerNext(hi, he, 0);
  +                          he->p.ptr = _free(he->p.ptr))
                        {
                            if (he->tag == RPMTAG_ARCHIVESIZE)
                                noArchiveSize = 1;
                            xx = headerPut(psm->oh, he, 0);
                        }
  -                     hi = headerFreeIterator(hi);
  +                     hi = headerFini(hi);
   
                        oh = headerFree(oh);
                        uh = _free(uh);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmchecksig.c
  ============================================================================
  $ cvs diff -u -r1.200 -r1.201 rpmchecksig.c
  --- rpm/lib/rpmchecksig.c     24 Nov 2007 23:55:01 -0000      1.200
  +++ rpm/lib/rpmchecksig.c     26 Nov 2007 02:03:09 -0000      1.201
  @@ -278,15 +278,15 @@
            }
   
            oh = headerCopyLoad(he->p.ptr);
  -         for (hi = headerInitExtension(oh);
  -             headerNextExtension(hi, ohe, 0);
  -             ohe->p.ptr = headerFreeData(ohe->p.ptr, ohe->t))
  +         for (hi = headerInit(oh);
  +             headerNext(hi, ohe, 0);
  +             ohe->p.ptr = _free(ohe->p.ptr))
            {
                if (ohe->p.ptr) {
                    xx = headerPut(nh, ohe, 0);
                }
            }
  -         hi = headerFreeIterator(hi);
  +         hi = headerFini(hi);
            oh = headerFree(oh);
   
            sigh = headerFree(sigh);
  @@ -808,7 +808,8 @@
            xx = headerGet(h, he, 0);
            if (!xx || he->p.ptr == NULL) {
                h = headerFree(h);
  -             rpmlog(RPMLOG_ERR, _("%s: headerGetEntry failed\n"), fn);
  +             rpmlog(RPMLOG_ERR, "%s: %s: %s\n", fn, _("headerGet failed"),
  +                     _("failed to retrieve original header\n"));
                rc = RPMRC_FAIL;
                goto exit;
            }
  @@ -985,9 +986,9 @@
        b += strlen(b);
   
        if (sigh != NULL)
  -     for (hi = headerInitExtension(sigh);
  -         headerNextExtension(hi, she, 0) != 0;
  -         she->p.ptr = headerFreeData(she->p.ptr, she->t))
  +     for (hi = headerInit(sigh);
  +         headerNext(hi, she, 0) != 0;
  +         she->p.ptr = _free(she->p.ptr))
        {
   
   assert(she->p.ptr != NULL);
  @@ -1094,7 +1095,7 @@
                }
            }
        }
  -     hi = headerFreeIterator(hi);
  +     hi = headerFini(hi);
        /* XXX clear the already free'd signature data. */
   /[EMAIL PROTECTED]@*/
        xx = pgpSetSig(dig, 0, 0, NULL, 0);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmds.c
  ============================================================================
  $ cvs diff -u -r2.85 -r2.86 rpmds.c
  --- rpm/lib/rpmds.c   24 Nov 2007 23:55:01 -0000      2.85
  +++ rpm/lib/rpmds.c   26 Nov 2007 02:03:09 -0000      2.86
  @@ -520,6 +520,7 @@
       *t = '\0';
       N[0] = t;
       t = stpcpy(t, Name);
  +    Name = _free(Name);
   
       t = xmalloc(sizeof(*EVR) + 20 + strlen(V) + strlen(R) + sizeof("-"));
       EVR = (const char **) t;
  @@ -529,6 +530,8 @@
       sprintf(t, "%d:", E);
       t += strlen(t);
       t = stpcpy( stpcpy( stpcpy( t, V), "-"), R);
  +    V = _free(V);
  +    R = _free(R);
   
       ds = xcalloc(1, sizeof(*ds));
       ds->Type = Type;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmte.c
  ============================================================================
  $ cvs diff -u -r2.71 -r2.72 rpmte.c
  --- rpm/lib/rpmte.c   24 Nov 2007 23:55:01 -0000      2.71
  +++ rpm/lib/rpmte.c   26 Nov 2007 02:03:09 -0000      2.72
  @@ -102,7 +102,7 @@
       he->tag = RPMTAG_NVRA;
       xx = headerGet(h, he, 0);
   assert(he->p.str != NULL);
  -    p->NEVR = he->p.str;
  +    p->NEVR = (xx ? he->p.str : xstrdup("?N-?V-?R.?A"));
       p->name = xstrdup(p->NEVR);
       if ((p->release = strrchr(p->name, '-')) != NULL)
        *p->release++ = '\0';
  @@ -113,7 +113,7 @@
   
       he->tag = RPMTAG_HDRID;
       xx = headerGet(h, he, 0);
  -    p->hdrid = he->p.str;
  +    p->hdrid = (xx ? he->p.str : xstrdup("?RPMTAG_HDRID?"));
   
       he->tag = RPMTAG_PKGID;
       xx = headerGet(h, he, 0);
  @@ -134,11 +134,11 @@
   
       he->tag = RPMTAG_ARCH;
       xx = headerGet(h, he, 0);
  -    p->arch = he->p.str;
  +    p->arch = (xx ? he->p.str : xstrdup("?RPMTAG_ARCH?"));
   
       he->tag = RPMTAG_OS;
       xx = headerGet(h, he, 0);
  -    p->os = he->p.str;
  +    p->os = (xx ? he->p.str : xstrdup("?RPMTAG_OS?"));
   
       p->isSource =
        (headerIsEntry(h, RPMTAG_SOURCERPM) == 0 &&
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/RPM_Header.xs
  ============================================================================
  $ cvs diff -u -r1.15 -r1.16 RPM_Header.xs
  --- rpm/perl/RPM_Header.xs    24 Nov 2007 19:46:06 -0000      1.15
  +++ rpm/perl/RPM_Header.xs    26 Nov 2007 02:03:09 -0000      1.16
  @@ -297,14 +297,16 @@
   listtag(h)
       Header h
       PREINIT:
  -    HeaderIterator iterator;
  -    rpmTag tag;
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +    HeaderIterator hi;
       PPCODE:
  -    iterator = headerInitIterator(h);
  -    while (headerNextIterator(iterator, &tag, NULL, NULL, NULL)) {
  -        XPUSHs(sv_2mortal(newSViv(tag)));
  +    for (hi = headerInit(h);
  +     headerNext(hi, he, 0);
  +     he->p.ptr = _free(he->p.ptr))
  +    {
  +        XPUSHs(sv_2mortal(newSViv(he->tag)));
       }
  -    headerFreeIterator(iterator);
  +    hi = headerFini(hi);
       
   int
   hastag(h, sv_tag)
  @@ -338,8 +340,9 @@
       } else if (SvPOK(sv_tag)) {
           he->tag = tagValue(SvPV_nolen(sv_tag));
       }
  -    if (he->tag > 0)
  -        if (headerGetEntry(h, he->tag, &he->t, &he->p, &he->c)) {
  +    if (he->tag > 0) {
  +        int xx = headerGet(h, he, 0);
  +        if (xx) {
               switch(he->t) {
                   case RPM_STRING_ARRAY_TYPE:
                       {
  @@ -374,8 +377,9 @@
                   default:
                       croak("unknown rpm tag type %d", he->t);
               }
  +         he->p.ptr = _free(he->p.ptr);
           }
  -    he->p.ptr = headerFreeData(he->p.ptr, he->t);
  +    }
   
   int
   tagtype(h, sv_tag)
  @@ -390,9 +394,13 @@
           he->tag = tagValue(SvPV_nolen(sv_tag));
       }
       RETVAL = 0;
  -    if (he->tag > 0)
  -        if (headerGetEntry(h, he->tag, &he->t, NULL, &he->c))
  +    if (he->tag > 0) {
  +        int xx = headerGet(h, he, 0);
  +        if (xx) {
               RETVAL = he->t;
  +         he->p.ptr = _free(he->p.ptr);
  +     }
  +    }
       OUTPUT:
       RETVAL
       
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/RPM_Spec.xs
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 RPM_Spec.xs
  --- rpm/perl/RPM_Spec.xs      24 Nov 2007 19:46:06 -0000      1.6
  +++ rpm/perl/RPM_Spec.xs      26 Nov 2007 02:03:09 -0000      1.7
  @@ -6,6 +6,7 @@
   #undef Mkdir
   #undef Stat
   
  +#include "header.h"  /* XXX headerIsEntry, headerLink */
   #include "rpmlib.h"
   #include "rpmio.h"
   #include "rpmcli.h"
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/rpmxs.c
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 rpmxs.c
  --- rpm/perl/rpmxs.c  22 Nov 2007 22:28:16 -0000      1.6
  +++ rpm/perl/rpmxs.c  26 Nov 2007 02:03:09 -0000      1.7
  @@ -122,16 +122,16 @@
   }
   
   int _headername_vs_dep(Header h, rpmds dep, int nopromote) {
  -    rpmTagType type;
  -    rpmTagData name;
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       int rc = 0;
       CHECK_RPMDS_IX(dep);
  -    headerGetEntry(h, RPMTAG_NAME, &type, &name, NULL);
  -    if (strcmp(name.str, rpmdsN(dep)) != 0)
  +    he->tag = RPMTAG_NAME;
  +    headerGet(h, he, 0);
  +    if (strcmp(he->p.str, rpmdsN(dep)) != 0)
           rc = 0;
       else
           rc = rpmdsNVRMatchesDep(h, dep, nopromote);
  -    name.ptr = headerFreeData(name.ptr, type);
  +    he->p.ptr = _free(he->p.ptr);
       return rc;
       /* return 1 if match */
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/python/header-py.c
  ============================================================================
  $ cvs diff -u -r1.85 -r1.86 header-py.c
  --- rpm/python/header-py.c    24 Nov 2007 23:15:32 -0000      1.85
  +++ rpm/python/header-py.c    26 Nov 2007 02:03:09 -0000      1.86
  @@ -125,10 +125,9 @@
    *   print hdr['release']
    * \endcode
    *
  - * This method of access is a teensy bit slower because the name must be
  - * translated into the tag number dynamically. You also must make sure
  - * the strings in header lookups don't get translated, or the lookups
  - * will fail.
  + * This method of access is slower because the name must be translated
  + * into the tag number dynamically. You also must make sure the strings
  + * in header lookups don't get translated, or the lookups will fail.
    */
   
   /** \ingroup py_c
  @@ -136,14 +135,6 @@
   struct hdrObject_s {
       PyObject_HEAD
       Header h;
  -    char ** md5list;
  -    char ** fileList;
  -    char ** linkList;
  -    uint32_t * fileSizes;
  -    uint32_t * mtimes;
  -    uint32_t * uids, * gids; /* XXX these tags are not used anymore */
  -    unsigned short * rdevs;
  -    unsigned short * modes;
   } ;
   
   /**
  @@ -165,21 +156,20 @@
   static PyObject * hdrKeyList(hdrObject * s)
        /[EMAIL PROTECTED]/
   {
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       PyObject * list, *o;
       HeaderIterator hi;
  -    rpmTag tag;
  -    rpmTagType type;
   
       list = PyList_New(0);
   
  -    hi = headerInitIterator(s->h);
  -    while (headerNextIterator(hi, &tag, &type, NULL, NULL)) {
  -        if (tag == HEADER_I18NTABLE) continue;
  -
  -     switch (type) {
  +    for (hi = headerInit(s->h);
  +     headerNext(hi, he, 0);
  +     he->p.ptr = _free(he->p.ptr))
  +    {
  +        if (he->tag == HEADER_I18NTABLE) continue;
  +     switch (he->t) {
        case RPM_I18NSTRING_TYPE:
  -         continue;
  -         /[EMAIL PROTECTED]@*/ break;
  +         break;
        case RPM_BIN_TYPE:
        case RPM_UINT64_TYPE:
        case RPM_UINT32_TYPE:
  @@ -187,12 +177,12 @@
        case RPM_UINT8_TYPE:
        case RPM_STRING_ARRAY_TYPE:
        case RPM_STRING_TYPE:
  -         PyList_Append(list, o=PyInt_FromLong(tag));
  +         PyList_Append(list, o=PyInt_FromLong(he->tag));
            Py_DECREF(o);
            break;
        }
       }
  -    headerFreeIterator(hi);
  +    hi = headerFini(hi);
   
       return list;
   }
  @@ -341,9 +331,6 @@
        /[EMAIL PROTECTED]/
   {
       if (s->h) headerFree(s->h);
  -    s->md5list = _free(s->md5list);
  -    s->fileList = _free(s->fileList);
  -    s->linkList = _free(s->linkList);
       PyObject_Del(s);
   }
   
  @@ -632,9 +619,6 @@
   {
       hdrObject * hdr = PyObject_New(hdrObject, &hdr_Type);
       hdr->h = headerLink(h);
  -    hdr->fileList = hdr->linkList = hdr->md5list = NULL;
  -    hdr->uids = hdr->gids = hdr->mtimes = hdr->fileSizes = NULL;
  -    hdr->modes = hdr->rdevs = NULL;
       return hdr;
   }
   
  @@ -773,121 +757,6 @@
   }
   
   /**
  - * This assumes the order of list matches the order of the new headers, and
  - * throws an exception if that isn't true.
  - */
  -int rpmMergeHeaders(PyObject * list, FD_t fd, int matchTag)
  -{
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  -    Header h;
  -    HeaderIterator hi;
  -    rpmTagData newMatch;
  -    rpmTagData oldMatch;
  -    hdrObject * hdr;
  -    uint32_t count = 0;
  -    int xx;
  -
  -    Py_BEGIN_ALLOW_THREADS
  -    {   const char item[] = "Header";
  -     const char * msg = NULL;
  -     rpmRC rc = rpmpkgRead(item, fd, &h, &msg);
  -     if (rc != RPMRC_OK)
  -         rpmlog(RPMLOG_ERR, "%s: %s: %s\n", "headerRead", item, msg);
  -     msg = _free(msg);
  -    }
  -    Py_END_ALLOW_THREADS
  -
  -    while (h) {
  -     he->tag = matchTag;
  -     xx = headerGet(hdr->h, he, 0);
  -     newMatch.ptr = he->p.ptr;
  -     if (!xx) {
  -         PyErr_SetString(pyrpmError, "match tag missing in new header");
  -         return 1;
  -     }
  -
  -     hdr = (hdrObject *) PyList_GetItem(list, count++);
  -     if (!hdr) {
  -         PyErr_SetString(pyrpmError, "match list item missing");
  -         return 1;
  -     }
  -
  -     he->tag = matchTag;
  -     xx = headerGet(hdr->h, he, 0);
  -     oldMatch.ptr = he->p.ptr;
  -     if (!xx) {
  -         PyErr_SetString(pyrpmError, "match tag missing in old header");
  -         return 1;
  -     }
  -
  -     if (*newMatch.ui32p != *oldMatch.ui32p) {
  -         PyErr_SetString(pyrpmError, "match tag mismatch");
  -         return 1;
  -     }
  -
  -     hdr->md5list = _free(hdr->md5list);
  -     hdr->fileList = _free(hdr->fileList);
  -     hdr->linkList = _free(hdr->linkList);
  -
  -     for (hi = headerInitIterator(h);
  -         headerNextIterator(hi, &he->tag, &he->t, &he->p, &he->c);
  -         he->p.ptr = headerFreeData(he->p.ptr, he->t))
  -     {
  -         /* could be dupes */
  -         xx = headerDel(hdr->h, he, 0);
  -         xx = headerPut(hdr->h, he, 0);
  -     }
  -
  -     headerFreeIterator(hi);
  -     h = headerFree(h);
  -
  -     Py_BEGIN_ALLOW_THREADS
  -     {   const char item[] = "Header";
  -         const char * msg = NULL;
  -         rpmRC rc = rpmpkgRead(item, fd, &h, &msg);
  -         if (rc != RPMRC_OK)
  -             rpmlog(RPMLOG_ERR, "%s: %s: %s\n", "headerRead", item, msg);
  -         msg = _free(msg);
  -     }
  -     Py_END_ALLOW_THREADS
  -    }
  -
  -    return 0;
  -}
  -
  -PyObject *
  -rpmMergeHeadersFromFD(PyObject * self, PyObject * args, PyObject * kwds)
  -{
  -    FD_t fd;
  -    int fileno;
  -    PyObject * list;
  -    int rc;
  -    int matchTag;
  -    char * kwlist[] = {"list", "fd", "matchTag", NULL};
  -
  -    if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oii", kwlist, &list,
  -         &fileno, &matchTag))
  -     return NULL;
  -
  -    if (!PyList_Check(list)) {
  -     PyErr_SetString(PyExc_TypeError, "first parameter must be a list");
  -     return NULL;
  -    }
  -
  -    fd = fdDup(fileno);
  -
  -    rc = rpmMergeHeaders (list, fd, matchTag);
  -    Fclose(fd);
  -
  -    if (rc) {
  -     return NULL;
  -    }
  -
  -    Py_INCREF(Py_None);
  -    return Py_None;
  -}
  -
  -/**
    */
   PyObject *
   rpmSingleHeaderFromFD(PyObject * self, PyObject * args, PyObject * kwds)
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/python/rpmts-py.c
  ============================================================================
  $ cvs diff -u -r1.80 -r1.81 rpmts-py.c
  --- rpm/python/rpmts-py.c     24 Nov 2007 23:55:03 -0000      1.80
  +++ rpm/python/rpmts-py.c     26 Nov 2007 02:03:09 -0000      1.81
  @@ -236,9 +236,15 @@
       /* Synthesize a python object for callback (if necessary). */
       if (pkgObj == NULL) {
        if (h) {
  -         rpmTagData n = { .ptr = NULL };
  -         (void) headerGetEntry(h, RPMTAG_NAME, NULL, &n, NULL);
  -         pkgObj = Py_BuildValue("s", n.str);
  +         HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +         he->tag = RPMTAG_NAME;
  +         if (headerGet(h, he, 0)) {
  +             pkgObj = Py_BuildValue("s", he->p.str);
  +             he->p.ptr = _free(he->p.ptr);
  +         } else {
  +             pkgObj = Py_None;
  +             Py_INCREF(pkgObj);
  +         }
        } else {
            pkgObj = Py_None;
            Py_INCREF(pkgObj);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrNVR.c
  ============================================================================
  $ cvs diff -u -r1.38 -r1.39 hdrNVR.c
  --- rpm/rpmdb/hdrNVR.c        24 Nov 2007 23:15:33 -0000      1.38
  +++ rpm/rpmdb/hdrNVR.c        26 Nov 2007 02:03:10 -0000      1.39
  @@ -155,46 +155,52 @@
                /[EMAIL PROTECTED]@*/ const char **ep, const char **vp, const 
char **rp,
                const char **ap)
   {
  -    rpmTagType t;
  -    rpmTagData p;
  -    rpmTagCount c;
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
   
   /[EMAIL PROTECTED]@*/
       if (np) {
  -     if (headerGetEntry(h, RPMTAG_NAME, &t, &p, &c)
  -      && t == RPM_STRING_TYPE && c == 1)
  -         *np = p.str;
  +     he->tag = RPMTAG_NAME;
  +     if (headerGet(h, he, 0)
  +      && he->t == RPM_STRING_TYPE && he->c == 1)
  +         *np = xstrdup(he->p.str);
        else
            *np = NULL;
  +     he->p.ptr = _free(he->p.ptr);
       }
       if (vp) {
  -     if (headerGetEntry(h, RPMTAG_VERSION, &t, &p, &c)
  -      && t == RPM_STRING_TYPE && c == 1)
  -         *vp = p.str;
  +     he->tag = RPMTAG_VERSION;
  +     if (headerGet(h, he, 0)
  +      && he->t == RPM_STRING_TYPE && he->c == 1)
  +         *vp = xstrdup(he->p.str);
        else
            *vp = NULL;
  +     he->p.ptr = _free(he->p.ptr);
       }
       if (rp) {
  -     if (headerGetEntry(h, RPMTAG_RELEASE, &t, &p, &c)
  -      && t == RPM_STRING_TYPE && c == 1)
  -         *rp = p.str;
  +     he->tag = RPMTAG_RELEASE;
  +     if (headerGet(h, he, 0)
  +      && he->t == RPM_STRING_TYPE && he->c == 1)
  +         *rp = xstrdup(he->p.str);
        else
            *rp = NULL;
  +     he->p.ptr = _free(he->p.ptr);
       }
       if (ap) {
  +     he->tag = RPMTAG_ARCH;
   /[EMAIL PROTECTED] [EMAIL PROTECTED]/
  -     if (!headerIsEntry(h, RPMTAG_ARCH))
  -         *ap = "pubkey";
  +     if (!headerIsEntry(h, he->tag))
  +         *ap = xstrdup("pubkey");
        else
        if (!headerIsEntry(h, RPMTAG_SOURCERPM))
  -         *ap = "src";
  +         *ap = xstrdup("src");
   /[EMAIL PROTECTED] [EMAIL PROTECTED]/
        else
  -     if (headerGetEntry(h, RPMTAG_ARCH, &t, &p, &c)
  -      && t == RPM_STRING_TYPE && c == 1)
  -         *ap = p.str;
  +     if (headerGet(h, he, 0)
  +      && he->t == RPM_STRING_TYPE && he->c == 1)
  +         *ap = xstrdup(he->p.str);
        else
            *ap = NULL;
  +     he->p.ptr = _free(he->p.ptr);
       }
   /[EMAIL PROTECTED]@*/
       return 0;
  @@ -221,7 +227,6 @@
   
   void headerMergeLegacySigs(Header h, const Header sigh)
   {
  -    HFD_t hfd = (HFD_t) headerFreeData;
       HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       HeaderIterator hi;
       int xx;
  @@ -229,9 +234,9 @@
       if (h == NULL || sigh == NULL)
        return;
   
  -    for (hi = headerInitExtension(sigh);
  -        headerNextExtension(hi, he, 0);
  -        he->p.ptr = hfd(he->p.ptr, he->t))
  +    for (hi = headerInit(sigh);
  +        headerNext(hi, he, 0);
  +        he->p.ptr = _free(he->p.ptr))
       {
        /* XXX Translate legacy signature tag values. */
        switch ((rpmSigTag)he->tag) {
  @@ -284,20 +289,19 @@
   assert(xx == 1);
        }
       }
  -    hi = headerFreeIterator(hi);
  +    hi = headerFini(hi);
   }
   
   Header headerRegenSigHeader(const Header h, int noArchiveSize)
   {
  -    HFD_t hfd = (HFD_t) headerFreeData;
       HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       Header sigh = headerNew();
       HeaderIterator hi;
       int xx;
   
  -    for (hi = headerInitExtension(h);
  -        headerNextExtension(hi, he, 0);
  -        he->p.ptr = hfd(he->p.ptr, he->t))
  +    for (hi = headerInit(h);
  +     headerNext(hi, he, 0);
  +     he->p.ptr = _free(he->p.ptr))
       {
        /* XXX Translate legacy signature tag values. */
        switch (he->tag) {
  @@ -328,6 +332,6 @@
   assert(xx == 1);
        }
       }
  -    hi = headerFreeIterator(hi);
  +    hi = headerFini(hi);
       return sigh;
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.42 -r1.43 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c        24 Nov 2007 22:07:30 -0000      1.42
  +++ rpm/rpmdb/hdrfmt.c        26 Nov 2007 02:03:10 -0000      1.43
  @@ -1026,21 +1026,18 @@
   static int instprefixTag(Header h, HE_t he)
        /[EMAIL PROTECTED] he @*/
   {
  -    rpmTagType ipt;
  -    rpmTagData array;
  -
       he->tag = RPMTAG_INSTALLPREFIX;
  -    if (headerGetEntry(h, RPMTAG_INSTALLPREFIX, &he->t, &he->p, &he->c)) {
  -     he->freeData = 0;
  +    if (headerGet(h, he, 0))
        return 0;
  -    }
  +
       he->tag = RPMTAG_INSTPREFIXES;
  -    if (headerGetEntry(h, he->tag, &ipt, &array, &he->c)) {
  +    if (headerGet(h, he, 0)) {
  +     rpmTagData array = { .argv = he->p.argv };
        he->t = RPM_STRING_TYPE;
        he->c = 1;
        he->p.str = xstrdup(array.argv[0]);
        he->freeData = 1;
  -     array.ptr = headerFreeData(array.ptr, ipt);
  +     array.ptr = _free(array.ptr);
        return 0;
       }
       return 1;
  @@ -1056,40 +1053,64 @@
        /[EMAIL PROTECTED] he @*/
   {
       HE_t _he = memset(alloca(sizeof(*_he)), 0, sizeof(*_he));
  -    rpmTagData flags;
  -    rpmTagData indices;
  -    rpmTagData names;
  -    rpmTagData versions;
  -    const char ** conds;
  +    rpmTagData flags = { .ptr = NULL };
  +    rpmTagData indices = { .ptr = NULL };
  +    rpmTagData names = { .ptr = NULL };
  +    rpmTagData versions = { .ptr = NULL };
       rpmTagData s;
  -    char * item, * flagsStr;
  -    char * chptr;
  -    uint32_t numNames, numScripts;
  +    rpmTagCount numNames;
  +    rpmTagCount numScripts;
       unsigned i, j;
  +    int rc = 1;              /* assume failure */
       int xx;
   
       he->freeData = 0;
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERNAME, NULL, &names, &numNames);
  -    if (!xx)
  -     return 0;
  +
  +    _he->tag = RPMTAG_TRIGGERNAME;
  +    xx = headerGet(h, _he, 0);
  +    names.argv = _he->p.argv;
  +    numNames = _he->c;
  +    if (!xx) {               /* no triggers, succeed anyways */
  +     rc = 0;
  +     goto exit;
  +    }
  +
  +    _he->tag = RPMTAG_TRIGGERINDEX;
  +    xx = headerGet(h, _he, 0);
  +    indices.ui32p = _he->p.ui32p;
  +    if (!xx) goto exit;
  +
  +    _he->tag = RPMTAG_TRIGGERFLAGS;
  +    xx = headerGet(h, _he, 0);
  +    flags.ui32p = _he->p.ui32p;
  +    if (!xx) goto exit;
  +
  +    _he->tag = RPMTAG_TRIGGERVERSION;
  +    xx = headerGet(h, _he, 0);
  +    versions.argv = _he->p.argv;
  +    if (!xx) goto exit;
  +
  +    _he->tag = RPMTAG_TRIGGERSCRIPTS;
  +    xx = headerGet(h, _he, 0);
  +    s.argv = _he->p.argv;
  +    numScripts = _he->c;
  +    if (!xx) goto exit;
   
       _he->tag = he->tag;
       _he->t = RPM_UINT32_TYPE;
       _he->p.ui32p = NULL;
       _he->c = 1;
  -    _he->freeData = -1;
  -
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERINDEX, NULL, &indices, NULL);
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, &flags, NULL);
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERVERSION, NULL, &versions, NULL);
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, &s, &numScripts);
  +    _he->freeData = 0;
   
       he->t = RPM_STRING_ARRAY_TYPE;
       he->c = numScripts;
   
       he->freeData = 1;
  -    he->p.argv = conds = xmalloc(sizeof(*conds) * numScripts);
  -    for (i = 0; i < (unsigned) numScripts; i++) {
  +    he->p.argv = xmalloc(sizeof(*he->p.argv) * he->c);
  +    for (i = 0; i < (unsigned) he->c; i++) {
  +     char * item, * flagsStr;
  +     char * chptr;
  +
        chptr = xstrdup("");
   
        for (j = 0; j < (unsigned) numNames; j++) {
  @@ -1111,14 +1132,18 @@
            item = _free(item);
        }
   
  -     conds[i] = chptr;
  +     he->p.argv[i] = chptr;
       }
  +    rc = 0;
   
  -    names.ptr = headerFreeData(names.ptr, -1);
  -    versions.ptr = headerFreeData(versions.ptr, -1);
  -    s.ptr = headerFreeData(s.ptr, -1);
  +exit:
  +    indices.ptr = _free(indices.ptr);
  +    flags.ptr = _free(flags.ptr);
  +    names.ptr = _free(names.ptr);
  +    versions.ptr = _free(versions.ptr);
  +    s.ptr = _free(s.ptr);
   
  -    return 0;
  +    return rc;
   }
   
   /**
  @@ -1130,46 +1155,65 @@
   static int triggertypeTag(Header h, HE_t he)
        /[EMAIL PROTECTED] he @*/
   {
  +    HE_t _he = memset(alloca(sizeof(*_he)), 0, sizeof(*_he));
       rpmTagData indices;
       rpmTagData flags;
  -    const char ** conds;
       rpmTagData s;
  -    uint32_t numScripts, numNames;
  +    rpmTagCount numNames;
  +    rpmTagCount numScripts;
       unsigned i, j;
  +    int rc = 1;              /* assume failure */
       int xx;
   
       he->freeData = 0;
  -    if (!headerGetEntry(h, RPMTAG_TRIGGERINDEX, NULL, &indices, &numNames))
  -     return 1;
   
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, &flags, NULL);
  -    xx = headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, &s, &numScripts);
  +    _he->tag = RPMTAG_TRIGGERINDEX;
  +    xx = headerGet(h, _he, 0);
  +    indices.ui32p = _he->p.ui32p;
  +    numNames = _he->c;
  +    if (!xx) goto exit;
  +
  +    _he->tag = RPMTAG_TRIGGERFLAGS;
  +    xx = headerGet(h, _he, 0);
  +    flags.ui32p = _he->p.ui32p;
  +    if (!xx) goto exit;
  +
  +    _he->tag = RPMTAG_TRIGGERSCRIPTS;
  +    xx = headerGet(h, _he, 0);
  +    s.argv = _he->p.argv;
  +    numScripts = _he->c;
  +    if (!xx) goto exit;
   
       he->t = RPM_STRING_ARRAY_TYPE;
       he->c = numScripts;
   
       he->freeData = 1;
  -    he->p.argv = conds = xmalloc(sizeof(*conds) * numScripts);
  -    for (i = 0; i < (unsigned) numScripts; i++) {
  +    he->p.argv = xmalloc(sizeof(*he->p.argv) * he->c);
  +    for (i = 0; i < (unsigned) he->c; i++) {
        for (j = 0; j < (unsigned) numNames; j++) {
            if (indices.ui32p[j] != i)
                /[EMAIL PROTECTED]@*/ continue;
   
  +         /* XXX FIXME: there's memory leaks here. */
            if (flags.ui32p[j] & RPMSENSE_TRIGGERPREIN)
  -             conds[i] = xstrdup("prein");
  +             he->p.argv[i] = xstrdup("prein");
            else if (flags.ui32p[j] & RPMSENSE_TRIGGERIN)
  -             conds[i] = xstrdup("in");
  +             he->p.argv[i] = xstrdup("in");
            else if (flags.ui32p[j] & RPMSENSE_TRIGGERUN)
  -             conds[i] = xstrdup("un");
  +             he->p.argv[i] = xstrdup("un");
            else if (flags.ui32p[j] & RPMSENSE_TRIGGERPOSTUN)
  -             conds[i] = xstrdup("postun");
  +             he->p.argv[i] = xstrdup("postun");
            else
  -             conds[i] = xstrdup("");
  +             he->p.argv[i] = xstrdup("");
            /[EMAIL PROTECTED]@*/ break;
        }
       }
  +    rc = 0;
   
  -    s.ptr = headerFreeData(s.ptr, -1);
  +exit:
  +    indices.ptr = _free(indices.ptr);
  +    flags.ptr = _free(flags.ptr);
  +    s.ptr = _free(s.ptr);
       return 0;
   }
   
  @@ -1290,52 +1334,49 @@
   static int localeTag(Header h, HE_t he)
        /[EMAIL PROTECTED] he @*/
   {
  -    rpmTagType t;
  -    rpmTagData p;
  -    rpmTagCount c;
  -    const char ** argv;
  -    char * te;
       int rc;
   
  -    rc = headerGetEntry(h, he->tag, &t, &p, &c);
  -    if (!rc || p.ptr == NULL || c == 0) {
  +    rc = headerGetEntry(h, he->tag, &he->t, &he->p, &he->c);
  +    if (!rc || he->p.str == NULL || he->c == 0) {
        he->t = RPM_STRING_TYPE;
  -     he->p.str = NULL;
  -     he->c = 0;
        he->freeData = 0;
        return 1;
       }
   
  -    if (t == RPM_STRING_TYPE) {
  -     p.str = xstrdup(p.str);
  -     p.str = xstrtolocale(p.str);
  +    switch (he->t) {
  +    default:
  +     he->freeData = 0;
  +     break;
  +    case RPM_STRING_TYPE:
  +     he->p.str = xstrdup(he->p.str);
  +     he->p.str = xstrtolocale(he->p.str);
        he->freeData = 1;
  -    } else if (t == RPM_STRING_ARRAY_TYPE) {
  +     break;
  +    case RPM_STRING_ARRAY_TYPE:
  +    {        const char ** argv;
  +     char * te;
        size_t l = 0;
        unsigned i;
  -     for (i = 0; i < (unsigned)c; i++) {
  -         p.argv[i] = xstrdup(p.argv[i]);
  -         p.argv[i] = xstrtolocale(p.argv[i]);
  -assert(p.argv[i] != NULL);
  -         l += strlen(p.argv[i]) + 1;
  -     }
  -     argv = xmalloc(c * sizeof(*argv) + l);
  -     te = (char *)&argv[c];
  -     for (i = 0; i < (unsigned) c; i++) {
  +     for (i = 0; i < (unsigned) he->c; i++) {
  +         he->p.argv[i] = xstrdup(he->p.argv[i]);
  +         he->p.argv[i] = xstrtolocale(he->p.argv[i]);
  +assert(he->p.argv[i] != NULL);
  +         l += strlen(he->p.argv[i]) + 1;
  +     }
  +     argv = xmalloc(he->c * sizeof(*argv) + l);
  +     te = (char *)&argv[he->c];
  +     for (i = 0; i < (unsigned) he->c; i++) {
            argv[i] = te;
  -         te = stpcpy(te, p.argv[i]);
  +         te = stpcpy(te, he->p.argv[i]);
            te++;
  -         p.argv[i] = _free(p.argv[i]);
  +         he->p.argv[i] = _free(he->p.argv[i]);
        }
  -     p.ptr = _free(p.ptr);
  -     p.argv = argv;
  +     he->p.ptr = _free(he->p.ptr);
  +     he->p.argv = argv;
        he->freeData = 1;
  -    } else
  -     he->freeData = 0;
  +    }        break;
  +    }
   
  -    he->t = t;
  -    he->p.ptr = p.ptr;
  -    he->c = c;
       return 0;
   }
   
  @@ -1446,6 +1487,10 @@
       if (V)   t = stpcpy( stpcpy(t, "-"), V);
       if (R)   t = stpcpy( stpcpy(t, "-"), R);
       if (A)   t = stpcpy( stpcpy(t, "."), A);
  +    N = _free(N);
  +    V = _free(V);
  +    R = _free(R);
  +    A = _free(A);
       return NVRA;
   }
   
  @@ -1492,15 +1537,15 @@
                /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagCount * fcp)
        /[EMAIL PROTECTED] *fnp, *fcp @*/
   {
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
  +    rpmTag dirNameTag = 0;
  +    rpmTag dirIndexesTag = 0;
       rpmTagData baseNames;
       rpmTagData dirNames;
       rpmTagData dirIndexes;
       rpmTagData fileNames;
       rpmTagCount count;
       size_t size;
  -    rpmTag dirNameTag = 0;
  -    rpmTag dirIndexesTag = 0;
  -    rpmTagType bnt, dnt;
       char * t;
       unsigned i;
       int xx;
  @@ -1511,16 +1556,31 @@
       } else if (tagN == RPMTAG_ORIGBASENAMES) {
        dirNameTag = RPMTAG_ORIGDIRNAMES;
        dirIndexesTag = RPMTAG_ORIGDIRINDEXES;
  +    } else {
  +     if (fnp) *fnp = NULL;
  +     if (fcp) *fcp = 0;
  +     return;         /* programmer error */
       }
   
  -    if (!headerGetEntry(h, tagN, &bnt, &baseNames, &count)) {
  +    he->tag = tagN;
  +    xx = headerGet(h, he, 0);
  +    baseNames.argv = he->p.argv;
  +    count = he->c;
  +
  +    if (!xx) {
        if (fnp) *fnp = NULL;
        if (fcp) *fcp = 0;
        return;         /* no file list */
       }
   
  -    xx = headerGetEntry(h, dirNameTag, &dnt, &dirNames, NULL);
  -    xx = headerGetEntry(h, dirIndexesTag, NULL, &dirIndexes, &count);
  +    he->tag = dirNameTag;
  +    xx = headerGet(h, he, 0);
  +    dirNames.argv = he->p.argv;
  +
  +    he->tag = dirIndexesTag;
  +    xx = headerGet(h, he, 0);
  +    dirIndexes.ui32p = he->p.ui32p;
  +    count = he->c;
   
       size = sizeof(*fileNames.argv) * count;
       for (i = 0; i < (unsigned)count; i++) {
  @@ -1538,8 +1598,9 @@
        t = stpcpy( stpcpy(t, dn), baseNames.argv[i]);
        *t++ = '\0';
       }
  -    baseNames.ptr = headerFreeData(baseNames.ptr, bnt);
  -    dirNames.ptr = headerFreeData(dirNames.ptr, dnt);
  +    baseNames.ptr = _free(baseNames.ptr);
  +    dirNames.ptr = _free(dirNames.ptr);
  +    dirIndexes.ptr = _free(dirIndexes.ptr);
   
   /[EMAIL PROTECTED]@*/
       if (fnp)
  @@ -1815,29 +1876,6 @@
   }
   
   /**
  - * Mark a tag container with headerGetEntry() freeData.
  - * @param he         tag container
  - */
  -/[EMAIL PROTECTED]@*/
  -static HE_t rpmheMark(/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ HE_t he)
  -     /[EMAIL PROTECTED] he @*/
  -{
  -    /* Set he->freeData as appropriate for headerGetEntry() . */
  -    if (he)
  -    switch (he->t) {
  -    default:
  -     he->freeData = 0;
  -     break;
  -    case RPM_I18NSTRING_TYPE:
  -    case RPM_STRING_ARRAY_TYPE:
  -    case RPM_BIN_TYPE:
  -     he->freeData = 1;
  -     break;
  -    }
  -    return he;
  -}
  -
  -/**
    * Clean a tag container, free'ing attached malloc's.
    * @param he         tag container
    */
  @@ -1916,7 +1954,7 @@
       if (hsa != NULL) {
        hsa->i = 0;
        if (tag != NULL && tag->tagno == -2)
  -         hsa->hi = headerInitIterator(hsa->h);
  +         hsa->hi = headerInit(hsa->h);
       }
   /[EMAIL PROTECTED]@*/
       return hsa;
  @@ -1946,12 +1984,11 @@
            hsa->i++;
        } else {
            HE_t he = rpmheClean(&tag->he);
  -         if (!headerNextIterator(hsa->hi, &he->tag, &he->t, &he->p, &he->c))
  +         if (!headerNext(hsa->hi, he, 0))
            {
                tag->tagno = 0;
                return NULL;
            }
  -         he = rpmheMark(he);
            he->avail = 1;
            tag->tagno = he->tag;
        }
  @@ -1971,7 +2008,7 @@
        /[EMAIL PROTECTED] hsa */
   {
       if (hsa != NULL) {
  -     hsa->hi = headerFreeIterator(hsa->hi);
  +     hsa->hi = headerFini(hsa->hi);
        hsa->i = 0;
       }
   /[EMAIL PROTECTED]@*/
  @@ -2481,7 +2518,7 @@
    * @param fn         function
    * @retval he                tag container
    * @retval ec                extension cache
  - * @return           0 on success, 1 on failure
  + * @return           1 on success, 0 on failure
    */
   static int getExtension(headerSprintfArgs hsa, headerTagTagFunction fn,
                HE_t he, HE_t ec)
  @@ -2497,6 +2534,7 @@
       } else
        *he = *ec;      /* structure copy. */
       he->freeData = 0;
  +    rc = (rc == 0);  /* XXX invert getExtension return. */
       return rc;
   }
   
  @@ -2523,20 +2561,18 @@
       int xx;
   
       if (!he->avail) {
  -     if (tag->ext) {
  +     if (tag->ext)
            xx = getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum);
  -     } else {
  +     else {
            he->tag = tag->tagno;       /* XXX necessary? */
            xx = headerGet(hsa->h, he, 0);
  -         if (xx)             /* XXX 1 on success */
  -             he->freeData = 1;
  -         xx = (xx == 0);     /* XXX invert headerGetEntry return. */
        }
  -     if (xx) {
  +     if (!xx) {
            (void) rpmheClean(he);
            he->t = RPM_STRING_TYPE;    
            he->p.str = xstrdup("(none)");
            he->c = 1;
  +         he->freeData = 1;
        }
        he->avail = 1;
       }
  @@ -2733,13 +2769,9 @@
                he->tag = tag->tagno;
                if (tag->ext)
                    xx = getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum);
  -             else {
  +             else
                    xx = headerGet(hsa->h, he, 0);
  -                 if (xx)
  -                     he->freeData = 1;
  -                 xx = (xx == 0);     /* XXX invert headerGet return. */
  -             }
  -             if (xx) {
  +             if (!xx) {
                    (void) rpmheClean(he);
                    continue;
                }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrinline.h
  ============================================================================
  $ cvs diff -u -r1.42 -r1.43 hdrinline.h
  --- rpm/rpmdb/hdrinline.h     24 Nov 2007 23:15:33 -0000      1.42
  +++ rpm/rpmdb/hdrinline.h     26 Nov 2007 02:03:10 -0000      1.43
  @@ -224,44 +224,6 @@
   }
   
   /** \ingroup header
  - * Destroy header tag container iterator.
  - * @param hi         header tag container iterator
  - * @return           NULL always
  - */
  -/[EMAIL PROTECTED]@*/ static inline
  -HeaderIterator headerFreeExtension(/[EMAIL PROTECTED]@*/ HeaderIterator hi)
  -     /[EMAIL PROTECTED] hi @*/
  -{
  -    return hdrVec->hdrfreeiter(hi);
  -}
  -
  -/** \ingroup header
  - * Create header tag iterator.
  - * @param h          header
  - * @return           header tag iterator
  - */
  -/[EMAIL PROTECTED]@*/ static inline
  -HeaderIterator headerInitExtension(Header h)
  -     /[EMAIL PROTECTED] h */
  -{
  -    return hdrVec->hdrinititer(h);
  -}
  -
  -/** \ingroup header
  - * Return next tag from header.
  - * @param hi         header tag iterator
  - * @param he         tag container
  - * @param flags              (unused)
  - * @return           1 on success, 0 on failure
  - */
  -/[EMAIL PROTECTED]@*/ static inline
  -int headerNextExtension(HeaderIterator hi, HE_t he, /[EMAIL PROTECTED]@*/ 
unsigned int flags)
  -     /[EMAIL PROTECTED] hi, he @*/
  -{
  -    return hdrVec->hdrnextiter(hi, &he->tag, &he->t, &he->p, &he->c);
  -}
  -
  -/** \ingroup header
    * Retrieve tag value.
    * Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements with
    * RPM_I18NSTRING_TYPE equivalent entries are translated (if HEADER_I18NTABLE
  @@ -425,50 +387,6 @@
   }
   
   /** \ingroup header
  - * Destroy header tag iterator.
  - * @param hi         header tag iterator
  - * @return           NULL always
  - */
  -/[EMAIL PROTECTED]@*/ static inline
  -HeaderIterator headerFreeIterator(/[EMAIL PROTECTED]@*/ HeaderIterator hi)
  -     /[EMAIL PROTECTED] hi @*/
  -{
  -    return hdrVec->hdrfreeiter(hi);
  -}
  -
  -/** \ingroup header
  - * Create header tag iterator.
  - * @param h          header
  - * @return           header tag iterator
  - */
  -/[EMAIL PROTECTED]@*/ static inline
  -HeaderIterator headerInitIterator(Header h)
  -     /[EMAIL PROTECTED] h */
  -{
  -    return hdrVec->hdrinititer(h);
  -}
  -
  -/** \ingroup header
  - * Return next tag from header.
  - * @param hi         header tag iterator
  - * @retval *tag              tag
  - * @retval *type     tag value data type
  - * @retval *p                pointer to tag value(s)
  - * @retval *c                number of values
  - * @return           1 on success, 0 on failure
  - */
  -/[EMAIL PROTECTED]@*/ static inline
  -int headerNextIterator(HeaderIterator hi,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTag * tag,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagType * type,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagData * p,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagCount * c)
  -     /[EMAIL PROTECTED] hi, *tag, *type, *p, *c @*/
  -{
  -    return hdrVec->hdrnextiter(hi, tag, type, p, c);
  -}
  -
  -/** \ingroup header
    * Return header magic.
    * @param h          header
    * @param *magicp    magic array
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.135 -r1.136 header.c
  --- rpm/rpmdb/header.c        24 Nov 2007 23:15:33 -0000      1.135
  +++ rpm/rpmdb/header.c        26 Nov 2007 02:03:10 -0000      1.136
  @@ -2097,6 +2097,61 @@
   }
   
   /**
  + * Always realloc HE_t memory.
  + * @param he         tag container
  + * @return           1 on success, 0 on failure
  + */
  +static int rpmheRealloc(HE_t he)
  +     /[EMAIL PROTECTED] he @*/
  +{
  +    size_t nb = 0;
  +    int rc = 1;              /* assume success */
  +
  +    switch (he->t) {
  +    default:
  +assert(0);   /* XXX stop unimplemented oversights. */
  +     break;
  +    case RPM_BIN_TYPE:
  +     he->freeData = 1;       /* XXX RPM_BIN_TYPE is malloc'd */
  +     /[EMAIL PROTECTED]@*/
  +    case RPM_UINT8_TYPE:
  +     nb = he->c * sizeof(*he->p.ui8p);
  +     break;
  +    case RPM_UINT16_TYPE:
  +     nb = he->c * sizeof(*he->p.ui16p);
  +     break;
  +    case RPM_UINT32_TYPE:
  +     nb = he->c * sizeof(*he->p.ui32p);
  +     break;
  +    case RPM_UINT64_TYPE:
  +     nb = he->c * sizeof(*he->p.ui64p);
  +     break;
  +    case RPM_I18NSTRING_TYPE:
  +assert(he->c == 1);  /* XXX stop unimplemented oversights. */
  +     /[EMAIL PROTECTED]@*/
  +    case RPM_STRING_TYPE:
  +     if (he->p.str)
  +         nb = strlen(he->p.str) + 1;
  +     else
  +         rc = 0;
  +     break;
  +    case RPM_STRING_ARRAY_TYPE:
  +     break;
  +    }
  +
  +    /* Allocate all returned storage (if not already). */
  +    if (he->p.ptr && nb && !he->freeData) {
  +     void * ptr = memcpy(xmalloc(nb), he->p.ptr, nb);
  +     he->p.ptr = ptr;
  +    }
  +
  +    if (rc)
  +     he->freeData = 1;
  +
  +    return rc;
  +}
  +
  +/**
    * Header tag iterator data structure.
    */
   struct headerIterator_s {
  @@ -2104,14 +2159,7 @@
       size_t next_index;       /*!< Next tag index. */
   };
   
  -/** \ingroup header
  - * Destroy header tag iterator.
  - * @param hi         header tag iterator
  - * @return           NULL always
  - */
  -static /[EMAIL PROTECTED]@*/
  -HeaderIterator headerFreeIterator(/[EMAIL PROTECTED]@*/ HeaderIterator hi)
  -     /[EMAIL PROTECTED] hi @*/
  +HeaderIterator headerFini(/[EMAIL PROTECTED]@*/ HeaderIterator hi)
   {
       if (hi != NULL) {
        hi->h = headerFree(hi->h);
  @@ -2120,14 +2168,7 @@
       return hi;
   }
   
  -/** \ingroup header
  - * Create header tag iterator.
  - * @param h          header
  - * @return           header tag iterator
  - */
  -static
  -HeaderIterator headerInitIterator(Header h)
  -     /[EMAIL PROTECTED] h */
  +HeaderIterator headerInit(Header h)
   {
       HeaderIterator hi = xmalloc(sizeof(*hi));
   
  @@ -2138,24 +2179,7 @@
       return hi;
   }
   
  -/** \ingroup header
  - * Return next tag from header.
  - * @param hi         header tag iterator
  - * @retval *tag              tag
  - * @retval *type     tag value data type
  - * @retval *p                pointer to tag value(s)
  - * @retval *c                number of values
  - * @return           1 on success, 0 on failure
  - */
  -static
  -int headerNextIterator(HeaderIterator hi,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTag * tag,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagType * type,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagData * p,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagCount * c)
  -     /[EMAIL PROTECTED] hi, *tag, *type, *p, *c @*/
  -     /[EMAIL PROTECTED] maxSet(tag) >= 0 /\ maxSet(type) >= 0
  -             /\ maxSet(p) >= 0 /\ maxSet(c) >= 0 @*/
  +int headerNext(HeaderIterator hi, HE_t he, /[EMAIL PROTECTED]@*/ unsigned 
int flags)
   {
       void * sw;
       Header h = hi->h;
  @@ -2163,6 +2187,9 @@
       indexEntry entry = NULL;
       int rc;
   
  +    /* Insure that *he is reliably initialized. */
  +    memset(he, 0, sizeof(*he));
  +
       for (slot = hi->next_index; slot < h->indexUsed; slot++) {
        entry = h->index + slot;
        if (!ENTRY_IS_REGION(entry))
  @@ -2172,17 +2199,15 @@
       if (entry == NULL || slot >= h->indexUsed)
        return 0;
   
  -    /[EMAIL PROTECTED]@*/    /* LCL: no clue */
       hi->next_index++;
  -    /[EMAIL PROTECTED]@*/
   
       if ((sw = headerGetStats(h, 19)) != NULL)        /* RPMTS_OP_HDRGET */
        (void) rpmswEnter(sw, 0);
   
  -    if (tag)
  -     *tag = entry->info.tag;
  -
  -    rc = copyEntry(entry, (rpmTagType *)type, (rpmTagData *)p, (rpmTagCount 
*)c, 0);
  +    he->tag = entry->info.tag;
  +    rc = copyEntry(entry, &he->t, &he->p, &he->c, 0);
  +    if (rc)
  +     rc = rpmheRealloc(he);
   
       if (sw != NULL)  (void) rpmswExit(sw, 0);
   
  @@ -2203,13 +2228,13 @@
       Header nh = headerNew();
       HeaderIterator hi;
      
  -    for (hi = headerInitIterator(h);
  -     headerNextIterator(hi, &he->tag, &he->t, &he->p, &he->c);
  -     he->p.ptr = headerFreeData(he->p.ptr, he->t))
  +    for (hi = headerInit(h);
  +     headerNext(hi, he, 0);
  +     he->p.ptr = _free(he->p.ptr))
       {
        if (he->p.ptr) (void) headerAddEntry(nh, he->tag, he->t, he->p.ptr, 
he->c);
       }
  -    hi = headerFreeIterator(hi);
  +    hi = headerFini(hi);
   
       return headerReload(nh, HEADER_IMAGE);
   }
  @@ -2224,21 +2249,21 @@
   void headerCopyTags(Header headerFrom, Header headerTo, rpmTag * tagstocopy)
        /[EMAIL PROTECTED] headerTo @*/
   {
  +    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       rpmTag * tagno;
  +    int xx;
   
       if (headerFrom == headerTo)
        return;
   
       for (tagno = tagstocopy; *tagno != 0; tagno++) {
  -     rpmTagType t;
  -     rpmTagData p = { .ptr = NULL };
  -     rpmTagCount c;
        if (headerIsEntry(headerTo, *tagno))
            continue;
  -     if (!headerGetEntry(headerFrom, *tagno, &t, &p, &c))
  +     he->tag = *tagno;
  +     if (!headerGet(headerFrom, he, 0))
            continue;
  -     (void) headerAddEntry(headerTo, *tagno, t, p.ptr, c);
  -     p.ptr = headerFreeData(p.ptr, t);
  +     xx = headerPut(headerTo, he, 0);
  +     he->p.ptr = _free(he->p.ptr);
       }
   }
   
  @@ -2266,9 +2291,6 @@
       headerModifyEntry,
       headerRemoveEntry,
       headerCopyTags,
  -    headerFreeIterator,
  -    headerInitIterator,
  -    headerNextIterator,
       headerGetMagic,
       headerSetMagic,
       headerGetOrigin,
  @@ -2291,11 +2313,16 @@
       const char * name;
       headerSprintfExtension exts = headerCompoundFormats;
       headerSprintfExtension ext;
  -    size_t nb = 0;
       int extNum;
       int rc;
   
       if (h == NULL || he == NULL)     return 0;       /* XXX this is nutty. */
  +
  +    /* Insure that *he is reliably initialized. */
  +    {        rpmTag tag = he->tag;
  +     memset(he, 0, sizeof(*he));
  +     he->tag = tag;
  +    }
       name = tagName(he->tag);
   
       if ((sw = headerGetStats(h, 19)) != NULL)        /* RPMTS_OP_HDRGET */
  @@ -2311,53 +2338,15 @@
            break;
       }
   
  -    if (ext && ext->name != NULL && ext->type == HEADER_EXT_TAG)
  +    if (ext && ext->name != NULL && ext->type == HEADER_EXT_TAG) {
        rc = ext->u.tagFunction(h, he);
  -    else
  +     rc = (rc == 0);         /* XXX invert extension return. */
  +    } else
        rc = intGetEntry(h, he->tag, &he->t, &he->p, &he->c, 0);
   
  -    if (!rc)
  -     goto exit;
  -
  -    switch (he->t) {
  -    default:
  -assert(0);   /* XXX stop unimplemented oversights. */
  -     break;
  -    case RPM_BIN_TYPE:
  -     he->freeData = 1;       /* XXX RPM_BIN_TYPE is malloc'd */
  -     /[EMAIL PROTECTED]@*/
  -    case RPM_UINT8_TYPE:
  -     nb = he->c * sizeof(*he->p.ui8p);
  -     break;
  -    case RPM_UINT16_TYPE:
  -     nb = he->c * sizeof(*he->p.ui16p);
  -     break;
  -    case RPM_UINT32_TYPE:
  -     nb = he->c * sizeof(*he->p.ui32p);
  -     break;
  -    case RPM_UINT64_TYPE:
  -     nb = he->c * sizeof(*he->p.ui64p);
  -     break;
  -    case RPM_I18NSTRING_TYPE:
  -assert(he->c == 1);  /* XXX stop unimplemented oversights. */
  -     /[EMAIL PROTECTED]@*/
  -    case RPM_STRING_TYPE:
  -     if (he->p.str)
  -         nb = strlen(he->p.str) + 1;
  -     else
  -         rc = 0;
  -     break;
  -    case RPM_STRING_ARRAY_TYPE:
  -     break;
  -    }
  -
  -    /* Allocate all returned storage (if not already). */
  -    if (he->p.ptr && nb && !he->freeData) {
  -     void * ptr = memcpy(xmalloc(nb), he->p.ptr, nb);
  -     he->p.ptr = ptr;
  -    }
  +    if (rc)
  +     rc = rpmheRealloc(he);
   
  -exit:
       if (sw != NULL)  (void) rpmswExit(sw, 0);
   
   #if defined(SUPPORT_IMPLICIT_TAG_DATA_TYPES)
  @@ -2368,6 +2357,12 @@
   /[EMAIL PROTECTED]@*/
   #endif
   
  +    if (!((rc == 0 && he->freeData == 0 && he->p.ptr == NULL) ||
  +       (rc == 1 && he->freeData == 1 && he->p.ptr != NULL)))
  +    {
  +fprintf(stderr, "==> %s(%u) %u %p[%u] free %u rc %d\n", name, (unsigned) 
he->tag, (unsigned) he->t, he->p.ptr, (unsigned) he->c, he->freeData, rc);
  +    }
  +
       return rc;
   }
   
  @@ -2386,7 +2381,6 @@
        rc = headerAddOrAppendEntry(h, he->tag, he->t, he->p.ptr, he->c);
       else
        rc = headerAddEntry(h, he->tag, he->t, he->p.ptr, he->c);
  -assert(rc == 1);
   
       return rc;
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.h
  ============================================================================
  $ cvs diff -u -r1.76 -r1.77 header.h
  --- rpm/rpmdb/header.h        24 Nov 2007 23:15:33 -0000      1.76
  +++ rpm/rpmdb/header.h        26 Nov 2007 02:03:10 -0000      1.77
  @@ -86,17 +86,6 @@
   extern "C" {
   #endif
   
  -/**
  - * Prototype for headerFreeData() vector.
  - *
  - * @param data               address of data (or NULL)
  - * @param type               type of data (or -1 to force free)
  - * @return           NULL always
  - */
  -typedef /[EMAIL PROTECTED]@*/
  -    void * (*HFD_t) (/[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ const void 
* data, rpmTagType type)
  -     /[EMAIL PROTECTED] data @*/;
  -
   /** \ingroup header
    * Create new (empty) header instance.
    * @return           header
  @@ -360,41 +349,6 @@
        /[EMAIL PROTECTED] headerFrom, headerTo @*/;
   
   /** \ingroup header
  - * Destroy header tag iterator.
  - * @param hi         header tag iterator
  - * @return           NULL always
  - */
  -typedef
  -HeaderIterator (*HDRfreeiter) (/[EMAIL PROTECTED]@*/ HeaderIterator hi)
  -     /[EMAIL PROTECTED] hi @*/;
  -
  -/** \ingroup header
  - * Create header tag iterator.
  - * @param h          header
  - * @return           header tag iterator
  - */
  -typedef
  -HeaderIterator (*HDRinititer) (Header h)
  -     /[EMAIL PROTECTED] h */;
  -
  -/** \ingroup header
  - * Return next tag from header.
  - * @param hi         header tag iterator
  - * @retval *tag              tag
  - * @retval *type     tag value data type
  - * @retval *p                tag value(s)
  - * @retval *c                number of values
  - * @return           1 on success, 0 on failure
  - */
  -typedef
  -int (*HDRnextiter) (HeaderIterator hi,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTag * tag,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagType * type,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagData * p,
  -             /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ rpmTagCount * c)
  -     /[EMAIL PROTECTED] hi, *tag, *type, *p, *c @*/;
  -
  -/** \ingroup header
    * Return header magic.
    * @param h          header
    * @param *magicp    magic array
  @@ -492,9 +446,6 @@
       HDRmodify        hdrmodify;
       HDRremove        hdrremove;
       HDRcopytags      hdrcopytags;
  -    HDRfreeiter      hdrfreeiter;
  -    HDRinititer      hdrinititer;
  -    HDRnextiter      hdrnextiter;
       HDRgetmagic hdrgetmagic;
       HDRsetmagic hdrsetmagic;
       HDRgetorigin hdrgetorigin;
  @@ -510,33 +461,6 @@
   };
   #endif
   
  -#if !defined(SWIG)
  -/** \ingroup header
  - * Free data allocated when retrieved from header.
  - * @deprecated Use headerFreeTag() instead.
  - * @todo Remove from API.
  - *
  - * @param data               address of data (or NULL)
  - * @param type               type of data (or -1 to force free)
  - * @return           NULL always
  - */
  -/[EMAIL PROTECTED]@*/ static inline /[EMAIL PROTECTED]@*/
  -void * headerFreeData( /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ const 
void * data, rpmTagType type)
  -     /[EMAIL PROTECTED] data @*/
  -{
  -    if (data) {
  -     /[EMAIL PROTECTED]@*/
  -     if (type == -1 ||
  -         type == RPM_STRING_ARRAY_TYPE ||
  -         type == RPM_I18NSTRING_TYPE ||
  -         type == RPM_BIN_TYPE)
  -             free((void *)data);
  -     /[EMAIL PROTECTED]@*/
  -    }
  -    return NULL;
  -}
  -#endif
  -
   #if !defined(__HEADER_PROTOTYPES__)
   #include "hdrinline.h"
   #endif
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/librpmdb.vers
  ============================================================================
  $ cvs diff -u -r1.33 -r1.34 librpmdb.vers
  --- rpm/rpmdb/librpmdb.vers   24 Nov 2007 23:15:33 -0000      1.33
  +++ rpm/rpmdb/librpmdb.vers   26 Nov 2007 02:03:10 -0000      1.34
  @@ -31,12 +31,15 @@
       headerCompoundFormats;
       headerDefaultFormats;
       headerDel;
  +    headerFini;
       headerGet;
  +    headerInit;
       headerMacrosLoad;
       headerMacrosUnload;
       headerMergeLegacySigs;
       headerMod;
       headerNEVRA;
  +    headerNext;
       headerPut;
       headerRegenSigHeader;
       headerSprintf;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.221 -r1.222 rpmdb.c
  --- rpm/rpmdb/rpmdb.c 24 Nov 2007 23:15:33 -0000      1.221
  +++ rpm/rpmdb/rpmdb.c 26 Nov 2007 02:03:10 -0000      1.222
  @@ -2893,11 +2893,8 @@
                /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ break;
            default:
                xx = headerGet(h, he, 0);
  -             if (!xx) {
  -                 /* XXX FIXME: headerGetExtension shouldn't malloc. */
  -                 he->p.ptr = _free(he->p.ptr);
  +             if (!xx)
                    continue;
  -             }
                /[EMAIL PROTECTED]@*/ break;
   
            }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmtag.h
  ============================================================================
  $ cvs diff -u -r1.14 -r1.15 rpmtag.h
  --- rpm/rpmdb/rpmtag.h        24 Nov 2007 23:15:33 -0000      1.14
  +++ rpm/rpmdb/rpmtag.h        26 Nov 2007 02:03:10 -0000      1.15
  @@ -697,6 +697,32 @@
   int headerMod(Header h, HE_t he, /[EMAIL PROTECTED]@*/ unsigned int flags)
        /[EMAIL PROTECTED] h @*/;
   
  +/** \ingroup header
  + * Destroy header tag container iterator.
  + * @param hi         header tag container iterator
  + * @return           NULL always
  + */
  +HeaderIterator headerFini(/[EMAIL PROTECTED]@*/ HeaderIterator hi)
  +     /[EMAIL PROTECTED] hi @*/;
  +
  +/** \ingroup header
  + * Create header tag iterator.
  + * @param h          header
  + * @return           header tag iterator
  + */
  +HeaderIterator headerInit(Header h)
  +     /[EMAIL PROTECTED] h */;
  +
  +/** \ingroup header
  + * Return next tag from header.
  + * @param hi         header tag iterator
  + * @param he         tag container
  + * @param flags              (unused)
  + * @return           1 on success, 0 on failure
  + */
  +int headerNext(HeaderIterator hi, HE_t he, /[EMAIL PROTECTED]@*/ unsigned 
int flags)
  +     /[EMAIL PROTECTED] hi, he @*/;
  +
   #ifdef __cplusplus
   }
   #endif
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to