summaryrefslogtreecommitdiffstats
path: root/lib/libalpm/be_local.c
diff options
context:
space:
mode:
authorTobias Stoeckmann <tobias@stoeckmann.org>2016-06-06 20:12:30 +0200
committerAllan McRae <allan@archlinux.org>2016-08-30 10:10:40 +0200
commit681509fd445ed6012e6ecf89b49e9c00d83b70cd (patch)
treeb2ffc59587c3277d79b70b8bd11abed994f22dd6 /lib/libalpm/be_local.c
parent1291c04961e6c27e93ef376583d46ec2aa3036a1 (diff)
downloadpacman-681509fd445ed6012e6ecf89b49e9c00d83b70cd.tar.gz
pacman-681509fd445ed6012e6ecf89b49e9c00d83b70cd.tar.xz
Release resources on error paths.
Some resources (memory or file descriptors) are not released on all error paths. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org> Signed-off-by: Allan McRae <allan@archlinux.org>
Diffstat (limited to 'lib/libalpm/be_local.c')
-rw-r--r--lib/libalpm/be_local.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index f8178228..cc2d8bad 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -800,18 +800,24 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
(len = _alpm_strip_newline(line, 0))) {
if(!_alpm_greedy_grow((void **)&files, &files_size,
(files_count ? (files_count + 1) * sizeof(alpm_file_t) : 8 * sizeof(alpm_file_t)))) {
- goto error;
+ goto nomem;
}
/* since we know the length of the file string already,
* we can do malloc + memcpy rather than strdup */
len += 1;
- MALLOC(files[files_count].name, len, goto error);
+ MALLOC(files[files_count].name, len, goto nomem);
memcpy(files[files_count].name, line, len);
files_count++;
}
/* attempt to hand back any memory we don't need */
if(files_count > 0) {
- files = realloc(files, sizeof(alpm_file_t) * files_count);
+ alpm_file_t *newfiles;
+
+ newfiles = realloc(files, sizeof(alpm_file_t) * files_count);
+ if(newfiles != NULL) {
+ files = newfiles;
+ }
+
/* make sure the list is sorted */
qsort(files, files_count, sizeof(alpm_file_t), _alpm_files_cmp);
} else {
@@ -819,6 +825,13 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t inforeq)
}
info->files.count = files_count;
info->files.files = files;
+ continue;
+nomem:
+ while(files_count > 0) {
+ FREE(files[--files_count].name);
+ }
+ FREE(files);
+ goto error;
} else if(strcmp(line, "%BACKUP%") == 0) {
while(safe_fgets(line, sizeof(line), fp) && _alpm_strip_newline(line, 0)) {
alpm_backup_t *backup;