[pacman-dev] [PATCH] fix geometric growth in _alpm_greedy_grow

Daniel Micay danielmicay at gmail.com
Mon Jan 12 15:37:40 UTC 2015


It was allocating the required size rather than the calculated new size,
resulting in pathological incremental reallocations.

Signed-off-by: Daniel Micay <danielmicay at gmail.com>
---
 lib/libalpm/be_local.c | 2 +-
 lib/libalpm/util.c     | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index 2454cdc..300660b 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -789,7 +789,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
 				while(safe_fgets(line, sizeof(line), fp) &&
 						(len = _alpm_strip_newline(line, 0))) {
 					if(!_alpm_greedy_grow((void **)&files, &files_size,
-								(files_size ? files_size + sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
+								(files_count ? (files_count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
 						goto error;
 					}
 					/* since we know the length of the file string already,
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 22408d7..ffd3c73 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -1328,7 +1328,7 @@ void *_alpm_greedy_grow(void **data, size_t *current, const size_t required)
 		return NULL;
 	}
 
-	return _alpm_realloc(data, current, required);
+	return _alpm_realloc(data, current, newsize);
 }
 
 void _alpm_alloc_fail(size_t size)
-- 
2.2.1


More information about the pacman-dev mailing list