!40 dbus-broker升级至35版本

From: @hongjinghao 
Reviewed-by: @licunlong 
Signed-off-by: @licunlong
This commit is contained in:
openeuler-ci-bot 2024-02-27 12:01:12 +00:00 committed by Gitee
commit c7cd3001b9
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
13 changed files with 104 additions and 511 deletions

View File

@ -10,14 +10,14 @@ Subject: [PATCH 2/2] add unit test for dbus-broker
test/dbus/util-broker.c | 138 ++++++++++++++++++++++++++++++-----
test/dbus/util-broker.h | 12 +++-
5 files changed, 401 insertions(+), 20 deletions(-)
create mode 100755 test/dbus/test-reexecute.c
create mode 100755 test/dbus/test-serialize.c
create mode 100644 test/dbus/test-reexecute.c
create mode 100644 test/dbus/test-serialize.c
diff --git a/test/dbus/meson.build b/test/dbus/meson.build
index c111283..c2d1d79 100644
index 683a653..e4ae0f1 100644
--- a/test/dbus/meson.build
+++ b/test/dbus/meson.build
@@ -67,6 +67,12 @@ test('Client Lifetime', test_lifetime)
@@ -72,6 +72,12 @@ test('Client Lifetime', test_lifetime)
test_matches = executable('test-matches', ['test-matches.c'], dependencies: [ dep_test ])
test('Signals and Matches', test_matches)
@ -31,7 +31,7 @@ index c111283..c2d1d79 100644
dbus_bin = dep_dbus.get_pkgconfig_variable('bindir') + '/dbus-daemon'
diff --git a/test/dbus/test-reexecute.c b/test/dbus/test-reexecute.c
new file mode 100755
new file mode 100644
index 0000000..43025e7
--- /dev/null
+++ b/test/dbus/test-reexecute.c
@ -158,8 +158,8 @@ index 0000000..43025e7
+ return 0;
+}
diff --git a/test/dbus/test-serialize.c b/test/dbus/test-serialize.c
new file mode 100755
index 0000000..e287647
new file mode 100644
index 0000000..22e32d6
--- /dev/null
+++ b/test/dbus/test-serialize.c
@@ -0,0 +1,144 @@
@ -308,7 +308,7 @@ index 0000000..e287647
+ return 0;
+}
diff --git a/test/dbus/util-broker.c b/test/dbus/util-broker.c
index 0bdcefc..5d33b52 100644
index 3cb4e1d..9b1ec74 100644
--- a/test/dbus/util-broker.c
+++ b/test/dbus/util-broker.c
@@ -15,6 +15,7 @@
@ -402,14 +402,14 @@ index 0bdcefc..5d33b52 100644
"a(btbs)" \
@@ -59,7 +125,7 @@ static int util_event_sigchld(sd_event_source *source, const siginfo_t *si, void
"a(ss)" \
"b"
"bs"
-static int util_append_policy(sd_bus_message *m) {
+int util_append_policy(sd_bus_message *m) {
int r;
r = sd_bus_message_open_container(m, 'v', "(" POLICY_T ")");
@@ -165,18 +231,49 @@ static int util_method_reload_config(sd_bus_message *message, void *userdata, sd
@@ -171,18 +237,49 @@ static int util_method_reload_config(sd_bus_message *message, void *userdata, sd
return sd_bus_reply_method_return(message, NULL);
}
@ -461,7 +461,7 @@ index 0bdcefc..5d33b52 100644
int r, pair[2];
pid_t pid;
@@ -214,7 +311,13 @@ void util_fork_broker(sd_bus **busp, sd_event *event, int listener_fd, pid_t *pi
@@ -220,7 +317,13 @@ void util_fork_broker(sd_bus **busp, sd_event *event, int listener_fd, pid_t *pi
if (pidp)
*pidp = pid;
@ -476,7 +476,7 @@ index 0bdcefc..5d33b52 100644
c_assert(r >= 0);
r = sd_bus_new(&bus);
@@ -223,11 +326,12 @@ void util_fork_broker(sd_bus **busp, sd_event *event, int listener_fd, pid_t *pi
@@ -229,11 +332,12 @@ void util_fork_broker(sd_bus **busp, sd_event *event, int listener_fd, pid_t *pi
/* consumes the fd */
r = sd_bus_set_fd(bus, pair[0], pair[0]);
c_assert(r >= 0);
@ -490,7 +490,7 @@ index 0bdcefc..5d33b52 100644
c_assert(r >= 0);
r = sd_bus_start(bus);
@@ -381,10 +485,16 @@ static void *util_broker_thread(void *userdata) {
@@ -387,10 +491,16 @@ static void *util_broker_thread(void *userdata) {
r = sd_event_add_signal(event, NULL, SIGUSR1, util_event_sigusr1, broker);
c_assert(r >= 0);
@ -508,7 +508,7 @@ index 0bdcefc..5d33b52 100644
broker->listener_fd = c_close(broker->listener_fd);
} else {
c_assert(broker->listener_fd < 0);
@@ -478,18 +588,7 @@ void util_broker_spawn(Broker *broker) {
@@ -484,18 +594,7 @@ void util_broker_spawn(Broker *broker) {
* run and babysit the broker.
*/
@ -528,7 +528,7 @@ index 0bdcefc..5d33b52 100644
r = pthread_create(&broker->thread, NULL, util_broker_thread, broker);
c_assert(r >= 0);
}
@@ -512,6 +611,7 @@ void util_broker_terminate(Broker *broker) {
@@ -518,6 +617,7 @@ void util_broker_terminate(Broker *broker) {
r = pthread_join(broker->thread, &value);
c_assert(!r);
@ -574,5 +574,5 @@ index a3f5f49..fa6de9d 100644
/* broker */
--
2.30.2
2.33.0

View File

@ -1,45 +0,0 @@
From af6bf48ba27408725d14378e4a11139106506f3b Mon Sep 17 00:00:00 2001
From: David Rheinsberg <david@readahead.eu>
Date: Mon, 12 Jun 2023 10:56:31 +0200
Subject: [PATCH] bus/peer: fix catching OOM when linking match-rules
When the match-rule infrastructure was extended to have per-key lookup
tables, all call-sites had to be amended to catch errors when linking
new rules. One such site was missed, so fix this and catch the error
properly.
The conversion was initially performed in:
commit 6c2b082522a6af033cd6699b669a4de614c41ad7
Author: Tom Gundersen <teg@jklm.no>
Date: Wed Apr 25 17:16:47 2018 +0200
match: make match_rule_link() fallible
This fixes a possible bug where ENOMEM is ignored and thus a match rule
is silently dropped instead of being linked and retained.
Reported-by: Mark Esler <mark.esler@canonical.com>
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/bus/peer.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/bus/peer.c b/src/bus/peer.c
index 1867223..9de3566 100644
--- a/src/bus/peer.c
+++ b/src/bus/peer.c
@@ -548,7 +548,9 @@ static int peer_link_match(Peer *peer, MatchRule *rule, bool monitor) {
case ADDRESS_TYPE_ID: {
sender = peer_registry_find_peer(&peer->bus->peers, addr.id);
if (sender) {
- match_rule_link(rule, &sender->sender_matches, monitor);
+ r = match_rule_link(rule, &sender->sender_matches, monitor);
+ if (r)
+ return error_fold(r);
} else if (addr.id >= peer->bus->peers.ids) {
/*
* This peer does not yet exist, by the same
--
2.33.0

View File

@ -1,32 +0,0 @@
From 743db9327bf8223dba59b1b666ba547a14e18afb Mon Sep 17 00:00:00 2001
From: Luca Boccassi <bluca@debian.org>
Date: Tue, 4 Apr 2023 01:58:02 +0100
Subject: [PATCH] dbus/socket: set msgheader controllen size using the right
macro
Use CMSG_SPACE to set the size of msg_controllen when sending FDs.
CMSG_LEN was used implicicly before, which for 1 FD is 20 bytes,
while CMSG_SPACE is 24 bytes.
Signed-off-by: Luca Boccassi <bluca@debian.org>
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/dbus/socket.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/dbus/socket.c b/src/dbus/socket.c
index d429588..85eedda 100644
--- a/src/dbus/socket.c
+++ b/src/dbus/socket.c
@@ -806,7 +806,7 @@ static int socket_dispatch_write(Socket *socket) {
buffer->message->fds &&
socket_buffer_is_uncomsumed(buffer)) {
msg->msg_control = buffer->message->fds->cmsg;
- msg->msg_controllen = buffer->message->fds->cmsg->cmsg_len;
+ msg->msg_controllen = fdlist_size(buffer->message->fds);
} else {
msg->msg_control = NULL;
msg->msg_controllen = 0;
--
2.33.0

View File

@ -1,42 +0,0 @@
From c2f07184beddb26d7e62c4c32d6503ad47830152 Mon Sep 17 00:00:00 2001
From: David Rheinsberg <david@readahead.eu>
Date: Wed, 5 Jul 2023 09:41:11 +0200
Subject: [PATCH] launch/config: avoid expat.h in header
To reduce exposure of expat, avoid it in config.h. The only definition
we use can be easily forward-declared, and thus we can completely
contain expat in config.c.
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/launch/config.h | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/launch/config.h b/src/launch/config.h
index c36819d..881974a 100644
--- a/src/launch/config.h
+++ b/src/launch/config.h
@@ -6,9 +6,10 @@
#include <c-list.h>
#include <c-stdaux.h>
-#include <expat.h>
#include <stdlib.h>
+struct XML_ParserStruct;
+
typedef struct ConfigPath ConfigPath;
typedef struct ConfigNode ConfigNode;
typedef struct ConfigParser ConfigParser;
@@ -218,7 +219,7 @@ struct ConfigRoot {
}
struct ConfigParser {
- XML_Parser xml;
+ struct XML_ParserStruct *xml;
struct ConfigState {
NSSCache *nss;
--
2.33.0

View File

@ -1,73 +0,0 @@
This fixes an issue where libexpat might read from `/dev/urandom` and
thus block until the entropy pool is initialized. This hidden
dependency is very hard to debug. Instead, we require the service
launcher to delay startup until suitable entropy is available. This
explicit dependency is much easier to manage, debug, and control.
Reported-by: Stefan Agner <stefan@agner.ch>
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/launch/config.c | 17 +++++++++++++++++
src/launch/config.h | 1 +
2 files changed, 18 insertions(+)
diff --git a/src/launch/config.c b/src/launch/config.c
index 85521bd..4a6a11e 100644
--- a/src/launch/config.c
+++ b/src/launch/config.c
@@ -6,6 +6,7 @@
#include <c-stdaux.h>
#include <expat.h>
#include <stdlib.h>
+#include <sys/auxv.h>
#include "dbus/protocol.h"
#include "launch/config.h"
#include "launch/nss-cache.h"
@@ -1216,9 +1217,24 @@ static void config_parser_blob_fn(void *userdata, const XML_Char *data, int n_da
* config_parser_init() - XXX
*/
void config_parser_init(ConfigParser *parser) {
+ void *random;
+
*parser = (ConfigParser)CONFIG_PARSER_NULL(*parser);
parser->xml = XML_ParserCreate(NULL);
+
+ /*
+ * The hash-tables of libexpat require a reliable random seed.
+ * Depending on libexpat compilation flags, this might end up using
+ * `/dev/urandom` and thus block until random-initialization is
+ * finished. We avoid this hidden dependency and instead use the
+ * entropy provided via `AT_RANDOM`. Hence, entropy availability is
+ * tightly coupled to process startup, and it is the job of the
+ * service manager to order processes accordingly.
+ */
+ random = (void *)getauxval(AT_RANDOM);
+ c_assert(random);
+ c_memcpy(&parser->salt, random, sizeof(parser->salt));
}
/**
@@ -1262,6 +1278,7 @@ static int config_parser_include(ConfigParser *parser, ConfigRoot *root, ConfigN
}
XML_ParserReset(parser->xml, NULL);
+ XML_SetHashSalt(parser->xml, parser->salt);
XML_SetUserData(parser->xml, &parser->state);
XML_SetElementHandler(parser->xml, config_parser_begin_fn, config_parser_end_fn);
XML_SetCharacterDataHandler(parser->xml, config_parser_blob_fn);
diff --git a/src/launch/config.h b/src/launch/config.h
index 4c8df18..8ae9be6 100644
--- a/src/launch/config.h
+++ b/src/launch/config.h
@@ -216,6 +216,7 @@ struct ConfigRoot {
struct ConfigParser {
struct XML_ParserStruct *xml;
+ unsigned long salt;
struct ConfigState {
NSSCache *nss;
--
2.33.0

View File

@ -1,33 +0,0 @@
From b0096d204afcd5fd096ec35a8f7ab113bcc5ab95 Mon Sep 17 00:00:00 2001
From: Luca Boccassi <bluca@debian.org>
Date: Tue, 4 Apr 2023 13:36:46 +0100
Subject: [PATCH] util/fdlist: add helper to return list size
Provide a new helper to return the space occupied by a full FDList. This
includes trailing padding and is required for cmsg-based transactions.
Signed-off-by: Luca Boccassi <bluca@debian.org>
(fix commit message)
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/util/fdlist.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/util/fdlist.h b/src/util/fdlist.h
index 33ff73c..233ffc0 100644
--- a/src/util/fdlist.h
+++ b/src/util/fdlist.h
@@ -33,6 +33,10 @@ static inline size_t fdlist_count(FDList *list) {
return list ? (list->cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int) : 0;
}
+static inline size_t fdlist_size(FDList *list) {
+ return list ? CMSG_SPACE(fdlist_count(list) * sizeof(int)) : 0;
+}
+
static inline int fdlist_get(FDList *list, size_t index) {
return index < fdlist_count(list) ? fdlist_data(list)[index] : -1;
}
--
2.33.0

View File

@ -1,39 +0,0 @@
From 01a500868f3343489c8b4af08e0e352874bdb04e Mon Sep 17 00:00:00 2001
From: David Rheinsberg <david@readahead.eu>
Date: Mon, 12 Jun 2023 12:09:12 +0200
Subject: [PATCH] util/selinux: follow permissive mode
Make sure to follow the rules of enforcing/permissive mode and avoid
operation denials in permissive mode.
Reported-by: Daan De Meyer <daan.j.demeyer@gmail.com>
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/util/selinux.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/util/selinux.c b/src/util/selinux.c
index 4b61ec7..a72cc0a 100644
--- a/src/util/selinux.c
+++ b/src/util/selinux.c
@@ -242,7 +242,7 @@ int bus_selinux_check_own(BusSELinuxRegistry *registry,
"dbus",
"acquire_svc",
NULL);
- if (r < 0) {
+ if (r < 0 && bus_selinux_is_enforcing()) {
/*
* Treat unknown contexts (possibly due to policy reload)
* as access denied.
@@ -289,7 +289,7 @@ int bus_selinux_check_send(BusSELinuxRegistry *registry,
"dbus",
"send_msg",
NULL);
- if (r < 0) {
+ if (r < 0 && bus_selinux_is_enforcing()) {
/*
* Treat unknown contexts (possibly due to policy reload)
* as access denied.
--
2.33.0

View File

@ -1,72 +0,0 @@
From df23f09376386fbdefb4bcc049c1c81a9a893baf Mon Sep 17 00:00:00 2001
From: David Rheinsberg <david@readahead.eu>
Date: Mon, 12 Jun 2023 12:04:47 +0200
Subject: [PATCH] util/selinux: provide helper to check enforcing mode
Add a new helper to check the selinux enforcing mode. This will be used
in follow-ups to avoid AVC denials in permissive mode.
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/util/selinux-fallback.c | 4 ++++
src/util/selinux.c | 16 ++++++++++++++++
src/util/selinux.h | 1 +
3 files changed, 21 insertions(+)
diff --git a/src/util/selinux-fallback.c b/src/util/selinux-fallback.c
index ec4d458..0654a07 100644
--- a/src/util/selinux-fallback.c
+++ b/src/util/selinux-fallback.c
@@ -16,6 +16,10 @@ bool bus_selinux_is_enabled(void) {
return false;
}
+bool bus_selinux_is_enforcing(void) {
+ return false;
+}
+
const char *bus_selinux_policy_root(void) {
return NULL;
}
diff --git a/src/util/selinux.c b/src/util/selinux.c
index f8b4c8a..4b61ec7 100644
--- a/src/util/selinux.c
+++ b/src/util/selinux.c
@@ -38,6 +38,22 @@ bool bus_selinux_is_enabled(void) {
return is_selinux_enabled();
}
+/**
+ * bus_selinux_is_enforcing() - checks if SELinux is in enforcing mode
+ *
+ * If selinux is not enabled or otherwise unavailable, this will return true.
+ * That is, this will only return false, if selinux is enabled and in
+ * permissive mode.
+ *
+ * Returns: true if SELinux is in enforcing mode, false otherwise.
+ */
+bool bus_selinux_is_enforcing(void) {
+ if (bus_selinux_status_open)
+ return selinux_status_getenforce() != 0;
+ else
+ return security_getenforce() != 0;
+}
+
/**
* bus_selinux_policy_root() - the root directory where the current SELinux policy can be found
*
diff --git a/src/util/selinux.h b/src/util/selinux.h
index 9a71e90..435c8a8 100644
--- a/src/util/selinux.h
+++ b/src/util/selinux.h
@@ -16,6 +16,7 @@ enum {
};
bool bus_selinux_is_enabled(void);
+bool bus_selinux_is_enforcing(void);
const char *bus_selinux_policy_root(void);
int bus_selinux_registry_new(BusSELinuxRegistry **registryp, const char *fallback_context);
--
2.33.0

View File

@ -1,68 +0,0 @@
Subject: [PATCH] util/selinux: try opening the status page
Try opening the selinux status page for faster access to selinux status
values. If running on older kernels without the status page, simply
avoid using it.
Signed-off-by: David Rheinsberg <david@readahead.eu>
---
src/util/selinux.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/src/util/selinux.c b/src/util/selinux.c
index 0264ea7..ea6af75 100644
--- a/src/util/selinux.c
+++ b/src/util/selinux.c
@@ -27,6 +27,7 @@ struct BusSELinuxName {
typedef struct BusSELinuxName BusSELinuxName;
static bool bus_selinux_avc_open;
+static bool bus_selinux_status_open;
/** bus_selinux_is_enabled() - checks if SELinux is currently enabled
*
@@ -360,6 +361,29 @@ int bus_selinux_init_global(void) {
bus_selinux_avc_open = true;
}
+ if (!bus_selinux_status_open) {
+ r = selinux_status_open(0);
+ if (r == 0) {
+ /*
+ * The status page was successfully opened and can now
+ * be used for faster selinux status-checks.
+ */
+ bus_selinux_status_open = true;
+ } else if (r > 0) {
+ /*
+ * >0 indicates success but with the netlink-fallback.
+ * We didn't request the netlink-fallback, so close the
+ * status-page again and treat it as unavailable.
+ */
+ selinux_status_close();
+ } else {
+ /*
+ * If the status page could not be opened, treat it as
+ * unavailable and use the slower fallback functions.
+ */
+ }
+ }
+
selinux_set_callback(SELINUX_CB_LOG, (union selinux_callback)bus_selinux_log);
/* XXX: set audit callback to get more metadata in the audit log? */
@@ -378,6 +402,11 @@ void bus_selinux_deinit_global(void) {
if (!is_selinux_enabled())
return;
+ if (bus_selinux_status_open) {
+ selinux_status_close();
+ bus_selinux_status_open = false;
+ }
+
if (bus_selinux_avc_open) {
avc_destroy();
bus_selinux_avc_open = false;
--
2.33.0

Binary file not shown.

BIN
dbus-broker-35.tar.xz Normal file

Binary file not shown.

View File

@ -1,21 +1,16 @@
Name: dbus-broker
Version: 31
Release: 6
Version: 35
Release: 1
Summary: Linux D-Bus Message Broker
License: Apache-2.0
URL: https://github.com/bus1/dbus-broker
Source0: https://github.com/bus1/dbus-broker/releases/download/v%{version}/%{name}-%{version}.tar.xz
Patch0001: enable-dbus-broker-to-reexecute.patch
Patch0002: add-unit-test-for-dbus-broker.patch
Patch0003: backport-bus-peer-fix-catching-OOM-when-linking-match-rules.patch
Patch0004: backport-dbus-socket-set-msgheader-controllen-size-using-the-.patch
Patch0005: backport-launch-config-avoid-expat.h-in-header.patch
Patch0006: backport-util-fdlist-add-helper-to-return-list-size.patch
Patch0007: backport-util-selinux-follow-permissive-mode.patch
Patch0008: backport-util-selinux-provide-helper-to-check-enforcing-mode.patch
Patch0009: backport-util-selinux-try-opening-the-status-page.patch
Patch0010: backport-launch-config-use-AT_RANDOM-for-XML-hash-salt.patch
# Patches from upstream use Patch0001
# Patches from openEuler use Patch8001
Patch8001: enable-dbus-broker-to-reexecute.patch
Patch8002: add-unit-test-for-dbus-broker.patch
BuildRequires: cmake gcc glibc-devel meson python-docutils dbus
BuildRequires: pkgconfig(expat) pkgconfig(libsystemd) pkgconfig(libselinux)
@ -93,8 +88,12 @@ fi
%{_userunitdir}/dbus-broker.service
%changelog
* Tue Feb 27 2024 hongjinghao<hongjinghao@huawei.com> - 35-1
- upgrade to 35
* Sat Oct 7 2023 hongjinghao<hongjinghao@huawei.com> - 31-6
- Fix buffer leakage
* Wed Aug 9 2023 hongjinghao<hongjinghao@huawei.com> - 31-5
- sync patches from dbus-broker community

View File

@ -21,7 +21,7 @@ Subject: [PATCH 1/2] enable dbus-broker to reexecute
src/dbus/connection.h | 1 +
src/dbus/socket.c | 2 +-
src/dbus/socket.h | 1 +
src/launch/launcher.c | 213 +++++++++++++++---
src/launch/launcher.c | 212 +++++++++++++++---
src/launch/launcher.h | 6 +-
src/launch/main.c | 119 +++++++++-
src/meson.build | 1 +
@ -31,12 +31,12 @@ Subject: [PATCH 1/2] enable dbus-broker to reexecute
src/util/serialize.h | 39 ++++
src/util/string.c | 79 +++++++
src/util/string.h | 3 +
27 files changed, 1305 insertions(+), 51 deletions(-)
27 files changed, 1304 insertions(+), 51 deletions(-)
create mode 100644 src/util/serialize.c
create mode 100644 src/util/serialize.h
diff --git a/src/broker/broker.c b/src/broker/broker.c
index 49f2680..51c7e8f 100644
index 7a56fa7..eba2970 100644
--- a/src/broker/broker.c
+++ b/src/broker/broker.c
@@ -10,6 +10,7 @@
@ -182,7 +182,7 @@ index 49f2680..51c7e8f 100644
broker->signals_file = (DispatchFile)DISPATCH_FILE_NULL(broker->signals_file);
broker->controller = (Controller)CONTROLLER_NULL(broker->controller);
@@ -200,7 +307,6 @@ int broker_run(Broker *broker) {
@@ -210,7 +317,6 @@ int broker_run(Broker *broker) {
sigemptyset(&signew);
sigaddset(&signew, SIGTERM);
sigaddset(&signew, SIGINT);
@ -190,7 +190,7 @@ index 49f2680..51c7e8f 100644
sigprocmask(SIG_BLOCK, &signew, &sigold);
r = connection_open(&broker->controller.connection);
@@ -209,6 +315,12 @@ int broker_run(Broker *broker) {
@@ -219,6 +325,12 @@ int broker_run(Broker *broker) {
else if (r)
return error_fold(r);
@ -203,7 +203,7 @@ index 49f2680..51c7e8f 100644
do {
r = dispatch_context_dispatch(&broker->dispatcher);
if (r == DISPATCH_E_EXIT)
@@ -217,8 +329,20 @@ int broker_run(Broker *broker) {
@@ -227,8 +339,20 @@ int broker_run(Broker *broker) {
r = MAIN_FAILED;
else
r = error_fold(r);
@ -224,7 +224,7 @@ index 49f2680..51c7e8f 100644
peer_registry_flush(&broker->bus.peers);
k = broker_log_metrics(broker);
@@ -248,3 +372,24 @@ int broker_reload_config(Broker *broker, User *sender_user, uint64_t sender_id,
@@ -258,3 +382,24 @@ int broker_reload_config(Broker *broker, User *sender_user, uint64_t sender_id,
return 0;
}
@ -326,7 +326,7 @@ index a38f597..a6bca1a 100644
}
+int deserialize_broker(Broker *broker, int mem_fd);
diff --git a/src/broker/controller-dbus.c b/src/broker/controller-dbus.c
index 449151d..3c3ab7d 100644
index 68be2bc..504a35d 100644
--- a/src/broker/controller-dbus.c
+++ b/src/broker/controller-dbus.c
@@ -11,6 +11,7 @@
@ -337,7 +337,7 @@ index 449151d..3c3ab7d 100644
#include "dbus/connection.h"
#include "dbus/message.h"
#include "dbus/protocol.h"
@@ -271,8 +272,18 @@ static int controller_method_add_listener(Controller *controller, const char *_p
@@ -273,8 +274,18 @@ static int controller_method_add_listener(Controller *controller, const char *_p
policy = NULL;
fdlist_steal(fds, fd_index);
@ -356,7 +356,7 @@ index 449151d..3c3ab7d 100644
return 0;
}
@@ -520,6 +531,12 @@ static int controller_dispatch_reply(Controller *controller, uint32_t serial, co
@@ -528,6 +539,12 @@ static int controller_dispatch_reply(Controller *controller, uint32_t serial, co
ControllerReload *reload;
int r;
@ -369,7 +369,7 @@ index 449151d..3c3ab7d 100644
reload = controller_find_reload(controller, serial);
if (!reload)
return CONTROLLER_E_UNEXPECTED_REPLY;
@@ -781,3 +798,47 @@ int controller_dbus_send_reload(Controller *controller, User *user, uint32_t ser
@@ -789,3 +806,47 @@ int controller_dbus_send_reload(Controller *controller, User *user, uint32_t ser
return 0;
}
@ -418,7 +418,7 @@ index 449151d..3c3ab7d 100644
+ return 0;
+}
diff --git a/src/broker/controller.c b/src/broker/controller.c
index 450c4ad..6a67077 100644
index b9ce927..6ee2f62 100644
--- a/src/broker/controller.c
+++ b/src/broker/controller.c
@@ -373,6 +373,22 @@ int controller_request_reload(Controller *controller,
@ -445,10 +445,10 @@ index 450c4ad..6a67077 100644
* controller_find_name() - XXX
*/
diff --git a/src/broker/controller.h b/src/broker/controller.h
index a353003..ea680bc 100644
index c3d18f0..acb550e 100644
--- a/src/broker/controller.h
+++ b/src/broker/controller.h
@@ -139,6 +139,10 @@ int controller_request_reload(Controller *controller,
@@ -153,6 +153,10 @@ int controller_request_reload(Controller *controller,
User *user,
uint64_t sender_id,
uint32_t sender_serial);
@ -459,7 +459,7 @@ index a353003..ea680bc 100644
ControllerName *controller_find_name(Controller *controller, const char *path);
ControllerListener *controller_find_listener(Controller *controller, const char *path);
ControllerReload *controller_find_reload(Controller *controller, uint32_t serial);
@@ -146,6 +150,7 @@ ControllerReload *controller_find_reload(Controller *controller, uint32_t serial
@@ -160,6 +164,7 @@ ControllerReload *controller_find_reload(Controller *controller, uint32_t serial
int controller_dbus_dispatch(Controller *controller, Message *message);
int controller_dbus_send_activation(Controller *controller, const char *path, uint64_t serial);
int controller_dbus_send_reload(Controller *controller, User *user, uint32_t serial);
@ -563,18 +563,18 @@ index 81afb3d..37c822b 100644
};
diff --git a/src/bus/driver.c b/src/bus/driver.c
index b9774d6..874cc73 100644
index 6fff07a..ef99ccb 100644
--- a/src/bus/driver.c
+++ b/src/bus/driver.c
@@ -19,6 +19,7 @@
#include "dbus/protocol.h"
@@ -21,6 +21,7 @@
#include "dbus/socket.h"
#include "util/apparmor.h"
#include "util/error.h"
+#include "util/proc.h"
#include "util/selinux.h"
#include "util/string.h"
@@ -1592,6 +1593,45 @@ static int driver_method_reload_config(Peer *peer, const char *path, CDVar *in_v
@@ -1658,6 +1659,45 @@ static int driver_method_reload_config(Peer *peer, const char *path, CDVar *in_v
return 0;
}
@ -620,12 +620,12 @@ index b9774d6..874cc73 100644
static int driver_method_get_id(Peer *peer, const char *path, CDVar *in_v, uint32_t serial, CDVar *out_v) {
char buffer[sizeof(peer->bus->guid) * 2 + 1] = {};
int r;
@@ -2285,6 +2325,7 @@ static const DriverMethod driver_methods[] = {
{ "UpdateActivationEnvironment", true, "/org/freedesktop/DBus", driver_method_update_activation_environment, driver_type_in_apss, driver_type_out_unit },
{ "GetNameOwner", true, NULL, driver_method_get_name_owner, driver_type_in_s, driver_type_out_s },
{ "ReloadConfig", true, NULL, driver_method_reload_config, c_dvar_type_unit, driver_type_out_unit },
+ { "Reexecute", true, NULL, driver_method_reexecute, c_dvar_type_unit, driver_type_out_s },
{ "GetId", true, NULL, driver_method_get_id, c_dvar_type_unit, driver_type_out_s },
@@ -2363,6 +2403,7 @@ static const DriverMethod driver_methods[] = {
{ "UpdateActivationEnvironment", true, "/org/freedesktop/DBus", driver_method_update_activation_environment, driver_type_in_apss, driver_type_out_unit, false },
{ "GetNameOwner", true, NULL, driver_method_get_name_owner, driver_type_in_s, driver_type_out_s, false },
{ "ReloadConfig", true, NULL, driver_method_reload_config, c_dvar_type_unit, driver_type_out_unit, false },
+ { "Reexecute", true, NULL, driver_method_reexecute, c_dvar_type_unit, driver_type_out_s, false },
{ "GetId", true, NULL, driver_method_get_id, c_dvar_type_unit, driver_type_out_s, false },
{ },
};
diff --git a/src/bus/listener.c b/src/bus/listener.c
@ -710,7 +710,7 @@ index a6b39ea..59eaf7f 100644
void match_owner_get_stats(MatchOwner *owner, unsigned int *n_bytesp, unsigned int *n_matchesp);
void match_owner_move(MatchOwner *to, MatchOwner *from);
diff --git a/src/bus/peer.c b/src/bus/peer.c
index ce4584c..3f72dbf 100644
index 9d64d78..0a35c45 100644
--- a/src/bus/peer.c
+++ b/src/bus/peer.c
@@ -8,6 +8,7 @@
@ -749,7 +749,7 @@ index ce4584c..3f72dbf 100644
_c_cleanup_(peer_freep) Peer *peer = NULL;
_c_cleanup_(user_unrefp) User *user = NULL;
_c_cleanup_(c_freep) gid_t *gids = NULL;
@@ -269,7 +274,11 @@ int peer_new_with_fd(Peer **peerp,
@@ -270,7 +275,11 @@ int peer_new_with_fd(Peer **peerp,
if (r < 0)
return error_origin(-errno);
@ -759,10 +759,10 @@ index ce4584c..3f72dbf 100644
+ else
+ r = user_registry_ref_user(&bus->users, &user, ucred.uid);
+
if (r < 0)
if (r)
return error_fold(r);
@@ -324,7 +333,10 @@ int peer_new_with_fd(Peer **peerp,
@@ -337,7 +346,10 @@ int peer_new_with_fd(Peer **peerp,
if (r < 0)
return error_fold(r);
@ -774,7 +774,7 @@ index ce4584c..3f72dbf 100644
slot = c_rbtree_find_slot(&bus->peers.peer_tree, peer_compare, &peer->id, &parent);
c_assert(slot); /* peer->id is guaranteed to be unique */
c_rbtree_add(&bus->peers.peer_tree, parent, slot, &peer->registry_node);
@@ -353,6 +365,7 @@ Peer *peer_free(Peer *peer) {
@@ -367,6 +379,7 @@ Peer *peer_free(Peer *peer) {
reply_owner_deinit(&peer->owned_replies);
reply_registry_deinit(&peer->replies);
match_owner_deinit(&peer->owned_matches);
@ -782,7 +782,7 @@ index ce4584c..3f72dbf 100644
match_registry_deinit(&peer->name_owner_changed_matches);
match_registry_deinit(&peer->sender_matches);
name_owner_deinit(&peer->owned_names);
@@ -376,7 +389,6 @@ int peer_spawn(Peer *peer) {
@@ -390,7 +403,6 @@ int peer_spawn(Peer *peer) {
}
void peer_register(Peer *peer) {
@ -790,7 +790,7 @@ index ce4584c..3f72dbf 100644
c_assert(!peer->monitor);
peer->registered = true;
@@ -460,6 +472,24 @@ void peer_release_name_ownership(Peer *peer, NameOwnership *ownership, NameChang
@@ -476,6 +488,24 @@ void peer_release_name_ownership(Peer *peer, NameOwnership *ownership, NameChang
name_ownership_release(ownership, change);
}
@ -815,7 +815,7 @@ index ce4584c..3f72dbf 100644
static int peer_link_match(Peer *peer, MatchRule *rule, bool monitor) {
Address addr;
Peer *sender, *owner;
@@ -591,6 +621,10 @@ int peer_add_match(Peer *peer, const char *rule_string) {
@@ -609,6 +639,10 @@ int peer_add_match(Peer *peer, const char *rule_string) {
_c_cleanup_(match_rule_user_unrefp) MatchRule *rule = NULL;
int r;
@ -826,7 +826,7 @@ index ce4584c..3f72dbf 100644
r = match_owner_ref_rule(&peer->owned_matches, &rule, peer->user, rule_string, false);
if (r) {
if (r == MATCH_E_QUOTA)
@@ -811,7 +845,7 @@ int peer_queue_unicast(PolicySnapshot *sender_policy, NameSet *sender_names, Rep
@@ -849,7 +883,7 @@ int peer_queue_unicast(PolicySnapshot *sender_policy, NameSet *sender_names, Rep
int peer_queue_reply(Peer *sender, const char *destination, uint32_t reply_serial, Message *message) {
_c_cleanup_(reply_slot_freep) ReplySlot *slot = NULL;
@ -835,7 +835,7 @@ index ce4584c..3f72dbf 100644
Address addr;
int r;
@@ -820,10 +854,13 @@ int peer_queue_reply(Peer *sender, const char *destination, uint32_t reply_seria
@@ -858,10 +892,13 @@ int peer_queue_reply(Peer *sender, const char *destination, uint32_t reply_seria
return PEER_E_UNEXPECTED_REPLY;
slot = reply_slot_get_by_id(&sender->replies, addr.id, reply_serial);
@ -852,7 +852,7 @@ index ce4584c..3f72dbf 100644
r = connection_queue(&receiver->connection, NULL, message);
if (r) {
@@ -880,3 +917,225 @@ Peer *peer_registry_find_peer(PeerRegistry *registry, uint64_t id) {
@@ -918,3 +955,225 @@ Peer *peer_registry_find_peer(PeerRegistry *registry, uint64_t id) {
return peer && peer->registered ? peer : NULL;
}
@ -1079,7 +1079,7 @@ index ce4584c..3f72dbf 100644
+ return 0;
+}
diff --git a/src/bus/peer.h b/src/bus/peer.h
index b9e30c5..cb5feff 100644
index 4cf202a..457c7b5 100644
--- a/src/bus/peer.h
+++ b/src/bus/peer.h
@@ -8,6 +8,7 @@
@ -1090,7 +1090,7 @@ index b9e30c5..cb5feff 100644
#include "bus/match.h"
#include "bus/name.h"
#include "bus/policy.h"
@@ -75,6 +76,7 @@ struct Peer {
@@ -76,6 +77,7 @@ struct Peer {
MatchRegistry sender_matches;
MatchRegistry name_owner_changed_matches;
MatchOwner owned_matches;
@ -1098,7 +1098,7 @@ index b9e30c5..cb5feff 100644
ReplyRegistry replies;
ReplyOwner owned_replies;
};
@@ -90,6 +92,7 @@ struct Peer {
@@ -89,6 +91,7 @@ struct Peer {
.sender_matches = MATCH_REGISTRY_INIT((_x).sender_matches), \
.name_owner_changed_matches = MATCH_REGISTRY_INIT((_x).name_owner_changed_matches), \
.owned_matches = MATCH_OWNER_INIT((_x).owned_matches), \
@ -1106,7 +1106,7 @@ index b9e30c5..cb5feff 100644
.replies = REPLY_REGISTRY_INIT, \
.owned_replies = REPLY_OWNER_INIT((_x).owned_replies), \
}
@@ -101,7 +104,8 @@ struct PeerRegistry {
@@ -100,7 +103,8 @@ struct PeerRegistry {
#define PEER_REGISTRY_INIT {}
@ -1116,7 +1116,7 @@ index b9e30c5..cb5feff 100644
Peer *peer_free(Peer *peer);
int peer_dispatch(DispatchFile *file);
@@ -130,6 +134,8 @@ void peer_registry_deinit(PeerRegistry *registry);
@@ -129,6 +133,8 @@ void peer_registry_deinit(PeerRegistry *registry);
void peer_registry_flush(PeerRegistry *registry);
Peer *peer_registry_find_peer(PeerRegistry *registry, uint64_t id);
@ -1151,7 +1151,7 @@ index d694fc6..4c7343a 100644
};
diff --git a/src/dbus/socket.c b/src/dbus/socket.c
index c0a9aff..58e784b 100644
index 85eedda..672f353 100644
--- a/src/dbus/socket.c
+++ b/src/dbus/socket.c
@@ -732,7 +732,7 @@ static int socket_dispatch_read(Socket *socket) {
@ -1176,11 +1176,11 @@ index 67a49ae..077458f 100644
void socket_close(Socket *socket);
void socket_get_stats(Socket *socket,
diff --git a/src/launch/launcher.c b/src/launch/launcher.c
index 3fd69e0..69adb19 100644
index a4b7460..8b52bef 100644
--- a/src/launch/launcher.c
+++ b/src/launch/launcher.c
@@ -28,7 +28,10 @@
#include "util/error.h"
@@ -29,7 +29,10 @@
#include "util/fs.h"
#include "util/log.h"
#include "util/misc.h"
+#include "util/proc.h"
@ -1190,7 +1190,7 @@ index 3fd69e0..69adb19 100644
/*
* These are the default limits used when spawning dbus-broker. They are
@@ -43,6 +46,18 @@ static const uint64_t main_max_match_rules_per_connection = 256;
@@ -44,6 +47,18 @@ static const uint64_t main_max_match_rules_per_connection = 256;
static const char * main_arg_broker = BINDIR "/dbus-broker";
@ -1209,7 +1209,7 @@ index 3fd69e0..69adb19 100644
static sd_bus *bus_close_unref(sd_bus *bus) {
/*
* It is not sufficient to simply call sd_bus_unref(), as messages
@@ -100,6 +115,79 @@ static void log_append_service_user(Log *log, const char *user) {
@@ -101,6 +116,79 @@ static void log_append_service_user(Log *log, const char *user) {
}
static int launcher_reload_config(Launcher *launcher);
@ -1289,7 +1289,7 @@ index 3fd69e0..69adb19 100644
static int launcher_on_sighup(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
Launcher *launcher = userdata;
@@ -187,7 +275,8 @@ static int launcher_open_log(Launcher *launcher) {
@@ -188,7 +276,8 @@ static int launcher_open_log(Launcher *launcher) {
return 0;
}
@ -1299,7 +1299,7 @@ index 3fd69e0..69adb19 100644
_c_cleanup_(launcher_freep) Launcher *launcher = NULL;
int r;
@@ -199,7 +288,10 @@ int launcher_new(Launcher **launcherp, int fd_listen, bool audit, const char *co
@@ -200,7 +289,10 @@ int launcher_new(Launcher **launcherp, int fd_listen, bool audit, const char *co
launcher->fd_listen = fd_listen;
launcher->uid = -1;
launcher->gid = -1;
@ -1310,7 +1310,7 @@ index 3fd69e0..69adb19 100644
launcher->user_scope = user_scope;
if (configfile)
@@ -266,7 +358,7 @@ static noreturn void launcher_run_child(Launcher *launcher, int fd_log, int fd_c
@@ -267,7 +359,7 @@ static noreturn void launcher_run_child(Launcher *launcher, int fd_log, int fd_c
str_max_fds[C_DECIMAL_MAX(uint64_t)],
str_max_matches[C_DECIMAL_MAX(uint64_t)];
const char * const argv[] = {
@ -1319,7 +1319,7 @@ index 3fd69e0..69adb19 100644
"--log",
str_log,
"--controller",
@@ -290,12 +382,6 @@ static noreturn void launcher_run_child(Launcher *launcher, int fd_log, int fd_c
@@ -291,12 +383,6 @@ static noreturn void launcher_run_child(Launcher *launcher, int fd_log, int fd_c
goto exit;
}
@ -1332,7 +1332,7 @@ index 3fd69e0..69adb19 100644
r = fcntl(fd_log, F_GETFD);
if (r < 0) {
r = error_origin(-errno);
@@ -361,10 +447,37 @@ static int launcher_on_child_exit(sd_event_source *source, const siginfo_t *si,
@@ -362,10 +448,37 @@ static int launcher_on_child_exit(sd_event_source *source, const siginfo_t *si,
if (r)
return error_fold(r);
@ -1371,7 +1371,7 @@ index 3fd69e0..69adb19 100644
static int launcher_fork(Launcher *launcher, int fd_controller) {
pid_t pid;
int r;
@@ -376,6 +489,7 @@ static int launcher_fork(Launcher *launcher, int fd_controller) {
@@ -377,6 +490,7 @@ static int launcher_fork(Launcher *launcher, int fd_controller) {
if (!pid)
launcher_run_child(launcher, log_get_fd(&launcher->log), fd_controller);
@ -1379,7 +1379,7 @@ index 3fd69e0..69adb19 100644
r = sd_event_add_child(launcher->event, NULL, pid, WEXITED, launcher_on_child_exit, launcher);
if (r < 0)
return error_origin(-errno);
@@ -1101,7 +1215,8 @@ static int launcher_load_policy(Launcher *launcher, ConfigRoot *root, Policy *po
@@ -1102,7 +1216,8 @@ static int launcher_load_policy(Launcher *launcher, ConfigRoot *root, Policy *po
return 0;
}
@ -1389,7 +1389,7 @@ index 3fd69e0..69adb19 100644
_c_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
int r;
@@ -1303,13 +1418,22 @@ static int bus_method_reload_config(sd_bus_message *message, void *userdata, sd_
@@ -1304,13 +1419,22 @@ static int bus_method_reload_config(sd_bus_message *message, void *userdata, sd_
return sd_bus_reply_method_return(message, NULL);
}
@ -1417,7 +1417,7 @@ index 3fd69e0..69adb19 100644
int launcher_run(Launcher *launcher) {
_c_cleanup_(config_root_freep) ConfigRoot *root = NULL;
@@ -1371,26 +1495,45 @@ int launcher_run(Launcher *launcher) {
@@ -1378,26 +1502,45 @@ int launcher_run(Launcher *launcher) {
return 0;
}
@ -1479,7 +1479,7 @@ index 3fd69e0..69adb19 100644
r = sd_bus_add_object_vtable(launcher->bus_controller, NULL, "/org/bus1/DBus/Controller", "org.bus1.DBus.Controller", launcher_vtable, launcher);
if (r < 0)
@@ -1412,6 +1555,11 @@ int launcher_run(Launcher *launcher) {
@@ -1419,6 +1562,11 @@ int launcher_run(Launcher *launcher) {
if (r)
return error_trace(r);
@ -1491,12 +1491,7 @@ index 3fd69e0..69adb19 100644
r = launcher_connect(launcher);
if (r)
return error_trace(r);
@@ -1434,10 +1582,13 @@ int launcher_run(Launcher *launcher) {
return error_fold(r);
}
+ log_append_here(&launcher->log, LOG_INFO, 0, NULL);
r = log_commitf(&launcher->log, "Ready\n");
@@ -1446,6 +1594,8 @@ int launcher_run(Launcher *launcher) {
if (r)
return error_fold(r);
@ -1724,7 +1719,7 @@ index ed08e85..672c99e 100644
if (r)
goto exit;
diff --git a/src/meson.build b/src/meson.build
index c363cbc..7db1ecb 100644
index 2014372..c07f1c5 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -41,6 +41,7 @@ sources_bus = [
@ -1736,10 +1731,10 @@ index c363cbc..7db1ecb 100644
'util/string.c',
'util/systemd.c',
diff --git a/src/units/system/dbus-broker.service.in b/src/units/system/dbus-broker.service.in
index 4155630..9912572 100644
index cc5ae36..163853f 100644
--- a/src/units/system/dbus-broker.service.in
+++ b/src/units/system/dbus-broker.service.in
@@ -16,6 +16,8 @@ PrivateTmp=true
@@ -17,6 +17,8 @@ PrivateTmp=true
PrivateDevices=true
ExecStart=@bindir@/dbus-broker-launch --scope system --audit
ExecReload=@bindir@/busctl call org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus ReloadConfig
@ -1749,17 +1744,17 @@ index 4155630..9912572 100644
[Install]
Alias=dbus.service
diff --git a/src/util/proc.c b/src/util/proc.c
index 06d4e27..b502da1 100644
index 4a876b9..a3cdf0f 100644
--- a/src/util/proc.c
+++ b/src/util/proc.c
@@ -8,6 +8,7 @@
#include <unistd.h>
@@ -9,6 +9,7 @@
#include "util/error.h"
#include "util/proc.h"
#include "util/string.h"
+#include "util/serialize.h"
int proc_get_seclabel(pid_t pid, char **labelp, size_t *n_labelp) {
_c_cleanup_(c_fclosep) FILE *f = NULL;
/*
* A file in /proc can be at most 4M minus one. If required, we start with a 4K
diff --git a/src/util/serialize.c b/src/util/serialize.c
new file mode 100644
index 0000000..c027999
@ -2048,14 +2043,13 @@ index 0000000..5a5758d
+int serialize_peers(FILE *f, Broker *broker);
\ No newline at end of file
diff --git a/src/util/string.c b/src/util/string.c
index dfbdced..4016f98 100644
index e138d9f..71b5920 100644
--- a/src/util/string.c
+++ b/src/util/string.c
@@ -55,3 +55,82 @@ int util_strtou64(uint64_t *valp, const char *string) {
@@ -56,6 +56,85 @@ int util_strtou64(uint64_t *valp, const char *string) {
return 0;
}
+
+void generate_args_string(bool valid_arg, char **ret, int size, int *cur_i, char *option, char *val) {
+ int i = *cur_i;
+
@ -2134,14 +2128,18 @@ index dfbdced..4016f98 100644
+ *ret = strndup(string + pi, i - pi);
+ return string + i + 1;
+}
+
int util_strtoint(int *valp, const char *string) {
long val;
char *end;
diff --git a/src/util/string.h b/src/util/string.h
index 14f7171..f1c7d10 100644
index 5ceeb2f..5138409 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -17,6 +17,9 @@ enum {
@@ -18,6 +18,9 @@ enum {
int util_strtou32(uint32_t *valp, const char *string);
int util_strtou64(uint64_t *valp, const char *string);
int util_strtoint(int *valp, const char *string);
+void generate_args_string(bool valid_arg, char **ret, int size, int *cur_i, char *option, char *val);
+char *extract_word_inlist(char *string, char **ret, int ret_length);
+char *extract_list_element(char *string, char **ret);
@ -2149,5 +2147,5 @@ index 14f7171..f1c7d10 100644
/**
* string_compare() - compare two strings
--
2.30.2
2.33.0