} RpmHead;
+static inline void
+headinit(RpmHead *h, unsigned int cnt, unsigned int dcnt)
+{
+ h->cnt = (int)cnt;
+ h->dcnt = dcnt;
+ h->dp = h->data + 16 * cnt;
+ h->dp[dcnt] = 0;
+}
+
static inline unsigned char *
headfindtag(RpmHead *h, int tag)
{
char *rootdir;
RpmHead *rpmhead; /* header storage space */
- int rpmheadsize;
+ unsigned int rpmheadsize;
};
#endif
#ifndef ENABLE_RPMPKG_LIBRPM
-static int
-headfromfp(struct rpmdbstate *state, const char *name, FILE *fp, unsigned char *lead, unsigned int cnt, unsigned int dsize, unsigned int pad, Chksum *chk1, Chksum *chk2)
+static inline RpmHead *
+realloc_head(struct rpmdbstate *state, unsigned int len)
{
- RpmHead *rpmhead;
- unsigned int len = 16 * cnt + dsize + pad;
- if (len + 1 > state->rpmheadsize)
+ if (len > state->rpmheadsize)
{
state->rpmheadsize = len + 128;
state->rpmhead = solv_realloc(state->rpmhead, sizeof(*state->rpmhead) + state->rpmheadsize);
}
- rpmhead = state->rpmhead;
+ return state->rpmhead;
+}
+
+static int
+headfromfp(struct rpmdbstate *state, const char *name, FILE *fp, unsigned char *lead, unsigned int cnt, unsigned int dsize, unsigned int pad, Chksum *chk1, Chksum *chk2)
+{
+ unsigned int len = 16 * cnt + dsize + pad;
+ RpmHead *rpmhead = realloc_head(state, len + 1);
if (fread(rpmhead->data, len, 1, fp) != 1)
return pool_error(state->pool, 0, "%s: unexpected EOF", name);
if (chk1)
solv_chksum_add(chk1, rpmhead->data, len);
if (chk2)
solv_chksum_add(chk2, rpmhead->data, len);
- rpmhead->data[len] = 0;
- rpmhead->cnt = cnt;
- rpmhead->dcnt = dsize;
- rpmhead->dp = rpmhead->data + cnt * 16;
+ headinit(rpmhead, cnt, dsize);
return 1;
}
-#if defined(ENABLE_RPMDB_BYRPMHEADER)
-static void
-headfromblob(struct rpmdbstate *state, const unsigned char *blob, unsigned int cnt, unsigned int dsize)
+# if defined(ENABLE_RPMDB) && (!defined(ENABLE_RPMDB_LIBRPM) || defined(HAVE_RPMDBNEXTITERATORHEADERBLOB))
+
+static int
+headfromhdrblob(struct rpmdbstate *state, const unsigned char *data, unsigned int size)
{
+ unsigned int dsize, cnt, len;
RpmHead *rpmhead;
- unsigned int len = 16 * cnt + dsize;
- if (len + 1 > state->rpmheadsize)
- {
- state->rpmheadsize = len + 128;
- state->rpmhead = solv_realloc(state->rpmhead, sizeof(*state->rpmhead) + state->rpmheadsize);
- }
- rpmhead = state->rpmhead;
- memcpy(rpmhead->data, blob, len);
- rpmhead->data[len] = 0;
- rpmhead->cnt = cnt;
- rpmhead->dcnt = dsize;
- rpmhead->dp = rpmhead->data + cnt * 16;
+ if (size < 8)
+ return pool_error(state->pool, 0, "corrupt rpm database (size)");
+ cnt = getu32(data);
+ dsize = getu32(data + 4);
+ if (cnt >= MAX_HDR_CNT || dsize >= MAX_HDR_DSIZE)
+ return pool_error(state->pool, 0, "corrupt rpm database (cnt/dcnt)");
+ if (8 + cnt * 16 + dsize > size)
+ return pool_error(state->pool, 0, "corrupt rpm database (data size)");
+ len = 16 * cnt + dsize;
+ rpmhead = realloc_head(state, len + 1);
+ memcpy(rpmhead->data, data + 8, len);
+ headinit(rpmhead, cnt, dsize);
+ return 1;
}
-#endif
+
+# endif
#else
struct rpmdbstate *state = rpmstate;
#ifndef ENABLE_RPMPKG_LIBRPM
const unsigned char *uh;
- unsigned int dsize, cnt;
+ unsigned int dsize, cnt, len;
+ RpmHead *rpmhead;
if (!h)
return 0;
free((void *)uh);
return 0;
}
- headfromblob(state, uh + 8, cnt, dsize);
+ len = 16 * cnt + dsize;
+ rpmhead = realloc_head(state, len + 1);;
+ memcpy(rpmhead->data, uh + 8, len);
+ headinit(rpmhead, cnt, dsize);
free((void *)uh);
#else
if (!h)
char *rootdir;
RpmHead *rpmhead; /* header storage space */
- int rpmheadsize;
+ unsigned int rpmheadsize;
int dbenvopened; /* database environment opened */
int pkgdbopened; /* package database openend */
return entries;
}
-/* common code, return dbid on success, -1 on error */
-static int
-getrpm_dbdata(struct rpmdbstate *state, DBT *dbdata, int dbid)
-{
- unsigned int dsize, cnt, l;
- RpmHead *rpmhead;
-
- if (dbdata->size < 8)
- return pool_error(state->pool, -1, "corrupt rpm database (size)");
- cnt = getu32((const unsigned char *)dbdata->data);
- dsize = getu32((const unsigned char *)dbdata->data + 4);
- if (cnt >= MAX_HDR_CNT || dsize >= MAX_HDR_DSIZE)
- return pool_error(state->pool, -1, "corrupt rpm database (cnt/dcnt)");
- l = cnt * 16 + dsize;
- if (8 + l > dbdata->size)
- return pool_error(state->pool, -1, "corrupt rpm database (data size)");
- if (l + 1 > state->rpmheadsize)
- {
- state->rpmheadsize = l + 128;
- state->rpmhead = solv_realloc(state->rpmhead, sizeof(*rpmhead) + state->rpmheadsize);
- }
- rpmhead = state->rpmhead;
- rpmhead->cnt = cnt;
- rpmhead->dcnt = dsize;
- memcpy(rpmhead->data, (unsigned char *)dbdata->data + 8, l);
- rpmhead->data[l] = 0;
- rpmhead->dp = rpmhead->data + cnt * 16;
- return dbid;
-}
+static int headfromhdrblob(struct rpmdbstate *state, const unsigned char *data, unsigned int size);
/* retrive header by rpmdbid, returns 0 if not found, -1 on error */
static int
dbdata.size = 0;
if (state->db->get(state->db, NULL, &dbkey, &dbdata, 0))
return 0;
- return getrpm_dbdata(state, &dbdata, dbid);
+ if (!headfromhdrblob(state, (const unsigned char *)dbdata.data, (unsigned int)dbdata.size))
+ return -1;
+ return dbid;
}
static int
if (dbkey.size != 4)
return pool_error(state->pool, -1, "corrupt Packages database (key size)");
dbid = db2rpmdbid(dbkey.data, state->byteswapped);
- if (dbid) /* ignore join key */
- return getrpm_dbdata(state, &dbdata, dbid);
+ if (!dbid)
+ continue; /* ignore join key */
+ if (!headfromhdrblob(state, (const unsigned char *)dbdata.data, (unsigned int)dbdata.size))
+ return -1;
+ return dbid;
}
return 0; /* no more entries */
}
return 0;
}
-
char *rootdir;
RpmHead *rpmhead; /* header storage space */
- int rpmheadsize;
+ unsigned int rpmheadsize;
int dbenvopened; /* database environment opened */
int is_ostree; /* read-only db that lives in /usr/share/rpm */
}
#if defined(HAVE_RPMDBNEXTITERATORHEADERBLOB) && !defined(ENABLE_RPMPKG_LIBRPM)
-static int
-rpm_byrpmhdrblob(struct rpmdbstate *state, const unsigned char *data, unsigned int size)
-{
- unsigned int dsize, cnt, len;
- RpmHead *rpmhead;
- if (size < 8)
- return pool_error(state->pool, 0, "corrupt rpm database (size)");
- cnt = getu32(data);
- dsize = getu32(data + 4);
- if (cnt >= MAX_HDR_CNT || dsize >= MAX_HDR_DSIZE)
- return pool_error(state->pool, 0, "corrupt rpm database (cnt/dcnt)");
- if (8 + cnt * 16 + dsize > size)
- return pool_error(state->pool, 0, "corrupt rpm database (data size)");
- len = 16 * cnt + dsize;
- if (len + 1 > state->rpmheadsize)
- {
- state->rpmheadsize = len + 128;
- state->rpmhead = solv_realloc(state->rpmhead, sizeof(*state->rpmhead) + state->rpmheadsize);
- }
- rpmhead = state->rpmhead;
- memcpy(rpmhead->data, data + 8, len);
- rpmhead->data[len] = 0;
- rpmhead->cnt = cnt;
- rpmhead->dcnt = dsize;
- rpmhead->dp = rpmhead->data + cnt * 16;
- return 1;
-}
+static int headfromhdrblob(struct rpmdbstate *state, const unsigned char *data, unsigned int size);
#endif
/* retrive header by rpmdbid, returns 0 if not found, -1 on error */
rpmdbFreeIterator(mi);
return 0;
}
- if (!rpm_byrpmhdrblob(state, uh, uhlen))
+ if (!headfromhdrblob(state, uh, uhlen))
{
rpmdbFreeIterator(mi);
return -1;
while ((uh = rpmdbNextIteratorHeaderBlob(state->mi, &uhlen)) != 0)
{
Id dbid = rpmdbGetIteratorOffset(state->mi);
- if (!rpm_byrpmhdrblob(state, uh, uhlen))
+ if (!headfromhdrblob(state, uh, uhlen))
continue;
return dbid;
}