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.
diff --git a/src/log.c b/src/log.c
index c4e0082..23e6c47 100644
--- a/src/log.c
+++ b/src/log.c
@@ -618,7 +618,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
@@ -645,7 +645,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
@@ -678,16 +678,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 */
@@ -696,11 +696,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;
}
/*