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: 07-Oct-2007 17:59:46
Branch: HEAD Handle: 2007100716594501
Modified files:
rpm CHANGES
rpm/rpmdb header.c header.h pkgio.c
Log:
- bero: fix: RPMRC_FAIL, not non-existent RPMRC_BAD, return.
- jbj: teach headerGetExtension() to allocate all returned data.
- jbj: attempt using a pedantically correct union for header data.
Summary:
Revision Changes Path
1.1657 +3 -0 rpm/CHANGES
1.68 +54 -6 rpm/rpmdb/header.c
1.27 +7 -4 rpm/rpmdb/header.h
1.13 +2 -2 rpm/rpmdb/pkgio.c
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1656 -r1.1657 CHANGES
--- rpm/CHANGES 7 Oct 2007 14:00:12 -0000 1.1656
+++ rpm/CHANGES 7 Oct 2007 15:59:45 -0000 1.1657
@@ -1,4 +1,7 @@
4.5 -> 5.0:
+ - jbj: fix: RPMRC_FAIL, not non-exitent RPMRC_BAD, return.
+ - jbj: teach headerGetExtension() to allocate all returned data.
+ - jbj: attempt using a pedantically correct union for header data.
- jbj: mark --initdb and --verifydb code paths for destruction.
- jbj: start making miRE abstract and refcounted.
- jbj: convert rel to abs linkto depedency iff directory is known.
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.c
============================================================================
$ cvs diff -u -r1.67 -r1.68 header.c
--- rpm/rpmdb/header.c 7 Oct 2007 14:00:13 -0000 1.67
+++ rpm/rpmdb/header.c 7 Oct 2007 15:59:46 -0000 1.68
@@ -1820,12 +1820,24 @@
const char * name = tagName(tag);
headerSprintfExtension exts = (headerSprintfExtension)headerCompoundFormats;
headerSprintfExtension ext;
+ int_32 he_t = 0;
+ hRET_t he_p;
+ int_32 he_c = 0;
+ HE_t he = alloca(sizeof(*he));
+ size_t nb = 0;
int extNum;
int rc;
if ((sw = headerGetStats(h, 19)) != NULL) /* RPMTS_OP_HDRGET */
(void) rpmswEnter(sw, 0);
+ memset(&he_p, 0, sizeof(he_p));
+ memset(he, 0, sizeof(*he));
+ he->tag = tag;
+ he->t = &he_t;
+ he->p.ret = (p ? &he_p : NULL);
+ he->c = &he_c;
+
/* Search extensions for specific tag override. */
for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
ext = (ext->type == HEADER_EXT_MORE ? ext->u.more : ext+1), extNum++)
@@ -1836,13 +1848,49 @@
break;
}
- if (ext && ext->name != NULL && ext->type == HEADER_EXT_TAG) {
- int freeData = 0; /* XXX lots of memory leaks. */
- rc = ext->u.tagFunction(h, type, p, c, &freeData);
- } else
- rc = intGetEntry(h, tag, type, (hPTR_t *)p, c, 0);
+ if (ext && ext->name != NULL && ext->type == HEADER_EXT_TAG)
+ rc = ext->u.tagFunction(h, he->t, he->p.ptr, he->c, &he->freeData);
+ else
+ rc = intGetEntry(h, he->tag, he->t, he->p.ptr, he->c, 0);
+
+ if (he->p.ret)
+ switch (*he->t) {
+ case RPM_NULL_TYPE:
+ case RPM_OPENPGP_TYPE: /* XXX W2DO? */
+ case RPM_ASN1_TYPE: /* XXX W2DO? */
+ case RPM_BIN_TYPE:
+ default:
+assert(0); /* XXX stop unimplemented oversights. */
+ break;
+ case RPM_CHAR_TYPE:
+ case RPM_INT8_TYPE:
+ nb = he_c * sizeof(*he_p->i8p);
+ break;
+ case RPM_INT16_TYPE:
+ nb = he_c * sizeof(*he_p->i16p);
+ break;
+ case RPM_INT32_TYPE:
+ nb = he_c * sizeof(*he_p->i32p);
+ break;
+ case RPM_INT64_TYPE:
+ nb = he_c * sizeof(*he_p->i64p);
+ break;
+ case RPM_I18NSTRING_TYPE:
+ case RPM_STRING_TYPE:
+ nb = he_c * sizeof(*he_p->str);
+ break;
+ case RPM_STRING_ARRAY_TYPE:
+ break;
+ }
- /* XXX Returned data is always allocated. */
+ if (p)
+ *(void **)p = ((nb > 0 && !he->freeData)
+ ? memcpy(xmalloc(nb), he_p->ptr, nb) : he_p->ptr);
+
+ if (type)
+ *type = *he->t;
+ if (c)
+ *c = *he->c;
if (sw != NULL) (void) rpmswExit(sw, 0);
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.h
============================================================================
$ cvs diff -u -r1.26 -r1.27 header.h
--- rpm/rpmdb/header.h 7 Oct 2007 14:00:13 -0000 1.26
+++ rpm/rpmdb/header.h 7 Oct 2007 15:59:46 -0000 1.27
@@ -310,11 +310,13 @@
typedef union hRET_s * hRET_t;
#if !defined(SWIG)
union hRET_s {
- const void * ptr;
+ void * ptr;
const char ** argv;
const char * str;
+ uint_64 * ui64p;
uint_32 * ui32p;
uint_16 * ui16p;
+ int_64 * i64p;
int_32 * i32p;
int_16 * i16p;
int_8 * i8p;
@@ -330,15 +332,16 @@
struct HE_s {
int_32 tag;
/*@null@*/
- hTYP_t typ;
+ hTYP_t t;
union {
/*@null@*/
hPTR_t * ptr;
/*@null@*/
hRET_t * ret;
- } u;
+ } p;
/*@null@*/
- hCNT_t cnt;
+ hCNT_t c;
+ int freeData;
};
#endif
/*@=typeuse =fielduse@*/
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/pkgio.c
============================================================================
$ cvs diff -u -r1.12 -r1.13 pkgio.c
--- rpm/rpmdb/pkgio.c 7 Oct 2007 14:00:13 -0000 1.12
+++ rpm/rpmdb/pkgio.c 7 Oct 2007 15:59:46 -0000 1.13
@@ -1100,9 +1100,9 @@
if (msg)
*msg = NULL;
- h = headerLoad(ptr);
+ h = headerLoad((void *)ptr);
if (h == NULL)
- rc = RPMRC_BAD;
+ rc = RPMRC_FAIL;
h = headerFree(h);
return rc;
@@ .
Received on Sun Oct 7 17:59:46 2007