RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm-4_5: rpm/ CHANGES rpm/rpmdb/ header.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Thu 25 Oct 2007 - 22:53:09 CEST
Message-Id: <20071025205309.CBBAF34845B@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:   25-Oct-2007 22:53:09
  Branch: rpm-4_5                          Handle: 2007102521530900

  Modified files:           (Branch: rpm-4_5)
    rpm                     CHANGES
    rpm/rpmdb               header.c

  Log:
    - jbj: pass rpmTagData internally by reference, not by value.
    - jbj: fix a memory leak while iterating query tags.
    - jbj: handle RPM_I18NSTRING_TYPE as argv internally.

  Summary:
    Revision    Changes     Path
    1.1360.2.49 +3  -0      rpm/CHANGES
    1.48.2.16   +49 -51     rpm/rpmdb/header.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1360.2.48 -r1.1360.2.49 CHANGES
  --- rpm/CHANGES	24 Oct 2007 06:35:13 -0000	1.1360.2.48
  +++ rpm/CHANGES	25 Oct 2007 20:53:09 -0000	1.1360.2.49
  @@ -1,4 +1,7 @@
   4.4.9 -> 4.5:
  +    - jbj: pass rpmTagData internally by reference, not by value.
  +    - jbj: fix a memory leak while iterating query tags.
  +    - jbj: handle RPM_I18NSTRING_TYPE as argv internally.
       - jbj: completed tag container backport.
       - jbj: fix: RPM_I18NSTRING_TYPE was being returned as argv array with --xml.
       - jbj: eliminate warnings.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.48.2.15 -r1.48.2.16 header.c
  --- rpm/rpmdb/header.c	24 Oct 2007 06:35:14 -0000	1.48.2.15
  +++ rpm/rpmdb/header.c	25 Oct 2007 20:53:09 -0000	1.48.2.16
  @@ -375,18 +375,18 @@
   /**
    * Return length of entry data.
    * @param type		entry data type
  - * @param p		entry data
  + * @param *p		entry 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 data (or NULL)
    * @return		no. bytes in data, -1 on failure
    */
  -static int dataLength(rpmTagType type, rpmTagData p, rpmTagCount count, int onDisk,
  -		/*@null@*/ rpmTagData pend)
  +static int dataLength(rpmTagType type, rpmTagData * p, rpmTagCount count,
  +		int onDisk, /*@null@*/ rpmTagData * pend)
   	/*@*/
   {
  -    const unsigned char * s = p.ui8p;
  -    const unsigned char * se = pend.ui8p;
  +    const unsigned char * s = (*p).ui8p;
  +    const unsigned char * se = (pend ? (*pend).ui8p : NULL);
       int length = 0;
   
       switch (type) {
  @@ -400,12 +400,10 @@
   	}
   	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 */
  @@ -416,7 +414,7 @@
   		}
   	    }
   	} else {
  -	    const char ** av = p.argv;
  +	    const char ** av = (*p).argv;
   	    while (count--) {
   		/* add one for null termination */
   		length += strlen(*av++) + 1;
  @@ -502,7 +500,7 @@
   
   	p.ptr = ie.data;
   	pend.ui8p = (unsigned char *) dataEnd;
  -	ie.length = dataLength(ie.info.type, p, ie.info.count, 1, pend);
  +	ie.length = dataLength(ie.info.type, &p, ie.info.count, 1, &pend);
   	if (ie.length < 0 || hdrchkData(ie.length))
   	    return -1;
   
  @@ -1506,15 +1504,13 @@
   		: entry->data);
   	}
   	break;
  -    case RPM_I18NSTRING_TYPE:
  -	count = 1;	/* XXX wrong for headerGetRawEntry() */
  -	/*@fallthrough@*/
       case RPM_STRING_TYPE:
   	if (count == 1) {
   	    (*p).str = entry->data;
   	    break;
   	}
   	/*@fallthrough@*/
  +    case RPM_I18NSTRING_TYPE:
       case RPM_STRING_ARRAY_TYPE:
       {	const char ** argv;
   	size_t nb = count * sizeof(*argv);
  @@ -1843,28 +1839,28 @@
   
   /**
    */
  -static void copyData(rpmTagType type, rpmTagData dest, rpmTagData src,
  -		rpmTagCount cnt, int dataLength)
  +static void copyData(rpmTagType type, rpmTagData * dest, rpmTagData * src,
  +		rpmTagCount cnt, int len)
   	/*@modifies *dstPtr @*/
   {
       switch (type) {
  -    case RPM_STRING_ARRAY_TYPE:
       case RPM_I18NSTRING_TYPE:
  -    {	const char ** av = src.argv;
  -	char * t = (char *) dest.str;
  +    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(dest.ptr, src.ptr, dataLength);
  +	memmove((*dest).ptr, (*src).ptr, len);
   	break;
       }
   }
  @@ -1879,17 +1875,17 @@
    */
   /*@null@*/
   static void *
  -grabData(rpmTagType type, rpmTagData p, rpmTagCount c, /*@out@*/ int * lenp)
  +grabData(rpmTagType type, rpmTagData * p, rpmTagCount c, /*@out@*/ int * lenp)
   	/*@modifies *lengthPtr @*/
   	/*@requires maxSet(lengthPtr) >= 0 @*/
   {
       rpmTagData data = { .ptr = NULL };
       int length;
   
  -    length = dataLength(type, p, c, 0, (rpmTagData)NULL);
  +    length = dataLength(type, p, c, 0, NULL);
       if (length > 0) {
   	data.ptr = xmalloc(length);
  -	copyData(type, data, p, c, length);
  +	copyData(type, &data, p, c, length);
       }
   
       if (lenp)
  @@ -1930,7 +1926,7 @@
   	return 0;
   
       length = 0;
  -    data.ptr = grabData(type, q, c, &length);
  +    data.ptr = grabData(type, &q, c, &length);
       if (data.ptr == NULL || length <= 0)
   	return 0;
   
  @@ -1990,7 +1986,7 @@
       if (!entry)
   	return 0;
   
  -    length = dataLength(type, src, c, 0, (rpmTagData)NULL);
  +    length = dataLength(type, &src, c, 0, NULL);
       if (length < 0)
   	return 0;
   
  @@ -2003,7 +1999,7 @@
   	entry->data = xrealloc(entry->data, entry->length + length);
   
       dest.ptr = ((char *) entry->data) + entry->length;
  -    copyData(type, dest, src, c, length);
  +    copyData(type, &dest, &src, c, length);
   
       entry->length += length;
   
  @@ -2211,7 +2207,7 @@
   	return 0;
   
       length = 0;
  -    newData.ptr = grabData(type, q, c, &length);
  +    newData.ptr = grabData(type, &q, c, &length);
       if (newData.ptr == NULL || length <= 0)
   	return 0;
   
  @@ -2265,6 +2261,7 @@
       default:
   	he->freeData = 0;
   	break;
  +    case RPM_I18NSTRING_TYPE:
       case RPM_STRING_ARRAY_TYPE:
       case RPM_BIN_TYPE:
   	he->freeData = 1;
  @@ -2280,7 +2277,7 @@
   static HE_t rpmheClean(/*@null@*/ HE_t he)
   	/*@modifies he @*/
   {
  -    if (he) {
  +    if (he && he->p.ptr) {
   	if (he->freeData)
   	    he->p.ptr = _free(he->p.ptr);
   	memset(he, 0, sizeof(*he));
  @@ -2519,10 +2516,12 @@
   	    hsa->i++;
   	} else {
   	    HE_t he = rpmheClean(&tag->he);
  -	    if (!headerNextIterator(hsa->hi, &he->tag, (hTAG_t)&he->t, (hPTR_t *)&he->p.ptr, &he->c))
  +	    if (!headerNextIterator(hsa->hi, &he->tag, (hTAG_t)&he->t, (hPTR_t *)&he->p.ptr, &he->c)) {
   		fmt = NULL;
  -	    he = rpmheMark(he);
  -	    he->avail = 1;
  +	    } else {
  +		he = rpmheMark(he);
  +		he->avail = 1;
  +	    }
   	    tag->tagno = he->tag;
   	}
       }
  @@ -3295,7 +3294,6 @@
       char buf[20];
       unsigned int intVal;
       uint_64 llVal;
  -    const char ** strarray;
       rpmTagCount countBuf;
   
       memset(buf, 0, sizeof(buf));
  @@ -3353,19 +3351,17 @@
   	goto exit;
   	/*@notreached@*/ break;
       case RPM_STRING_ARRAY_TYPE:
  -	strarray = he->p.argv;
  -
   	if (tag->fmt)
  -	    val = tag->fmt(RPM_STRING_TYPE, strarray[element], buf, tag->pad, (he->c > 1 ? element : -1));
  +	    val = tag->fmt(RPM_STRING_TYPE, he->p.argv[element], buf, tag->pad, (he->c > 1 ? element : -1));
   
   	if (val) {
   	    need = strlen(val);
   	} else {
  -	    need = strlen(strarray[element]) + tag->pad + 20;
  +	    need = strlen(he->p.argv[element]) + tag->pad + 20;
   	    val = xmalloc(need+1);
   	    strcat(buf, "s");
   	    /*@-formatconst@*/
  -	    sprintf(val, buf, strarray[element]);
  +	    sprintf(val, buf, he->p.argv[element]);
   	    /*@=formatconst@*/
   	}
   
  @@ -3557,19 +3553,21 @@
   	    if (spft->type != PTOK_TAG || tag->arrayCount || tag->justOne)
   		continue;
   	    he = &tag->he;
  -	    if (tag->ext) {
  -		xx = getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum);
  -	    } else {
  +	    if (!he->avail) {
   		he->tag = tag->tagno;
  -		xx = headerGetEntry(hsa->h, he->tag, (hTYP_t)&he->t, &he->p, &he->c);
  -		xx = (xx == 0);	/* XXX invert headerGetEntry return. */
  -	    } 
  -	    if (xx) {
  -		(void) rpmheClean(he);
  -		continue;
  +		if (tag->ext)
  +		    xx = getExtension(hsa, tag->ext, he, hsa->ec + tag->extNum);
  +		else {
  +		    xx = headerGetEntry(hsa->h, he->tag, (hTYP_t)&he->t, &he->p, &he->c);
  +		    xx = (xx == 0);	/* XXX invert headerGetEntry return. */
  +		}
  +		if (xx) {
  +		    (void) rpmheClean(he);
  +		    continue;
  +		}
  +		(void) rpmheMark(he);
  +		he->avail = 1;
   	    }
  -	    (void) rpmheMark(he);
  -	    he->avail = 1;
   
   	    if (he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == RPM_OPENPGP_TYPE)
   		he->c = 1;	/* XXX count abused as no. of bytes. */
  @@ .
Received on Thu Oct 25 22:53:09 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.