From 0113214db9a9e9ae48bffa3c3e7b39be16e8272a Mon Sep 17 00:00:00 2001 From: morganamilo Date: Wed, 6 Mar 2019 22:52:19 +0000 Subject: pacman: fix segfault when Usage is specified without a value And extract all the common code to a macro. Signed-off-by: morganamilo Signed-off-by: Allan McRae --- src/pacman/conf.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/pacman/conf.c b/src/pacman/conf.c index 29f69052..cca3657e 100644 --- a/src/pacman/conf.c +++ b/src/pacman/conf.c @@ -844,28 +844,28 @@ static int _parse_repo(const char *key, char *value, const char *file, int ret = 0; config_repo_t *repo = section->repo; +#define CHECK_VALUE(val) do { \ + if(!val) { \ + pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: directive '%s' needs a value\n"), \ + file, line, key); \ + return 1; \ + } \ +} while(0) + if(strcmp(key, "Server") == 0) { - if(!value) { - pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: directive '%s' needs a value\n"), - file, line, key); - ret = 1; - } else { - repo->servers = alpm_list_add(repo->servers, strdup(value)); - } + CHECK_VALUE(value); + repo->servers = alpm_list_add(repo->servers, strdup(value)); } else if(strcmp(key, "SigLevel") == 0) { - if(!value) { - pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: directive '%s' needs a value\n"), - file, line, key); - } else { - alpm_list_t *values = NULL; - setrepeatingoption(value, "SigLevel", &values); - if(values) { - ret = process_siglevel(values, &repo->siglevel, - &repo->siglevel_mask, file, line); - FREELIST(values); - } + CHECK_VALUE(value); + alpm_list_t *values = NULL; + setrepeatingoption(value, "SigLevel", &values); + if(values) { + ret = process_siglevel(values, &repo->siglevel, + &repo->siglevel_mask, file, line); + FREELIST(values); } } else if(strcmp(key, "Usage") == 0) { + CHECK_VALUE(value); alpm_list_t *values = NULL; setrepeatingoption(value, "Usage", &values); if(values) { @@ -881,6 +881,8 @@ static int _parse_repo(const char *key, char *value, const char *file, file, line, key, repo->name); } +#undef CHECK_VALUE + return ret; } -- cgit v1.2.3-70-g09d2