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

Signed-off-by: Daniel Micay <[email protected]>
---
 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

Reply via email to