From 51013e82d4931c4f0ce6f7fc99788a39cc6960ed Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 11 Dec 2019 12:05:39 +0100 Subject: [PATCH] BUG/MINOR: log: fix minor resource leaks on logformat error path As reported by Ilya in issue #392, Coverity found that we're leaking allocated strings on error paths in parse_logformat(). Let's use a proper exit label for failures instead of seeding return 0 everywhere. This should be backported to all supported versions. --- src/log.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/log.c b/src/log.c index c4e008286..23e6c4757 100644 --- a/src/log.c +++ b/src/log.c @@ -618,7 +618,7 @@ int parse_logformat_string(const char *fmt, struct proxy *curproxy, struct list sp = str - 1; /* send both the '%' and the current char */ memprintf(err, "unexpected variable name near '%c' at position %d line : '%s'. Maybe you want to write a single '%%', use the syntax '%%%%'", *str, (int)(str - backfmt), fmt); - return 0; + goto fail; } else @@ -645,7 +645,7 @@ int parse_logformat_string(const char *fmt, struct proxy *curproxy, struct list break; } memprintf(err, "parse argument modifier without variable name near '%%{%s}'", arg); - return 0; + goto fail; case LF_STEXPR: // text immediately following '%[' if (*str == ']') { // end of arg @@ -678,16 +678,16 @@ int parse_logformat_string(const char *fmt, struct proxy *curproxy, struct list switch (pformat) { case LF_VAR: if (!parse_logformat_var(arg, arg_len, var, var_len, curproxy, list_format, &options, err)) - return 0; + goto fail; break; case LF_STEXPR: if (!add_sample_to_logformat_list(var, arg, arg_len, curproxy, list_format, options, cap, err)) - return 0; + goto fail; break; case LF_TEXT: case LF_SEPARATOR: if (!add_to_logformat_list(sp, str, pformat, list_format, err)) - return 0; + goto fail; break; } sp = str; /* new start of text at every state switch and at every separator */ @@ -696,11 +696,14 @@ int parse_logformat_string(const char *fmt, struct proxy *curproxy, struct list if (pformat == LF_STARTVAR || pformat == LF_STARG || pformat == LF_STEXPR) { memprintf(err, "truncated line after '%s'", var ? var : arg ? arg : "%"); - return 0; + goto fail; } free(backfmt); return 1; + fail: + free(backfmt); + return 0; } /*