commit 87eb9c1e04bf4eeb12ede12213222168b6367609 from: Omar Polo date: Tue Aug 15 18:24:24 2023 UTC amused-web: fix reading POST body Some clients seem to include CRLF in the POST' Content-length, some don't. Ignoring when clients send more data then advertised and stripping CRLF at the end works fine across firefox, w3m and netsurf. commit - 99b289691b96fd2ccc00e417a51b08377d781189 commit + 87eb9c1e04bf4eeb12ede12213222168b6367609 blob - 62fe18352621f0158077483ff1740b4cf7c4ab32 blob + 8b1d5a2d69d12e84ecfd77f74f402475834a9147 --- web/http.c +++ web/http.c @@ -160,23 +160,17 @@ http_read(struct request *req, int fd) size_t left; ssize_t nr; - /* drop \r\n */ - if (req->len > 2) - req->len -= 2; - - if (req->clen > sizeof(req->buf) - 1) - return -1; - if (req->len == req->clen) { - req->buf[req->len] = '\0'; - return 0; - } - if (req->len > req->clen) { - log_warnx("got more data than what advertised! (%zu vs %zu)", - req->len, req->clen); + if (req->clen > sizeof(req->buf) - 1) { + log_warnx("POST has more data then what can be accepted"); return -1; } - left = req->clen - req->len; + /* clients may have sent more data than advertised */ + if (req->clen < req->len) + left = 0; + else + left = req->clen - req->len; + while (left > 0) { nr = read(fd, req->buf + req->len, left); if (nr <= 0) { @@ -193,6 +187,9 @@ http_read(struct request *req, int fd) } req->buf[req->len] = '\0'; + while (req->len > 0 && (req->buf[req->len - 1] == '\r' || + (req->buf[req->len - 1] == '\n'))) + req->buf[--req->len] = '\0'; return 0; }