Message ID | 20210320192839.3962480-1-hauke@hauke-m.de |
---|---|
State | Superseded |
Delegated to: | Hauke Mehrtens |
Headers | show |
Series | [uhttpd] client: Always close connection with request body in case of error | expand |
On 3/20/21 8:28 PM, Hauke Mehrtens wrote: > When we run into an error like a 404 Not Found the request body is not > read and will be parsed as part of the next request. The next Request > will then fail because there is unexpected data in it. > When we run into such a problem with a request body close return an > error and close the connection. This should be easier than trying to > recover the state. > > We saw this problem when /ubus/ was not installed, but the browser tried > to access it. Then uhttpd returned a 404, but the next request done in > this connection also failed with a HTTP 400, bad request. > > Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> This should fix the following bug report: https://bugs.openwrt.org/index.php?do=details&task_id=3378 > --- > client.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/client.c b/client.c > index 6233d01..1d337f3 100644 > --- a/client.c > +++ b/client.c > @@ -138,6 +138,7 @@ void uh_request_done(struct client *cl) > void __printf(4, 5) > uh_client_error(struct client *cl, int code, const char *summary, const char *fmt, ...) > { > + struct http_request *r = &cl->request; > va_list arg; > > uh_http_header(cl, code, summary); > @@ -151,6 +152,11 @@ uh_client_error(struct client *cl, int code, const char *summary, const char *fm > va_end(arg); > } > > + if (r->transfer_chunked || r->content_length > 0) { > + cl->state = CLIENT_STATE_CLOSE; > + cl->request.connection_close = true; > + } > + > uh_request_done(cl); > } > >
diff --git a/client.c b/client.c index 6233d01..1d337f3 100644 --- a/client.c +++ b/client.c @@ -138,6 +138,7 @@ void uh_request_done(struct client *cl) void __printf(4, 5) uh_client_error(struct client *cl, int code, const char *summary, const char *fmt, ...) { + struct http_request *r = &cl->request; va_list arg; uh_http_header(cl, code, summary); @@ -151,6 +152,11 @@ uh_client_error(struct client *cl, int code, const char *summary, const char *fm va_end(arg); } + if (r->transfer_chunked || r->content_length > 0) { + cl->state = CLIENT_STATE_CLOSE; + cl->request.connection_close = true; + } + uh_request_done(cl); }
When we run into an error like a 404 Not Found the request body is not read and will be parsed as part of the next request. The next Request will then fail because there is unexpected data in it. When we run into such a problem with a request body close return an error and close the connection. This should be easier than trying to recover the state. We saw this problem when /ubus/ was not installed, but the browser tried to access it. Then uhttpd returned a 404, but the next request done in this connection also failed with a HTTP 400, bad request. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> --- client.c | 6 ++++++ 1 file changed, 6 insertions(+)