|
Pablo Greco |
48fc63 |
From 1c53e6f5a6bf9ecd5196518fc824af22c6996141 Mon Sep 17 00:00:00 2001
|
|
Pablo Greco |
48fc63 |
From: Lennart Poettering <lennart@poettering.net>
|
|
Pablo Greco |
48fc63 |
Date: Wed, 13 Feb 2019 16:51:22 +0100
|
|
Pablo Greco |
48fc63 |
Subject: [PATCH] sd-bus: if we receive an invalid dbus message, ignore and
|
|
Pablo Greco |
48fc63 |
proceeed
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
dbus-daemon might have a slightly different idea of what a valid msg is
|
|
Pablo Greco |
48fc63 |
than us (for example regarding valid msg and field sizes). Let's hence
|
|
Pablo Greco |
48fc63 |
try to proceed if we can and thus drop messages rather than fail the
|
|
Pablo Greco |
48fc63 |
connection if we fail to validate a message.
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
Hopefully the differences in what is considered valid are not visible
|
|
Pablo Greco |
48fc63 |
for real-life usecases, but are specific to exploit attempts only.
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
(cherry-picked from commit 6d586a13717ae057aa1b4127400c3de61cd5b9e7)
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
Related: #1667871
|
|
Pablo Greco |
48fc63 |
---
|
|
Pablo Greco |
48fc63 |
src/libsystemd/sd-bus/bus-socket.c | 9 ++++++---
|
|
Pablo Greco |
48fc63 |
1 file changed, 6 insertions(+), 3 deletions(-)
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
|
|
Pablo Greco |
48fc63 |
index ab56ef4f33..4437024bb9 100644
|
|
Pablo Greco |
48fc63 |
--- a/src/libsystemd/sd-bus/bus-socket.c
|
|
Pablo Greco |
48fc63 |
+++ b/src/libsystemd/sd-bus/bus-socket.c
|
|
Pablo Greco |
48fc63 |
@@ -879,7 +879,7 @@ static int bus_socket_read_message_need(sd_bus *bus, size_t *need) {
|
|
Pablo Greco |
48fc63 |
}
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
static int bus_socket_make_message(sd_bus *bus, size_t size) {
|
|
Pablo Greco |
48fc63 |
- sd_bus_message *t;
|
|
Pablo Greco |
48fc63 |
+ sd_bus_message *t = NULL;
|
|
Pablo Greco |
48fc63 |
void *b;
|
|
Pablo Greco |
48fc63 |
int r;
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
@@ -905,7 +905,9 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) {
|
|
Pablo Greco |
48fc63 |
NULL,
|
|
Pablo Greco |
48fc63 |
NULL,
|
|
Pablo Greco |
48fc63 |
&t);
|
|
Pablo Greco |
48fc63 |
- if (r < 0) {
|
|
Pablo Greco |
48fc63 |
+ if (r == -EBADMSG)
|
|
Pablo Greco |
48fc63 |
+ log_debug_errno(r, "Received invalid message from connection %s, dropping.", strna(bus->description));
|
|
Pablo Greco |
48fc63 |
+ else if (r < 0) {
|
|
Pablo Greco |
48fc63 |
free(b);
|
|
Pablo Greco |
48fc63 |
return r;
|
|
Pablo Greco |
48fc63 |
}
|
|
Pablo Greco |
48fc63 |
@@ -916,7 +918,8 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) {
|
|
Pablo Greco |
48fc63 |
bus->fds = NULL;
|
|
Pablo Greco |
48fc63 |
bus->n_fds = 0;
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
- bus->rqueue[bus->rqueue_size++] = t;
|
|
Pablo Greco |
48fc63 |
+ if (t)
|
|
Pablo Greco |
48fc63 |
+ bus->rqueue[bus->rqueue_size++] = t;
|
|
Pablo Greco |
48fc63 |
|
|
Pablo Greco |
48fc63 |
return 1;
|
|
Pablo Greco |
48fc63 |
}
|