Also fixes a memory leak under an error condition. Signed-off-by: Allan McRae <allan@archlinux.org> --- lib/libalpm/be_sync.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 041b2266..5502d92d 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -215,7 +215,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) RET_ERR(handle, ALPM_ERR_HANDLE_LOCK, -1); } - dbext = db->handle->dbext; + dbext = handle->dbext; for(i = db->servers; i; i = i->next) { const char *server = i->data, *final_db_url = NULL; @@ -232,9 +232,9 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) len = strlen(server) + strlen(db->treename) + strlen(dbext) + 2; MALLOC(payload.fileurl, len, { - free(syncpath); - umask(oldmask); - RET_ERR(handle, ALPM_ERR_MEMORY, -1); + handle->pm_errno = ALPM_ERR_MEMORY; + ret = -1; + goto cleanup; } ); snprintf(payload.fileurl, len, "%s/%s%s", server, db->treename, dbext); @@ -250,8 +250,9 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) /* an existing sig file is no good at this point */ char *sigpath = _alpm_sigpath(handle, _alpm_db_path(db)); if(!sigpath) { + /* pm_errno should be set */ ret = -1; - break; + goto cleanup; } unlink(sigpath); free(sigpath); @@ -277,9 +278,9 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) MALLOC(payload.fileurl, len, { - free(syncpath); - umask(oldmask); - RET_ERR(handle, ALPM_ERR_MEMORY, -1); + handle->pm_errno = ALPM_ERR_MEMORY; + ret = -1; + goto cleanup; } ); @@ -324,6 +325,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) } } +cleanup: if(ret == -1) { /* pm_errno was set by the download code */ _alpm_log(handle, ALPM_LOG_DEBUG, "failed to sync db: %s\n", -- 2.24.1