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]
