[pacman-dev] [PATCH] Release resources on error paths.

Tobias Stoeckmann tobias at stoeckmann.org
Mon Jun 6 18:12:30 UTC 2016


Some resources (memory or file descriptors) are not released on all
error paths.

Signed-off-by: Tobias Stoeckmann <tobias at stoeckmann.org>
---
Thanks for your valueable review, Andrew. :)
---
 lib/libalpm/add.c        |  5 ++++-
 lib/libalpm/backup.c     |  5 +++--
 lib/libalpm/be_local.c   | 19 ++++++++++++++++---
 lib/libalpm/be_package.c |  1 +
 4 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index f5c9a95..d132e52 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -466,7 +466,7 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
 		}
 	}
 
-	/* prepare directory for database entries so permission are correct after
+	/* prepare directory for database entries so permissions are correct after
 	   changelog/install script installation */
 	if(_alpm_local_db_prepare(db, newpkg)) {
 		alpm_logaction(handle, ALPM_CALLER_PREFIX,
@@ -503,6 +503,9 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg,
 			_alpm_log(handle, ALPM_LOG_ERROR, _("could not change directory to %s (%s)\n"),
 					handle->root, strerror(errno));
 			_alpm_archive_read_free(archive);
+			if(cwdfd >= 0) {
+				close(cwdfd);
+			}
 			close(fd);
 			ret = -1;
 			goto cleanup;
diff --git a/lib/libalpm/backup.c b/lib/libalpm/backup.c
index f622589..50bad5e 100644
--- a/lib/libalpm/backup.c
+++ b/lib/libalpm/backup.c
@@ -48,9 +48,10 @@ int _alpm_split_backup(const char *string, alpm_backup_t **backup)
 	ptr++;
 	/* now str points to the filename and ptr points to the hash */
 	STRDUP((*backup)->name, str, FREE(str); return -1);
-	STRDUP((*backup)->hash, ptr, FREE(str); return -1);
+	STRDUP((*backup)->hash, ptr, FREE((*backup)->name); FREE(str); return -1);
 	FREE(str);
-	return 0;}
+	return 0;
+}
 
 /* Look for a filename in a alpm_pkg_t.backup list. If we find it,
  * then we return the full backup entry.
diff --git a/lib/libalpm/be_local.c b/lib/libalpm/be_local.c
index f817822..38feb72 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;
diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c
index c9ed770..a79c0c5 100644
--- a/lib/libalpm/be_package.c
+++ b/lib/libalpm/be_package.c
@@ -762,6 +762,7 @@ int SYMEXPORT alpm_pkg_load(alpm_handle_t *handle, const char *filename, int ful
 
 			if(fail) {
 				_alpm_log(handle, ALPM_LOG_ERROR, _("required key missing from keyring\n"));
+				free(sigpath);
 				return -1;
 			}
 		}
-- 
2.8.3


More information about the pacman-dev mailing list