From 64306ccd9759a1765b93f7597676c18280e35d1a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 20 May 2022 16:20:52 +0200 Subject: [PATCH] MINOR: listener: detect stream vs dgram conflict during parsing Now that we have a function to parse all bind keywords, and that we know what types of sock-level and xprt-level protocols a bind_conf is using, it's easier to centralize the check for stream vs dgram conflict by putting it directly at the end of the args parser. This way it also works for peers, provides better precision in the report, and will also allow to validate transport layers. The check was even extended to detect inconsistencies between xprt layer (which were not covered before). It can even detect that there are two incompatible "bind" lines in a single peers section. --- src/cfgparse.c | 17 ----------------- src/listener.c | 9 +++++++++ 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/cfgparse.c b/src/cfgparse.c index d48efac9c..3fb0fb4a2 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -3762,23 +3762,6 @@ out_uri_auth_compat: list_for_each_entry(bind_conf, &curproxy->conf.bind, by_fe) { int mode = (1 << (curproxy->mode == PR_MODE_HTTP)); const struct mux_proto_list *mux_ent; - const struct listener *l; - int types = 0; - - /* check that the mux is compatible with all listeners' - * protocol types (dgram or stream). - */ - list_for_each_entry(l, &bind_conf->listeners, by_bind) - types |= 1 << l->rx.proto->proto_type; - - if (atleast2(types)) { - ha_alert("%s '%s' : cannot mix datagram and stream protocols " - "for 'bind %s' at [%s:%d].\n", - proxy_type_str(curproxy), curproxy->id, - bind_conf->arg, bind_conf->file, bind_conf->line); - cfgerr++; - continue; - } if (!bind_conf->mux_proto) continue; diff --git a/src/listener.c b/src/listener.c index 6c71c1b4b..e5cb867ba 100644 --- a/src/listener.c +++ b/src/listener.c @@ -1631,6 +1631,15 @@ int bind_parse_args_list(struct bind_conf *bind_conf, char **args, int cur_arg, err_code |= ERR_ALERT | ERR_FATAL; goto out; } + + if ((bind_conf->options & (BC_O_USE_SOCK_DGRAM|BC_O_USE_SOCK_STREAM)) == (BC_O_USE_SOCK_DGRAM|BC_O_USE_SOCK_STREAM) || + (bind_conf->options & (BC_O_USE_XPRT_DGRAM|BC_O_USE_XPRT_STREAM)) == (BC_O_USE_XPRT_DGRAM|BC_O_USE_XPRT_STREAM)) { + ha_alert("parsing [%s:%d] : '%s %s' in section '%s' : cannot mix datagram and stream protocols.\n", + file, linenum, args[0], args[1], section); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + out: return err_code; }