[pacman-dev] [PATCH] Always use proper error code in alpm_initialize.
In out of memory conditions, an undefined error value is written into *err, because myerr is never explicitly set in these cases. I have also converted a calloc into a MALLOC call, because the memory will be properly filled by the snprintf call right after it. Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org> --- lib/libalpm/alpm.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c index 6f02913..6b7fa7a 100644 --- a/lib/libalpm/alpm.c +++ b/lib/libalpm/alpm.c @@ -55,8 +55,7 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, alpm_handle_t *myhandle = _alpm_handle_new(); if(myhandle == NULL) { - myerr = ALPM_ERR_MEMORY; - goto cleanup; + goto nomem; } if((myerr = _alpm_set_directory_option(root, &(myhandle->root), 1))) { goto cleanup; @@ -68,15 +67,15 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, /* to contatenate myhandle->root (ends with a slash) with SYSHOOKDIR (starts * with a slash) correctly, we skip SYSHOOKDIR[0]; the regular +1 therefore * disappears from the allocation */ - MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto cleanup); + MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto nomem); sprintf(hookdir, "%s%s", myhandle->root, SYSHOOKDIR + 1); myhandle->hookdirs = alpm_list_add(NULL, hookdir); /* set default database extension */ - STRDUP(myhandle->dbext, ".db", goto cleanup); + STRDUP(myhandle->dbext, ".db", goto nomem); lockfilelen = strlen(myhandle->dbpath) + strlen(lf) + 1; - myhandle->lockfile = calloc(lockfilelen, sizeof(char)); + MALLOC(myhandle->lockfile, lockfilelen, goto nomem); snprintf(myhandle->lockfile, lockfilelen, "%s%s", myhandle->dbpath, lf); if(_alpm_db_register_local(myhandle) == NULL) { @@ -90,9 +89,11 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, return myhandle; +nomem: + myerr = ALPM_ERR_MEMORY; cleanup: _alpm_handle_free(myhandle); - if(err && myerr) { + if(err) { *err = myerr; } return NULL; -- 2.8.3
On 06/05/16 at 07:23pm, Tobias Stoeckmann wrote:
In out of memory conditions, an undefined error value is written into *err, because myerr is never explicitly set in these cases.
I have also converted a calloc into a MALLOC call, because the memory will be properly filled by the snprintf call right after it.
Signed-off-by: Tobias Stoeckmann <tobias@stoeckmann.org> --- lib/libalpm/alpm.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
ACK.
diff --git a/lib/libalpm/alpm.c b/lib/libalpm/alpm.c index 6f02913..6b7fa7a 100644 --- a/lib/libalpm/alpm.c +++ b/lib/libalpm/alpm.c @@ -55,8 +55,7 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, alpm_handle_t *myhandle = _alpm_handle_new();
if(myhandle == NULL) { - myerr = ALPM_ERR_MEMORY; - goto cleanup; + goto nomem; } if((myerr = _alpm_set_directory_option(root, &(myhandle->root), 1))) { goto cleanup; @@ -68,15 +67,15 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath, /* to contatenate myhandle->root (ends with a slash) with SYSHOOKDIR (starts * with a slash) correctly, we skip SYSHOOKDIR[0]; the regular +1 therefore * disappears from the allocation */ - MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto cleanup); + MALLOC(hookdir, strlen(myhandle->root) + strlen(SYSHOOKDIR), goto nomem); sprintf(hookdir, "%s%s", myhandle->root, SYSHOOKDIR + 1); myhandle->hookdirs = alpm_list_add(NULL, hookdir);
/* set default database extension */ - STRDUP(myhandle->dbext, ".db", goto cleanup); + STRDUP(myhandle->dbext, ".db", goto nomem);
lockfilelen = strlen(myhandle->dbpath) + strlen(lf) + 1; - myhandle->lockfile = calloc(lockfilelen, sizeof(char)); + MALLOC(myhandle->lockfile, lockfilelen, goto nomem); snprintf(myhandle->lockfile, lockfilelen, "%s%s", myhandle->dbpath, lf);
if(_alpm_db_register_local(myhandle) == NULL) { @@ -90,9 +89,11 @@ alpm_handle_t SYMEXPORT *alpm_initialize(const char *root, const char *dbpath,
return myhandle;
+nomem: + myerr = ALPM_ERR_MEMORY; cleanup: _alpm_handle_free(myhandle); - if(err && myerr) { + if(err) { *err = myerr; } return NULL; -- 2.8.3
participants (2)
-
Andrew Gregory
-
Tobias Stoeckmann