From e91ffd093e548aa08d7ccb835fd261f3d71ffb17 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 24 Apr 2015 10:10:53 +0200 Subject: [PATCH] BUG/MAJOR: tcp: only call registered actions when they're registered 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 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/proto_tcp.c b/src/proto_tcp.c index efa9158bfc..cf0aaa81e7 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -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; -- 2.39.5