From abb301c418f34ba87440c02203fe64a0c9f32598 Mon Sep 17 00:00:00 2001 From: Soner Tari Date: Wed, 22 Sep 2021 15:52:00 +0300 Subject: [PATCH] Fail if struct ProxySpec has no arguments or closing brace --- src/opts.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/opts.c b/src/opts.c index 5b47cdc..6937de5 100644 --- a/src/opts.c +++ b/src/opts.c @@ -1260,6 +1260,7 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine, global_t *globa } (*argv)++; } + if (state != 0 && state != 3 && state != 4) { fprintf(stderr, "Incomplete proxyspec!\n"); return -1; @@ -4596,8 +4597,11 @@ load_proxyspec_line(global_t *global, const char *argv0, char *value, char **nat } } - if (proxyspec_parse(&argc, &argv, *natengine, global, argv0, tmp_global_opts) == -1) + if (proxyspec_parse(&argc, &argv, *natengine, global, argv0, tmp_global_opts) == -1) { + fprintf(stderr, "Error in proxyspec on line %d\n", line_num); return -1; + } + free(save_argv); return 0; } @@ -4625,7 +4629,9 @@ load_proxyspec_struct(global_t *global, const char *argv0, char **natengine, int return oom_return(argv0); memset(spec_addrs, 0, sizeof(spec_addrs_t)); - while (!feof(f)) { + int closing_brace = 0; + + while (!feof(f) && !closing_brace) { if (getline(&line, &line_len, f) == -1) { break; } @@ -4651,12 +4657,18 @@ load_proxyspec_struct(global_t *global, const char *argv0, char **natengine, int if (retval == -1) { goto leave; } else if (retval == 1) { - break; + closing_brace = 1; } free(line); line = NULL; } + if (!closing_brace) { + fprintf(stderr, "Error in conf file: struct ProxySpec has no closing brace '}' after line %d\n", *line_num); + retval = -1; + goto leave; + } + set_divert(spec, tmp_global_opts->split); retval = 0; @@ -4785,8 +4797,11 @@ set_global_option(global_t *global, const char *argv0, log_dbg_printf("ProxySpec { on line %d\n", *line_num); #endif /* DEBUG_OPTS */ return load_proxyspec_struct(global, argv0, natengine, line_num, f, tmp_global_opts); - } else { + } else if (strlen(value)) { return load_proxyspec_line(global, argv0, value, natengine, *line_num, tmp_global_opts); + } else { + fprintf(stderr, "Incomplete ProxySpec on line %d\n", *line_num); + return -1; } } else if (equal(name, "ConnIdleTimeout")) { unsigned int i = atoi(value);