]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: log: fix potential lf->name memory leak
authorAurelien DARRAGON <adarragon@haproxy.com>
Thu, 22 Feb 2024 14:14:21 +0000 (15:14 +0100)
committerAurelien DARRAGON <adarragon@haproxy.com>
Thu, 22 Feb 2024 14:32:42 +0000 (15:32 +0100)
Recent commit 2ed6068 ("MINOR: log: custom name for logformat node")
introduced a potential memory leak because when custom name is provided,
lf->name value is allocated using strdup(), thus is expected to be freed
alongside the node when the node is released.

However lf->name was only freed in some common places within log.c
cleanups and helpers func, but in reality there are still cases where
lf nodes are manually freed without making use of freeing helpers.

So this is what this patch does, it makes sure all lf freeing places now
leverage the free_logformat_node() helper function that takes care of
freeing all known allocated elements within the node, including custom
name.

This commit depends on:
 - "MINOR: log: add free_logformat_node() helper function"

No backport needed unless 2ed6068 gets backported.

src/cfgparse.c
src/log.c

index feab258e08ab5f9d789f66d64c69f604f7b6a4d2..17ddf8246b054638a613600351d4281f1bd55a69 100644 (file)
@@ -3156,8 +3156,7 @@ init_proxies_list_stage1:
                                 * fall back to static rule
                                 */
                                LIST_DELETE(&node->list);
-                               free(node->arg);
-                               free(node);
+                               free_logformat_node(node);
                        }
 
                        rule->dynamic = 0;
@@ -3227,8 +3226,7 @@ init_proxies_list_stage1:
                                 * fall back to static rule
                                 */
                                LIST_DELETE(&node->list);
-                               free(node->arg);
-                               free(node);
+                               free_logformat_node(node);
                        }
 
                        srule->dynamic = 0;
index 490a17e32deeef51c80efc0c6ccaa23a3c2058e4..64a383ba03b2bcfe04452c4142381c8613a1a9da 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -332,8 +332,7 @@ int parse_logformat_var(char *arg, int arg_len, char *name, int name_len, int ty
                                }
                                if (node->type == LOG_FMT_GLOBAL) {
                                        *defoptions = node->options;
-                                       free(node->arg);
-                                       free(node);
+                                       free_logformat_node(node);
                                } else {
                                        if (logformat_keywords[j].config_callback &&
                                            logformat_keywords[j].config_callback(node, curproxy) != 0) {
@@ -357,11 +356,7 @@ int parse_logformat_var(char *arg, int arg_len, char *name, int name_len, int ty
        var[var_len] = j;
 
   error_free:
-       if (node) {
-               free(node->arg);
-               free(node->name);
-               free(node);
-       }
+       free_logformat_node(node);
        return 0;
 }
 
@@ -480,11 +475,7 @@ int add_sample_to_logformat_list(char *text, char *name, int name_len, int typec
        return 1;
 
   error_free:
-       release_sample_expr(expr);
-       if (node) {
-               free(node->arg);
-               free(node);
-       }
+       free_logformat_node(node);
        return 0;
 }