From 0a763769282e494dc3c4ef192f3e763931179817 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Thu, 16 Jul 2015 15:14:43 +0200 Subject: [PATCH] bus-proxy: never pass on unmatched broadcasts The lovely libvirtd goes into crazy mode if it receives broadcasts that it didn't subscribe to. With bus-proxyd, this might happen in 2 cases: 1) The kernel passes us an unmatched signal due to a false-positive bloom-match. 2) We generate NameOwnerChanged/NameAcquired/NameLost locally even though the peer didn't subscribe to it. dbus-daemon is reliable in what signals it passes on. So make sure we follow that style. Never ever send a signal to a local peer if it doesn't match an installed filter of that peer. --- src/libelogind/sd-bus/bus-introspect.h | 43 +++++++++++++++++--------- src/libelogind/sd-bus/bus-slot.h | 7 ++--- src/shared/blkid-util.h | 24 +++++++------- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/libelogind/sd-bus/bus-introspect.h b/src/libelogind/sd-bus/bus-introspect.h index 1914e6cb8..ccb951c10 100644 --- a/src/libelogind/sd-bus/bus-introspect.h +++ b/src/libelogind/sd-bus/bus-introspect.h @@ -5,7 +5,7 @@ /*** This file is part of systemd. - Copyright 2013 Lennart Poettering + Copyright 2014 David Herrmann systemd is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -21,21 +21,34 @@ along with systemd; If not, see . ***/ -#include - #include "sd-bus.h" -#include "set.h" +#include "bus-xml-policy.h" + +typedef struct Proxy Proxy; + +struct Proxy { + sd_bus *local_bus; + struct ucred local_creds; + int local_in; + int local_out; + + sd_bus *destination_bus; -struct introspect { - FILE *f; - char *introspection; - size_t size; - bool trusted; + Set *owned_names; + SharedPolicy *policy; + + bool got_hello : 1; + bool queue_overflow : 1; + bool message_matched : 1; + bool synthetic_matched : 1; }; -int introspect_begin(struct introspect *i, bool trusted); -int introspect_write_default_interfaces(struct introspect *i, bool object_manager); -int introspect_write_child_nodes(struct introspect *i, Set *s, const char *prefix); -int introspect_write_interface(struct introspect *i, const sd_bus_vtable *v); -int introspect_finish(struct introspect *i, sd_bus *bus, sd_bus_message *m, sd_bus_message **reply); -void introspect_free(struct introspect *i); +int proxy_new(Proxy **out, int in_fd, int out_fd, const char *dest); +Proxy *proxy_free(Proxy *p); + +int proxy_set_policy(Proxy *p, SharedPolicy *policy, char **configuration); +int proxy_hello_policy(Proxy *p, uid_t original_uid); +int proxy_match(sd_bus_message *m, void *userdata, sd_bus_error *error); +int proxy_run(Proxy *p); + +DEFINE_TRIVIAL_CLEANUP_FUNC(Proxy*, proxy_free); diff --git a/src/libelogind/sd-bus/bus-slot.h b/src/libelogind/sd-bus/bus-slot.h index 23a15e4d0..da3834f8b 100644 --- a/src/libelogind/sd-bus/bus-slot.h +++ b/src/libelogind/sd-bus/bus-slot.h @@ -22,8 +22,7 @@ ***/ #include "sd-bus.h" -#include "bus-internal.h" +#include "bus-xml-policy.h" +#include "proxy.h" -sd_bus_slot *bus_slot_allocate(sd_bus *bus, bool floating, BusSlotType type, size_t extra, void *userdata); - -void bus_slot_disconnect(sd_bus_slot *slot); +int bus_proxy_process_driver(Proxy *p, sd_bus *a, sd_bus *b, sd_bus_message *m, SharedPolicy *sp, const struct ucred *ucred, Set *owned_names); diff --git a/src/shared/blkid-util.h b/src/shared/blkid-util.h index 33d18cb39..b596daddf 100644 --- a/src/shared/blkid-util.h +++ b/src/shared/blkid-util.h @@ -1,5 +1,7 @@ /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ +#pragma once + /*** This file is part of systemd. @@ -19,19 +21,17 @@ along with systemd; If not, see . ***/ -#pragma once - -#include "sd-event.h" -#include "util.h" - -typedef enum { DKR_PULL_V1, DKR_PULL_V2 } DkrPullVersion; -typedef struct DkrPull DkrPull; +#include "sd-bus.h" +#include "proxy.h" -typedef void (*DkrPullFinished)(DkrPull *pull, int error, void *userdata); +int synthetic_driver_send(sd_bus *b, sd_bus_message *m); -int dkr_pull_new(DkrPull **pull, sd_event *event, const char *index_url, const char *image_root, DkrPullFinished on_finished, void *userdata); -DkrPull* dkr_pull_unref(DkrPull *pull); +int synthetic_reply_method_return(sd_bus_message *call, const char *types, ...); +int synthetic_reply_method_return_strv(sd_bus_message *call, char **l); -DEFINE_TRIVIAL_CLEANUP_FUNC(DkrPull*, dkr_pull_unref); +int synthetic_reply_method_error(sd_bus_message *call, const sd_bus_error *e); +int synthetic_reply_method_errorf(sd_bus_message *call, const char *name, const char *format, ...) _sd_printf_(3, 4); +int synthetic_reply_method_errno(sd_bus_message *call, int error, const sd_bus_error *p); +int synthetic_reply_method_errnof(sd_bus_message *call, int error, const char *format, ...) _sd_printf_(3, 4); -int dkr_pull_start(DkrPull *pull, const char *name, const char *tag, const char *local, bool force_local, DkrPullVersion version); +int synthesize_name_acquired(Proxy *p, sd_bus *a, sd_bus *b, sd_bus_message *m); -- 2.30.2