RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmdb/ hdrfmt.c header.c header.h

From: Jeff Johnson <jbj@rpm5.org>
Date: Fri 26 Oct 2007 - 04:50:46 CEST
Message-Id: <20071026025046.B15B634845E@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:   26-Oct-2007 04:50:46
  Branch: HEAD                             Handle: 2007102603504600

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               hdrfmt.c header.c header.h

  Log:
    - jbj: mostly unbork HEAD. --install modes still non-functional.

  Summary:
    Revision    Changes     Path
    1.1756      +1  -0      rpm/CHANGES
    1.25        +11 -10     rpm/rpmdb/hdrfmt.c
    1.111       +151 -344   rpm/rpmdb/header.c
    1.56        +4  -4      rpm/rpmdb/header.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1755 -r1.1756 CHANGES
  --- rpm/CHANGES	25 Oct 2007 15:06:39 -0000	1.1755
  +++ rpm/CHANGES	26 Oct 2007 02:50:46 -0000	1.1756
  @@ -1,4 +1,5 @@
   4.5 -> 5.0:
  +    - jbj: mostly unbork HEAD. --install modes still non-functional.
       - jbj: don't modify strings exposed by method wrappers (#349091).
       - jbj: drill headerAddExtension everywhere.
       - jbj: header.c: insturment headerGet{Entry,Extension} switch, debug goop.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.24 -r1.25 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c	21 Oct 2007 23:22:56 -0000	1.24
  +++ rpm/rpmdb/hdrfmt.c	26 Oct 2007 02:50:46 -0000	1.25
  @@ -70,6 +70,7 @@
   
       return perms;
   }
  +
   /**
    * Identify type of trigger.
    * @param he		tag container
  @@ -1373,25 +1374,25 @@
       { HEADER_EXT_TAG, "RPMTAG_ORIGPATHS",
   	{ .tagFunction = origpathsTag } },
       { HEADER_EXT_FORMAT, "armor",
  -	{ .formatFunction = armorFormat } },
  +	{ .fmtFunction = armorFormat } },
       { HEADER_EXT_FORMAT, "base64",
  -	{ .formatFunction = base64Format } },
  +	{ .fmtFunction = base64Format } },
       { HEADER_EXT_FORMAT, "depflags",
  -	{ .formatFunction = depflagsFormat } },
  +	{ .fmtFunction = depflagsFormat } },
       { HEADER_EXT_FORMAT, "fflags",
  -	{ .formatFunction = fflagsFormat } },
  +	{ .fmtFunction = fflagsFormat } },
       { HEADER_EXT_FORMAT, "perms",
  -	{ .formatFunction = permsFormat } },
  +	{ .fmtFunction = permsFormat } },
       { HEADER_EXT_FORMAT, "permissions",	
  -	{ .formatFunction = permsFormat } },
  +	{ .fmtFunction = permsFormat } },
       { HEADER_EXT_FORMAT, "pgpsig",
  -	{ .formatFunction = pgpsigFormat } },
  +	{ .fmtFunction = pgpsigFormat } },
       { HEADER_EXT_FORMAT, "triggertype",	
  -	{ .formatFunction = triggertypeFormat } },
  +	{ .fmtFunction = triggertypeFormat } },
       { HEADER_EXT_FORMAT, "xml",
  -	{ .formatFunction = xmlFormat } },
  +	{ .fmtFunction = xmlFormat } },
       { HEADER_EXT_FORMAT, "yaml",
  -	{ .formatFunction = yamlFormat } },
  +	{ .fmtFunction = yamlFormat } },
       { HEADER_EXT_MORE, NULL,		{ (void *) headerDefaultFormats } }
   } ;
   /*@=type@*/
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.110 -r1.111 header.c
  --- rpm/rpmdb/header.c	22 Oct 2007 02:45:38 -0000	1.110
  +++ rpm/rpmdb/header.c	26 Oct 2007 02:50:46 -0000	1.111
  @@ -2,16 +2,6 @@
    * \file rpmdb/header.c
    */
   
  -/* Tags are looked up with linear, not binary, search. */
  -/* XXX work in progress, caveat emptor. */
  -#define SUPPORT_LINEAR_TAGTABLE_LOOKUP	1
  -
  -#define	SUPPORT_SPRINTF_TAGTABLE	1
  -
  -#if 1	/* XXX undefining loses the extensions in lib/formats.c. */
  -#define	SUPPORT_SPRINTF_EXTTABLE	1
  -#endif
  -
   /* RPM - Copyright (C) 1995-2002 Red Hat Software */
   
   /* Data written to file descriptors is in network byte order.    */
  @@ -33,7 +23,7 @@
   /*@unchecked@*/
   int _newmagic = 0;		/* XXX Change header magic? */
   /*@unchecked@*/
  -static int _jbj = 0;    	/* XXX private debugging */
  +static int _jbj = 1;    	/* XXX private debugging */
   /*@unchecked@*/
   static int _usehge = 1;		/* XXX Use headerGetExtension? */
   /*@unchecked@*/
  @@ -125,37 +115,6 @@
   extern headerTagIndices rpmTags;
   /*@=redecl@*/
   
  -#if 0
  -static void _valid(const void *ptr, size_t cnt)
  -{
  -    unsigned char * p = ptr;
  -    unsigned xx;
  -    int i;
  -    for (i = 0; i < cnt; i++)
  -	xx = p[i];
  -}
  -
  -static void * _memset(void * s, int c, size_t n)
  -{
  -    _valid(s, n);
  -    return memset(s, c, n);
  -}
  -
  -static void * _memcpy(void * dest, void *src, size_t n)
  -{
  -    _valid(src, n);
  -    _valid(dest, n);
  -    return memcpy(dest, src, n);
  -}
  -
  -static void * _memmove(void * dest, void *src, size_t n)
  -{
  -    _valid(src, n);
  -    _valid(dest, n);
  -    return memmove(dest, src, n);
  -}
  -#endif
  -
   /**
    * Return tag name from value.
    * @todo This should come from #include <rpmtag.h>.
  @@ -480,18 +439,18 @@
   /**
    * Return length of entry data.
    * @param type		entry data type
  - * @param p		entry data
  + * @param *p		tag container data
    * @param count		entry item count
    * @param onDisk	data is concatenated strings (with NUL's))?
  - * @param pend		pointer to end of data (or NULL)
  + * @param *pend		pointer to end of tag container data (or NULL)
    * @return		no. bytes in data, -1 on failure
    */
  -static int dataLength(rpmTagType type, const void * p, rpmTagCount count, int onDisk,
  -		/*@null@*/ const void * pend)
  +static int dataLength(rpmTagType type, rpmTagData * p, rpmTagCount count,
  +		int onDisk, /*@null@*/ rpmTagData * pend)
   	/*@*/
   {
  -    const unsigned char * s = p;
  -    const unsigned char * se = pend;
  +    const unsigned char * s = (*p).ui8p;
  +    const unsigned char * se = (pend ? (*pend).ui8p : NULL);
       int length = 0;
   
       switch (type) {
  @@ -505,36 +464,33 @@
   	}
   	length++;	/* count nul terminator too. */
   	break;
  -
  -    case RPM_STRING_ARRAY_TYPE:
  -    case RPM_I18NSTRING_TYPE:
   	/* These are like RPM_STRING_TYPE, except they're *always* an array */
   	/* Compute sum of length of all strings, including nul terminators */
  -
  +    case RPM_I18NSTRING_TYPE:
  +    case RPM_STRING_ARRAY_TYPE:
   	if (onDisk) {
   	    while (count--) {
   		length++;       /* count nul terminator too */
                  while (*s++) {
   		    if (se && s > se)
  -			return -1;
  +			return -1;	/* XXX change errret, use size_t */
   		    length++;
   		}
   	    }
   	} else {
  -	    const char ** av = (const char **) p;
  +	    const char ** av = (*p).argv;
   	    while (count--) {
   		/* add one for null termination */
   		length += strlen(*av++) + 1;
   	    }
   	}
   	break;
  -
       default:
   	if (typeSizes[type] == -1)
  -	    return -1;
  +	    return -1;		/* XXX change errret, use size_t */
   	length = typeSizes[(type & 0xf)] * count;
   	if (length < 0 || (se && (s + length) > se))
  -	    return -1;
  +	    return -1;		/* XXX change errret, use size_t */
   	break;
       }
   
  @@ -575,7 +531,8 @@
   		int regionid)
   	/*@modifies *entry, *dataStart @*/
   {
  -    const void * p, * pend;
  +    rpmTagData p;
  +    rpmTagData pend;
       unsigned char * tprev = NULL;
       unsigned char * t = NULL;
       int tdel = 0;
  @@ -605,9 +562,9 @@
   	if (dataEnd && t >= dataEnd)
   	    return -1;
   
  -	p = ie.data;
  -	pend = dataEnd;
  -	ie.length = dataLength(ie.info.type, p, ie.info.count, 1, pend);
  +	p.ptr = ie.data;
  +	pend.ui8p = (unsigned char *) dataEnd;
  +	ie.length = dataLength(ie.info.type, &p, ie.info.count, 1, &pend);
   	if (ie.length < 0 || hdrchkData(ie.length))
   	    return -1;
   
  @@ -684,7 +641,7 @@
   	}
   
   	dl += ie.length;
  -	if (dataEnd && dataStart + dl > dataEnd) return -1;
  +	if (dataEnd && (dataStart + dl) > dataEnd) return -1;
   	tl += tdel;
   	ieprev = ie;	/* structure assignment */
   
  @@ -720,10 +677,10 @@
       void * sw;
       int_32 * ei = NULL;
       entryInfo pe;
  -    char * dataStart;
  -    char * te;
  +    unsigned char * dataStart;
  +    unsigned char * te;
       unsigned pad;
  -    unsigned len;
  +    unsigned len = 0;
       int_32 il = 0;
       int_32 dl = 0;
       indexEntry entry; 
  @@ -733,7 +690,6 @@
       int driplen, ndrips;
       int legacy = 0;
   
  -fprintf(stderr, "==> headerUnload(%p, %p)\n", h, lenp);
       if ((sw = headerGetStats(h, 18)) != NULL)	/* RPMTS_OP_HDRLOAD */
   	(void) rpmswEnter(sw, 0);
   
  @@ -816,7 +772,7 @@
       ei[1] = htonl(dl);
   
       pe = (entryInfo) &ei[2];
  -    dataStart = te = (char *) (pe + il);
  +    dataStart = te = (unsigned char *) (pe + il);
   
       pad = 0;
       for (i = 0, entry = h->index; i < h->indexUsed; i++, entry++) {
  @@ -828,7 +784,7 @@
   	if (entry->data == NULL || entry->length <= 0)
   	    continue;
   
  -	t = (unsigned char *)te;
  +	t = te;
   	pe->tag = htonl(entry->info.tag);
   	pe->type = htonl(entry->info.type);
   	pe->count = htonl(entry->info.count);
  @@ -962,9 +918,9 @@
       }
      
       /* Insure that there are no memcpy underruns/overruns. */
  -    if (((char *)pe) != dataStart)
  +    if (((unsigned char *)pe) != dataStart)
   	goto errxit;
  -    if ((((char *)ei)+len) != te)
  +    if ((((unsigned char *)ei)+len) != te)
   	goto errxit;
   
       if (lenp)
  @@ -1088,7 +1044,7 @@
   Header headerLoad(/*@kept@*/ void * uh)
   	/*@modifies uh @*/
   {
  -    void * sw;
  +    void * sw = NULL;
       int_32 * ei = (int_32 *) uh;
       int_32 il = ntohl(ei[0]);		/* index length */
       int_32 dl = ntohl(ei[1]);		/* data length */
  @@ -1242,14 +1198,14 @@
       h->flags &= ~HEADERFLAG_SORTED;
       headerSort(h);
   
  -    if (sw != NULL)
  -	(void) rpmswExit(sw, pvlen);
  +    if (sw != NULL)	(void) rpmswExit(sw, pvlen);
   
       /*@-globstate -observertrans @*/
       return h;
       /*@=globstate =observertrans @*/
   
   errxit:
  +    if (sw != NULL)	(void) rpmswExit(sw, pvlen);
       /*@-usereleased@*/
       if (h) {
   	h->index = _free(h->index);
  @@ -1376,7 +1332,6 @@
       int_32 instance = h->instance;
       int xx;
   
  -fprintf(stderr, "==> headerReload(%p, %s)\n", h, tagName(tag));
   /*@-onlytrans@*/
       uh = headerUnload(h, NULL);
       h = headerFree(h);
  @@ -1584,9 +1539,9 @@
    * @return		1 on success, otherwise error.
    */
   static int copyEntry(const indexEntry entry,
  -		/*@null@*/ /*@out@*/ hTYP_t type,
  -		/*@null@*/ /*@out@*/ hRET_t * p,
  -		/*@null@*/ /*@out@*/ hCNT_t c,
  +		/*@null@*/ /*@out@*/ rpmTagType * type,
  +		/*@null@*/ /*@out@*/ rpmTagData * p,
  +		/*@null@*/ /*@out@*/ rpmTagCount * c,
   		int minMem)
   	/*@modifies *type, *p, *c @*/
   	/*@requires maxSet(type) >= 0 /\ maxSet(p) >= 0 /\ maxSet(c) >= 0 @*/
  @@ -1594,8 +1549,6 @@
       rpmTagCount count = entry->info.count;
       int rc = 1;		/* XXX 1 on success. */
   
  -if (_jbj)
  -fprintf(stderr, "--> cpe(%p, %p, %p, %p)\n", entry, type, p, c);
       if (p)
       switch (entry->info.type) {
       case RPM_BIN_TYPE:
  @@ -1648,31 +1601,29 @@
   	break;
       case RPM_STRING_TYPE:
   	if (count == 1) {
  -	    (*p).str = (char *) entry->data;	/* NOCAST */
  +	    (*p).str = entry->data;
   	    break;
   	}
   	/*@fallthrough@*/
  -    case RPM_STRING_ARRAY_TYPE:
       case RPM_I18NSTRING_TYPE:
  -    {	const char ** ptrEntry;
  -	/*@-sizeoftype@*/
  -	int tableSize = count * sizeof(char *);
  -	/*@=sizeoftype@*/
  +    case RPM_STRING_ARRAY_TYPE:
  +    {	const char ** argv;
  +	size_t nb = count * sizeof(*argv);
   	char * t;
   	int i;
   
   	/*@-mods@*/
   	if (minMem) {
  -	    (*p).argv = ptrEntry = xmalloc(tableSize);
  +	    (*p).argv = argv = xmalloc(nb);
   	    t = entry->data;
   	} else {
  -	    (*p).argv = ptrEntry = xmalloc(tableSize + entry->length);
  -	    t = (char *) &ptrEntry[count];
  +	    (*p).argv = argv = xmalloc(nb + entry->length);
  +	    t = (char *) &argv[count];
   	    memcpy(t, entry->data, entry->length);
   	}
   	/*@=mods@*/
   	for (i = 0; i < count; i++) {
  -	    *ptrEntry++ = t;
  +	    argv[i] = t;
   	    t = strchr(t, 0);
   	    t++;
   	}
  @@ -1835,9 +1786,9 @@
    * @return		1 on success, 0 on not found
    */
   static int intGetEntry(Header h, int_32 tag,
  -		/*@null@*/ /*@out@*/ hTYP_t type,
  -		/*@null@*/ /*@out@*/ hRET_t * p,
  -		/*@null@*/ /*@out@*/ hCNT_t c,
  +		/*@null@*/ /*@out@*/ rpmTagType * type,
  +		/*@null@*/ /*@out@*/ rpmTagData * p,
  +		/*@null@*/ /*@out@*/ rpmTagCount * c,
   		int minMem)
   	/*@modifies *type, *p, *c @*/
   	/*@requires maxSet(type) >= 0 /\ maxSet(p) >= 0 /\ maxSet(c) >= 0 @*/
  @@ -1845,12 +1796,10 @@
       indexEntry entry;
       int rc;
   
  -if (_jbj)
  -fprintf(stderr, "--> ige(%p, %s, %p, %p, %p)\n", h, tagName(tag), type, p, c);
       /* First find the tag */
  -    /*@-mods@*/		/*@ FIX: h modified by sort. */
  +/*@-mods@*/		/*@ FIX: h modified by sort. */
       entry = findEntry(h, tag, RPM_NULL_TYPE);
  -    /*@mods@*/
  +/*@=mods@*/
       if (entry == NULL) {
   	if (type) type = 0;
   	if (p) (*p).ptr = NULL;
  @@ -1864,11 +1813,11 @@
   	if (type) *type = RPM_STRING_TYPE;
   	if (c) *c = 1;
   	/*@-dependenttrans@*/
  -	if (p) (*p).ptr = headerFindI18NString(h, entry);
  +	if (p) (*p).str = headerFindI18NString(h, entry);
   	/*@=dependenttrans@*/
   	break;
       default:
  -	rc = copyEntry(entry, type, (*p).ptr, c, minMem);
  +	rc = copyEntry(entry, type, p, c, minMem);
   	break;
       }
   
  @@ -1927,8 +1876,6 @@
       int extNum;
       int rc;
   
  -if (_jbj)
  -fprintf(stderr, "--> HGE(%p, %s, %p, %p, %p)\n", h, tagName(tag), type, p, c);
       if ((sw = headerGetStats(h, 19)) != NULL)	/* RPMTS_OP_HDRGET */
   	(void) rpmswEnter(sw, 0);
   
  @@ -2029,11 +1976,9 @@
       void * sw;
       int rc;
   
  -if (_jbj)
  -fprintf(stderr, "--> hge(%p, %s, %p, %p, %p)\n", h, tagName(tag), type, p, c);
       if ((sw = headerGetStats(h, 19)) != NULL)	/* RPMTS_OP_HDRGET */
   	(void) rpmswEnter(sw, 0);
  -    rc = intGetEntry(h, tag, type, p, c, 0);
  +    rc = intGetEntry(h, tag, (rpmTagType *)type, (rpmTagData *)p, (rpmTagCount *)c, 0);
       if (sw != NULL)	(void) rpmswExit(sw, 0);
       return rc;
   }
  @@ -2063,7 +2008,7 @@
   
       if ((sw = headerGetStats(h, 19)) != NULL)	/* RPMTS_OP_HDRGET */
   	(void) rpmswEnter(sw, 0);
  -    rc = intGetEntry(h, tag, type, p, c, 1);
  +    rc = intGetEntry(h, tag, (rpmTagType *)type, (rpmTagData *)p, (rpmTagCount *)c, 1);
       if (sw != NULL)	(void) rpmswExit(sw, 0);
       return rc;
   }
  @@ -2093,28 +2038,27 @@
   
   /**
    */
  -static void copyData(rpmTagType type, /*@out@*/ void * dstPtr, const void * srcPtr,
  -		rpmTagCount cnt, int dataLength)
  -	/*@modifies *dstPtr @*/
  +static void copyData(rpmTagType type, rpmTagData * dest, rpmTagData * src,
  +		rpmTagCount cnt, size_t len)
  +	/*@modifies *dest @*/
   {
       switch (type) {
  -    case RPM_STRING_ARRAY_TYPE:
       case RPM_I18NSTRING_TYPE:
  -    {	const char ** av = (const char **) srcPtr;
  -	char * t = dstPtr;
  +    case RPM_STRING_ARRAY_TYPE:
  +    {	const char ** av = (*src).argv;
  +	char * t = (char *) (*dest).str;
   
  -	while (cnt-- > 0 && dataLength > 0) {
  +	while (cnt-- > 0 && len > 0) {
   	    const char * s;
   	    if ((s = *av++) == NULL)
   		continue;
   	    do {
   		*t++ = *s++;
  -	    } while (s[-1] && --dataLength > 0);
  +	    } while (s[-1] && --len > 0);
   	}
       }	break;
  -
       default:
  -	memmove(dstPtr, srcPtr, dataLength);
  +	memmove((*dest).ptr, (*src).ptr, len);
   	break;
       }
   }
  @@ -2122,29 +2066,29 @@
   /**
    * Return (malloc'ed) copy of entry data.
    * @param type		entry data type
  - * @param p		entry data
  + * @param *p		tag container data
    * @param c		entry item count
    * @retval *lenp	no. bytes in returned data
    * @return 		(malloc'ed) copy of entry data, NULL on error
    */
   /*@null@*/
   static void *
  -grabData(rpmTagType type, const void * p, rpmTagCount c, /*@out@*/ int * lenp)
  +grabData(rpmTagType type, rpmTagData * p, rpmTagCount c, /*@out@*/ int * lenp)
   	/*@modifies *lenp @*/
   	/*@requires maxSet(lenp) >= 0 @*/
   {
  -    void * data = NULL;
  +    rpmTagData data = { .ptr = NULL };
       int length;
   
       length = dataLength(type, p, c, 0, NULL);
       if (length > 0) {
  -	data = xmalloc(length);
  -	copyData(type, data, p, c, length);
  +	data.ptr = xmalloc(length);
  +	copyData(type, &data, p, c, length);
       }
   
       if (lenp)
   	*lenp = length;
  -    return data;
  +    return data.ptr;
   }
   
   /** \ingroup header
  @@ -2166,7 +2110,8 @@
   	/*@modifies h @*/
   {
       indexEntry entry;
  -    hPTR_t data;
  +    rpmTagData q = { .ptr = (void *) p };
  +    rpmTagData data;
       int length;
   
       /* Count must always be >= 1 for headerAddEntry. */
  @@ -2179,8 +2124,8 @@
   	return 0;
   
       length = 0;
  -    data = grabData(type, p, c, &length);
  -    if (data == NULL || length <= 0)
  +    data.ptr = grabData(type, &q, c, &length);
  +    if (data.ptr == NULL || length <= 0)
   	return 0;
   
       /* Allocate more index space if necessary */
  @@ -2195,7 +2140,7 @@
       entry->info.type = type;
       entry->info.count = c;
       entry->info.offset = 0;
  -    entry->data = (void *) (*data).ptr;	/* NOCAST */
  +    entry->data = data.ptr;
       entry->length = length;
   
       if (h->indexUsed > 0 && tag < h->index[h->indexUsed-1].info.tag)
  @@ -2224,6 +2169,8 @@
   		const void * p, rpmTagCount c)
   	/*@modifies h @*/
   {
  +    rpmTagData src = { .ptr = (void *) p };
  +    rpmTagData dest = { .ptr = NULL };
       indexEntry entry;
       int length;
   
  @@ -2237,7 +2184,7 @@
       if (!entry)
   	return 0;
   
  -    length = dataLength(type, p, c, 0, NULL);
  +    length = dataLength(type, &src, c, 0, NULL);
       if (length < 0)
   	return 0;
   
  @@ -2249,7 +2196,8 @@
       } else
   	entry->data = xrealloc(entry->data, entry->length + length);
   
  -    copyData(type, ((char *) entry->data) + entry->length, p, c, length);
  +    dest.ptr = ((char *) entry->data) + entry->length;
  +    copyData(type, &dest, &src, c, length);
   
       entry->length += length;
   
  @@ -2446,8 +2394,9 @@
   	/*@modifies h @*/
   {
       indexEntry entry;
  -    void * oldData;
  -    rpmTagData data;
  +    rpmTagData q = { .ptr = (void *) p };
  +    rpmTagData oldData;
  +    rpmTagData newData;
       int length;
   
       /* First find the tag */
  @@ -2456,8 +2405,8 @@
   	return 0;
   
       length = 0;
  -    data.ptr = grabData(type, p, c, &length);
  -    if (data.ptr == NULL || length <= 0)
  +    newData.ptr = grabData(type, &q, c, &length);
  +    if (newData.ptr == NULL || length <= 0)
   	return 0;
   
       /* make sure entry points to the first occurence of this tag */
  @@ -2466,17 +2415,17 @@
   
       /* free after we've grabbed the new data in case the two are intertwined;
          that's a bad idea but at least we won't break */
  -    oldData = entry->data;
  +    oldData.ptr = entry->data;
   
       entry->info.count = c;
       entry->info.type = type;
  -    entry->data = data.ptr;
  +    entry->data = newData.ptr;
       entry->length = length;
   
       if (ENTRY_IN_REGION(entry)) {
   	entry->info.offset = 0;
       } else
  -	oldData = _free(oldData);
  +	oldData.ptr = _free(oldData.ptr);
   
       return 1;
   }
  @@ -2510,6 +2459,7 @@
       default:
   	he->freeData = 0;
   	break;
  +    case RPM_I18NSTRING_TYPE:
       case RPM_STRING_ARRAY_TYPE:
       case RPM_BIN_TYPE:
   	he->freeData = 1;
  @@ -2526,50 +2476,13 @@
   	/*@modifies he @*/
   {
       if (he) {
  -	if (he->freeData) {
  -if (_jbj)
  -fprintf(stderr, " ZAP: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, he->avail);
  +	if (he->freeData && he->p.ptr != NULL)
   	    he->p.ptr = _free(he->p.ptr);
  -	}
   	memset(he, 0, sizeof(*he));
       }
       return he;
   }
   
  -#ifdef	NOTYET
  -/**
  - * Destroy tag data cache.
  - * @param tc		tag data cache
  - * @param ntc		no. of elements
  - * @return		NULL always
  - */
  -static /*@null@*/ HE_t
  -rpmtcFree(/*@only@*/ HE_t tc, int ntc)
  -	/*@modifies ec @*/
  -{
  -    int i;
  -
  -    if (tc != NULL)
  -    for (i = 0; i < ntc; i++)
  -	rpmtcClean(tc + i);
  -    tc = _free(tc);
  -    return NULL;
  -}
  -
  -/**
  - * Create tag data cache.
  - * @param ntc		no. of elements
  - * @return		new tag data cache
  - */
  -static /*@only@*/ HE_t
  -rpmtcNew(int ntc)
  -	/*@*/
  -{
  -    HE_t ec = xcalloc(ntc+1, sizeof(*ec));
  -    return ec;
  -}
  -#endif
  -
   /**
    * Destroy headerSprintf format array.
    * @param format	sprintf format array
  @@ -2587,8 +2500,9 @@
       for (i = 0; i < num; i++) {
   	switch (format[i].type) {
   	case PTOK_TAG:
  -	    (void) rpmheClean(&format[i].u.tag.he);
  -	    break;
  +	    if (_tagcache)
  +		(void) rpmheClean(&format[i].u.tag.he);
  +	    /*@switchbreak@*/ break;
   	case PTOK_ARRAY:
   	    format[i].u.array.format =
   		freeFormat(format[i].u.array.format,
  @@ -2601,7 +2515,8 @@
   	    format[i].u.cond.elseFormat =
   		freeFormat(format[i].u.cond.elseFormat, 
   			format[i].u.cond.numElseTokens);
  -	    (void) rpmheClean(&format[i].u.cond.tag.he);
  +	    if (_tagcache)
  +		(void) rpmheClean(&format[i].u.cond.tag.he);
   	    /*@switchbreak@*/ break;
   	case PTOK_NONE:
   	case PTOK_STRING:
  @@ -2681,8 +2596,6 @@
       indexEntry entry = NULL;
       int rc;
   
  -if (_jbj)
  -fprintf(stderr, "--> hni(%p, %p, %p, %p, %p)\n", h, tag, type, p, c);
       for (slot = hi->next_index; slot < h->indexUsed; slot++) {
   	entry = h->index + slot;
   	if (!ENTRY_IS_REGION(entry))
  @@ -2699,7 +2612,7 @@
       if (tag)
   	*tag = entry->info.tag;
   
  -    rc = copyEntry(entry, type, p, c, 0);
  +    rc = copyEntry(entry, (rpmTagType *)type, (rpmTagData *)p, (rpmTagCount *)c, 0);
   
       /* XXX 1 on success */
       return ((rc == 1) ? 1 : 0);
  @@ -2733,7 +2646,6 @@
    */
   typedef struct headerSprintfArgs_s {
       Header h;
  -    HE_s he;
       char * fmt;
   /*@temp@*/
       headerTagTableEntry tags;
  @@ -2743,10 +2655,6 @@
       const char * errmsg;
       HE_t ec;			/*!< Extension data cache. */
       int nec;			/*!< No. of extension cache items. */
  -#ifdef	NOTYET
  -    HE_t tc;			/*!< Tag data cache. */
  -    int ntc;			/*!< No. of tag cache items. */
  -#endif
       sprintfToken format;
   /*@relnull@*/
       HeaderIterator hi;
  @@ -2813,8 +2721,6 @@
   	    }
   	    he = rpmheMark(he);
   	    he->avail = 1;
  -if (_jbj)
  -fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, he->avail);
   	    tag->tagno = he->tag;
   	}
       }
  @@ -2860,7 +2766,6 @@
       return hsa->val + hsa->vallen;
   }
   
  -#if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
   /**
    * Return tag name from value.
    * @todo bsearch on sorted value table.
  @@ -2911,7 +2816,6 @@
       }
       return 0;
   }
  -#endif
   
   /**
    * Search extensions and tags for a name.
  @@ -2959,11 +2863,7 @@
       }
   
       /* Search tag names. */
  -#if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
       stag->tagno = myTagValue(hsa->tags, name);
  -#else
  -    stag->tagno = tagValue(name);
  -#endif
       if (stag->tagno != 0)
   	goto bingo;
   
  @@ -2978,7 +2878,7 @@
   	if (ext->name == NULL || ext->type != HEADER_EXT_FORMAT)
   	    continue;
   	if (!strcmp(ext->name, stag->type)) {
  -	    stag->fmt = ext->u.formatFunction;
  +	    stag->fmt = ext->u.fmtFunction;
   	    break;
   	}
       }
  @@ -3200,21 +3100,21 @@
   /*@-type@*/ /* FIX: cast? */
   const struct headerSprintfExtension_s headerDefaultFormats[] = {
       { HEADER_EXT_FORMAT, "octal",
  -	{ .formatFunction = octFormat } },
  +	{ .fmtFunction = octFormat } },
       { HEADER_EXT_FORMAT, "oct",
  -	{ .formatFunction = octFormat } },
  +	{ .fmtFunction = octFormat } },
       { HEADER_EXT_FORMAT, "hex",
  -	{ .formatFunction = hexFormat } },
  +	{ .fmtFunction = hexFormat } },
       { HEADER_EXT_FORMAT, "decimal",
  -	{ .formatFunction = decFormat } },
  +	{ .fmtFunction = decFormat } },
       { HEADER_EXT_FORMAT, "dec",
  -	{ .formatFunction = decFormat } },
  +	{ .fmtFunction = decFormat } },
       { HEADER_EXT_FORMAT, "date",
  -	{ .formatFunction = dateFormat } },
  +	{ .fmtFunction = dateFormat } },
       { HEADER_EXT_FORMAT, "day",
  -	{ .formatFunction = dayFormat } },
  +	{ .fmtFunction = dayFormat } },
       { HEADER_EXT_FORMAT, "shescape",
  -	{ .formatFunction = shescapeFormat } },
  +	{ .fmtFunction = shescapeFormat } },
       { HEADER_EXT_LAST, NULL, { NULL } }
   };
   /*@=type@*/
  @@ -3233,20 +3133,6 @@
   	/*@modifies hsa, str, token, *endPtr @*/
   	/*@requires maxSet(endPtr) >= 0 @*/;
   
  -static void dumpSprintfTag(const char * msg, sprintfTag tag)
  -{
  -    if (msg)
  -	fprintf(stderr, "%s", msg);
  -    fprintf(stderr, " he %p %s", &tag->he, tagName(tag->tagno));
  -    if (tag->fmt)
  -	fprintf(stderr, " fmt %p", tag->fmt);
  -    if (tag->ext)
  -	fprintf(stderr, " ext %p[%d]", tag->ext, tag->extNum);
  -    if (tag->format)
  -	fprintf(stderr, " format \"%s\" pad %d", tag->format, tag->pad);
  -}
  -
  -
   /**
    * Parse a headerSprintf term.
    * @param hsa		headerSprintf args
  @@ -3483,40 +3369,6 @@
   	    break;
   	}
       }
  -    for (i = 0; i < numTokens; i++) {
  -	token = format + i;
  -if (_jbj)
  -fprintf(stderr, "%4d: %p", i, token);
  -	switch(token->type) {
  -	case PTOK_NONE:
  -if (_jbj)
  -fprintf(stderr, " none(%d)", token->type);
  -	    break;
  -	case PTOK_TAG:
  -if (_jbj) {
  -fprintf(stderr, " tag(%d)", token->type);
  -dumpSprintfTag(" ", &token->u.tag);
  -}
  -	    break;
  -	case PTOK_ARRAY:
  -if (_jbj) {
  -fprintf(stderr, " array(%d)", token->type);
  -dumpSprintfTag(" ", &token->u.array.format->u.tag);
  -}
  -	    break;
  -	case PTOK_STRING:
  -	    token->u.string.len = strlen(token->u.string.string);
  -if (_jbj)
  -fprintf(stderr, " string(%d) \"%s\"", token->type, token->u.string.string);
  -	    break;
  -	case PTOK_COND:
  -if (_jbj)
  -fprintf(stderr, " cond(%d)", token->type);
  -	    break;
  -	}
  -if (_jbj)
  -fprintf(stderr, "\n");
  -    }
   
       *numTokensPtr = numTokens;
       *formatPtr = format;
  @@ -3622,7 +3474,6 @@
       return 0;
   }
   
  -#if defined(SUPPORT_SPRINTF_EXTTABLE)
   /**
    * Call a header extension only once, saving results.
    * @param hsa		headerSprintf args
  @@ -3647,7 +3498,6 @@
       he->freeData = 0;
       return rc;
   }
  -#endif	/* SUPPORT_SPRINTF_EXTTABLE */
   
   /**
    * Format a single item's value.
  @@ -3669,42 +3519,29 @@
       rpmTagCount countBuf;
       int xx;
   
  -/* XXX likely need to check !he->avail and he->tag == tag->tagno. */
  -#if defined(SUPPORT_SPRINTF_EXTTABLE)
  -    if (tag->ext) {
  -	if (getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum))
  -	{
  -	    he->c = 1;
  -	    he->t = RPM_STRING_TYPE;	
  -	    he->p.str = "(none)";
  -	    he->freeData = 0;
  -	}
  -    } else
  -#endif	/* SUPPORT_SPRINTF_EXTTABLE */
  -    if (!he->avail || he->tag != tag->tagno) {
  -if (_jbj)
  -fprintf(stderr, " ---: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, he->avail);
  -	he = rpmheClean(he);
  -	he->tag = tag->tagno;	/* XXX necessary? */
  -if (_jbj)
  -fprintf(stderr, " --+: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, he->avail);
  -	if (_usehge) {
  -	    xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
  -	    if (xx && he->p.ptr != NULL)
  -		he->freeData = 1;
  +    if (!he->avail) {
  +	if (tag->ext) {
  +	    xx = getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum);
   	} else {
  -	    xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
  -	    if (xx)
  -		he = rpmheMark(he);
  +	    he->tag = tag->tagno;	/* XXX necessary? */
  +	    if (_usehge) {
  +		xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +		if (xx)		/* XXX 1 on success */
  +		    he->freeData = 1;
  +	    } else {
  +		xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +		if (xx)		/* XXX 1 on success */
  +		    he = rpmheMark(he);
  +	    }
  +	    xx = (xx == 0);	/* XXX invert headerGetEntry return. */
   	}
  -	if (!xx) {
  -	    he->c = 1;
  +	if (xx) {
  +	    (void) rpmheClean(he);
   	    he->t = RPM_STRING_TYPE;	
   	    he->p.str = "(none)";
  -	    he->freeData = 0;
  +	    he->c = 1;
   	}
  -if (_jbj)
  -fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, he->avail);
  +	he->avail = 1;
       }
   
       if (tag->arrayCount) {
  @@ -3715,7 +3552,6 @@
   	he->c = 1;
   	he->freeData = 0;
       }
  -    he->avail = 1;
   
       if (he->p.ptr)
       switch (he->t) {
  @@ -3724,9 +3560,10 @@
   	need = strlen(val) + 1;
   	goto exit;
   	/*@notreached@*/ break;
  +    case RPM_I18NSTRING_TYPE:
       case RPM_STRING_ARRAY_TYPE:
  -	vhe->p.str = he->p.argv[element];
   	vhe->t = RPM_STRING_TYPE;
  +	vhe->p.str = he->p.argv[element];
   	vhe->c = he->c;
   	/* XXX TODO: force array representation? */
   	vhe->ix = (he->c > 1 ? 0 : -1);
  @@ -3887,32 +3724,29 @@
   	    tag = &spft->u.tag;
   	    if (spft->type != PTOK_TAG || tag->arrayCount || tag->justOne)
   		continue;
  -
   	    he = &tag->he;
  -/* XXX likely need to check !he->avail and he->tag == tag->tagno. */
  -#if defined(SUPPORT_SPRINTF_EXTTABLE)
  -	    if (tag->ext) {
  -		if (getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum))
  -		     continue;
  -	    } else
  -#endif	/* SUPPORT_SPRINTF_EXTTABLE */
  -	    if (!he->avail || he->tag != tag->tagno) {
  -		he = rpmheClean(he);
  +	    if (!he->avail) {
   		he->tag = tag->tagno;
  -		if (_usehge) {
  -		    xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
  -		    if (xx && he->p.ptr != NULL)
  -			he->freeData = 1;
  -		} else {
  -		    xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
  -		    if (xx)
  -			he = rpmheMark(he);
  +		if (tag->ext)
  +		    xx = getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum);
  +		else {
  +		    if (_usehge) {
  +			xx = headerGetExtension(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +			if (xx)
  +			    he->freeData = 1;
  +		    } else {
  +			xx = headerGetEntry(hsa->h, he->tag, &he->t, &he->p, &he->c);
  +			if (xx)	/* XXX 1 on success */
  +			    rpmheMark(he);
  +		    }
  +		    xx = (xx == 0);     /* XXX invert headerGetEntry return. */
   		}
  -		if (!xx)
  +		if (xx) {
  +		    (void) rpmheClean(he);
   		    continue;
  -if (_jbj)
  -fprintf(stderr, " NEW: %p tag %s(%d)\t%d %p[%d:%d] free %d avail %d\n", he, tagName(he->tag), he->tag, he->t, he->p.ptr, he->ix, he->c, he->freeData, he->avail);
  -	    } 
  +		}
  +		he->avail = 1;
  +	    }
   
   	    /* Check iteration arrays are same dimension (or scalar). */
   	    switch (he->t) {
  @@ -3963,11 +3797,7 @@
   		!strcmp(tag->type, "yaml"));
   
   	    if (isxml) {
  -#if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
   		const char * tagN = myTagName(hsa->tags, tag->tagno, NULL);
  -#else
  -		const char * tagN = tagName(tag->tagno);
  -#endif
   		/* XXX display "Tag_0x01234567" for unknown tags. */
   		if (tagN == NULL) {
   		    (void) snprintf(numbuf, sizeof(numbuf), "Tag_0x%08x",
  @@ -3981,13 +3811,8 @@
   		hsa->vallen += (te - t);
   	    }
   	    if (isyaml) {
  -#if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
   		int tagT = -1;
   		const char * tagN = myTagName(hsa->tags, tag->tagno, &tagT);
  -#else
  -		rpmTagType tagT = tagType(tag->tagno);
  -		const char * tagN = tagName(tag->tagno);
  -#endif
   		/* XXX display "Tag_0x01234567" for unknown tags. */
   		if (tagN == NULL) {
   		    (void) snprintf(numbuf, sizeof(numbuf), "Tag_0x%08x",
  @@ -4049,11 +3874,10 @@
       return (hsa->val + hsa->vallen);
   }
   
  -#if defined(SUPPORT_SPRINTF_EXTTABLE)
   /**
    * Create an extension cache.
    * @param exts		headerSprintf extensions
  - * @retval *necp	no. of elements
  + * @retval *necp	no. of elements (or NULL)
    * @return		new extension cache
    */
   static /*@only@*/ HE_t
  @@ -4070,10 +3894,9 @@
       {
   	;
       }
  -
  -    ec = xcalloc(extNum+1, sizeof(*ec));
  -    if (*necp)
  +    if (necp)
   	*necp = extNum;
  +    ec = xcalloc(extNum+1, sizeof(*ec));	/* XXX +1 unnecessary */
       return ec;
   }
   
  @@ -4093,14 +3916,12 @@
       for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
   	ext = (ext->type == HEADER_EXT_MORE ? ext->u.more : ext+1), extNum++)
       {
  -	if (ec[extNum].freeData)
  -	    ec[extNum].p.ptr = _free(ec[extNum].p.ptr);
  +	(void) rpmheClean(&ec[extNum]);
       }
   
       ec = _free(ec);
       return NULL;
   }
  -#endif	/* SUPPORT_SPRINTF_EXTTABLE */
   
   /** \ingroup header
    * Return formatted output string from header tags.
  @@ -4140,23 +3961,15 @@
       hsa->fmt = xstrdup(fmt);
   /*@-castexpose@*/	/* FIX: legacy API shouldn't change. */
       hsa->exts = (headerSprintfExtension) exts;
  -#if defined(SUPPORT_LINEAR_TAGTABLE_LOOKUP)
       hsa->tags = (headerTagTableEntry) tags;
  -#endif
   /*@=castexpose@*/
       hsa->errmsg = NULL;
   
       if (parseFormat(hsa, hsa->fmt, &hsa->format, &hsa->numTokens, NULL, PARSER_BEGIN))
   	goto exit;
   
  -#if defined(SUPPORT_SPRINTF_EXTTABLE)
       hsa->nec = 0;
       hsa->ec = rpmecNew(hsa->exts, &hsa->nec);
  -#endif	/* SUPPORT_SPRINTF_EXTTABLE */
  -#ifdef	NOTYET
  -    hsa->ntc = numTokens;
  -    hsa->tc = rpmtcNew(hsa->ntc);
  -#endif
       hsa->val = xstrdup("");
   
       tag =
  @@ -4207,14 +4020,8 @@
       if (hsa->val != NULL && hsa->vallen < hsa->alloced)
   	hsa->val = xrealloc(hsa->val, hsa->vallen+1);	
   
  -#if defined(SUPPORT_SPRINTF_EXTTABLE)
       hsa->ec = rpmecFree(hsa->exts, hsa->ec);
       hsa->nec = 0;
  -#endif	/* SUPPORT_SPRINTF_EXTTABLE */
  -#ifdef	NOTYET
  -    hsa->tc = rpmtcFree(hsa->tc, hsa->ntc);
  -    hsa->ntc = 0;
  -#endif
       hsa->format = freeFormat(hsa->format, hsa->numTokens);
   
   exit:
  @@ -4237,21 +4044,21 @@
   void headerCopyTags(Header headerFrom, Header headerTo, hTAG_t tagstocopy)
   	/*@modifies headerTo @*/
   {
  -    int * p;
  +    int * tagno;
   
       if (headerFrom == headerTo)
   	return;
   
  -    for (p = tagstocopy; *p != 0; p++) {
  -	rpmTagData ptr;
  -	rpmTagType type;
  -	rpmTagCount count;
  -	if (headerIsEntry(headerTo, *p))
  +    for (tagno = tagstocopy; *tagno != 0; tagno++) {
  +	rpmTagType t;
  +	rpmTagData p = { .ptr = NULL };
  +	rpmTagCount c;
  +	if (headerIsEntry(headerTo, *tagno))
   	    continue;
  -	if (!headerGetEntryMinMemory(headerFrom, *p, &type, &ptr, &count))
  +	if (!headerGetEntryMinMemory(headerFrom, *tagno, (hTYP_t)&t, &p, &c))
   	    continue;
  -	(void) headerAddEntry(headerTo, *p, type, ptr.ptr, count);
  -	ptr.ptr = headerFreeData(ptr.ptr, type);
  +	(void) headerAddEntry(headerTo, *tagno, t, p.ptr, c);
  +	p.ptr = headerFreeData(p.ptr, t);
       }
   }
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.h
  ============================================================================
  $ cvs diff -u -r1.55 -r1.56 header.h
  --- rpm/rpmdb/header.h	22 Oct 2007 02:48:42 -0000	1.55
  +++ rpm/rpmdb/header.h	26 Oct 2007 02:50:46 -0000	1.56
  @@ -254,7 +254,7 @@
    * @param he		tag container
    * @return		formatted string
    */
  -typedef /*only@*/ char * (*headerTagFormatFunction)(HE_t he)
  +typedef /*only@*/ char * (*headerTagFormatFunction) (HE_t he)
   	/*@modifies he @*/;
   
   /** \ingroup header
  @@ -266,7 +266,7 @@
    * @return		0 on success
    */
   typedef int (*headerTagTagFunction) (Header h, HE_t he)
  -	/*@modifies he */;
  +	/*@modifies he @*/;
   
   /** \ingroup header
    * Define header tag output formats.
  @@ -280,8 +280,8 @@
       union {
   /*@observer@*/ /*@null@*/
   	void * generic;				/*!< Private extension. */
  -	headerTagFormatFunction formatFunction; /*!< HEADER_EXT_TAG extension. */
  -	headerTagTagFunction tagFunction;	/*!< HEADER_EXT_FORMAT extension. */
  +	headerTagFormatFunction fmtFunction; /*!< HEADER_EXT_TAG extension. */
  +	headerTagTagFunction tagFunction; /*!< HEADER_EXT_FORMAT extension. */
   	struct headerSprintfExtension_s * more;	/*!< Chained table extension. */
       } u;
   };
  @@ .
Received on Fri Oct 26 04:50:46 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.