From 74a9eb5216641b2b0d4ae6a96906fc4a36a90b6c Mon Sep 17 00:00:00 2001 From: Thierry Fournier Date: Mon, 10 Oct 2022 12:46:38 +0200 Subject: [PATCH] BUG/MEDIUM: httpclient: segfault when the httpclient parser fails If the uri is unexpected ("/" in place of "http://xxx/"), some parsing function fails. The failure is not handled. This patch handle these errors. Note: the return code is boolean, maybe we can return more precise error for Lua reporting ? Must be backported in 2.6. --- src/http_client.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/http_client.c b/src/http_client.c index cd12a8e7f..2f9bac555 100644 --- a/src/http_client.c +++ b/src/http_client.c @@ -476,10 +476,10 @@ int httpclient_set_dst(struct httpclient *hc, const char *dst) } /* - * Return a split URL in , , + * Split in , , */ -static void httpclient_spliturl(struct ist url, enum http_scheme *scheme, - struct ist *host, int *port) +static int httpclient_spliturl(struct ist url, enum http_scheme *scheme, + struct ist *host, int *port) { enum http_scheme scheme_tmp = SCH_HTTP; int port_tmp = 0; @@ -489,6 +489,9 @@ static void httpclient_spliturl(struct ist url, enum http_scheme *scheme, parser = http_uri_parser_init(url); scheme_ist = http_parse_scheme(&parser); + if (!isttest(scheme_ist)) { + return 0; + } if (isteqi(scheme_ist, ist("http://"))){ scheme_tmp = SCH_HTTP; @@ -499,6 +502,9 @@ static void httpclient_spliturl(struct ist url, enum http_scheme *scheme, } authority_ist = http_parse_authority(&parser, 1); + if (!isttest(authority_ist)) { + return 0; + } p = end = istend(authority_ist); /* look for a port at the end of the authority */ @@ -521,6 +527,7 @@ static void httpclient_spliturl(struct ist url, enum http_scheme *scheme, if (port) *port = port_tmp; + return 1; } /* @@ -1006,7 +1013,8 @@ static int httpclient_applet_init(struct appctx *appctx) /* parse the URL and */ - httpclient_spliturl(hc->req.url, &scheme, &host, &port); + if (!httpclient_spliturl(hc->req.url, &scheme, &host, &port)) + goto out_error; if (hc->dst) { /* if httpclient_set_dst() was used, sets the alternative address */