]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: log: fix minor resource leaks on logformat error path
authorWilly Tarreau <w@1wt.eu>
Wed, 11 Dec 2019 11:05:39 +0000 (12:05 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 11 Dec 2019 11:05:39 +0000 (12:05 +0100)
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

index c4e0082860f40e2e2337064147d58d4ad86ea95c..23e6c475757cca042a0f19e6ba87cdbf1258a9e3 100644 (file)
--- 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;
 }
 
 /*