From d44874004f4ba75b07a2fa73e6e5612173d007e5 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Thu, 21 Mar 2019 09:23:00 +0100 Subject: [PATCH 01/16] cpp-ify libdbuspolicy1.c Change-Id: I6f0ef0cb5bf558500020ee715e301f708fffb04d --- Makefile.am | 4 ++-- configure.ac | 2 +- doxygen.cfg | 2 +- src/{kdbus.c => kdbus.cpp} | 27 +++++++++++++-------- src/{libdbuspolicy1.c => libdbuspolicy1.cpp} | 36 ++++++++++++++-------------- 5 files changed, 39 insertions(+), 32 deletions(-) rename src/{kdbus.c => kdbus.cpp} (84%) rename src/{libdbuspolicy1.c => libdbuspolicy1.cpp} (93%) diff --git a/Makefile.am b/Makefile.am index 83cd183..420809a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -52,8 +52,8 @@ lib_LTLIBRARIES = src/libdbuspolicy1.la COMMON_SRC =\ src/libdbuspolicy1-private.h \ - src/libdbuspolicy1.c \ - src/kdbus.c \ + src/libdbuspolicy1.cpp \ + src/kdbus.cpp \ src/internal/internal.cpp \ src/internal/naive_policy_checker.cpp \ src/internal/policy.cpp \ diff --git a/configure.ac b/configure.ac index 5ffc83a..febecd2 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ AC_INIT([dbuspolicy], [dev@lists.tizen.org], [dbuspolicy], [http://review.tizen.org]) -AC_CONFIG_SRCDIR([src/libdbuspolicy1.c]) +AC_CONFIG_SRCDIR([src/libdbuspolicy1.cpp]) AC_CONFIG_AUX_DIR([build-aux]) AM_INIT_AUTOMAKE([ check-news diff --git a/doxygen.cfg b/doxygen.cfg index 0b1c67d..498ec70 100644 --- a/doxygen.cfg +++ b/doxygen.cfg @@ -4,7 +4,7 @@ GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO CASE_SENSE_NAMES = NO -INPUT = doc/main_page.dox src/internal/ src/dbuspolicy1 src/libdbuspolicy1.c +INPUT = doc/main_page.dox src/internal/ src/dbuspolicy1 src/libdbuspolicy1.cpp EXCLUDE = src/internal/xml_policy.hpp JAVADOC_AUTOBRIEF = YES EXTRACT_PRIVATE = YES diff --git a/src/kdbus.c b/src/kdbus.cpp similarity index 84% rename from src/kdbus.c rename to src/kdbus.cpp index 1d983f2..cdf4429 100644 --- a/src/kdbus.c +++ b/src/kdbus.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #define CONNECTION_LABEL "libdbuspolicy1-kdbus" @@ -54,7 +55,7 @@ static int kdbus_hello(struct kdbus_connection *conn, struct kdbus_item* item; size_t size = ALIGN8(sizeof(struct kdbus_cmd_hello)) + ALIGN8(offsetof(struct kdbus_item, data) + sizeof(CONNECTION_LABEL)); - cmd = calloc(1, size); + cmd = static_cast(calloc(1, size)); if (!cmd) goto err; cmd->size = size; @@ -70,7 +71,8 @@ static int kdbus_hello(struct kdbus_connection *conn, if (ioctl(conn->fd, KDBUS_CMD_HELLO, cmd) < 0) goto err; - if (MAP_FAILED == (conn->pool = mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, conn->fd, 0))) + conn->pool = static_cast(mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, conn->fd, 0)); + if (MAP_FAILED == conn->pool) goto err; cmd_free.offset = cmd->offset; @@ -91,7 +93,7 @@ void kdbus_shared_init_fd(kdbus_connection *conn, int fd) void kdbus_shared_init_pool(kdbus_connection *conn, void *pool) { - conn->pool = pool; + conn->pool = static_cast(pool); } int kdbus_connect(kdbus_connection *conn, @@ -136,6 +138,14 @@ union kdbus_cmd_union { uint8_t _buffer_[sizeof(struct kdbus_cmd_info) + offsetof(struct kdbus_item, data) + ALIGN8(MAX_DBUS_NAME_LEN+1)]; }; +static void set_item_info(struct kdbus_item *item, const char *str, __u64 str_length, __u64 type) +{ + item->size = (__u64)offsetof(struct kdbus_item, data) + str_length + (__u64)1; + item->type = type; + *(uint64_t*)ALIGNDN8((uintptr_t)item->str + str_length) = 0; /* trailing zero + padding */ + memcpy(item->str, str, str_length+1); +} + int kdbus_get_conn_info(kdbus_connection *conn, const char *destination, struct kdbus_cmd_param *info, @@ -164,10 +174,7 @@ int kdbus_get_conn_info(kdbus_connection *conn, unsigned int l = strlen(destination); cmd.cmd_info.size = sizeof(struct kdbus_cmd_info) + offsetof(struct kdbus_item, data) + ALIGN8(l+1); cmd.cmd_info.id = 0; - cmd.cmd_info.items->size = (__u64)offsetof(struct kdbus_item, data) + (__u64)l + (__u64)1; - cmd.cmd_info.items->type = KDBUS_ITEM_NAME; - *(uint64_t*)ALIGNDN8((uintptr_t)cmd.cmd_info.items->str + l) = 0; /* trailing zero + padding */ - memcpy(cmd.cmd_info.items->str, destination, l + 1); + set_item_info(cmd.cmd_info.items, destination, l, KDBUS_ITEM_NAME); } r = ioctl(conn->fd, KDBUS_CMD_CONN_INFO, &cmd.cmd_info); if (r < 0) { @@ -182,9 +189,9 @@ int kdbus_get_conn_info(kdbus_connection *conn, conn_info = (struct kdbus_info *) ((uint8_t *) conn->pool + cmd.cmd_info.offset); items_end = (uintptr_t)conn_info + (unsigned)conn_info->size; - _Static_assert((unsigned)KDBUS_ITEM_CREDS == KDBUS_ITEM_CREDS, "KDBUS_ITEM_CREDS not preserved when cast to unsigned"); - _Static_assert((unsigned)KDBUS_ITEM_SECLABEL == KDBUS_ITEM_SECLABEL, "KDBUS_ITEM_SECLABEL not preserved when cast to unsigned"); - _Static_assert((unsigned)KDBUS_ITEM_OWNED_NAME == KDBUS_ITEM_OWNED_NAME, "KDBUS_ITEM_OWNED_NAME not preserved when cast to unsigned"); + static_assert((unsigned)KDBUS_ITEM_CREDS == KDBUS_ITEM_CREDS, "KDBUS_ITEM_CREDS not preserved when cast to unsigned"); + static_assert((unsigned)KDBUS_ITEM_SECLABEL == KDBUS_ITEM_SECLABEL, "KDBUS_ITEM_SECLABEL not preserved when cast to unsigned"); + static_assert((unsigned)KDBUS_ITEM_OWNED_NAME == KDBUS_ITEM_OWNED_NAME, "KDBUS_ITEM_OWNED_NAME not preserved when cast to unsigned"); info->names_num = 0; for (item = conn_info->items; (uintptr_t)item < items_end; item = (typeof(item))ALIGN8((uintptr_t)item + (unsigned)item->size)) { diff --git a/src/libdbuspolicy1.c b/src/libdbuspolicy1.cpp similarity index 93% rename from src/libdbuspolicy1.c rename to src/libdbuspolicy1.cpp index c141b81..92b2d8c 100644 --- a/src/libdbuspolicy1.c +++ b/src/libdbuspolicy1.cpp @@ -19,11 +19,11 @@ #include "internal/internal.h" #include "libdbuspolicy1-private.h" -#include -#include +#include +#include #include -#include -#include +#include +#include #include #include #include @@ -31,7 +31,7 @@ #include #include #include -#include +#include #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" #define KDBUS_SYSTEM_BUS_PATH "/sys/fs/kdbus/0-system/bus" @@ -56,7 +56,7 @@ static bool init_once_done = false; static bool init_once_db[2] = {false, false}; static bool init_once_conn[2] = {false, false}; -void __dbuspolicy1_change_creds(uid_t uid, gid_t gid, const char* label) +extern "C" void __dbuspolicy1_change_creds(uid_t uid, gid_t gid, const char* label) { g_udesc.uid = uid; g_udesc.gid = gid; @@ -136,7 +136,7 @@ static int bus_path_resolve(const char *bus_path, char *resolved_path, unsigned if (0 != strcmp(p + suffix_pos, user_suffix)) goto err; - last_slash = memrchr(p, '/', suffix_pos); + last_slash = static_cast(memrchr(p, '/', suffix_pos)); if (last_slash == NULL) goto err; last_slash++; @@ -201,9 +201,9 @@ static struct kconn *get_global_conn(BusType bus_type, const char *resolved_path return result; } -static struct kconn *init_shared_fd(BusType bus_type, int fd) +static kconn *init_shared_fd(BusType bus_type, int fd) { - struct kconn *result = malloc(sizeof(*result)); + kconn *result = static_cast(malloc(sizeof(*result))); if (NULL == result) { LOGE("Error: failed to allocate memory for policy configuration"); return NULL; @@ -227,8 +227,8 @@ static bool can_open(BusType bus_type, uid_t bus_owner) DBUSPOLICY1_EXPORT void* dbuspolicy1_init_shared(const char *bus_path, int fd) { - _Static_assert(SYSTEM_BUS == 0, "SYSTEM_BUS not 0"); - _Static_assert(SESSION_BUS == 1, "SESSION_BUS not 1"); + static_assert(SYSTEM_BUS == 0, "SYSTEM_BUS not 0"); + static_assert(SESSION_BUS == 1, "SESSION_BUS not 1"); BusType bus_type = SESSION_BUS; uid_t bus_owner = 0; @@ -260,7 +260,7 @@ DBUSPOLICY1_EXPORT void* dbuspolicy1_init(const char *bus_path) DBUSPOLICY1_EXPORT void dbuspolicy1_init_set_pool(void *configuration, void *pool) { - kdbus_shared_init_pool(configuration, pool); + kdbus_shared_init_pool(static_cast(configuration), pool); } DBUSPOLICY1_EXPORT void dbuspolicy1_free(void* configuration) @@ -287,7 +287,7 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, (void)reply_serial; (void)requested_reply; - struct kconn *kconn = configuration; + struct kconn *kconn = static_cast(configuration); int r; struct kdbus_cmd_param info; @@ -301,6 +301,9 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, __internal_enter(); + uid_t dest_uid_n = 0; + gid_t dest_gid_n = 0; + /* check can send */ /* if broadcasting, then pass - null destination */ if (destination && *destination) { @@ -318,9 +321,6 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, if (r <= 0) goto end; - uid_t dest_uid_n = 0; - gid_t dest_gid_n = 0; - /* copy & free */ if (destination && *destination) { dest_uid_n = info.uid_n; @@ -378,7 +378,7 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_in(void* configuration, (void)reply_serial; (void)requested_reply; - struct kconn *kconn = configuration; + struct kconn *kconn = static_cast(configuration); int r; struct kdbus_cmd_param info; @@ -418,7 +418,7 @@ end: DBUSPOLICY1_EXPORT int dbuspolicy1_can_own(void* configuration, const char* const service) { int r; - struct kconn *kconn = configuration; + struct kconn *kconn = static_cast(configuration); __internal_enter(); r = __internal_can_own(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, service); __internal_exit(); -- 2.7.4 From b9ea7bb741489c33daef021bc206913036f8dbdd Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 13:37:06 +0100 Subject: [PATCH 02/16] API: mark dbuspolicy1_init as deprecated Change-Id: I6ca78933941a57018130bcc67732ff07550fa0d6 --- src/dbuspolicy1/libdbuspolicy1.h | 6 +++++- src/stest_cynara.c | 3 +++ src/stest_memory.c | 3 +++ src/stest_method_call.c | 3 +++ src/stest_ownership.c | 3 +++ src/stest_signal.c | 3 +++ 6 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/dbuspolicy1/libdbuspolicy1.h b/src/dbuspolicy1/libdbuspolicy1.h index 21f79a2..192867b 100644 --- a/src/dbuspolicy1/libdbuspolicy1.h +++ b/src/dbuspolicy1/libdbuspolicy1.h @@ -62,8 +62,12 @@ struct udesc; * \return On success pointer to configuration context is returned. On * error NULL is returned. * \ingroup API + * + * \deprecated This is old-style API function, which forces creating of new + * bus connection by the library. Use dbuspolicy1_init_shared() and + * dbuspolicy1_init_set_pool() instead. */ -void* dbuspolicy1_init(const char *bus_path); +void* dbuspolicy1_init(const char *bus_path) __attribute__ ((deprecated)); void* dbuspolicy1_init_shared(const char *bus_path, int fd); diff --git a/src/stest_cynara.c b/src/stest_cynara.c index b910ca9..3fc3a7c 100644 --- a/src/stest_cynara.c +++ b/src/stest_cynara.c @@ -24,7 +24,10 @@ int main(int argc, char* argv[]) desired_result = 0; printf("---desired result: %d %s\n\n", desired_result, argv[0]); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" c = dbuspolicy1_init("/sys/fs/kdbus/0-system/bus"); +#pragma GCC diagnostic pop assert(c != NULL); __dbuspolicy1_change_creds(200, 0, "L"); diff --git a/src/stest_memory.c b/src/stest_memory.c index e20fe24..52bd72b 100644 --- a/src/stest_memory.c +++ b/src/stest_memory.c @@ -72,7 +72,10 @@ int main(void) assert(res != -1); clock_gettime(CLOCK_MONOTONIC, &begin); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" policy = dbuspolicy1_init("/sys/fs/kdbus/0-system/bus"); +#pragma GCC diagnostic pop assert(policy != NULL); get_time_since(&begin, &elapsed); diff --git a/src/stest_method_call.c b/src/stest_method_call.c index 7b1dc93..5be13b5 100644 --- a/src/stest_method_call.c +++ b/src/stest_method_call.c @@ -13,7 +13,10 @@ int main(int argc, char* argv[]) prepare_mask(argc, argv); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" c = dbuspolicy1_init("/sys/fs/kdbus/0-system/bus"); +#pragma GCC diagnostic pop assert(c != NULL); __dbuspolicy1_change_creds(0, 0, NULL); diff --git a/src/stest_ownership.c b/src/stest_ownership.c index 4baa558..230e384 100644 --- a/src/stest_ownership.c +++ b/src/stest_ownership.c @@ -13,7 +13,10 @@ int main(int argc, char* argv[]) prepare_mask(argc, argv); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" c = dbuspolicy1_init("/sys/fs/kdbus/0-system/bus"); +#pragma GCC diagnostic pop assert(c != NULL); __dbuspolicy1_change_creds(0, 0, NULL); diff --git a/src/stest_signal.c b/src/stest_signal.c index 1fe2f9e..ad6b733 100644 --- a/src/stest_signal.c +++ b/src/stest_signal.c @@ -13,7 +13,10 @@ int main(int argc, char* argv[]) prepare_mask(argc, argv); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" c = dbuspolicy1_init("/sys/fs/kdbus/0-system/bus"); +#pragma GCC diagnostic pop assert(c != NULL); __dbuspolicy1_change_creds(0, 0, NULL); -- 2.7.4 From e39a55ab51d5752edbee46dfc8743d54aee9a3b6 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 14:12:39 +0100 Subject: [PATCH 03/16] API: documentation update Change-Id: I002b6ce0869677f3a522162d8a68bda536ddbc9e --- src/dbuspolicy1/libdbuspolicy1.h | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/dbuspolicy1/libdbuspolicy1.h b/src/dbuspolicy1/libdbuspolicy1.h index 192867b..056d91b 100644 --- a/src/dbuspolicy1/libdbuspolicy1.h +++ b/src/dbuspolicy1/libdbuspolicy1.h @@ -69,14 +69,42 @@ struct udesc; */ void* dbuspolicy1_init(const char *bus_path) __attribute__ ((deprecated)); +/** + * This is a new-style initialization function, which allows sharing kdbus connection with + * libdbuspolicy client. + * + * Instead of single function, new API provides two functions. The dbuspolicy1_init_shared() + * function initializes the library with bus path and open file descriptor, used by client + * to connect to kdbus, and returns handle to the configuration, or NULL if client is not allowed + * to connect to the bus. The dbuspolicy1_init_set_pool() function completes the initialization + * by setting pointer to the pool. + * The process is as follows: + * - client opens a bus file; + * - client passes the path and the file descriptor to libdbuspolicy; + * - libdbuspolicy checks if the client is allowed to connect to the bus, + * returns handle to the configuration; + * - client connects to the bus (if allowed); + * - client maps the kdbus pool; + * - client completes libdbuspolicy initialization by passing the pointer to the pool. + * \ingroup API + * \param[in] bus_path path to the kdbus bus (system or session) + * \param[in] fd file descriptor to the path + */ void* dbuspolicy1_init_shared(const char *bus_path, int fd); +/** + * Completes shared initialization by setting pointer to the pool. + * + * \ingroup API + * \param[in] configuration Pointer with policy configuration acquired using dbuspolicy1_init_shared + * \param[in] pool Pointer to the pool. + */ void dbuspolicy1_init_set_pool(void *configuration, void *pool); /** * Free libdbuspolicy configuration context * \ingroup API - * \param[in] configuration Pointer with policy configuration acquired using dbuspolicy1_init + * \param[in] configuration Pointer with policy configuration */ void dbuspolicy1_free(void* configuration); -- 2.7.4 From 45e960efd8751e52cddeb076ab4d695c44125681 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Thu, 21 Mar 2019 10:41:37 +0100 Subject: [PATCH 04/16] use call_once for initialization Change-Id: I5dae342a7ba7083903d1fa30a4440700629b6945 --- src/internal/internal.h | 2 -- src/libdbuspolicy1.cpp | 73 +++++++++++++++++-------------------------------- 2 files changed, 25 insertions(+), 50 deletions(-) diff --git a/src/internal/internal.h b/src/internal/internal.h index c5d9ca5..92a1acc 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -66,8 +66,6 @@ int __internal_init_auto_serialized(BusType bus_type, const char* const config_n /** Inits tslog. */ void __internal_init_once(void); -extern pthread_mutex_t g_mutex; - /** Dumps memory */ void memory_dump(BusType bus_type); diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 92b2d8c..5446bdc 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -30,8 +30,8 @@ #include #include #include -#include #include +#include #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" #define KDBUS_SYSTEM_BUS_PATH "/sys/fs/kdbus/0-system/bus" @@ -52,9 +52,9 @@ struct udesc { char label[256]; } g_udesc; -static bool init_once_done = false; -static bool init_once_db[2] = {false, false}; -static bool init_once_conn[2] = {false, false}; +static std::once_flag init_once_done; +static std::once_flag init_once_db[2]; +static std::once_flag init_once_conn[2]; extern "C" void __dbuspolicy1_change_creds(uid_t uid, gid_t gid, const char* label) { @@ -64,23 +64,20 @@ extern "C" void __dbuspolicy1_change_creds(uid_t uid, gid_t gid, const char* lab strncpy(g_udesc.label, label, strlen(label) + 1); } -static bool dbuspolicy_init_once_locked(void) +static void dbuspolicy_init_once_locked(void) { - if (init_once_done) - return false; - char buf[1024]; int attr_fd; int r; attr_fd = open("/proc/self/attr/current", O_RDONLY); if (attr_fd < 0) - return true; + assert(false && "failed open: /proc/self/attr/current"); r = read(attr_fd, buf, sizeof(buf)); close(attr_fd); if (r < 0 || r >= (long int)sizeof(g_udesc.label)) /* read */ - return true; + assert(false && "failed read: /proc/self/attr/current"); buf[r] = 0; g_udesc.uid = getuid(); @@ -88,10 +85,6 @@ static bool dbuspolicy_init_once_locked(void) snprintf(g_udesc.label, r + 1 /* additional byte for \0 */, "%s", buf); __internal_init_once(); - - init_once_done = true; - - return false; } static bool bus_type_from_path(const char *bus_path, BusType *bus_type, char **pp) @@ -160,45 +153,33 @@ err: return ret; } -static bool init_common_locked(BusType bus_type) +static void init_common_locked(BusType bus_type) { - dbuspolicy_init_once_locked(); - - if (init_once_db[bus_type]) - return true; - int ret = __internal_init_auto_serialized(bus_type, (bus_type == SYSTEM_BUS) ? system_bus_conf_file_primary() : session_bus_conf_file_primary()); if (ret < 0) ret = __internal_init(bus_type, (bus_type == SYSTEM_BUS) ? SYSTEM_BUS_CONF_FILE_SECONDARY : SESSION_BUS_CONF_FILE_SECONDARY); - if (ret >= 0) { + if (ret >= 0) __internal_init_sup_group(bus_type, g_udesc.uid, g_udesc.gid); - init_once_db[bus_type] = true; - } - return ret >= 0; + else + assert(false && "failed __internal_init"); } -static struct kconn *init_global_conn_locked(BusType bus_type, const char *resolved_path) +static void init_global_conn_locked(BusType bus_type, const char *resolved_path) { - if (init_once_conn[bus_type]) - return &g_conn[bus_type]; - - struct kconn *result = &g_conn[bus_type]; - if (kdbus_connect(&result->conn, resolved_path, 0, _KDBUS_ATTACH_ALL, 0) < 0) - return NULL; + struct kconn *kconn = &g_conn[bus_type]; + kconn->bus_type = bus_type; - result->bus_type = bus_type; - init_once_conn[bus_type] = true; - - return result; + if (kdbus_connect(&kconn->conn, resolved_path, 0, _KDBUS_ATTACH_ALL, 0) < 0) { + assert(false && "failed kdbus_connect"); + } } -static struct kconn *get_global_conn(BusType bus_type, const char *resolved_path) +static struct kconn *get_global_conn(BusType bus_type, const char *resolved_path) noexcept { - pthread_mutex_lock(&g_mutex); - struct kconn *result = init_global_conn_locked(bus_type, resolved_path); - pthread_mutex_unlock(&g_mutex); - return result; + std::call_once(init_once_conn[bus_type], init_global_conn_locked, bus_type, resolved_path); + + return &g_conn[bus_type]; } static kconn *init_shared_fd(BusType bus_type, int fd) @@ -213,16 +194,12 @@ static kconn *init_shared_fd(BusType bus_type, int fd) return result; } -static bool can_open(BusType bus_type, uid_t bus_owner) +static bool can_open(BusType bus_type, uid_t bus_owner) noexcept { - pthread_mutex_lock(&g_mutex); - bool ret = init_common_locked(bus_type); - pthread_mutex_unlock(&g_mutex); + std::call_once(init_once_done, dbuspolicy_init_once_locked); + std::call_once(init_once_db[bus_type], init_common_locked, bus_type); - if (ret) - return __internal_can_open(bus_type, bus_owner, g_udesc.uid, g_udesc.gid, g_udesc.label) > 0; - - return false; + return __internal_can_open(bus_type, bus_owner, g_udesc.uid, g_udesc.gid, g_udesc.label) > 0; } DBUSPOLICY1_EXPORT void* dbuspolicy1_init_shared(const char *bus_path, int fd) -- 2.7.4 From 6ffc4c69fca03682ccfa03982f36f20700b401ee Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 22 Mar 2019 15:05:17 +0100 Subject: [PATCH 05/16] refactoring: remove not needed types Change-Id: Iff52dbdab0e4b4b45c52d971beb0934cb22044a7 --- src/libdbuspolicy1.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 5446bdc..87ec326 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -36,19 +36,14 @@ #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" #define KDBUS_SYSTEM_BUS_PATH "/sys/fs/kdbus/0-system/bus" -/** A user ID */ -typedef unsigned long dbus_uid_t; -/** A group ID */ -typedef unsigned long dbus_gid_t; - struct kconn { kdbus_connection conn; BusType bus_type; } g_conn[2]; struct udesc { - dbus_uid_t uid; - dbus_gid_t gid; + uid_t uid; + gid_t gid; char label[256]; } g_udesc; -- 2.7.4 From ef36f5bf78e7fb5c1d7e9e9584f8537593c4ea01 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 15:15:41 +0100 Subject: [PATCH 06/16] refactoring: use string_ref for extracting bus_owner Change-Id: I4009d4bf06ba09c3e8177c8ffbb0dec6a1d05000 --- src/libdbuspolicy1.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 87ec326..66c8950 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" #define KDBUS_SYSTEM_BUS_PATH "/sys/fs/kdbus/0-system/bus" @@ -107,9 +108,6 @@ static bool bus_type_from_path(const char *bus_path, BusType *bus_type, char **p static int bus_path_resolve(const char *bus_path, char *resolved_path, unsigned resolved_path_size, BusType *bus_type, uid_t *bus_owner) { - const char user_suffix[] = "-user/bus"; - int suffix_pos; - char* last_slash; int ret = -1; char *p; @@ -117,22 +115,22 @@ static int bus_path_resolve(const char *bus_path, char *resolved_path, unsigned return -1; if (*bus_type == SESSION_BUS && NULL != bus_owner) { - suffix_pos = strlen(p) - strlen(user_suffix); - if (suffix_pos < 0) - goto err; + boost::string_ref user_suffix("-user/bus"); + boost::string_ref ps(p); - if (0 != strcmp(p + suffix_pos, user_suffix)) + if (!ps.ends_with(user_suffix)) goto err; - last_slash = static_cast(memrchr(p, '/', suffix_pos)); - if (last_slash == NULL) - goto err; - last_slash++; - if ((int)(last_slash - p) > (int)strlen(p)) + ps.remove_suffix(user_suffix.length()); + + size_t last_slash = ps.find_last_of('/'); + if (last_slash == boost::string_ref::npos || last_slash == ps.length() - 1) goto err; + ps = ps.substr(last_slash+1); + errno = 0; - *bus_owner = strtol(last_slash, NULL, 10); + *bus_owner = strtol(ps.data(), NULL, 10); // We will never get 0 as a session bus owner (0 uses "0-system" bus), // so it's OK to assume that *bus_owner==0 always means error. if (errno || (*bus_owner == 0)) -- 2.7.4 From a26b097a67d4d03938793f96ea581cd5448fd3e0 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 15:18:05 +0100 Subject: [PATCH 07/16] refactoring: replace bool return type with RAII This changes return type of bus path resolving to shared_ptr from bool. This is sufficient to carry all the needed information, and allows removing of explicit free()s and gotos. Change-Id: Ic05a734aea49439182fca4ea912086213a6cf91a --- src/internal/transaction_guard.hpp | 2 + src/libdbuspolicy1.cpp | 92 +++++++++++++++++--------------------- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/src/internal/transaction_guard.hpp b/src/internal/transaction_guard.hpp index 9963751..8357459 100644 --- a/src/internal/transaction_guard.hpp +++ b/src/internal/transaction_guard.hpp @@ -15,6 +15,8 @@ */ #pragma once +#include + namespace transaction_guard { /* Helping class for automatically releasing acquired resources when transaction diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 66c8950..9e32499 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -18,6 +18,7 @@ #include "kdbus.h" #include "internal/internal.h" #include "libdbuspolicy1-private.h" +#include "internal/transaction_guard.hpp" #include #include @@ -33,6 +34,7 @@ #include #include #include +#include #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" #define KDBUS_SYSTEM_BUS_PATH "/sys/fs/kdbus/0-system/bus" @@ -83,67 +85,60 @@ static void dbuspolicy_init_once_locked(void) __internal_init_once(); } -static bool bus_type_from_path(const char *bus_path, BusType *bus_type, char **pp) +static std::shared_ptr bus_type_from_path(const char *bus_path, BusType &bus_type) { - char *p = realpath(bus_path, NULL); - if (!p) - return false; + assert(bus_path); - if (pp) - *pp = p; + std::shared_ptr p(realpath(bus_path, nullptr), [](const char *a) { free(const_cast(a)); }); + if (!p) + return nullptr; - if (0 == strcmp(p, KDBUS_SYSTEM_BUS_PATH)) { - *bus_type = SYSTEM_BUS; - return true; + if (0 == strcmp(p.get(), KDBUS_SYSTEM_BUS_PATH)) { + bus_type = SYSTEM_BUS; + return p; } - if (0 == strncmp(p, KDBUS_PATH_PREFIX, strlen(KDBUS_PATH_PREFIX))) { - *bus_type = SESSION_BUS; - return true; + if (0 == strncmp(p.get(), KDBUS_PATH_PREFIX, strlen(KDBUS_PATH_PREFIX))) { + bus_type = SESSION_BUS; + return p; } - free(p); - return false; + return nullptr; } -static int bus_path_resolve(const char *bus_path, char *resolved_path, unsigned resolved_path_size, BusType *bus_type, uid_t *bus_owner) +static std::shared_ptr bus_path_resolve(const char *bus_path, BusType &bus_type, uid_t &bus_owner) noexcept { - int ret = -1; - char *p; + assert(bus_path); + + auto resolved_path = bus_type_from_path(bus_path, bus_type); - if (!bus_type_from_path(bus_path, bus_type, &p)) - return -1; + if (nullptr == resolved_path) + return nullptr; - if (*bus_type == SESSION_BUS && NULL != bus_owner) { + if (bus_type == SESSION_BUS) { boost::string_ref user_suffix("-user/bus"); - boost::string_ref ps(p); + boost::string_ref ps(resolved_path.get()); if (!ps.ends_with(user_suffix)) - goto err; + return nullptr; ps.remove_suffix(user_suffix.length()); size_t last_slash = ps.find_last_of('/'); if (last_slash == boost::string_ref::npos || last_slash == ps.length() - 1) - goto err; + return nullptr; ps = ps.substr(last_slash+1); errno = 0; - *bus_owner = strtol(ps.data(), NULL, 10); + bus_owner = strtol(ps.data(), NULL, 10); // We will never get 0 as a session bus owner (0 uses "0-system" bus), - // so it's OK to assume that *bus_owner==0 always means error. - if (errno || (*bus_owner == 0)) - goto err; + // so it's OK to assume that bus_owner==0 always means error. + if (errno || bus_owner == 0) + return nullptr; } - if (resolved_path) - snprintf(resolved_path, resolved_path_size, "%s", p); - - ret = 0; -err: - free(p); - return ret; + return resolved_path; } static void init_common_locked(BusType bus_type) @@ -158,17 +153,17 @@ static void init_common_locked(BusType bus_type) assert(false && "failed __internal_init"); } -static void init_global_conn_locked(BusType bus_type, const char *resolved_path) +static void init_global_conn_locked(BusType bus_type, std::shared_ptr resolved_path) { struct kconn *kconn = &g_conn[bus_type]; kconn->bus_type = bus_type; - if (kdbus_connect(&kconn->conn, resolved_path, 0, _KDBUS_ATTACH_ALL, 0) < 0) { + if (kdbus_connect(&kconn->conn, resolved_path.get(), 0, _KDBUS_ATTACH_ALL, 0) < 0) { assert(false && "failed kdbus_connect"); } } -static struct kconn *get_global_conn(BusType bus_type, const char *resolved_path) noexcept +static struct kconn *get_global_conn(BusType bus_type, std::shared_ptr resolved_path) noexcept { std::call_once(init_once_conn[bus_type], init_global_conn_locked, bus_type, resolved_path); @@ -202,11 +197,11 @@ DBUSPOLICY1_EXPORT void* dbuspolicy1_init_shared(const char *bus_path, int fd) BusType bus_type = SESSION_BUS; uid_t bus_owner = 0; - char resolved_path[PATH_MAX] = { 0 }; - if (bus_path_resolve(bus_path, resolved_path, sizeof(resolved_path), &bus_type, &bus_owner) < 0) { + auto resolved_path = bus_path_resolve(bus_path, bus_type, bus_owner); + if (nullptr == resolved_path) { LOGE("Error resolving bus path: %s", bus_path); - return NULL; + return nullptr; } struct kconn *result = NULL; @@ -260,8 +255,8 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, struct kconn *kconn = static_cast(configuration); int r; - struct kdbus_cmd_param info; - char *dest_label = NULL; + struct kdbus_cmd_param info = {}; + std::string dest_label; bool free_conn_info = false; /* Broadcast signal has NULL destination */ @@ -270,6 +265,7 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, return 1; __internal_enter(); + auto internal_enter_guard = transaction_guard::makeGuard([] () { __internal_exit(); }); uid_t dest_uid_n = 0; gid_t dest_gid_n = 0; @@ -279,7 +275,7 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, if (destination && *destination) { r = kdbus_get_conn_info(&kconn->conn, destination, &info, POLICY_CONN_INFO_ALL); if (r < 0) - goto end; + return r; free_conn_info = true; } @@ -297,7 +293,7 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, dest_gid_n = info.gid_n; if (info.label) - dest_label = strdup(info.label); + dest_label = info.label; if (free_conn_info) { kdbus_free_by_offset(&kconn->conn, info.free_offset); @@ -315,18 +311,14 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, free_conn_info = true; if (0 == info.names_num) - r = __internal_can_recv(kconn->bus_type, dest_uid_n, dest_gid_n, dest_label, sender, path, interface, member, message_type); + r = __internal_can_recv(kconn->bus_type, dest_uid_n, dest_gid_n, dest_label.c_str(), sender, path, interface, member, message_type); else - r = __internal_can_recv_multi(kconn->bus_type, dest_uid_n, dest_gid_n, dest_label, info.k_names, info.names_num, path, interface, member, message_type); + r = __internal_can_recv_multi(kconn->bus_type, dest_uid_n, dest_gid_n, dest_label.c_str(), info.k_names, info.names_num, path, interface, member, message_type); end: if (free_conn_info) kdbus_free_by_offset(&kconn->conn, info.free_offset); - if (dest_label) - free(dest_label); - __internal_exit(); - return r; } -- 2.7.4 From a300ed61eb94dc4ef4441a374a792a1c6787a193 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 15:22:52 +0100 Subject: [PATCH 08/16] refactoring: merge 'can' with 'can_multi' functions Change-Id: I17889df47ac3a5f740eb528f7f56c3e3b8b7edc5 --- src/internal/internal.cpp | 67 +++++++--------------- src/internal/internal.h | 62 +++----------------- src/libdbuspolicy1.cpp | 30 +++++----- src/test-libdbuspolicy1-method.cpp | 12 +++- ...libdbuspolicy1-send_destination_prefix-deny.cpp | 2 +- src/test-libdbuspolicy1-signal.cpp | 5 +- 6 files changed, 62 insertions(+), 116 deletions(-) diff --git a/src/internal/internal.cpp b/src/internal/internal.cpp index 8ad20ea..108a9e7 100644 --- a/src/internal/internal.cpp +++ b/src/internal/internal.cpp @@ -102,35 +102,24 @@ int __internal_can_send(BusType bus_type, const gid_t group, const char* const label, const char* const destination, + const char** const destination_names, + uint16_t destination_names_size, const char* const path, const char* const interface, const char* const member, int type) { MatchItemSend matcher(interface, member, path, static_cast(type)); - if (!matcher.addNames(destination)) { - tslog::log_verbose("Destination too long: ", destination, "\n"); - return false; - } - return static_cast(policy_checker(bus_type).check(user, group, label, matcher)); -} - -int __internal_can_send_multi_dest(BusType bus_type, - const uid_t user, - const gid_t group, - const char* const label, - const char** const destination, - uint16_t destination_size, - const char* const path, - const char* const interface, - const char* const member, - int type) -{ - MatchItemSend matcher(interface, member, path, static_cast(type)); - if (destination) - for (size_t i = 0; i < destination_size; i++) { - matcher.addName(destination[i]); + if (destination_names_size == 0) { + if (!matcher.addNames(destination)) { + tslog::log_verbose("Destination too long: ", destination, "\n"); + return false; } + } else { + assert(destination_names); + for (size_t i = 0; i < destination_names_size; i++) + matcher.addName(destination_names[i]); + } return static_cast(policy_checker(bus_type).check(user, group, label, matcher)); } @@ -139,39 +128,27 @@ int __internal_can_recv(BusType bus_type, const gid_t group, const char* const label, const char* const sender, + const char** const sender_names, + uint16_t sender_names_size, const char* const path, const char* const interface, const char* const member, int type) { MatchItemReceive matcher(interface, member, path, static_cast(type)); - if (!matcher.addNames(sender)) { - tslog::log_verbose("Sender too long: ", sender, "\n"); - return false; - } - return static_cast(policy_checker(bus_type).check(user, group, label, matcher)); -} - -int __internal_can_recv_multi(BusType bus_type, - const uid_t user, - const gid_t group, - const char* const label, - const char** const sender, - uint16_t sender_size, - const char* const path, - const char* const interface, - const char* const member, - int type) -{ - MatchItemReceive matcher(interface, member, path, static_cast(type)); - if (sender) - for (size_t i = 0; i < sender_size; i++) { - matcher.addName(sender[i]); + if (0 == sender_names_size) { + if (!matcher.addNames(sender)) { + tslog::log_verbose("Sender too long: ", sender, "\n"); + return false; } + } else { + assert(sender_names); + for (size_t i = 0; i < sender_names_size; i++) + matcher.addName(sender_names[i]); + } return static_cast(policy_checker(bus_type).check(user, group, label, matcher)); } - int __internal_can_own(BusType bus_type, const uid_t user, const gid_t group, diff --git a/src/internal/internal.h b/src/internal/internal.h index 92a1acc..c22a5d0 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -26,10 +26,6 @@ #ifndef _LIBDBUSPOLICY1_INTERNAL_H_ #define _LIBDBUSPOLICY1_INTERNAL_H_ -#ifdef __cplusplus -extern "C" { -#endif - #include #include #include @@ -96,6 +92,8 @@ int __internal_can_open(BusType bus_type, * \param[in] group User group id * \param[in] label Sender label * \param[in] destination Message destination + * \param[in] destination_names Array containing names owned by the destination + * \param[in] destination_names_size Size of destination_names array * \param[in] path Path * \param[in] interface Interface name * \param[in] member Member name @@ -107,40 +105,21 @@ int __internal_can_send(BusType bus_type, const gid_t group, const char* const label, const char* const destination, + const char** const destination_names, + uint16_t destination_names_size, const char* const path, const char* const interface, const char* const member, int type); -/** Checks if user can send messages (multiple destinations). - * \param[in] bus_type Bus type (system/session) - * \param[in] user User id - * \param[in] group User group id - * \param[in] label Sender label - * \param[in] destination Message destination - * \param[in] path Path - * \param[in] interface Interface name - * \param[in] member Member name - * \param[in] type Message type - * \return 1 on allow, 0 on deny, negative error code otherwise - */ -int __internal_can_send_multi_dest(BusType bus_type, - const uid_t user, - const gid_t group, - const char* const label, - const char** const destination, - uint16_t destination_size, - const char* const path, - const char* const interface, - const char* const member, - int type); - /** Check if user can receive messages. * \param[in] bus_type Bus type (system/session) * \param[in] user User id * \param[in] group User group id * \param[in] label User label * \param[in] sender Sender of received message + * \param[in] sender_names Array containing names owned by the sender + * \param[in] sender_names_size Size of sender_names array * \param[in] path Path * \param[in] interface Interface name * \param[in] member Member name @@ -152,29 +131,8 @@ int __internal_can_recv(BusType bus_type, gid_t group, const char* const label, const char* const sender, - const char* const path, - const char* const interface, - const char* const member, - int type); - -/** Check if user can receive messages. - * \param[in] bus_type Bus type (system/session) - * \param[in] user User id - * \param[in] group User group id - * \param[in] label User label - * \param[in] sender Sender of received message - * \param[in] path Path - * \param[in] interface Interface name - * \param[in] member Member name - * \param[in] type Message type - * \return 1 on allow, 0 on deny, negative error code otherwise - */ -int __internal_can_recv_multi(BusType bus_type, - uid_t user, - gid_t group, - const char* const label, - const char** const sender, - uint16_t sender_size, + const char** const sender_names, + uint16_t sender_names_size, const char* const path, const char* const interface, const char* const member, @@ -193,8 +151,4 @@ int __internal_can_own(BusType bus_type, gid_t group, const char* const label, const char* const service); -#ifdef __cplusplus -} /* extern "C" */ -#endif - #endif diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 9e32499..91063b1 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -279,10 +279,10 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, free_conn_info = true; } - if (0 == info.names_num) - r = __internal_can_send(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, destination, path, interface, member, message_type); - else - r = __internal_can_send_multi_dest(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, info.k_names, info.names_num, path, interface, member, message_type); + r = __internal_can_send(kconn->bus_type, + g_udesc.uid, g_udesc.gid, g_udesc.label, + destination, info.k_names, info.names_num, + path, interface, member, message_type); if (r <= 0) goto end; @@ -310,10 +310,10 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, } free_conn_info = true; - if (0 == info.names_num) - r = __internal_can_recv(kconn->bus_type, dest_uid_n, dest_gid_n, dest_label.c_str(), sender, path, interface, member, message_type); - else - r = __internal_can_recv_multi(kconn->bus_type, dest_uid_n, dest_gid_n, dest_label.c_str(), info.k_names, info.names_num, path, interface, member, message_type); + r = __internal_can_recv(kconn->bus_type, + dest_uid_n, dest_gid_n, dest_label.c_str(), + sender, info.k_names, info.names_num, + path, interface, member, message_type); end: if (free_conn_info) @@ -353,10 +353,10 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_in(void* configuration, goto end; } - if (0 == info.names_num) - r = __internal_can_send(kconn->bus_type, sender_uid, sender_gid, sender_label, destination, path, interface, member, message_type); - else - r = __internal_can_send_multi_dest(kconn->bus_type, sender_uid, sender_gid, sender_label, info.k_names, info.names_num, path, interface, member, message_type); + r = __internal_can_send(kconn->bus_type, + sender_uid, sender_gid, sender_label, + destination, info.k_names, info.names_num, + path, interface, member, message_type); if (r <= 0) goto end; @@ -366,7 +366,11 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_in(void* configuration, /* it is not needed to use __internal_can_recv_multi here. */ if (!sender) sender = ":"; - r = __internal_can_recv(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, sender, path, interface, member, message_type); + r = __internal_can_recv(kconn->bus_type, + g_udesc.uid, g_udesc.gid, g_udesc.label, + sender, nullptr, 0, + path, interface, member, message_type); + if (r <= 0) goto end; end: diff --git a/src/test-libdbuspolicy1-method.cpp b/src/test-libdbuspolicy1-method.cpp index d7db435..85ce088 100644 --- a/src/test-libdbuspolicy1-method.cpp +++ b/src/test-libdbuspolicy1-method.cpp @@ -68,9 +68,17 @@ bool method_test() { for (i = 0; i < sizeof(method_tests)/sizeof(struct MethodTest); i++) { if (method_tests[i].recv_send == MessageDirection::SEND) { - ret = __internal_can_send(SYSTEM_BUS, method_tests[i].user, method_tests[i].group, method_tests[i].label, method_tests[i].name, method_tests[i].path, method_tests[i].interface, method_tests[i].member, static_cast(method_tests[i].type)); + ret = __internal_can_send(SYSTEM_BUS, + method_tests[i].user, method_tests[i].group, method_tests[i].label, + method_tests[i].name, nullptr, 0, + method_tests[i].path, method_tests[i].interface, method_tests[i].member, + static_cast(method_tests[i].type)); } else if (method_tests[i].recv_send == MessageDirection::RECEIVE) { - ret = __internal_can_recv(SYSTEM_BUS, method_tests[i].user, method_tests[i].group, method_tests[i].label, method_tests[i].name, method_tests[i].path, method_tests[i].interface, method_tests[i].member, static_cast(method_tests[i].type)); + ret = __internal_can_recv(SYSTEM_BUS, + method_tests[i].user, method_tests[i].group, method_tests[i].label, + method_tests[i].name, nullptr, 0, + method_tests[i].path, method_tests[i].interface, method_tests[i].member, + static_cast(method_tests[i].type)); } if ( (int)((method_tests[i].expected_result)) != ret) { printf("[ERROR][%d] method test failed: %d %d ", i, (int)((method_tests[i].expected_result)), ret); diff --git a/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp b/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp index 2f2fbe5..da6a09c 100644 --- a/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp +++ b/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp @@ -141,7 +141,7 @@ bool test() for (i = 0; i < sizeof(tests)/sizeof(struct Test); i++) { ret = __internal_can_send(SYSTEM_BUS, tests[i].user, - tests[i].group, tests[i].label, tests[i].destination, + tests[i].group, tests[i].label, tests[i].destination, nullptr, 0, tests[i].path, tests[i].interface, tests[i].member, (int)tests[i].type); diff --git a/src/test-libdbuspolicy1-signal.cpp b/src/test-libdbuspolicy1-signal.cpp index 27069e5..84c3af4 100644 --- a/src/test-libdbuspolicy1-signal.cpp +++ b/src/test-libdbuspolicy1-signal.cpp @@ -33,7 +33,10 @@ bool signal_test() { bool ret = true; __internal_init(SYSTEM_BUS, "tests/default_allow/system.conf"); for (i = 0; i < sizeof(signal_tests)/sizeof(struct SignalTest); i++) { - ret = __internal_can_send(SYSTEM_BUS, signal_tests[i].user, signal_tests[i].group, signal_tests[i].label, signal_tests[i].dest, NULL, signal_tests[i].interface, NULL, DBUSPOLICY_MESSAGE_TYPE_SIGNAL); + ret = __internal_can_send(SYSTEM_BUS, + signal_tests[i].user, signal_tests[i].group, signal_tests[i].label, + signal_tests[i].dest, nullptr, 0, + NULL, signal_tests[i].interface, NULL, DBUSPOLICY_MESSAGE_TYPE_SIGNAL); if ( (int)((signal_tests[i].expected_result)) != ret) { printf("[ERROR][%d] signal test failed: %d %d ", i, (int)((signal_tests[i].expected_result)), ret); signalTest_print(&signal_tests[i], ret); -- 2.7.4 From fe85c1495658f95a34e04f0614f7e72b70c4103f Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 15:53:31 +0100 Subject: [PATCH 09/16] refactoring: manage kdbus commands This introduces helper class kdbus_command which makes it easy to allocate stack space for kdbus commands, including space needed for optional items. Change-Id: If4b9ab6cbc92f4705b21373af3d94f9d88a7fd6a --- src/kdbus.cpp | 127 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 69 insertions(+), 58 deletions(-) diff --git a/src/kdbus.cpp b/src/kdbus.cpp index cdf4429..c920145 100644 --- a/src/kdbus.cpp +++ b/src/kdbus.cpp @@ -39,6 +39,42 @@ #define MAX_DBUS_NAME_LEN 255 +constexpr uint64_t KDBUS_ITEM_HEADER_SIZE = offsetof(kdbus_item, data); +constexpr uint64_t KDBUS_ITEM_SIZE(uint64_t s) { return KDBUS_ITEM_HEADER_SIZE + s; } +constexpr uint64_t KDBUS_ITEM_SIZE_ALIGN(uint64_t s) { return ALIGN8(KDBUS_ITEM_SIZE(s)); } + +/* + * kdbus_command: + * A placeholder for kdbus_cmd_* commands designed to easily allocate them on the stack. + * It creates a stack buffer of appropriate size, emplaces a command in the buffer + * and initializes 'size' and 'flags' fields. + * Template parameters are: + * T - one of kdbus_cmd_* + * buffer_additional_size - size of maximum additional space needed for the command; + * by default it is 0, which means that only space needed for the command + * itself will be allocated + */ +template +class kdbus_command { + static constexpr size_t cmd_size = ALIGN8(sizeof(T)); + static constexpr size_t buffer_size = cmd_size + buffer_additional_size; + alignas(T) uint8_t buffer[buffer_size]; +public: + /* By default commands are initialized with no flags set, and size equal to + * the maximum buffer size. + * Parameter items_size may be used to assign some smaller value to the size, + * e.g. it may be set to 0, if users would like to increment command size by themselves. + */ + explicit kdbus_command(uint64_t flags = 0, size_t items_size = buffer_additional_size) { + auto cmd = get(); + cmd->size = cmd_size + items_size; + cmd->flags = flags; + } + T *get() { return reinterpret_cast(buffer); } +}; + +int kdbus_free_by_offset(kdbus_connection *conn, __u64 offset); + static int kdbus_open_bus(kdbus_connection *conn, const char *path) { conn->fd = open(path, O_RDWR|O_NOCTTY|O_LARGEFILE|O_CLOEXEC); @@ -50,40 +86,26 @@ static int kdbus_hello(struct kdbus_connection *conn, uint64_t attach_flags_send, uint64_t attach_flags_recv) { - struct kdbus_cmd_hello* cmd; - struct kdbus_cmd_free cmd_free; - struct kdbus_item* item; - size_t size = ALIGN8(sizeof(struct kdbus_cmd_hello)) + ALIGN8(offsetof(struct kdbus_item, data) + sizeof(CONNECTION_LABEL)); - - cmd = static_cast(calloc(1, size)); - if (!cmd) - goto err; - cmd->size = size; - cmd->flags = hello_flags; + kdbus_command command(hello_flags); + auto cmd = command.get(); + cmd->attach_flags_send = attach_flags_send; cmd->attach_flags_recv = attach_flags_recv; cmd->pool_size = KDBUS_POOL_SIZE; - item = cmd->items; + struct kdbus_item *item = cmd->items; item->size = offsetof(struct kdbus_item, data) + sizeof(CONNECTION_LABEL); item->type = KDBUS_ITEM_CONN_DESCRIPTION; memcpy(item->str, CONNECTION_LABEL, sizeof(CONNECTION_LABEL)); if (ioctl(conn->fd, KDBUS_CMD_HELLO, cmd) < 0) - goto err; + return -errno; conn->pool = static_cast(mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, conn->fd, 0)); if (MAP_FAILED == conn->pool) - goto err; + return -errno; - cmd_free.offset = cmd->offset; - cmd_free.size = sizeof(struct kdbus_cmd_free); - ioctl(conn->fd, KDBUS_CMD_FREE, &cmd_free); - free(cmd); + kdbus_free_by_offset(conn, cmd->offset); return 0; - -err: - free(cmd); - return -errno; } void kdbus_shared_init_fd(kdbus_connection *conn, int fd) @@ -133,11 +155,6 @@ static uint64_t kdbus_unique_id(char const *name) return res; } -union kdbus_cmd_union { - struct kdbus_cmd_info cmd_info; - uint8_t _buffer_[sizeof(struct kdbus_cmd_info) + offsetof(struct kdbus_item, data) + ALIGN8(MAX_DBUS_NAME_LEN+1)]; -}; - static void set_item_info(struct kdbus_item *item, const char *str, __u64 str_length, __u64 type) { item->size = (__u64)offsetof(struct kdbus_item, data) + str_length + (__u64)1; @@ -151,51 +168,44 @@ int kdbus_get_conn_info(kdbus_connection *conn, struct kdbus_cmd_param *info, conn_info_type conn_info_type) { + kdbus_command command(0, 0); + auto cmd = command.get(); + char const *label = NULL; - int r; uid_t uid_n = UID_INVALID; gid_t gid_n = GID_INVALID; - union kdbus_cmd_union cmd; - - struct kdbus_info *conn_info; - struct kdbus_item *item; - uintptr_t items_end; - cmd.cmd_info.flags = 0; + cmd->flags = 0; if (conn_info_type == POLICY_CONN_INFO_ALL) - cmd.cmd_info.attach_flags = (KDBUS_ATTACH_CREDS | KDBUS_ATTACH_NAMES | KDBUS_ATTACH_SECLABEL); + cmd->attach_flags = (KDBUS_ATTACH_CREDS | KDBUS_ATTACH_NAMES | KDBUS_ATTACH_SECLABEL); else - cmd.cmd_info.attach_flags = KDBUS_ATTACH_NAMES; + cmd->attach_flags = KDBUS_ATTACH_NAMES; if (kdbus_is_unique_id(destination)) { - cmd.cmd_info.size = sizeof(cmd.cmd_info); - cmd.cmd_info.id = kdbus_unique_id(destination); + cmd->id = kdbus_unique_id(destination); } else { - unsigned int l = strlen(destination); - cmd.cmd_info.size = sizeof(struct kdbus_cmd_info) + offsetof(struct kdbus_item, data) + ALIGN8(l+1); - cmd.cmd_info.id = 0; - set_item_info(cmd.cmd_info.items, destination, l, KDBUS_ITEM_NAME); + auto l = strlen(destination); + cmd->size += KDBUS_ITEM_SIZE_ALIGN(ALIGN8(l+1)); + cmd->id = 0; + set_item_info(cmd->items, destination, l, KDBUS_ITEM_NAME); } - r = ioctl(conn->fd, KDBUS_CMD_CONN_INFO, &cmd.cmd_info); - if (r < 0) { + if (ioctl(conn->fd, KDBUS_CMD_CONN_INFO, cmd) < 0) { if (errno == ENXIO || errno == ESRCH) return DBUSPOLICY_RESULT_DEST_NOT_AVAILABLE; return DBUSPOLICY_RESULT_KDBUS_ERROR; } - info->free_offset = cmd.cmd_info.offset; + info->free_offset = cmd->offset; - conn_info = (struct kdbus_info *) ((uint8_t *) conn->pool + cmd.cmd_info.offset); - items_end = (uintptr_t)conn_info + (unsigned)conn_info->size; - - static_assert((unsigned)KDBUS_ITEM_CREDS == KDBUS_ITEM_CREDS, "KDBUS_ITEM_CREDS not preserved when cast to unsigned"); - static_assert((unsigned)KDBUS_ITEM_SECLABEL == KDBUS_ITEM_SECLABEL, "KDBUS_ITEM_SECLABEL not preserved when cast to unsigned"); - static_assert((unsigned)KDBUS_ITEM_OWNED_NAME == KDBUS_ITEM_OWNED_NAME, "KDBUS_ITEM_OWNED_NAME not preserved when cast to unsigned"); + auto conn_info = reinterpret_cast((uint8_t *) conn->pool + cmd->offset); + uintptr_t items_end = (uintptr_t)conn_info + (size_t)conn_info->size; info->names_num = 0; - for (item = conn_info->items; (uintptr_t)item < items_end; item = (typeof(item))ALIGN8((uintptr_t)item + (unsigned)item->size)) { - switch ((unsigned)item->type) { + for (auto item = conn_info->items; + (uintptr_t)item < items_end; + item = reinterpret_cast(ALIGN8((uintptr_t)item + (size_t)item->size))) { + switch (item->type) { case KDBUS_ITEM_CREDS: uid_n = item->creds.euid; gid_n = item->creds.egid; @@ -213,18 +223,19 @@ int kdbus_get_conn_info(kdbus_connection *conn, info->uid_n = uid_n; info->gid_n = gid_n; - return r; + return 0; } int kdbus_free_by_offset(kdbus_connection *conn, __u64 offset) { - struct kdbus_cmd_free cmd; - cmd.size = sizeof(cmd); - cmd.flags = 0; - cmd.offset = offset; + kdbus_command command; + auto cmd = command.get(); + cmd->offset = offset; - if (ioctl(conn->fd, KDBUS_CMD_FREE, &cmd) != 0) + if (ioctl(conn->fd, KDBUS_CMD_FREE, cmd) != 0) { + LOGE("failed KDBUS_CMD_FREE"); return errno; + } return 0; } -- 2.7.4 From fcb54744a8c1186326561100bc3ee22ab20e89b9 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 16:00:31 +0100 Subject: [PATCH 10/16] refactoring: generalize and use setting string item Change-Id: Iabedbee561b73df704f97392ae064cfcc97806a5 --- src/kdbus.cpp | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/kdbus.cpp b/src/kdbus.cpp index c920145..fe9b043 100644 --- a/src/kdbus.cpp +++ b/src/kdbus.cpp @@ -81,6 +81,13 @@ static int kdbus_open_bus(kdbus_connection *conn, const char *path) return conn->fd; } +static void set_item_str(struct kdbus_item *item, const char *str, __u64 str_length, __u64 type) +{ + item->size = KDBUS_ITEM_SIZE(str_length); + item->type = type; + memcpy(item->str, str, str_length); +} + static int kdbus_hello(struct kdbus_connection *conn, uint64_t hello_flags, uint64_t attach_flags_send, @@ -93,10 +100,8 @@ static int kdbus_hello(struct kdbus_connection *conn, cmd->attach_flags_recv = attach_flags_recv; cmd->pool_size = KDBUS_POOL_SIZE; - struct kdbus_item *item = cmd->items; - item->size = offsetof(struct kdbus_item, data) + sizeof(CONNECTION_LABEL); - item->type = KDBUS_ITEM_CONN_DESCRIPTION; - memcpy(item->str, CONNECTION_LABEL, sizeof(CONNECTION_LABEL)); + set_item_str(cmd->items, CONNECTION_LABEL, sizeof(CONNECTION_LABEL), KDBUS_ITEM_CONN_DESCRIPTION); + if (ioctl(conn->fd, KDBUS_CMD_HELLO, cmd) < 0) return -errno; @@ -155,14 +160,6 @@ static uint64_t kdbus_unique_id(char const *name) return res; } -static void set_item_info(struct kdbus_item *item, const char *str, __u64 str_length, __u64 type) -{ - item->size = (__u64)offsetof(struct kdbus_item, data) + str_length + (__u64)1; - item->type = type; - *(uint64_t*)ALIGNDN8((uintptr_t)item->str + str_length) = 0; /* trailing zero + padding */ - memcpy(item->str, str, str_length+1); -} - int kdbus_get_conn_info(kdbus_connection *conn, const char *destination, struct kdbus_cmd_param *info, @@ -187,7 +184,7 @@ int kdbus_get_conn_info(kdbus_connection *conn, auto l = strlen(destination); cmd->size += KDBUS_ITEM_SIZE_ALIGN(ALIGN8(l+1)); cmd->id = 0; - set_item_info(cmd->items, destination, l, KDBUS_ITEM_NAME); + set_item_str(cmd->items, destination, l+1, KDBUS_ITEM_NAME); } if (ioctl(conn->fd, KDBUS_CMD_CONN_INFO, cmd) < 0) { if (errno == ENXIO || errno == ESRCH) -- 2.7.4 From 17cc423eb93578f549456fdca3c16040ec4109b2 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 16:12:19 +0100 Subject: [PATCH 11/16] refactoring: remove 'struct's Change-Id: I38349fb759a1a23873892d80642698580c7bbbfb --- src/kdbus.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/kdbus.cpp b/src/kdbus.cpp index fe9b043..9c09462 100644 --- a/src/kdbus.cpp +++ b/src/kdbus.cpp @@ -81,14 +81,14 @@ static int kdbus_open_bus(kdbus_connection *conn, const char *path) return conn->fd; } -static void set_item_str(struct kdbus_item *item, const char *str, __u64 str_length, __u64 type) +static void set_item_str(kdbus_item *item, const char *str, __u64 str_length, __u64 type) { item->size = KDBUS_ITEM_SIZE(str_length); item->type = type; memcpy(item->str, str, str_length); } -static int kdbus_hello(struct kdbus_connection *conn, +static int kdbus_hello(kdbus_connection *conn, uint64_t hello_flags, uint64_t attach_flags_send, uint64_t attach_flags_recv) @@ -162,7 +162,7 @@ static uint64_t kdbus_unique_id(char const *name) int kdbus_get_conn_info(kdbus_connection *conn, const char *destination, - struct kdbus_cmd_param *info, + kdbus_cmd_param *info, conn_info_type conn_info_type) { kdbus_command command(0, 0); @@ -195,7 +195,7 @@ int kdbus_get_conn_info(kdbus_connection *conn, info->free_offset = cmd->offset; - auto conn_info = reinterpret_cast((uint8_t *) conn->pool + cmd->offset); + auto conn_info = reinterpret_cast((uint8_t *) conn->pool + cmd->offset); uintptr_t items_end = (uintptr_t)conn_info + (size_t)conn_info->size; info->names_num = 0; -- 2.7.4 From 9cc0e36fe8eab97713c6780e20484b040b463eb9 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 16:12:43 +0100 Subject: [PATCH 12/16] kdbus: free cmd earlier while doing hello() Change-Id: I1b22db1d9296277de188d9e21e790390a24e7627 --- src/kdbus.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kdbus.cpp b/src/kdbus.cpp index 9c09462..b76b201 100644 --- a/src/kdbus.cpp +++ b/src/kdbus.cpp @@ -105,11 +105,12 @@ static int kdbus_hello(kdbus_connection *conn, if (ioctl(conn->fd, KDBUS_CMD_HELLO, cmd) < 0) return -errno; + kdbus_free_by_offset(conn, cmd->offset); + conn->pool = static_cast(mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, conn->fd, 0)); if (MAP_FAILED == conn->pool) return -errno; - kdbus_free_by_offset(conn, cmd->offset); return 0; } -- 2.7.4 From 2887b371404b961137586a395e8d9e7d24b9a2fb Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 16:15:43 +0100 Subject: [PATCH 13/16] refactoring: extract function getting bus owner from path Change-Id: I967484c5149f8eda1220e4e2045deb54ad84a4ab --- src/libdbuspolicy1.cpp | 53 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 91063b1..96ae45f 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -37,7 +37,7 @@ #include #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" -#define KDBUS_SYSTEM_BUS_PATH "/sys/fs/kdbus/0-system/bus" +#define KDBUS_SYSTEM_BUS_PATH KDBUS_PATH_PREFIX"0-system/bus" struct kconn { kdbus_connection conn; @@ -106,35 +106,46 @@ static std::shared_ptr bus_type_from_path(const char *bus_path, BusT return nullptr; } -static std::shared_ptr bus_path_resolve(const char *bus_path, BusType &bus_type, uid_t &bus_owner) noexcept +// We will never get 0 as a session bus owner (0 uses "0-system" bus), +// so it's OK to assume that bus_owner==0 always means error. +static uid_t bus_owner_from_path(const char *resolved_path) noexcept { - assert(bus_path); + boost::string_ref user_suffix("-user/bus"); + boost::string_ref ps(resolved_path); - auto resolved_path = bus_type_from_path(bus_path, bus_type); + if (!ps.ends_with(user_suffix)) + return 0; - if (nullptr == resolved_path) - return nullptr; + ps.remove_suffix(user_suffix.length()); - if (bus_type == SESSION_BUS) { - boost::string_ref user_suffix("-user/bus"); - boost::string_ref ps(resolved_path.get()); + size_t last_slash = ps.find_last_of('/'); + if (last_slash == boost::string_ref::npos || last_slash == ps.length() - 1) + return 0; - if (!ps.ends_with(user_suffix)) - return nullptr; + ps = ps.substr(last_slash+1); - ps.remove_suffix(user_suffix.length()); + errno = 0; + uid_t bus_owner = strtol(ps.data(), NULL, 10); + if (errno) + return 0; - size_t last_slash = ps.find_last_of('/'); - if (last_slash == boost::string_ref::npos || last_slash == ps.length() - 1) - return nullptr; + return bus_owner; +} - ps = ps.substr(last_slash+1); +static std::shared_ptr bus_path_resolve(const char *bus_path, BusType &bus_type, uid_t &bus_owner) +{ + assert(bus_path); + + auto resolved_path = bus_type_from_path(bus_path, bus_type); - errno = 0; - bus_owner = strtol(ps.data(), NULL, 10); - // We will never get 0 as a session bus owner (0 uses "0-system" bus), - // so it's OK to assume that bus_owner==0 always means error. - if (errno || bus_owner == 0) + if (nullptr == resolved_path) + return nullptr; + + if (bus_type == SESSION_BUS) { + auto result = bus_owner_from_path(resolved_path.get()); + if (result > 0) + bus_owner = result; + else return nullptr; } -- 2.7.4 From e1c0ffeb15da05d10503fec180cfbec622fe56e3 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 16:24:12 +0100 Subject: [PATCH 14/16] refactoring: simplify getting conf file names Change-Id: Ib452c4c11480ab388c69296d6e220ac725e83ee0 --- src/libdbuspolicy1.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 96ae45f..5b8b6bb 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -152,16 +152,30 @@ static std::shared_ptr bus_path_resolve(const char *bus_path, BusTyp return resolved_path; } +static const char *primary_conf_file(BusType bus_type) +{ + if (SYSTEM_BUS == bus_type) + return system_bus_conf_file_primary(); + return session_bus_conf_file_primary(); +} + +static const char *secondary_conf_file(BusType bus_type) +{ + if (SYSTEM_BUS == bus_type) + return SYSTEM_BUS_CONF_FILE_SECONDARY; + return SESSION_BUS_CONF_FILE_SECONDARY; +} + static void init_common_locked(BusType bus_type) { - int ret = __internal_init_auto_serialized(bus_type, (bus_type == SYSTEM_BUS) ? system_bus_conf_file_primary() : session_bus_conf_file_primary()); + int ret = __internal_init_auto_serialized(bus_type, primary_conf_file(bus_type)); if (ret < 0) - ret = __internal_init(bus_type, (bus_type == SYSTEM_BUS) ? SYSTEM_BUS_CONF_FILE_SECONDARY : SESSION_BUS_CONF_FILE_SECONDARY); + ret = __internal_init(bus_type, secondary_conf_file(bus_type)); + + assert(ret >= 0 && "failed __internal_init"); if (ret >= 0) __internal_init_sup_group(bus_type, g_udesc.uid, g_udesc.gid); - else - assert(false && "failed __internal_init"); } static void init_global_conn_locked(BusType bus_type, std::shared_ptr resolved_path) -- 2.7.4 From 60ce2d8330d37573b8fbe54e698a92aea4571df1 Mon Sep 17 00:00:00 2001 From: Adrian Szyndela Date: Fri, 29 Mar 2019 16:27:51 +0100 Subject: [PATCH 15/16] introduce KdbusConnection and KdbusConnectionInfo classes Change-Id: Ie9b80624f6f6d09e08338ed68e23657f5dc33480 --- src/kdbus.cpp | 123 ++++++++++++++++++++++------------------------ src/kdbus.h | 80 +++++++++++++++++++----------- src/libdbuspolicy1.cpp | 131 +++++++++++++++++-------------------------------- 3 files changed, 155 insertions(+), 179 deletions(-) diff --git a/src/kdbus.cpp b/src/kdbus.cpp index b76b201..5802625 100644 --- a/src/kdbus.cpp +++ b/src/kdbus.cpp @@ -20,13 +20,14 @@ #include #include -#include +#include #include #include #include #include -#include #include +#include +#include #define CONNECTION_LABEL "libdbuspolicy1-kdbus" @@ -34,8 +35,6 @@ #define ALIGN8(l) (((l) + 7) & ~7) #define ALIGNDN8(l) ((l) & ~7) -#define UID_INVALID ((uid_t) -1) -#define GID_INVALID ((gid_t) -1) #define MAX_DBUS_NAME_LEN 255 @@ -73,12 +72,10 @@ public: T *get() { return reinterpret_cast(buffer); } }; -int kdbus_free_by_offset(kdbus_connection *conn, __u64 offset); - -static int kdbus_open_bus(kdbus_connection *conn, const char *path) +int KdbusConnection::open_bus(const char *path) { - conn->fd = open(path, O_RDWR|O_NOCTTY|O_LARGEFILE|O_CLOEXEC); - return conn->fd; + fd = open(path, O_RDWR|O_NOCTTY|O_LARGEFILE|O_CLOEXEC); + return fd; } static void set_item_str(kdbus_item *item, const char *str, __u64 str_length, __u64 type) @@ -88,10 +85,9 @@ static void set_item_str(kdbus_item *item, const char *str, __u64 str_length, __ memcpy(item->str, str, str_length); } -static int kdbus_hello(kdbus_connection *conn, - uint64_t hello_flags, - uint64_t attach_flags_send, - uint64_t attach_flags_recv) +int KdbusConnection::hello(uint64_t hello_flags, + uint64_t attach_flags_send, + uint64_t attach_flags_recv) { kdbus_command command(hello_flags); auto cmd = command.get(); @@ -102,47 +98,36 @@ static int kdbus_hello(kdbus_connection *conn, set_item_str(cmd->items, CONNECTION_LABEL, sizeof(CONNECTION_LABEL), KDBUS_ITEM_CONN_DESCRIPTION); - if (ioctl(conn->fd, KDBUS_CMD_HELLO, cmd) < 0) + if (ioctl(fd, KDBUS_CMD_HELLO, cmd) < 0) return -errno; - kdbus_free_by_offset(conn, cmd->offset); + free_by_offset(cmd->offset); - conn->pool = static_cast(mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, conn->fd, 0)); - if (MAP_FAILED == conn->pool) + pool = static_cast(mmap(NULL, KDBUS_POOL_SIZE, PROT_READ, MAP_SHARED, fd, 0)); + if (MAP_FAILED == pool) return -errno; return 0; } -void kdbus_shared_init_fd(kdbus_connection *conn, int fd) -{ - conn->fd = fd; -} - -void kdbus_shared_init_pool(kdbus_connection *conn, void *pool) -{ - conn->pool = static_cast(pool); -} - -int kdbus_connect(kdbus_connection *conn, - const char *path, - uint64_t hello_flags, - uint64_t attach_flags_send, - uint64_t attach_flags_recv) +int KdbusConnection::connect(const char *path, + uint64_t hello_flags, + uint64_t attach_flags_send, + uint64_t attach_flags_recv) { - if ((conn->fd = kdbus_open_bus(conn, path)) < 0) { + if (open_bus(path) < 0) { LOGE("Error opening bus: %s", path); return -1; } - if (kdbus_hello(conn, hello_flags, attach_flags_send, attach_flags_recv) < 0) { + if (hello(hello_flags, attach_flags_send, attach_flags_recv) < 0) { LOGE("Error: bus hello failed"); - close(conn->fd); + close(fd); return -1; } return 0; } -static bool kdbus_is_unique_id(const char* name) +constexpr bool kdbus_is_unique_id(const char* name) { return ':' == name[0]; } @@ -161,79 +146,89 @@ static uint64_t kdbus_unique_id(char const *name) return res; } -int kdbus_get_conn_info(kdbus_connection *conn, - const char *destination, - kdbus_cmd_param *info, - conn_info_type conn_info_type) +int KdbusConnection::get_conn_info(const char *bus_name, + conn_info_type conn_info_type, + KdbusConnectionInfo *info) { kdbus_command command(0, 0); auto cmd = command.get(); - char const *label = NULL; - uid_t uid_n = UID_INVALID; - gid_t gid_n = GID_INVALID; - - cmd->flags = 0; if (conn_info_type == POLICY_CONN_INFO_ALL) cmd->attach_flags = (KDBUS_ATTACH_CREDS | KDBUS_ATTACH_NAMES | KDBUS_ATTACH_SECLABEL); else cmd->attach_flags = KDBUS_ATTACH_NAMES; - if (kdbus_is_unique_id(destination)) { - cmd->id = kdbus_unique_id(destination); + if (kdbus_is_unique_id(bus_name)) { + cmd->id = kdbus_unique_id(bus_name); } else { - auto l = strlen(destination); - cmd->size += KDBUS_ITEM_SIZE_ALIGN(ALIGN8(l+1)); + auto l = strlen(bus_name); + cmd->size += KDBUS_ITEM_SIZE_ALIGN(l+1); cmd->id = 0; - set_item_str(cmd->items, destination, l+1, KDBUS_ITEM_NAME); + + set_item_str(cmd->items, bus_name, l+1, KDBUS_ITEM_NAME); } - if (ioctl(conn->fd, KDBUS_CMD_CONN_INFO, cmd) < 0) { + if (ioctl(fd, KDBUS_CMD_CONN_INFO, cmd) < 0) { if (errno == ENXIO || errno == ESRCH) return DBUSPOLICY_RESULT_DEST_NOT_AVAILABLE; return DBUSPOLICY_RESULT_KDBUS_ERROR; } - info->free_offset = cmd->offset; + info->setNewData(cmd->offset); - auto conn_info = reinterpret_cast((uint8_t *) conn->pool + cmd->offset); + auto conn_info = reinterpret_cast(pool + cmd->offset); uintptr_t items_end = (uintptr_t)conn_info + (size_t)conn_info->size; - info->names_num = 0; for (auto item = conn_info->items; (uintptr_t)item < items_end; item = reinterpret_cast(ALIGN8((uintptr_t)item + (size_t)item->size))) { switch (item->type) { case KDBUS_ITEM_CREDS: - uid_n = item->creds.euid; - gid_n = item->creds.egid; + info->setCreds(item->creds.euid, item->creds.egid); break; case KDBUS_ITEM_SECLABEL: - label = item->str; + info->setLabel(item->str); break; case KDBUS_ITEM_OWNED_NAME: - info->k_names[info->names_num++] = item->name.name; + info->addName(item->name.name); break; } } - info->label = label; - info->uid_n = uid_n; - info->gid_n = gid_n; - return 0; } -int kdbus_free_by_offset(kdbus_connection *conn, __u64 offset) +int KdbusConnection::free_by_offset(uint64_t offset) { kdbus_command command; auto cmd = command.get(); cmd->offset = offset; - if (ioctl(conn->fd, KDBUS_CMD_FREE, cmd) != 0) { + if (ioctl(fd, KDBUS_CMD_FREE, cmd) != 0) { LOGE("failed KDBUS_CMD_FREE"); return errno; } return 0; } + +void KdbusConnectionInfo::release_info() +{ + if (set) { + my_connection.free_by_offset(free_offset); + set = false; + } +} + +void KdbusConnectionInfo::setNewData(uint64_t offset) +{ + release_info(); + + free_offset = offset; + set = true; + + names_num = 0; + _label = nullptr; + uid_n = UID_INVALID; + gid_n = GID_INVALID; +} diff --git a/src/kdbus.h b/src/kdbus.h index 55fe607..7183937 100644 --- a/src/kdbus.h +++ b/src/kdbus.h @@ -28,44 +28,64 @@ #define KDBUS_CONN_MAX_NAMES 256 -#ifdef __cplusplus -extern "C" { -#endif +class KdbusConnectionInfo; -struct kdbus_connection { +class KdbusConnection { int fd; - char *pool; -}; + uint8_t *pool; -typedef struct kdbus_connection kdbus_connection; + int open_bus(const char *path); + int hello(uint64_t hello_flags, + uint64_t attach_flags_send, + uint64_t attach_flags_recv); +public: + typedef enum { POLICY_CONN_INFO_ALL, POLICY_CONN_INFO_NAME } conn_info_type; -struct kdbus_cmd_param { - char const *label; - const char* k_names[KDBUS_CONN_MAX_NAMES]; - __u64 free_offset; - uid_t uid_n; - gid_t gid_n; - uint16_t names_num; + void shared_init_fd(int fd_to_set) { fd = fd_to_set; } + void shared_init_pool(void *pool_to_set) { pool = static_cast(pool_to_set); } + int connect(const char *path, + uint64_t hello_flags, + uint64_t attach_flags_send, + uint64_t attach_flags_recv); + int get_conn_info(const char *bus_name, + conn_info_type conn_info_type, + KdbusConnectionInfo *info); + int free_by_offset(uint64_t offset); }; -void kdbus_shared_init_fd(kdbus_connection *conn, int fd); -void kdbus_shared_init_pool(kdbus_connection *conn, void *pool); +class KdbusConnectionInfo { + static const uid_t UID_INVALID = -1; + static const gid_t GID_INVALID = -1; + + char const *_label{nullptr}; + const char *k_names[KDBUS_CONN_MAX_NAMES]{}; + uint64_t free_offset{0}; + uid_t uid_n{UID_INVALID}; + gid_t gid_n{GID_INVALID}; + uint16_t names_num{0}; + bool set{false}; + + KdbusConnection &my_connection; -int kdbus_connect(kdbus_connection *conn, - const char *path, - uint64_t hello_flags, - uint64_t attach_flags_send, - uint64_t attach_flags_recv); +public: + KdbusConnectionInfo(KdbusConnection &c) : my_connection{c} {} + ~KdbusConnectionInfo() { release_info(); } -typedef enum { POLICY_CONN_INFO_ALL, POLICY_CONN_INFO_NAME } conn_info_type; + void release_info(); + void setNewData(uint64_t offset); -int kdbus_get_conn_info(kdbus_connection *conn, - const char *destination, - struct kdbus_cmd_param *info, - conn_info_type conn_info_type); + void addName(const char *name) { k_names[names_num++] = name; } -int kdbus_free_by_offset(kdbus_connection *conn, __u64 offset); + void setCreds(uid_t uid, gid_t gid) { uid_n = uid; gid_n = gid; } -#ifdef __cplusplus -} /* extern "C" */ -#endif + void setLabel(const char *label) { _label = label; } + + int get(const char *destination, KdbusConnection::conn_info_type conn_info_type) { + return my_connection.get_conn_info(destination, conn_info_type, this); + } + const char **names() { return k_names; } + uint16_t numberOfNames() const { return names_num; } + uid_t uid() const { return uid_n; } + gid_t gid() const { return gid_n; } + const char *label() const { return _label; } +}; diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 5b8b6bb..6f9b673 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -40,7 +40,7 @@ #define KDBUS_SYSTEM_BUS_PATH KDBUS_PATH_PREFIX"0-system/bus" struct kconn { - kdbus_connection conn; + KdbusConnection conn; BusType bus_type; } g_conn[2]; @@ -183,7 +183,7 @@ static void init_global_conn_locked(BusType bus_type, std::shared_ptrbus_type = bus_type; - if (kdbus_connect(&kconn->conn, resolved_path.get(), 0, _KDBUS_ATTACH_ALL, 0) < 0) { + if (kconn->conn.connect(resolved_path.get(), 0, _KDBUS_ATTACH_ALL, 0) < 0) { assert(false && "failed kdbus_connect"); } } @@ -197,12 +197,12 @@ static struct kconn *get_global_conn(BusType bus_type, std::shared_ptr(malloc(sizeof(*result))); - if (NULL == result) { + kconn *result = new kconn; + if (nullptr == result) { LOGE("Error: failed to allocate memory for policy configuration"); - return NULL; + return nullptr; } - kdbus_shared_init_fd(&result->conn, fd); + result->conn.shared_init_fd(fd); result->bus_type = bus_type; return result; } @@ -229,7 +229,7 @@ DBUSPOLICY1_EXPORT void* dbuspolicy1_init_shared(const char *bus_path, int fd) return nullptr; } - struct kconn *result = NULL; + struct kconn *result = nullptr; if (can_open(bus_type, bus_owner)) { if (-1 == fd) { result = get_global_conn(bus_type, resolved_path); @@ -248,9 +248,12 @@ DBUSPOLICY1_EXPORT void* dbuspolicy1_init(const char *bus_path) return dbuspolicy1_init_shared(bus_path, -1); } +inline kconn *KCONN(void *config) { return static_cast(config); } +inline KdbusConnection &KDBUS_CONN(void *config) { return KCONN(config)->conn; } + DBUSPOLICY1_EXPORT void dbuspolicy1_init_set_pool(void *configuration, void *pool) { - kdbus_shared_init_pool(static_cast(configuration), pool); + KDBUS_CONN(configuration).shared_init_pool(pool); } DBUSPOLICY1_EXPORT void dbuspolicy1_free(void* configuration) @@ -259,7 +262,7 @@ DBUSPOLICY1_EXPORT void dbuspolicy1_free(void* configuration) if (configuration == &g_conn[i]) return; - free(configuration); + delete KCONN(configuration); } DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, @@ -269,21 +272,10 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, const char *interface, const char *member, int message_type, - const char *error_name, - int reply_serial, - int requested_reply) + const char * /*error_name*/, + int /*reply_serial*/, + int /*requested_reply*/) { - (void)error_name; - (void)reply_serial; - (void)requested_reply; - - struct kconn *kconn = static_cast(configuration); - - int r; - struct kdbus_cmd_param info = {}; - std::string dest_label; - bool free_conn_info = false; - /* Broadcast signal has NULL destination */ /* Due to this sender can not check rule correctly */ if (message_type == DBUSPOLICY_MESSAGE_TYPE_SIGNAL && !destination) @@ -292,59 +284,38 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_out(void* configuration, __internal_enter(); auto internal_enter_guard = transaction_guard::makeGuard([] () { __internal_exit(); }); - uid_t dest_uid_n = 0; - gid_t dest_gid_n = 0; - + auto kconn = KCONN(configuration); + KdbusConnectionInfo destinationInfo(kconn->conn); + int r; /* check can send */ /* if broadcasting, then pass - null destination */ if (destination && *destination) { - r = kdbus_get_conn_info(&kconn->conn, destination, &info, POLICY_CONN_INFO_ALL); + r = destinationInfo.get(destination, KdbusConnection::POLICY_CONN_INFO_ALL); if (r < 0) return r; - free_conn_info = true; } r = __internal_can_send(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, - destination, info.k_names, info.names_num, + destination, destinationInfo.names(), destinationInfo.numberOfNames(), path, interface, member, message_type); if (r <= 0) - goto end; - - /* copy & free */ - if (destination && *destination) { - dest_uid_n = info.uid_n; - dest_gid_n = info.gid_n; - - if (info.label) - dest_label = info.label; - - if (free_conn_info) { - kdbus_free_by_offset(&kconn->conn, info.free_offset); - free_conn_info = false; - } - } + return r; + KdbusConnectionInfo senderInfo(kconn->conn); /* check can recv */ /* get sender information from kdbus */ - r = kdbus_get_conn_info(&kconn->conn, sender, &info, POLICY_CONN_INFO_NAME); + r = senderInfo.get(sender, KdbusConnection::POLICY_CONN_INFO_NAME); if (r < 0) { fprintf(stderr, "failed to kdbus conn info:%d\n", r); - goto end; + return r; } - free_conn_info = true; - r = __internal_can_recv(kconn->bus_type, - dest_uid_n, dest_gid_n, dest_label.c_str(), - sender, info.k_names, info.names_num, + return __internal_can_recv(kconn->bus_type, + destinationInfo.uid(), destinationInfo.gid(), destinationInfo.label(), + sender, senderInfo.names(), senderInfo.numberOfNames(), path, interface, member, message_type); - -end: - if (free_conn_info) - kdbus_free_by_offset(&kconn->conn, info.free_offset); - - return r; } DBUSPOLICY1_EXPORT int dbuspolicy1_check_in(void* configuration, @@ -357,61 +328,51 @@ DBUSPOLICY1_EXPORT int dbuspolicy1_check_in(void* configuration, const char *interface, const char *member, int message_type, - const char *error_name, - int reply_serial, - int requested_reply) + const char * /*error_name*/, + int /*reply_serial*/, + int /*requested_reply*/) { - (void)error_name; - (void)reply_serial; - (void)requested_reply; - - struct kconn *kconn = static_cast(configuration); - - int r; - struct kdbus_cmd_param info; - __internal_enter(); + auto internal_enter_guard = transaction_guard::makeGuard([] () { __internal_exit(); }); + auto kconn = KCONN(configuration); + KdbusConnectionInfo info(kconn->conn); + int r; if (destination && *destination) { - r = kdbus_get_conn_info(&kconn->conn, destination, &info, POLICY_CONN_INFO_NAME); + r = info.get(destination, KdbusConnection::POLICY_CONN_INFO_NAME); if (r < 0) - goto end; + return r; } r = __internal_can_send(kconn->bus_type, sender_uid, sender_gid, sender_label, - destination, info.k_names, info.names_num, + destination, info.names(), info.numberOfNames(), path, interface, member, message_type); if (r <= 0) - goto end; + return r; - /* libdbus, gdbus pass multiple sender as parameter : eg. "name_A name_B name_C". */ - /* Because of '__internal_can_recv' can check rule against multiple names, */ - /* it is not needed to use __internal_can_recv_multi here. */ if (!sender) sender = ":"; + + /* libdbus, gdbus pass multiple sender as parameter : eg. "name_A name_B name_C". */ r = __internal_can_recv(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, sender, nullptr, 0, path, interface, member, message_type); if (r <= 0) - goto end; -end: - if (info.free_offset) - kdbus_free_by_offset(&kconn->conn, info.free_offset); + return r; - __internal_exit(); return r; } DBUSPOLICY1_EXPORT int dbuspolicy1_can_own(void* configuration, const char* const service) { - int r; - struct kconn *kconn = static_cast(configuration); + auto kconn = KCONN(configuration); + __internal_enter(); - r = __internal_can_own(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, service); - __internal_exit(); - return r; + auto internal_enter_guard = transaction_guard::makeGuard([] () { __internal_exit(); }); + + return __internal_can_own(kconn->bus_type, g_udesc.uid, g_udesc.gid, g_udesc.label, service); } -- 2.7.4 From 025693a033210a93c30ae1e2c6d4d2c31a8bca4e Mon Sep 17 00:00:00 2001 From: Agnieszka Baumann Date: Wed, 3 Apr 2019 18:46:33 +0200 Subject: [PATCH 16/16] refactoring: reorder includes Makes it easier to spot duplicated includes Change-Id: I6f0ef0cd5bf558500020ee715e301f708fffb04d --- src/internal/cynara.cpp | 6 +++--- src/internal/cynara_mockup.cpp | 4 ++-- src/internal/groups_proxy.cpp | 2 +- src/internal/internal.cpp | 15 +++++++-------- src/internal/internal.h | 3 ++- src/internal/naive_policy_checker.cpp | 4 ++-- src/internal/own_tree.cpp | 2 +- src/internal/policy.cpp | 16 +++++++--------- src/internal/print_content.cpp | 3 +-- src/internal/serializer.cpp | 11 +++++------ src/internal/storage_backend_serialized.cpp | 18 +++++++----------- src/internal/storage_backend_xml.cpp | 7 +++---- src/internal/tslog.cpp | 4 +--- src/internal/xml_parser.cpp | 13 ++++++------- src/kdbus.cpp | 14 ++++++-------- src/libdbuspolicy1.cpp | 16 ++++++++-------- src/stest_load_perf.cpp | 17 ++++++++--------- src/stest_performance.cpp | 19 +++++++++---------- src/test-libdbuspolicy1-access-deny-gdi.cpp | 10 +++++----- src/test-libdbuspolicy1-access-deny.cpp | 4 ++-- src/test-libdbuspolicy1-method-gdi.cpp | 15 +++++++-------- src/test-libdbuspolicy1-ownership-deny-gdi.cpp | 10 +++++----- src/test-libdbuspolicy1-ownership-deny.cpp | 4 ++-- src/test-libdbuspolicy1-ownership-gdi.cpp | 14 +++++++------- src/test-libdbuspolicy1-ownership.cpp | 5 ++--- ...ibdbuspolicy1-send_destination_prefix-deny-gdi.cpp | 14 +++++++------- ...st-libdbuspolicy1-send_destination_prefix-deny.cpp | 4 ++-- src/test-libdbuspolicy1-signal-gdi.cpp | 14 +++++++------- src/test-libdbuspolicy1-signal.cpp | 5 ++--- src/test-serializer.cpp | 9 ++++----- 30 files changed, 131 insertions(+), 151 deletions(-) diff --git a/src/internal/cynara.cpp b/src/internal/cynara.cpp index d42135f..44590c3 100644 --- a/src/internal/cynara.cpp +++ b/src/internal/cynara.cpp @@ -14,11 +14,11 @@ * limitations under the License. */ #include "cynara.hpp" -#include -#include -#include #include #include +#include +#include +#include using namespace ldp_cynara; diff --git a/src/internal/cynara_mockup.cpp b/src/internal/cynara_mockup.cpp index ad3cd24..1c63894 100644 --- a/src/internal/cynara_mockup.cpp +++ b/src/internal/cynara_mockup.cpp @@ -14,10 +14,10 @@ * limitations under the License. */ #include "cynara.hpp" -#include -#include #include #include +#include +#include using namespace ldp_cynara; diff --git a/src/internal/groups_proxy.cpp b/src/internal/groups_proxy.cpp index 8b79e73..d3e4e55 100644 --- a/src/internal/groups_proxy.cpp +++ b/src/internal/groups_proxy.cpp @@ -15,9 +15,9 @@ */ #include "groups_proxy.hpp" #include "tslog.hpp" +#include #include #include -#include /** * \file diff --git a/src/internal/internal.cpp b/src/internal/internal.cpp index 108a9e7..1a96cf7 100644 --- a/src/internal/internal.cpp +++ b/src/internal/internal.cpp @@ -17,16 +17,15 @@ * \file * \ingroup Implementation */ - -#include -#include -#include -#include -#include "xml_parser.hpp" -#include "policy.hpp" -#include "naive_policy_checker.hpp" #include "internal.h" +#include "naive_policy_checker.hpp" +#include "policy.hpp" #include "tslog.hpp" +#include "xml_parser.hpp" +#include +#include +#include +#include using namespace ldp_xml_parser; diff --git a/src/internal/internal.h b/src/internal/internal.h index c22a5d0..6c898d5 100644 --- a/src/internal/internal.h +++ b/src/internal/internal.h @@ -27,8 +27,9 @@ #define _LIBDBUSPOLICY1_INTERNAL_H_ #include -#include #include +#include +#include typedef enum { SYSTEM_BUS = 0, diff --git a/src/internal/naive_policy_checker.cpp b/src/internal/naive_policy_checker.cpp index da185a9..48666fa 100644 --- a/src/internal/naive_policy_checker.cpp +++ b/src/internal/naive_policy_checker.cpp @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "naive_policy_checker.hpp" #include "cynara.hpp" -#include "tslog.hpp" #include "groups_proxy.hpp" +#include "naive_policy_checker.hpp" #include "serializer.hpp" +#include "tslog.hpp" /** * \file diff --git a/src/internal/own_tree.cpp b/src/internal/own_tree.cpp index f27c3f2..5cc7ead 100644 --- a/src/internal/own_tree.cpp +++ b/src/internal/own_tree.cpp @@ -15,9 +15,9 @@ */ #include "own_tree.hpp" #include -#include #include #include +#include /** * \file diff --git a/src/internal/policy.cpp b/src/internal/policy.cpp index f818c7f..f0128aa 100644 --- a/src/internal/policy.cpp +++ b/src/internal/policy.cpp @@ -17,19 +17,17 @@ * \file * \ingroup Implementation */ - -#include "policy.hpp" #include "naive_policy_checker.hpp" -#include "tslog.hpp" +#include "policy.hpp" #include "storage_backend_xml.hpp" - -#include -#include -#include -#include +#include "tslog.hpp" +#include #include #include -#include +#include +#include +#include +#include using namespace ldp_xml_parser; diff --git a/src/internal/print_content.cpp b/src/internal/print_content.cpp index 245a959..5c67497 100644 --- a/src/internal/print_content.cpp +++ b/src/internal/print_content.cpp @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "policy.hpp" #include "print_content.hpp" #include "serialized_convert.hpp" -#include "policy.hpp" - #include #include diff --git a/src/internal/serializer.cpp b/src/internal/serializer.cpp index 8b74828..3cc7f41 100644 --- a/src/internal/serializer.cpp +++ b/src/internal/serializer.cpp @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include -#include -#include - +#include "include/fb_generated.h" +#include "include/flatbuffers/flatbuffers.h" #include "internal.h" #include "naive_policy_checker.hpp" #include "serializer.hpp" -#include "include/flatbuffers/flatbuffers.h" -#include "include/fb_generated.h" +#include +#include +#include namespace ldp_xml_parser { diff --git a/src/internal/storage_backend_serialized.cpp b/src/internal/storage_backend_serialized.cpp index 551c620..b6b7409 100644 --- a/src/internal/storage_backend_serialized.cpp +++ b/src/internal/storage_backend_serialized.cpp @@ -13,24 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "storage_backend_serialized.hpp" +#include "include/fb_generated.h" #include "print_content.hpp" #include "serialized_convert.hpp" -#include "tslog.hpp" -#include "transaction_guard.hpp" #include "serializer.hpp" - -#include "include/fb_generated.h" - +#include "storage_backend_serialized.hpp" +#include "transaction_guard.hpp" +#include "tslog.hpp" +#include +#include +#include #include #include #include #include -#include - -#include - -#include using namespace FB; diff --git a/src/internal/storage_backend_xml.cpp b/src/internal/storage_backend_xml.cpp index 63d87c9..95ee1b6 100644 --- a/src/internal/storage_backend_xml.cpp +++ b/src/internal/storage_backend_xml.cpp @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "storage_backend_xml.hpp" #include "policy_containers.hpp" -#include "xml_parser.hpp" -#include "tslog.hpp" #include "print_content.hpp" - +#include "storage_backend_xml.hpp" +#include "tslog.hpp" +#include "xml_parser.hpp" #include #include diff --git a/src/internal/tslog.cpp b/src/internal/tslog.cpp index 99147a5..6e3a03e 100644 --- a/src/internal/tslog.cpp +++ b/src/internal/tslog.cpp @@ -17,10 +17,8 @@ * \file * \ingroup Implementation */ - -#include "tslog.hpp" #include "libdbuspolicy1-private.h" - +#include "tslog.hpp" #include namespace tslog { diff --git a/src/internal/xml_parser.cpp b/src/internal/xml_parser.cpp index d91a665..984dd53 100644 --- a/src/internal/xml_parser.cpp +++ b/src/internal/xml_parser.cpp @@ -18,19 +18,18 @@ * \file * \ingroup Implementation */ +#include "libdbuspolicy1-private.h" +#include "tslog.hpp" #include "xml_parser.hpp" - #include -#include -#include #include -#include +#include #include +#include +#include #include #include -#include -#include "tslog.hpp" -#include "libdbuspolicy1-private.h" +#include using namespace ldp_xml_parser; diff --git a/src/kdbus.cpp b/src/kdbus.cpp index 5802625..3432a07 100644 --- a/src/kdbus.cpp +++ b/src/kdbus.cpp @@ -15,19 +15,17 @@ */ #include "kdbus.h" +#include +#include +#include #include - #include - +#include #include -#include -#include +#include #include -#include +#include #include -#include -#include -#include #define CONNECTION_LABEL "libdbuspolicy1-kdbus" diff --git a/src/libdbuspolicy1.cpp b/src/libdbuspolicy1.cpp index 6f9b673..4f377ec 100644 --- a/src/libdbuspolicy1.cpp +++ b/src/libdbuspolicy1.cpp @@ -20,21 +20,21 @@ #include "libdbuspolicy1-private.h" #include "internal/transaction_guard.hpp" +#include +#include +#include #include #include -#include -#include #include -#include -#include #include -#include #include #include -#include -#include -#include #include +#include +#include +#include +#include +#include #define KDBUS_PATH_PREFIX "/sys/fs/kdbus/" #define KDBUS_SYSTEM_BUS_PATH KDBUS_PATH_PREFIX"0-system/bus" diff --git a/src/stest_load_perf.cpp b/src/stest_load_perf.cpp index 13f3b58..44485e0 100644 --- a/src/stest_load_perf.cpp +++ b/src/stest_load_perf.cpp @@ -1,18 +1,17 @@ -#include -#include - -#include -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_serialized.hpp" #include "libdbuspolicy1-private.h" +#include +#include +#include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/stest_performance.cpp b/src/stest_performance.cpp index 75221c6..4aa8aba 100644 --- a/src/stest_performance.cpp +++ b/src/stest_performance.cpp @@ -1,19 +1,18 @@ -#include -#include - -#include -#include -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_serialized.hpp" #include "libdbuspolicy1-private.h" +#include +#include +#include +#include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-access-deny-gdi.cpp b/src/test-libdbuspolicy1-access-deny-gdi.cpp index 7f44f66..d15bee8 100644 --- a/src/test-libdbuspolicy1-access-deny-gdi.cpp +++ b/src/test-libdbuspolicy1-access-deny-gdi.cpp @@ -1,14 +1,14 @@ -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_xml.hpp" #include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-access-deny.cpp b/src/test-libdbuspolicy1-access-deny.cpp index 5ea0002..c2e69da 100644 --- a/src/test-libdbuspolicy1-access-deny.cpp +++ b/src/test-libdbuspolicy1-access-deny.cpp @@ -1,7 +1,7 @@ -#include -#include #include "internal/internal.h" #include +#include +#include struct AccessTest { bool expected_result; diff --git a/src/test-libdbuspolicy1-method-gdi.cpp b/src/test-libdbuspolicy1-method-gdi.cpp index 64ae2c6..c4d4585 100644 --- a/src/test-libdbuspolicy1-method-gdi.cpp +++ b/src/test-libdbuspolicy1-method-gdi.cpp @@ -1,16 +1,15 @@ - -#include -#include -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_xml.hpp" +#include +#include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-ownership-deny-gdi.cpp b/src/test-libdbuspolicy1-ownership-deny-gdi.cpp index af4bc20..6c5cd8f 100644 --- a/src/test-libdbuspolicy1-ownership-deny-gdi.cpp +++ b/src/test-libdbuspolicy1-ownership-deny-gdi.cpp @@ -1,13 +1,13 @@ -#include -#include -#include +#include "internal/include/fb_generated.h" +#include "internal/internal.h" #include "internal/naive_policy_checker.hpp" #include "internal/policy.hpp" -#include "internal/internal.h" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_xml.hpp" +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-ownership-deny.cpp b/src/test-libdbuspolicy1-ownership-deny.cpp index f52688c..31ac025 100644 --- a/src/test-libdbuspolicy1-ownership-deny.cpp +++ b/src/test-libdbuspolicy1-ownership-deny.cpp @@ -1,6 +1,6 @@ -#include -#include #include "internal/internal.h" +#include +#include struct OwnershipTest { bool expected_result; diff --git a/src/test-libdbuspolicy1-ownership-gdi.cpp b/src/test-libdbuspolicy1-ownership-gdi.cpp index f517685..f2daae1 100644 --- a/src/test-libdbuspolicy1-ownership-gdi.cpp +++ b/src/test-libdbuspolicy1-ownership-gdi.cpp @@ -1,15 +1,15 @@ -#include -#include -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_serialized.hpp" +#include +#include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-ownership.cpp b/src/test-libdbuspolicy1-ownership.cpp index 5a32425..cd8c1b7 100644 --- a/src/test-libdbuspolicy1-ownership.cpp +++ b/src/test-libdbuspolicy1-ownership.cpp @@ -1,9 +1,8 @@ - +#include "internal/internal.h" +#include #include #include #include -#include -#include "internal/internal.h" struct OwnershipTest { bool expected_result; diff --git a/src/test-libdbuspolicy1-send_destination_prefix-deny-gdi.cpp b/src/test-libdbuspolicy1-send_destination_prefix-deny-gdi.cpp index a7e96d1..1e72d33 100644 --- a/src/test-libdbuspolicy1-send_destination_prefix-deny-gdi.cpp +++ b/src/test-libdbuspolicy1-send_destination_prefix-deny-gdi.cpp @@ -1,15 +1,15 @@ -#include -#include -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_serialized.hpp" +#include +#include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp b/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp index da6a09c..fc64d3f 100644 --- a/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp +++ b/src/test-libdbuspolicy1-send_destination_prefix-deny.cpp @@ -1,8 +1,8 @@ -#include -#include #include "internal/internal.h" #include "internal/policy.hpp" #include "libdbuspolicy1-private.h" +#include +#include struct Test { bool expected_result; diff --git a/src/test-libdbuspolicy1-signal-gdi.cpp b/src/test-libdbuspolicy1-signal-gdi.cpp index dcf39aa..b08d51e 100644 --- a/src/test-libdbuspolicy1-signal-gdi.cpp +++ b/src/test-libdbuspolicy1-signal-gdi.cpp @@ -1,15 +1,15 @@ -#include -#include -#include -#include -#include +#include "internal/include/fb_generated.h" #include "internal/internal.h" -#include "internal/policy.hpp" #include "internal/naive_policy_checker.hpp" +#include "internal/policy.hpp" #include "internal/serializer.hpp" -#include "internal/include/fb_generated.h" #include "internal/storage_backend_serialized.hpp" #include "internal/storage_backend_serialized.hpp" +#include +#include +#include +#include +#include using namespace ldp_xml_parser; using namespace ldp_serialized; diff --git a/src/test-libdbuspolicy1-signal.cpp b/src/test-libdbuspolicy1-signal.cpp index 84c3af4..c4b622f 100644 --- a/src/test-libdbuspolicy1-signal.cpp +++ b/src/test-libdbuspolicy1-signal.cpp @@ -1,9 +1,8 @@ - +#include "internal/internal.h" +#include #include #include #include -#include -#include "internal/internal.h" struct SignalTest { bool expected_result; diff --git a/src/test-serializer.cpp b/src/test-serializer.cpp index 63689d4..2aaf1fd 100644 --- a/src/test-serializer.cpp +++ b/src/test-serializer.cpp @@ -1,11 +1,10 @@ -#include -#include -#include - -#include "internal/include/flatbuffers/flatbuffers.h" #include "internal/include/fb_generated.h" +#include "internal/include/flatbuffers/flatbuffers.h" #include "internal/policy_containers.hpp" #include "internal/serializer.hpp" +#include +#include +#include namespace ldp_xml_parser { -- 2.7.4