RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  [email protected]
  Module: rpm                              Date:   20-May-2009 17:36:47
  Branch: HEAD                             Handle: 2009052015364700

  Modified files:
    rpm/rpmdb               header.c

  Log:
    - swab data when adding/appending.

  Summary:
    Revision    Changes     Path
    1.185       +52 -49     rpm/rpmdb/header.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.184 -r1.185 header.c
  --- rpm/rpmdb/header.c        20 May 2009 03:56:56 -0000      1.184
  +++ rpm/rpmdb/header.c        20 May 2009 15:36:47 -0000      1.185
  @@ -1720,60 +1720,63 @@
   }
   
   /**
  + * Copy (swab'd) data into store.
  + * @param t          data store
  + * @param he         tag container
  + * @param nb         no. bytes in store
  + * @return           0 on success
    */
  -static void copyData(rpmTagType type, rpmTagData * dest, rpmTagData * src,
  -             rpmTagCount cnt, size_t len)
  -     /*...@modifies *dest @*/
  +static int copyData(char * t, const HE_t he, size_t nb)
  +     /*...@modifies *t @*/
   {
  -    switch (type) {
  +    int rc = 0;              /* assume success */
  +
  +    switch (he->t) {
       case RPM_I18NSTRING_TYPE:
       case RPM_STRING_ARRAY_TYPE:
  -    {        const char ** av = (*src).argv;
  -     char * t = (char *) (*dest).str;
  +    {        const char ** av = he->p.argv;
  +     rpmTagCount cnt = he->c;
  +     const char * s;
   
  -     while (cnt-- > 0 && len > 0) {
  -         const char * s;
  -         if ((s = *av++) == NULL)
  -             continue;
  +     while (cnt-- > 0 && nb > 0) {
  +         if ((s = *av++) != NULL)
            do {
                *t++ = *s++;
  -         } while (s[-1] && --len > 0);
  +         } while (s[-1] && --nb > 0);
        }
       }        break;
       default:
  -assert((*dest).ptr != NULL);
  -assert((*src).ptr != NULL);
  -     memmove((*dest).ptr, (*src).ptr, len);
  +     if (tagSwab((unsigned char *)t, he, nb) == NULL)
  +         rc = 1;
        break;
       }
  +    return rc;
   }
   
   /**
  - * Return (malloc'ed) copy of entry data.
  - * @param type               entry data type
  - * @param *p         tag container data
  - * @param c          entry item count
  + * Return (malloc'ed) copy of (swab'd) entry data.
  + * @param he         tag container
    * @retval *lenp     no. bytes in returned data
    * @return           (malloc'ed) copy of entry data, NULL on error
    */
   /*...@null@*/
   static void *
  -grabData(rpmTagType type, rpmTagData * p, rpmTagCount c, /*...@out@*/size_t 
* lenp)
  +grabData(HE_t he, /*...@out@*/ size_t * lenp)
        /*...@modifies *lenp @*/
  -     /*...@requires maxSet(lenp) >= 0 @*/
   {
  -    rpmTagData data = { .ptr = NULL };
  -    size_t length;
  +    size_t nb = dataLength(he->t, &he->p, he->c, 0, NULL);
  +    char * t = NULL;
   
  -    length = dataLength(type, p, c, 0, NULL);
  -    if (length > 0) {
  -     data.ptr = xmalloc(length);
  -     copyData(type, &data, p, c, length);
  +    if (nb > 0) {
  +     t = xmalloc(nb);
  +     if (copyData(t, he, nb)) {
  +         t = _free(t);
  +         nb = 0;
  +     }
       }
  -
       if (lenp)
  -     *lenp = length;
  -    return data.ptr;
  +     *lenp = nb;
  +    return t;
   }
   
   /** \ingroup header
  @@ -1792,23 +1795,22 @@
        /*...@modifies h @*/
   {
       indexEntry entry;
  -    rpmTagData q = { .ptr = he->p.ptr };
       rpmTagData data;
  -    size_t length;
  +    size_t length = 0;
  +    int rc = 0;              /* assume failure */
   
       /* Count must always be >= 1 for headerAddEntry. */
       if (he->c == 0)
  -     return 0;
  +     return rc;
   
       if (hdrchkType(he->t))
  -     return 0;
  +     return rc;
       if (hdrchkData(he->c))
  -     return 0;
  +     return rc;
   
  -    length = 0;
  -    data.ptr = grabData(he->t, &q, he->c, &length);
  +    data.ptr = grabData(he, &length);
       if (data.ptr == NULL || length == 0)
  -     return 0;
  +     return rc;
   
       /* Allocate more index space if necessary */
       if (h->indexUsed == h->indexAlloced) {
  @@ -1828,8 +1830,9 @@
       if (h->indexUsed > 0 && he->tag < h->index[h->indexUsed-1].info.tag)
        h->flags &= ~HEADERFLAG_SORTED;
       h->indexUsed++;
  +    rc = 1;
   
  -    return 1;
  +    return rc;
   }
   
   /** \ingroup header
  @@ -1846,23 +1849,24 @@
        /*...@modifies h @*/
   {
       rpmTagData src = { .ptr = he->p.ptr };
  -    rpmTagData dest = { .ptr = NULL };
  +    char * t;
       indexEntry entry;
       size_t length;
  +    int rc = 0;              /* assume failure */
   
       if (he->t == RPM_STRING_TYPE || he->t == RPM_I18NSTRING_TYPE) {
        /* we can't do this */
  -     return 0;
  +     return rc;
       }
   
       /* Find the tag entry in the header. */
       entry = findEntry(h, he->tag, he->t);
       if (!entry)
  -     return 0;
  +     return rc;
   
       length = dataLength(he->t, &src, he->c, 0, NULL);
       if (length == 0)
  -     return 0;
  +     return rc;
   
       if (ENTRY_IN_REGION(entry)) {
        char * t = xmalloc(entry->length + length);
  @@ -1872,14 +1876,15 @@
       } else
        entry->data = xrealloc(entry->data, entry->length + length);
   
  -    dest.ptr = ((char *) entry->data) + entry->length;
  -    copyData(he->t, &dest, &src, he->c, length);
  +    t = ((char *) entry->data) + entry->length;
  +    if (!copyData(t, he, length))
  +     rc = 1;
   
       entry->length += length;
   
       entry->info.count += he->c;
   
  -    return 1;
  +    return rc;
   }
   
   /** \ingroup header
  @@ -2056,18 +2061,16 @@
        /*...@modifies h @*/
   {
       indexEntry entry;
  -    rpmTagData q = { .ptr = he->p.ptr };
       rpmTagData oldData;
       rpmTagData newData;
  -    size_t length;
  +    size_t length = 0;
   
       /* First find the tag */
       entry = findEntry(h, he->tag, he->t);
       if (!entry)
        return 0;
   
  -    length = 0;
  -    newData.ptr = grabData(he->t, &q, he->c, &length);
  +    newData.ptr = grabData(he, &length);
       if (newData.ptr == NULL || length == 0)
        return 0;
   
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to