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