[pacman-dev] [PATCH] pacman: fix segfault when Usage is specified without a value

morganamilo morganamilo at gmail.com
Wed Mar 6 22:52:19 UTC 2019


And extract all the common code to a macro.

Signed-off-by: morganamilo <morganamilo at gmail.com>
---
 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;
 }
 
-- 
2.21.0


More information about the pacman-dev mailing list