File strpoolrehash.diff of Package rpm.openSUSE_13.1_Update

--- 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);
openSUSE Build Service is sponsored by