From f551c05e4799386508e10f0f007251e426493a67 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 11 Mar 2019 12:27:18 +0900 Subject: [PATCH] journal-remote: do not request Content-Length if Transfer-Encoding is chunked This fixes a bug introduced by 7fdb237f5473cb8fc2129e57e8a0039526dcb4fd. Closes #11571. (cherry picked from commit a289dfd69b3ff4bccdde93e84b67c947bafa27e1) Resolves: #1708849 --- src/journal-remote/journal-remote-main.c | 41 ++++++++++++++++-------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/journal-remote/journal-remote-main.c b/src/journal-remote/journal-remote-main.c index 5b0bbba310..47fe9d7433 100644 --- a/src/journal-remote/journal-remote-main.c +++ b/src/journal-remote/journal-remote-main.c @@ -254,6 +254,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); @@ -279,21 +280,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;