]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MAJOR: tcp: only call registered actions when they're registered
authorWilly Tarreau <w@1wt.eu>
Fri, 24 Apr 2015 08:10:53 +0000 (10:10 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 24 Apr 2015 08:13:18 +0000 (10:13 +0200)
Commit cc87a11 ("MEDIUM: tcp: add register keyword system.") introduced
the registration of new keywords for TCP rulesets. Unfortunately it
replaced the "accept" action with an unconditionnal call to the rule's
action function, resulting in an immediate segfault when using the
"accept" action in a TCP ruleset.

This bug reported by Baptiste Assmann was introduced in 1.6-dev1, no
backport is needed.

src/proto_tcp.c

index efa9158bfc5d87bfb89ecbd2cf35d51d9c4a694b..cf0aaa81e767b6efa155168ff260179cc2cd3bf0 100644 (file)
@@ -1216,7 +1216,7 @@ resume_execution:
                        }
                        else {
                                /* Custom keywords. */
-                               if (rule->action_ptr(rule, s->be, s) == 0) {
+                               if (rule->action_ptr && !rule->action_ptr(rule, s->be, s)) {
                                        s->current_rule = rule;
                                        goto missing_data;
                                }
@@ -1336,7 +1336,7 @@ resume_execution:
                        }
                        else {
                                /* Custom keywords. */
-                               if (!rule->action_ptr(rule, s->be, s)) {
+                               if (rule->action_ptr && !rule->action_ptr(rule, s->be, s)) {
                                        channel_dont_close(rep);
                                        s->current_rule = rule;
                                        return 0;
@@ -1415,7 +1415,8 @@ int tcp_exec_req_rules(struct session *sess)
                        }
                        else {
                                /* Custom keywords. */
-                               rule->action_ptr(rule, sess->fe, NULL);
+                               if (rule->action_ptr)
+                                       rule->action_ptr(rule, sess->fe, NULL);
 
                                /* otherwise it's an accept */
                                break;