|
|
23b3cf |
From 95ec0c76b4ee758012bc6c282c5299baee5ae451 Mon Sep 17 00:00:00 2001
|
|
|
23b3cf |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
23b3cf |
Date: Thu, 3 Jan 2019 16:28:30 +0100
|
|
|
23b3cf |
Subject: [PATCH] journal-remote: set a limit on the number of fields in a
|
|
|
23b3cf |
message
|
|
|
23b3cf |
|
|
|
23b3cf |
Existing use of E2BIG is replaced with ENOBUFS (entry too long), and E2BIG is
|
|
|
23b3cf |
reused for the new error condition (too many fields).
|
|
|
23b3cf |
|
|
|
23b3cf |
This matches the change done for systemd-journald, hence forming the second
|
|
|
23b3cf |
part of the fix for CVE-2018-16865
|
|
|
23b3cf |
(https://bugzilla.redhat.com/show_bug.cgi?id=1653861).
|
|
|
23b3cf |
|
|
|
23b3cf |
Resolves: #1657792
|
|
|
23b3cf |
---
|
|
|
23b3cf |
src/journal-remote/journal-remote-parse.c | 2 +-
|
|
|
23b3cf |
src/journal-remote/journal-remote-write.c | 3 +++
|
|
|
23b3cf |
src/journal-remote/journal-remote.c | 14 ++++++++++++--
|
|
|
23b3cf |
3 files changed, 16 insertions(+), 3 deletions(-)
|
|
|
23b3cf |
|
|
|
23b3cf |
diff --git a/src/journal-remote/journal-remote-parse.c b/src/journal-remote/journal-remote-parse.c
|
|
|
23b3cf |
index 64089da19..53f4e3612 100644
|
|
|
23b3cf |
--- a/src/journal-remote/journal-remote-parse.c
|
|
|
23b3cf |
+++ b/src/journal-remote/journal-remote-parse.c
|
|
|
23b3cf |
@@ -107,7 +107,7 @@ static int get_line(RemoteSource *source, char **line, size_t *size) {
|
|
|
23b3cf |
source->scanned = source->filled;
|
|
|
23b3cf |
if (source->scanned >= DATA_SIZE_MAX) {
|
|
|
23b3cf |
log_error("Entry is bigger than %u bytes.", DATA_SIZE_MAX);
|
|
|
23b3cf |
- return -E2BIG;
|
|
|
23b3cf |
+ return -ENOBUFS;
|
|
|
23b3cf |
}
|
|
|
23b3cf |
|
|
|
23b3cf |
if (source->passive_fd)
|
|
|
23b3cf |
diff --git a/src/journal-remote/journal-remote-write.c b/src/journal-remote/journal-remote-write.c
|
|
|
23b3cf |
index 99820fa7b..99920e62c 100644
|
|
|
23b3cf |
--- a/src/journal-remote/journal-remote-write.c
|
|
|
23b3cf |
+++ b/src/journal-remote/journal-remote-write.c
|
|
|
23b3cf |
@@ -22,6 +22,9 @@
|
|
|
23b3cf |
#include "journal-remote.h"
|
|
|
23b3cf |
|
|
|
23b3cf |
int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) {
|
|
|
23b3cf |
+ if (iovw->count >= ENTRY_FIELD_COUNT_MAX)
|
|
|
23b3cf |
+ return -E2BIG;
|
|
|
23b3cf |
+
|
|
|
23b3cf |
if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1))
|
|
|
23b3cf |
return log_oom();
|
|
|
23b3cf |
|
|
|
23b3cf |
diff --git a/src/journal-remote/journal-remote.c b/src/journal-remote/journal-remote.c
|
|
|
23b3cf |
index a455fb6bd..e65daf6a0 100644
|
|
|
23b3cf |
--- a/src/journal-remote/journal-remote.c
|
|
|
23b3cf |
+++ b/src/journal-remote/journal-remote.c
|
|
|
23b3cf |
@@ -524,11 +524,18 @@ static int process_http_upload(
|
|
|
23b3cf |
break;
|
|
|
23b3cf |
else if (r < 0) {
|
|
|
23b3cf |
log_warning("Failed to process data for connection %p", connection);
|
|
|
23b3cf |
- if (r == -E2BIG)
|
|
|
23b3cf |
+ if (r == -ENOBUFS)
|
|
|
23b3cf |
return mhd_respondf(connection,
|
|
|
23b3cf |
MHD_HTTP_REQUEST_ENTITY_TOO_LARGE,
|
|
|
23b3cf |
"Entry is too large, maximum is %u bytes.\n",
|
|
|
23b3cf |
DATA_SIZE_MAX);
|
|
|
23b3cf |
+
|
|
|
23b3cf |
+ else if (r == -E2BIG)
|
|
|
23b3cf |
+ return mhd_respondf(connection,
|
|
|
23b3cf |
+ MHD_HTTP_REQUEST_ENTITY_TOO_LARGE,
|
|
|
23b3cf |
+ "Entry with more fields than the maximum of %u\n",
|
|
|
23b3cf |
+ ENTRY_FIELD_COUNT_MAX);
|
|
|
23b3cf |
+
|
|
|
23b3cf |
else
|
|
|
23b3cf |
return mhd_respondf(connection,
|
|
|
23b3cf |
MHD_HTTP_UNPROCESSABLE_ENTITY,
|
|
|
23b3cf |
@@ -1043,7 +1050,10 @@ static int handle_raw_source(sd_event_source *event,
|
|
|
23b3cf |
log_debug("%zu active sources remaining", s->active);
|
|
|
23b3cf |
return 0;
|
|
|
23b3cf |
} else if (r == -E2BIG) {
|
|
|
23b3cf |
- log_notice_errno(E2BIG, "Entry too big, skipped");
|
|
|
23b3cf |
+ log_notice_errno(E2BIG, "Entry with too many fields, skipped");
|
|
|
23b3cf |
+ return 1;
|
|
|
23b3cf |
+ } else if (r == -ENOBUFS) {
|
|
|
23b3cf |
+ log_notice_errno(ENOBUFS, "Entry too big, skipped");
|
|
|
23b3cf |
return 1;
|
|
|
23b3cf |
} else if (r == -EAGAIN) {
|
|
|
23b3cf |
return 0;
|