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

Signed-off-by: Tobias Stoeckmann <[email protected]>
---
Yes it's rather ironic to send this patch after forgetting one on
my own just now. ;)
---
 lib/libalpm/add.c        |  5 ++++-
 lib/libalpm/backup.c     |  5 +++--
 lib/libalpm/be_local.c   | 18 +++++++++++++++---
 lib/libalpm/be_package.c |  1 +
 4 files changed, 23 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..0b351f9 100644
--- a/lib/libalpm/be_local.c
+++ b/lib/libalpm/be_local.c
@@ -794,7 +794,7 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t 
inforeq)
                        _alpm_strip_newline(line, 0);
                        if(strcmp(line, "%FILES%") == 0) {
                                size_t files_count = 0, files_size = 0, len;
-                               alpm_file_t *files = NULL;
+                               alpm_file_t *files = NULL, *newfiles;
 
                                while(safe_fgets(line, sizeof(line), fp) &&
                                                (len = 
_alpm_strip_newline(line, 0))) {
@@ -805,13 +805,18 @@ static int local_db_read(alpm_pkg_t *info, alpm_dbinfrq_t 
inforeq)
                                        /* 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);
+                                       newfiles = realloc(files, 
sizeof(alpm_file_t) * files_count);
+                                       if(newfiles == NULL) {
+                                               goto nomem;
+                                       }
+                                       files = newfiles;
+
                                        /* make sure the list is sorted */
                                        qsort(files, files_count, 
sizeof(alpm_file_t), _alpm_files_cmp);
                                } else {
@@ -819,6 +824,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

Reply via email to