RPM Community Forums

Mailing List Message of <rpm-cvs>

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

From: Jeff Johnson <jbj@rpm5.org>
Date: Sun 07 Oct 2007 - 17:59:46 CEST
Message-Id: <20071007155946.4D83134846C@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:   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
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.