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.
(cherry picked from commit 51013e82d4931c4f0ce6f7fc99788a39cc6960ed)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit f58f3a0fb818903610432cdb8f98060cffd9af29)
Signed-off-by: Willy Tarreau <w@1wt.eu>
diff --git a/src/log.c b/src/log.c
index 1778be9..dd041d9 100644
--- a/src/log.c
+++ b/src/log.c
@@ -615,7 +615,7 @@
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
@@ -642,7 +642,7 @@
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
@@ -675,16 +675,16 @@
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 */
@@ -693,11 +693,14 @@
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;
}
/*