]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: config: Make use_backend and use-server post-parsing less obscur
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 7 May 2020 13:59:33 +0000 (15:59 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 7 May 2020 13:59:35 +0000 (15:59 +0200)
During use_backend and use-server post-parsing, if the log-format string used to
specify the backend or the server is just a single string, the log-format string
(a list, internally) is replaced by the string itself. Because the field is an
union, the list is not emptied according to the rules of art. The element, when
released, is not removed from the list. There is no bug, but it is clearly not
obvious and error prone.

This patch should fix #544. The fix for the use_backend post-parsing may be
backported to all stable releases. use-server is static in 2.1 and prior.

src/cfgparse.c

index e5c9219e117e2d0331c0d148e31d2b70251817d7..5627fe2801d883c8cf2720b78d340749514bd22d 100644 (file)
@@ -2654,7 +2654,10 @@ int check_config_validity()
                                        free(pxname);
                                        continue;
                                }
-                               /* simple string: free the expression and fall back to static rule */
+                               /* Only one element in the list, a simple string: free the expression and
+                                * fall back to static rule
+                                */
+                               LIST_DEL(&node->list);
                                free(node->arg);
                                free(node);
                        }
@@ -2715,6 +2718,10 @@ int check_config_validity()
                                        free(server_name);
                                        continue;
                                }
+                               /* Only one element in the list, a simple string: free the expression and
+                                * fall back to static rule
+                                */
+                               LIST_DEL(&node->list);
                                free(node->arg);
                                free(node);
                        }