>From 80ef1b457438631159403a849ac7d7cb044e6d06 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 14 Apr 2014 16:13:43 +0200 Subject: [PATCH] SBUS: create a private context for introspection --- src/sbus/sssd_dbus_connection.c | 29 +++++++++++++++++++++++------ src/sbus/sssd_dbus_introspect.c | 8 +++++++- src/sbus/sssd_dbus_private.h | 4 ++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/sbus/sssd_dbus_connection.c b/src/sbus/sssd_dbus_connection.c index 281280ba72e2785eb099ccc9dca00b9ed0bf4650..64777fbe815c78d8c893ee1a3e8f5ab327c6701e 100644 --- a/src/sbus/sssd_dbus_connection.c +++ b/src/sbus/sssd_dbus_connection.c @@ -378,7 +378,8 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, const struct sbus_interface_meta *interface; struct sbus_request *dbus_req = NULL; sbus_msg_handler_fn handler_fn = NULL; - void *handler_data = NULL; + void *handler_data = NULL; /* Must be a talloc pointer! */ + struct sbus_introspect_ctx *ictx = NULL; DBusHandlerResult result; int ret; @@ -407,7 +408,6 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, method = sbus_meta_find_method(interface, msg_method); if (method && method->vtable_offset) handler_fn = VTABLE_FUNC(intf_p->intf->vtable, method->vtable_offset); - handler_data = intf_p->intf->instance_data; if (!method) { /* Reply DBUS_ERROR_UNKNOWN_METHOD */ @@ -434,22 +434,39 @@ DBusHandlerResult sbus_message_handler(DBusConnection *dbus_conn, if (strcmp(msg_interface, DBUS_INTROSPECT_INTERFACE) == 0 && strcmp(msg_method, DBUS_INTROSPECT_METHOD) == 0) { DEBUG(SSSDBG_TRACE_LIBS, "Got introspection request\n"); - handler_fn = sbus_introspect; - handler_data = discard_const(interface); + ictx = talloc(intf_p->conn, struct sbus_introspect_ctx); + if (ictx == NULL) { + result = sbus_reply_internal_error(message, intf_p->conn); + } else { + handler_fn = sbus_introspect; + ictx->iface = interface; + handler_data = ictx; + } } } if (handler_fn) { dbus_req = sbus_new_request(intf_p->conn, intf_p->intf, message); if (!dbus_req) { + talloc_zfree(handler_data); ret = ENOMEM; } else { dbus_req->method = method; + if (handler_data) { + /* If the handler uses private instance data, make + * sure they go away when the request does + */ + talloc_steal(dbus_req, handler_data); + } else { + /* If no custom handler data is set, pass on the + * interface data + */ + handler_data = intf_p->intf->instance_data; + } ret = handler_fn(dbus_req, handler_data); } if (ret != EOK) { - if (dbus_req) - talloc_free(dbus_req); + talloc_free(dbus_req); result = sbus_reply_internal_error(message, intf_p->conn); } else { result = DBUS_HANDLER_RESULT_HANDLED; diff --git a/src/sbus/sssd_dbus_introspect.c b/src/sbus/sssd_dbus_introspect.c index 6114293b2ae1cbf0ea00a43604d9c6688ed5884b..ffc1f4d38ba70f9074d6731280136e899374c866 100644 --- a/src/sbus/sssd_dbus_introspect.c +++ b/src/sbus/sssd_dbus_introspect.c @@ -305,8 +305,14 @@ int sbus_introspect(struct sbus_request *dbus_req, void *pvt) char *xml; DBusError dberr; const struct sbus_interface_meta *iface; + struct sbus_introspect_ctx *ictx; - iface = (struct sbus_interface_meta *) pvt; + ictx = talloc_get_type(pvt, struct sbus_introspect_ctx); + if (ictx == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n"); + return sbus_request_return_and_finish(dbus_req, DBUS_TYPE_INVALID); + } + iface = ictx->iface; xml = sbus_introspect_xml(dbus_req, iface); if (xml == NULL) { diff --git a/src/sbus/sssd_dbus_private.h b/src/sbus/sssd_dbus_private.h index 1bd0f11c9f1e1483f76645ca8820aa1aff3df1cb..929caeccbcc0aca2e42fc44eacf3603826cbe329 100644 --- a/src/sbus/sssd_dbus_private.h +++ b/src/sbus/sssd_dbus_private.h @@ -98,6 +98,10 @@ struct sbus_request * sbus_new_request(struct sbus_connection *conn, struct sbus_interface *intf, DBusMessage *message); +struct sbus_introspect_ctx { + const struct sbus_interface_meta *iface; +}; + int sbus_introspect(struct sbus_request *dbus_req, void *pvt); #endif /* _SSSD_DBUS_PRIVATE_H_ */ -- 1.9.0