pacman: fix segfault when Usage is specified without a value

And extract all the common code to a macro.

Signed-off-by: morganamilo <morganamilo@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
morganamilo 2019-03-06 22:52:19 +00:00 committed by Allan McRae
parent d197d8ab82
commit 0113214db9

View file

@ -844,28 +844,28 @@ static int _parse_repo(const char *key, char *value, const char *file,
int ret = 0; int ret = 0;
config_repo_t *repo = section->repo; 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(strcmp(key, "Server") == 0) {
if(!value) { CHECK_VALUE(value);
pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: directive '%s' needs a value\n"), repo->servers = alpm_list_add(repo->servers, strdup(value));
file, line, key);
ret = 1;
} else {
repo->servers = alpm_list_add(repo->servers, strdup(value));
}
} else if(strcmp(key, "SigLevel") == 0) { } else if(strcmp(key, "SigLevel") == 0) {
if(!value) { CHECK_VALUE(value);
pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: directive '%s' needs a value\n"), alpm_list_t *values = NULL;
file, line, key); setrepeatingoption(value, "SigLevel", &values);
} else { if(values) {
alpm_list_t *values = NULL; ret = process_siglevel(values, &repo->siglevel,
setrepeatingoption(value, "SigLevel", &values); &repo->siglevel_mask, file, line);
if(values) { FREELIST(values);
ret = process_siglevel(values, &repo->siglevel,
&repo->siglevel_mask, file, line);
FREELIST(values);
}
} }
} else if(strcmp(key, "Usage") == 0) { } else if(strcmp(key, "Usage") == 0) {
CHECK_VALUE(value);
alpm_list_t *values = NULL; alpm_list_t *values = NULL;
setrepeatingoption(value, "Usage", &values); setrepeatingoption(value, "Usage", &values);
if(values) { if(values) {
@ -881,6 +881,8 @@ static int _parse_repo(const char *key, char *value, const char *file,
file, line, key, repo->name); file, line, key, repo->name);
} }
#undef CHECK_VALUE
return ret; return ret;
} }