diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-03-30 22:35:37 -0400 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-07-15 22:23:47 -0400 |
commit | 851d4e2a67efb2c8777df151b697391ff1a76af0 (patch) | |
tree | 2982a963e3032fa7e9ec23b53669e7fc2add5c92 /src/journal-remote/journal-remote.c | |
parent | 5c879495eab608bf9b6e7bec1020d916a0503b6e (diff) |
journal-remote: reject fields above maximum size
Also fix an infinite loop on E2BIG.
Remember what range we already scanned for '\n', to avoid
quadratic behaviour on long "text" fields.
Diffstat (limited to 'src/journal-remote/journal-remote.c')
-rw-r--r-- | src/journal-remote/journal-remote.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/journal-remote/journal-remote.c b/src/journal-remote/journal-remote.c index de327cc3fd..09144eaa97 100644 --- a/src/journal-remote/journal-remote.c +++ b/src/journal-remote/journal-remote.c @@ -412,25 +412,28 @@ static int process_http_upload( log_info("Received %zu bytes", *upload_data_size); r = push_data(source, upload_data, *upload_data_size); - if (r < 0) { - log_error("Failed to store received data of size %zu: %s", - *upload_data_size, strerror(-r)); + if (r < 0) return mhd_respond_oom(connection); - } + *upload_data_size = 0; } else finished = true; while (true) { r = process_source(source, &server->writer, arg_compress, arg_seal); - if (r == -E2BIG) - log_warning("Entry too big, skipped"); - else if (r == -EAGAIN || r == -EWOULDBLOCK) + if (r == -EAGAIN || r == -EWOULDBLOCK) break; else if (r < 0) { log_warning("Failed to process data for connection %p", connection); - return mhd_respondf(connection, MHD_HTTP_UNPROCESSABLE_ENTITY, - "Processing failed: %s", strerror(-r)); + if (r == -E2BIG) + return mhd_respondf(connection, + MHD_HTTP_REQUEST_ENTITY_TOO_LARGE, + "Entry is too large, maximum is %u bytes.\n", + DATA_SIZE_MAX); + else + return mhd_respondf(connection, + MHD_HTTP_UNPROCESSABLE_ENTITY, + "Processing failed: %s.", strerror(-r)); } } |