From: Ivy Foster <ivy.fos...@gmail.com>

Signed-off-by: Ivy Foster <ivy.fos...@gmail.com>
---
 lib/libalpm/be_sync.c | 42 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 34 insertions(+), 8 deletions(-)

diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c
index ee438f8..f61668e 100644
--- a/lib/libalpm/be_sync.c
+++ b/lib/libalpm/be_sync.c
@@ -222,12 +222,24 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
        dbext = db->handle->dbext;
 
        len = strlen(syncpath) + strlen(db->treename) + strlen(dbext) + 2;
-       /* TODO fix leak syncpath and umask unset */
-       MALLOC(newdb, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
+       MALLOC(newdb, len,
+               {
+                       free(syncpath);
+                       umask(oldmask);
+                       RET_ERR(handle, ALPM_ERR_MEMORY, -1);
+               }
+       );
        snprintf(newdb, len, "%s/%s%s", syncpath, db->treename, dbext);
+
        len += 4;
-       /* TODO fix leak syncpath and umask unset */
-       MALLOC(olddb, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
+       MALLOC(olddb, len,
+               {
+                       free(syncpath);
+                       free(newdb);
+                       umask(oldmask);
+                       RET_ERR(handle, ALPM_ERR_MEMORY, -1);
+               }
+       );
        snprintf(olddb, len, "%s.bak", newdb);
        if (rename(newdb, olddb) == -1) {
                ret = -1;
@@ -247,8 +259,15 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
 
                /* print server + filename into a buffer */
                len = strlen(server) + strlen(db->treename) + strlen(dbext) + 2;
-               /* TODO fix leak syncpath and umask unset */
-               MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, 
-1));
+               MALLOC(payload.fileurl, len,
+                       {
+                               free(newdb);
+                               free(olddb);
+                               free(syncpath);
+                               umask(oldmask);
+                               RET_ERR(handle, ALPM_ERR_MEMORY, -1);
+                       }
+               );
                snprintf(payload.fileurl, len, "%s/%s%s", server, db->treename, 
dbext);
                payload.handle = handle;
                payload.force = force;
@@ -287,8 +306,15 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db)
                                len = strlen(server) + strlen(db->treename) + 
strlen(dbext) + 6;
                        }
 
-                       /* TODO fix leak syncpath and umask unset */
-                       MALLOC(payload.fileurl, len, RET_ERR(handle, 
ALPM_ERR_MEMORY, -1));
+                       MALLOC(payload.fileurl, len,
+                               {
+                                       free(newdb);
+                                       free(olddb);
+                                       free(syncpath);
+                                       umask(oldmask);
+                                       RET_ERR(handle, ALPM_ERR_MEMORY, -1);
+                               }
+                       );
 
                        if(final_db_url != NULL) {
                                snprintf(payload.fileurl, len, "%s.sig", 
final_db_url);
-- 
2.9.3

Reply via email to