- fix two bugs in the rpmstrPoolRehash() function

OBS-URL: https://build.opensuse.org/package/show/Base:System/rpm?expand=0&rev=290
This commit is contained in:
Michael Schröder 2013-09-11 16:30:58 +00:00 committed by Git OBS Bridge
parent e055b19e3c
commit 6f7d71789a
3 changed files with 54 additions and 1 deletions

View File

@ -1,3 +1,8 @@
-------------------------------------------------------------------
Wed Sep 11 18:28:39 CEST 2013 - mls@suse.de
- fix two bugs in the rpmstrPoolRehash() function
-------------------------------------------------------------------
Thu Sep 5 12:01:51 UTC 2013 - schwab@linux-m68k.org

View File

@ -137,6 +137,7 @@ Patch82: noposttrans.diff
Patch83: debug_gdb_scripts.diff
Patch84: beedigest.diff
Patch85: brp-compress-no-img.patch
Patch86: strpoolrehash.diff
Patch6464: auto-config-update-aarch64.diff
BuildRoot: %{_tmppath}/%{name}-%{version}-build
#
@ -223,7 +224,7 @@ rm -f rpmdb/db.h
%patch -P 50 -P 51 -P 52 -P 53 -P 54 -P 55 -P 56 -P 57 -P 58 -P 59
%patch -P 60 -P 61 -P 62 -P 63 -P 64 -P 65 -P 66 -P 67 -P 68 -P 69
%patch -P 70 -P 71 -P 72 -P 73 -P 74 -P 75 -P 76 -P 77 -P 78 -P 79
%patch -P 80 -P 81 -P 82 -P 83 -P 84 -P 85
%patch -P 80 -P 81 -P 82 -P 83 -P 84 -P 85 -P 86
%ifarch aarch64
%patch6464
%endif

47
strpoolrehash.diff Normal file
View File

@ -0,0 +1,47 @@
--- 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);