diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-03-11 12:27:18 +0900 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2019-03-11 13:52:10 +0100 |
commit | a289dfd69b3ff4bccdde93e84b67c947bafa27e1 (patch) | |
tree | 2cff515ff7e0ef1ab708c3e4f665271d3c98223d /src/journal-remote | |
parent | 0a8321d33c34cd42f79e7dcbf6cfcbba305ac691 (diff) | |
download | systemd-a289dfd69b3ff4bccdde93e84b67c947bafa27e1.tar.gz |
journal-remote: do not request Content-Length if Transfer-Encoding is chunked
This fixes a bug introduced by 7fdb237f5473cb8fc2129e57e8a0039526dcb4fd.
Closes #11571.
Diffstat (limited to 'src/journal-remote')
-rw-r--r-- | src/journal-remote/journal-remote-main.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c index 802c3ea608..2321a91e7b 100644 --- a/src/journal-remote/journal-remote-main.c +++ b/src/journal-remote/journal-remote-main.c @@ -265,6 +265,7 @@ static int request_handler( const char *header; int r, code, fd; _cleanup_free_ char *hostname = NULL; + bool chunked = false; size_t len; assert(connection); @@ -290,21 +291,33 @@ static int request_handler( return mhd_respond(connection, MHD_HTTP_UNSUPPORTED_MEDIA_TYPE, "Content-Type: application/vnd.fdo.journal is required."); + header = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, "Transfer-Encoding"); + if (header) { + if (!strcaseeq(header, "chunked")) + return mhd_respondf(connection, 0, MHD_HTTP_BAD_REQUEST, + "Unsupported Transfer-Encoding type: %s", header); + + chunked = true; + } + header = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, "Content-Length"); - if (!header) - return mhd_respond(connection, MHD_HTTP_LENGTH_REQUIRED, - "Content-Length header is required."); - r = safe_atozu(header, &len); - if (r < 0) - return mhd_respondf(connection, r, MHD_HTTP_LENGTH_REQUIRED, - "Content-Length: %s cannot be parsed: %m", header); - - if (len > ENTRY_SIZE_MAX) - /* When serialized, an entry of maximum size might be slightly larger, - * so this does not correspond exactly to the limit in journald. Oh well. - */ - return mhd_respondf(connection, 0, MHD_HTTP_PAYLOAD_TOO_LARGE, - "Payload larger than maximum size of %u bytes", ENTRY_SIZE_MAX); + if (header) { + if (chunked) + return mhd_respond(connection, MHD_HTTP_BAD_REQUEST, + "Content-Length must not specified when Transfer-Encoding type is 'chuncked'"); + + r = safe_atozu(header, &len); + if (r < 0) + return mhd_respondf(connection, r, MHD_HTTP_LENGTH_REQUIRED, + "Content-Length: %s cannot be parsed: %m", header); + + if (len > ENTRY_SIZE_MAX) + /* When serialized, an entry of maximum size might be slightly larger, + * so this does not correspond exactly to the limit in journald. Oh well. + */ + return mhd_respondf(connection, 0, MHD_HTTP_PAYLOAD_TOO_LARGE, + "Payload larger than maximum size of %u bytes", ENTRY_SIZE_MAX); + } { const union MHD_ConnectionInfo *ci; |