From 14d6832ef24aeda7fe77cf4285538baa6e21670c Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Sun, 23 Dec 2007 01:57:43 +1000 Subject: Allow NULL parameter in alpm_trans_commit Fixes FS#7380: alpm crashes on passing NULL to alpm_trans_commit in a sync operation. Adds check that data parameter is not NULL in several functions. Signed-off-by: Allan McRae [Dan: fix whitespace] Signed-off-by: Dan McGee --- lib/libalpm/sync.c | 46 ++++++++++++++++++++++++++++------------------ lib/libalpm/trans.c | 4 +++- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 76618665..22df9bf5 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -675,7 +675,11 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync if(deps) { pm_errno = PM_ERR_UNSATISFIED_DEPS; ret = -1; - *data = deps; + if(data) { + *data = deps; + } else { + FREELIST(deps); + } goto cleanup; } } @@ -887,35 +891,41 @@ static int test_md5sum(pmtrans_t *trans, const char *filename, md5sum2 = alpm_get_md5sum(filepath); if(md5sum == NULL) { - /* TODO wtf is this? malloc'd strings for error messages? */ - if((errormsg = calloc(512, sizeof(char))) == NULL) { - RET_ERR(PM_ERR_MEMORY, -1); + if(data) { + /* TODO wtf is this? malloc'd strings for error messages? */ + if((errormsg = calloc(512, sizeof(char))) == NULL) { + RET_ERR(PM_ERR_MEMORY, -1); + } + snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"), + filename); + *data = alpm_list_add(*data, errormsg); } - snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"), - filename); - *data = alpm_list_add(*data, errormsg); ret = 1; } else if(md5sum2 == NULL) { - if((errormsg = calloc(512, sizeof(char))) == NULL) { - RET_ERR(PM_ERR_MEMORY, -1); + if(data) { + if((errormsg = calloc(512, sizeof(char))) == NULL) { + RET_ERR(PM_ERR_MEMORY, -1); + } + snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"), + filename); + *data = alpm_list_add(*data, errormsg); } - snprintf(errormsg, 512, _("can't get md5 checksum for file %s\n"), - filename); - *data = alpm_list_add(*data, errormsg); ret = 1; } else if(strcmp(md5sum, md5sum2) != 0) { int doremove = 0; - if((errormsg = calloc(512, sizeof(char))) == NULL) { - RET_ERR(PM_ERR_MEMORY, -1); - } QUESTION(trans, PM_TRANS_CONV_CORRUPTED_PKG, (char *)filename, NULL, NULL, &doremove); if(doremove) { unlink(filepath); } - snprintf(errormsg, 512, _("file %s was corrupted (bad MD5 checksum)\n"), - filename); - *data = alpm_list_add(*data, errormsg); + if(data) { + if((errormsg = calloc(512, sizeof(char))) == NULL) { + RET_ERR(PM_ERR_MEMORY, -1); + } + snprintf(errormsg, 512, _("file %s was corrupted (bad MD5 checksum)\n"), + filename); + *data = alpm_list_add(*data, errormsg); + } ret = 1; } diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 582c76b7..292c7160 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -342,7 +342,9 @@ int _alpm_trans_addtarget(pmtrans_t *trans, char *target) int _alpm_trans_prepare(pmtrans_t *trans, alpm_list_t **data) { - *data = NULL; + if(data) { + *data = NULL; + } ALPM_LOG_FUNC; -- cgit v1.2.3-24-g4f1b