[pacman-dev,v2] Attempt to free lock on failure in alpm_db_update()

Message ID 20200107043212.121801-1-allan@archlinux.org
State New
Headers show
Series
  • [pacman-dev,v2] Attempt to free lock on failure in alpm_db_update()
Related show

Commit Message

Allan McRae Jan. 7, 2020, 4:32 a.m. UTC
Also fixes a memory leak under an error condition.

Signed-off-by: Allan McRae <allan@archlinux.org>
---

v2:
Move "cleanup:" higher
Clarify comment about pm_errno being set

 lib/libalpm/be_sync.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

Patch

diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index 07d2b4ae..f1caddd8 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;
@@ -230,9 +230,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);
@@ -248,8 +248,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 is set by _alpm_sigpath */
 				ret = -1;
-				break;
+				goto cleanup;
 			}
 			unlink(sigpath);
 			free(sigpath);
@@ -275,9 +276,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;
 				}
 			);
 
@@ -305,6 +306,7 @@  int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
 		}
 	}
 
+cleanup:
 	if(updated) {
 		/* Cache needs to be rebuilt */
 		_alpm_db_free_pkgcache(db);