[pacman-dev] [PATCH 1/2] Attempted to free lock on failure in alpm_db_update()

Allan McRae allan at archlinux.org
Mon Dec 16 15:04:59 UTC 2019


Also fixes a memory leak under an error condition.

Signed-off-by: Allan McRae <allan at 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


More information about the pacman-dev mailing list