4bff0a
From d212765dc94ba25c04e0e9a278586f0e86851e35 Mon Sep 17 00:00:00 2001
4bff0a
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
4bff0a
Date: Sat, 11 Aug 2018 08:32:20 +0200
4bff0a
Subject: [PATCH] bus-message: fix skipping of array fields in !gvariant
4bff0a
 messages
4bff0a
4bff0a
We copied part of the string into a buffer that was off by two.
4bff0a
If the element signature had length one, we'd copy 0 bytes and crash when
4bff0a
looking at the "first" byte. Otherwise, we would crash because strncpy would
4bff0a
not terminate the string.
4bff0a
4bff0a
(cherry picked from commit 73777ddba5100fe6c0791cd37a91f24a515f3202)
4bff0a
4bff0a
Resolves: #1696224
4bff0a
---
4bff0a
 src/libsystemd/sd-bus/bus-message.c               |   8 ++++----
4bff0a
 ...crash-37449529b1ad867f0c2671fa80aca5d7812a2b70 | Bin 0 -> 534 bytes
4bff0a
 2 files changed, 4 insertions(+), 4 deletions(-)
4bff0a
 create mode 100644 test/fuzz/fuzz-bus-message/crash-37449529b1ad867f0c2671fa80aca5d7812a2b70
4bff0a
4bff0a
diff --git a/src/libsystemd/sd-bus/bus-message.c b/src/libsystemd/sd-bus/bus-message.c
4bff0a
index 09e72d89dd..202f1aab30 100644
4bff0a
--- a/src/libsystemd/sd-bus/bus-message.c
4bff0a
+++ b/src/libsystemd/sd-bus/bus-message.c
4bff0a
@@ -4981,18 +4981,18 @@ static int message_skip_fields(
4bff0a
 
4bff0a
                 } else if (t == SD_BUS_TYPE_ARRAY) {
4bff0a
 
4bff0a
-                        r = signature_element_length(*signature+1, &l);
4bff0a
+                        r = signature_element_length(*signature + 1, &l);
4bff0a
                         if (r < 0)
4bff0a
                                 return r;
4bff0a
 
4bff0a
                         assert(l >= 1);
4bff0a
                         {
4bff0a
-                                char sig[l-1], *s;
4bff0a
+                                char sig[l + 1], *s = sig;
4bff0a
                                 uint32_t nas;
4bff0a
                                 int alignment;
4bff0a
 
4bff0a
-                                strncpy(sig, *signature + 1, l-1);
4bff0a
-                                s = sig;
4bff0a
+                                strncpy(sig, *signature + 1, l);
4bff0a
+                                sig[l] = '\0';
4bff0a
 
4bff0a
                                 alignment = bus_type_get_alignment(sig[0]);
4bff0a
                                 if (alignment < 0)
4bff0a
diff --git a/test/fuzz/fuzz-bus-message/crash-37449529b1ad867f0c2671fa80aca5d7812a2b70 b/test/fuzz/fuzz-bus-message/crash-37449529b1ad867f0c2671fa80aca5d7812a2b70
4bff0a
new file mode 100644
4bff0a
index 0000000000000000000000000000000000000000..6a20265a39e1b4a318b50aee2b13727ddc4113bf
4bff0a
GIT binary patch
4bff0a
literal 534
4bff0a
zcmc~{WMHggWMD`aVqj=xU|>*W&P&W-;Q0Fg|9>Elfq|V9OfmRED27Bi2!jjC2Wn-|
4bff0a
z17hYPAOVtNW-Ml42GVKy`9P9^ffdMS1=8h-IVt%J91NTwNgyEFV4&K>#6$*=MMgl(
4bff0a
r%#fH?l1eMv=;=K=_yi-CK!KUB2_%6r0c0u^mlS2@rGxk|0FGY(dwVLU
4bff0a
4bff0a
literal 0
4bff0a
HcmV?d00001
4bff0a