--- rpmio/rpmstrpool.c.orig 2013-09-11 15:33:48.371571600 +0000 +++ rpmio/rpmstrpool.c 2013-09-11 16:20:56.106566595 +0000 @@ -219,8 +219,17 @@ static void rpmstrPoolRehash(rpmstrPool pool->hash = poolHashFree(pool->hash); pool->hash = poolHashCreate(sizehint); - for (int i = 1; i < pool->offs_size; i++) - poolHashAddEntry(pool, rpmstrPoolStr(pool, i), i); + for (int i = 1; i <= pool->offs_size; i++) { + /* this is a little bit tricky because we have to skip the dummy + * entries that are at the end of each chunk */ + const char * str = rpmstrPoolStr(pool, i); + if (str[0] == 0 && i < pool->offs_size) { + /* looks like a dummy entry, check if next str is in a different chunk */ + if (rpmstrPoolStr(pool, i + 1) != str + 1) + continue; + } + poolHashAddEntry(pool, str, i); + } } rpmstrPool rpmstrPoolCreate(void) @@ -308,7 +317,8 @@ static rpmsid rpmstrPoolPut(rpmstrPool p } chunk_used = pool->offs[pool->offs_size] - pool->chunks[pool->chunks_size]; - if (ssize + 1 > pool->chunk_allocated - chunk_used) { + /* +2: extra trailing zero + extra byte */ + if (ssize + 2 > pool->chunk_allocated - chunk_used) { /* check size of ->chunks */ pool->chunks_size += 1; if (pool->chunks_size >= pool->chunks_allocated) { @@ -318,11 +328,12 @@ static rpmsid rpmstrPoolPut(rpmstrPool p } /* Check if string is bigger than chunks */ - if (ssize > pool->chunk_allocated) { - pool->chunk_allocated = 2 * ssize; + if (ssize + 2 > pool->chunk_allocated) { + pool->chunk_allocated = 2 * ssize + 2; } /* Dummy entry for end of last string*/ + pool->offs[pool->offs_size][0] = 0; pool->offs_size += 1; pool->offs[pool->offs_size] = xcalloc(1, pool->chunk_allocated);