Michael Schröder
6f7d71789a
OBS-URL: https://build.opensuse.org/package/show/Base:System/rpm?expand=0&rev=290
48 lines
1.7 KiB
Diff
48 lines
1.7 KiB
Diff
--- 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);
|