From: Lennart Poettering Date: Tue, 28 Apr 2020 15:04:08 +0000 (+0200) Subject: sd-bus: introduce new SD_BUS_VTABLE_ABSOLUTE_OFFSET vtable flag X-Git-Tag: v246-rc1~348^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=491ce161037a11b52abec74eeb6c8cfa512ef1fb;p=thirdparty%2Fsystemd.git sd-bus: introduce new SD_BUS_VTABLE_ABSOLUTE_OFFSET vtable flag When set, the offset specified for the vtable entry is passed to the handler as-is, and is not added to the userdata pointer. This is useful in case methods/properties are mixed on the same vtable, that expect to operate relative to some object in memory and that expect pointers to absolute memory, or that just want a number passed. --- diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index ad66d634d7e..6abac8822c6 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -56,7 +56,7 @@ static int node_vtable_get_userdata( static void *vtable_method_convert_userdata(const sd_bus_vtable *p, void *u) { assert(p); - if (!u) + if (!u || FLAGS_SET(p->flags, SD_BUS_VTABLE_ABSOLUTE_OFFSET)) return SIZE_TO_PTR(p->x.method.offset); /* don't add offset on NULL, to make ubsan happy */ return (uint8_t*) u + p->x.method.offset; @@ -65,7 +65,7 @@ static void *vtable_method_convert_userdata(const sd_bus_vtable *p, void *u) { static void *vtable_property_convert_userdata(const sd_bus_vtable *p, void *u) { assert(p); - if (!u) + if (!u || FLAGS_SET(p->flags, SD_BUS_VTABLE_ABSOLUTE_OFFSET)) return SIZE_TO_PTR(p->x.property.offset); /* as above */ return (uint8_t*) u + p->x.property.offset; diff --git a/src/systemd/sd-bus-vtable.h b/src/systemd/sd-bus-vtable.h index f2423ba456a..b10a3e04bc3 100644 --- a/src/systemd/sd-bus-vtable.h +++ b/src/systemd/sd-bus-vtable.h @@ -44,6 +44,7 @@ enum { SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION = 1ULL << 6, SD_BUS_VTABLE_PROPERTY_EXPLICIT = 1ULL << 7, SD_BUS_VTABLE_SENSITIVE = 1ULL << 8, /* covers both directions: method call + reply */ + SD_BUS_VTABLE_ABSOLUTE_OFFSET = 1ULL << 9, _SD_BUS_VTABLE_CAPABILITY_MASK = 0xFFFFULL << 40 };