summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-10-26 22:44:55 +0200
committerDan McGee <dan@archlinux.org>2011-10-26 22:44:55 +0200
commit7a6b01d46c1da385dd34466e757beafa33e02afa (patch)
tree4594f93c0b362ccff0c38527f910b496f401fd9a
parent2da59e1aa91fa4160ec1c8ec84d94d8141b2a832 (diff)
downloadpacman-7a6b01d46c1da385dd34466e757beafa33e02afa.tar.gz
pacman-7a6b01d46c1da385dd34466e757beafa33e02afa.tar.xz
Don't realloc a 0-length files array when loading packages
There is some pecular behavior going on here when a package is loaded that has no files, as is very common in our test suite. When we enter the realloc/sort code, a package without files will call the following: files = realloc(NULL, 0); One would assume this is a no-op, returning a NULL pointer, but that is not the case and valgrind later reports we are leaking memory. Fix the whole thing by skipping the reallocation and sort steps if the pointer is NULL, as we have nothing to do. Note that the package still gets marked as 'files loaded', becuase although there were none, we tried and were successful. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/be_package.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c
index c20c703f..c8e08e22 100644
--- a/lib/libalpm/be_package.c
+++ b/lib/libalpm/be_package.c
@@ -482,17 +482,19 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle,
newpkg->origin_data.file = strdup(pkgfile);
newpkg->ops = get_file_pkg_ops();
newpkg->handle = handle;
+ newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_SCRIPTLET;
if(full) {
- /* attempt to hand back any memory we don't need */
- files = realloc(files, sizeof(alpm_file_t) * files_count);
- /* "checking for conflicts" requires a sorted list, ensure that here */
- _alpm_log(handle, ALPM_LOG_DEBUG, "sorting package filelist for %s\n", pkgfile);
- newpkg->files.files = files_msort(files, files_count);
+ if(files) {
+ /* attempt to hand back any memory we don't need */
+ files = realloc(files, sizeof(alpm_file_t) * files_count);
+ /* "checking for conflicts" requires a sorted list, ensure that here */
+ _alpm_log(handle, ALPM_LOG_DEBUG,
+ "sorting package filelist for %s\n", pkgfile);
+ newpkg->files.files = files_msort(files, files_count);
+ }
newpkg->files.count = files_count;
- newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_FILES | INFRQ_SCRIPTLET;
- } else {
- newpkg->infolevel = INFRQ_BASE | INFRQ_DESC | INFRQ_SCRIPTLET;
+ newpkg->infolevel |= INFRQ_FILES;
}
return newpkg;