diff options
| author | Garrett D'Amore <garrett@damore.org> | 2025-01-12 13:50:32 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2025-01-12 13:50:32 -0800 |
| commit | d88484cafbf973d55dc95b7edcae5064efa8bad0 (patch) | |
| tree | de5ec0325765b7e4ffddd4e88c1f75e423b0564d /src/supplemental/http/http_conn.c | |
| parent | c34abc224e572b19fb5aa1b5afc8841705485d14 (diff) | |
| download | nng-d88484cafbf973d55dc95b7edcae5064efa8bad0.tar.gz nng-d88484cafbf973d55dc95b7edcae5064efa8bad0.tar.bz2 nng-d88484cafbf973d55dc95b7edcae5064efa8bad0.zip | |
http: fix mishandling of very long headers or URIs, and mishandling of unicode
Also, nng_err is now a distinct type which might be nicer in debuggers.
Diffstat (limited to 'src/supplemental/http/http_conn.c')
| -rw-r--r-- | src/supplemental/http/http_conn.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/supplemental/http/http_conn.c b/src/supplemental/http/http_conn.c index e143d9b3..d4cea914 100644 --- a/src/supplemental/http/http_conn.c +++ b/src/supplemental/http/http_conn.c @@ -260,12 +260,22 @@ http_rd_buf(nni_http_conn *conn, nni_aio *aio) if (rv == NNG_EAGAIN) { nni_iov iov1; http_buf_pull_up(conn); + if (conn->rd_put == conn->bufsz) { + nng_http_set_status(conn, + conn->req.data.parsed + ? NNG_HTTP_STATUS_HEADERS_TOO_LARGE + : NNG_HTTP_STATUS_URI_TOO_LONG, + NULL); + // leave a "header" so we don't confuse parsing + // We want to ensure this is an overlong + // request. + strcpy((char *) conn->buf, "NNG-DISCARD: X"); + conn->rd_get = 0; + conn->rd_put = strlen((char *) conn->buf); + } iov1.iov_buf = conn->buf + conn->rd_put; iov1.iov_len = conn->bufsz - conn->rd_put; conn->buffered = true; - if (iov1.iov_len == 0) { - return (NNG_EMSGSIZE); - } nni_aio_set_iov(&conn->rd_aio, 1, &iov1); nng_stream_recv(conn->sock, &conn->rd_aio); } @@ -702,7 +712,7 @@ http_snprintf(nng_http *conn, char *buf, size_t sz) n = http_sprintf_headers(buf, sz, hdrs); len += n; - if (len < sz) { + if (n < sz) { sz -= n; buf += n; } else { |
