diff --git a/lib/libalpm/be_package.c b/lib/libalpm/be_package.c index fccbb10a..3188a2fe 100644 --- a/lib/libalpm/be_package.c +++ b/lib/libalpm/be_package.c @@ -380,7 +380,7 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle, int ret, fd, config = 0; struct archive *archive; struct archive_entry *entry; - alpm_pkg_t *newpkg = NULL; + alpm_pkg_t *newpkg; struct stat st; size_t files_count = 0, files_size = 0; alpm_file_t *files = NULL; @@ -394,7 +394,7 @@ alpm_pkg_t *_alpm_pkg_load_internal(alpm_handle_t *handle, if(errno == ENOENT) { handle->pm_errno = ALPM_ERR_PKG_NOT_FOUND; } - goto error; + return NULL; } newpkg = _alpm_pkg_new(); diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index b16271bc..c4673b1b 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -391,7 +391,7 @@ static int sync_db_populate(alpm_db_t *db) { const char *dbpath; size_t est_count; - int count = -1, fd; + int count, fd; struct stat buf; struct archive *archive; struct archive_entry *entry; @@ -412,13 +412,14 @@ static int sync_db_populate(alpm_db_t *db) fd = _alpm_open_archive(db->handle, dbpath, &buf, &archive, ALPM_ERR_DB_OPEN); if(fd < 0) { - goto cleanup; + return -1; } est_count = estimate_package_count(&buf, archive); db->pkgcache = _alpm_pkghash_create(est_count); if(db->pkgcache == NULL) { db->handle->pm_errno = ALPM_ERR_MEMORY; + count = -1; goto cleanup; } diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c index 2cce8247..e2cbd8c5 100644 --- a/lib/libalpm/util.c +++ b/lib/libalpm/util.c @@ -213,6 +213,8 @@ size_t _alpm_strip_newline(char *str) * This takes care of creating the libarchive 'archive' struct, setting up * compression and format options, opening a file descriptor, setting up the * buffer size, and performing a stat on the path once opened. + * On error, no file descriptor is opened, and the archive pointer returned + * will be set to NULL. * @param handle the context handle * @param path the path of the archive to open * @param buf space for a stat buffer for the given path @@ -238,16 +240,13 @@ int _alpm_open_archive(alpm_handle_t *handle, const char *path, if(fd < 0) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); - archive_read_finish(*archive); - RET_ERR(handle, error, -1); + goto error; } if(fstat(fd, buf) != 0) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not stat file %s: %s\n"), path, strerror(errno)); - archive_read_finish(*archive); - CLOSE(fd); - RET_ERR(handle, error, -1); + goto error; } #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE if(buf->st_blksize > ALPM_BUFFER_SIZE) { @@ -258,12 +257,18 @@ int _alpm_open_archive(alpm_handle_t *handle, const char *path, if(archive_read_open_fd(*archive, fd, bufsize) != ARCHIVE_OK) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not open file %s: %s\n"), path, archive_error_string(*archive)); - archive_read_finish(*archive); - CLOSE(fd); - RET_ERR(handle, error, -1); + goto error; } return fd; + +error: + archive_read_finish(*archive); + *archive = NULL; + if(fd >= 0) { + CLOSE(fd); + } + RET_ERR(handle, error, -1); } /** Unpack a specific file in an archive.