Browse Source

client: fix incorrectly emitting HTTP 413 for certain content lengths

The existing logic for checking overlong request headers did not take
into account that when the request body content length is a multiple
of 4096, the request handling state might transition directly from
CLIENT_STATE_HEADER or CLIENT_STATE_DATA to CLIENT_STATE_DONE, in
which case we must not emit a stray HTTP 413 error.

Fixes: https://github.com/openwrt/luci/issues/2051
Signed-off-by: Liangbin Lian <jjm2473@gmail.com>
[Change commit subject, add commit message, swap order of conditions]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Jo-Philipp Wich 1 year ago
parent
commit
23977554d9
1 changed files with 2 additions and 1 deletions
  1. 2 1
      client.c

+ 2 - 1
client.c

@@ -532,7 +532,8 @@ void uh_client_read_cb(struct client *cl)
 
 		if (!read_cbs[cl->state](cl, str, len)) {
 			if (len == us->r.buffer_len &&
-			    cl->state != CLIENT_STATE_DATA)
+			    cl->state != CLIENT_STATE_DATA &&
+			    cl->state != CLIENT_STATE_DONE)
 				uh_header_error(cl, 413, "Request Entity Too Large");
 			break;
 		}