diff options
author | Simo Sorce <idra@samba.org> | 2009-02-24 16:36:16 -0500 |
---|---|---|
committer | Simo Sorce <idra@samba.org> | 2009-02-24 16:50:08 -0500 |
commit | 57df88bb0b4ce656855410a8c2969d93475c2f11 (patch) | |
tree | 644bf0ce008c446efc27cf369d18a248da5ae7b4 /server/nss | |
parent | 3621d86ad205dcacb50022f8e6b669218600257f (diff) | |
download | sssd-57df88bb0b4ce656855410a8c2969d93475c2f11.tar.gz sssd-57df88bb0b4ce656855410a8c2969d93475c2f11.tar.bz2 sssd-57df88bb0b4ce656855410a8c2969d93475c2f11.zip |
Proper fix for memory handling problem.
sbus_message_handler is not responsible anymore for sending
back data in any case.
Transfer this responsibility to the handler function called.
This way both synchronous and asynchronous funstions use the
interface the same way and can properly free memory referenced
by the reply after the send buffer has been filled in and all
copies are done in sbus_conn_send_reply()
Diffstat (limited to 'server/nss')
-rw-r--r-- | server/nss/nsssrv.c | 31 | ||||
-rw-r--r-- | server/nss/nsssrv_dp.c | 13 |
2 files changed, 31 insertions, 13 deletions
diff --git a/server/nss/nsssrv.c b/server/nss/nsssrv.c index b6191cce..c48aed4a 100644 --- a/server/nss/nsssrv.c +++ b/server/nss/nsssrv.c @@ -44,9 +44,9 @@ #define SSS_NSS_PIPE_NAME "nss" -static int service_identity(DBusMessage *message, void *data, DBusMessage **r); -static int service_pong(DBusMessage *message, void *data, DBusMessage **r); -static int service_reload(DBusMessage *message, void *data, DBusMessage **r); +static int service_identity(DBusMessage *message, struct sbus_conn_ctx *sconn); +static int service_pong(DBusMessage *message, struct sbus_conn_ctx *sconn); +static int service_reload(DBusMessage *message, struct sbus_conn_ctx *sconn); static int nss_init_domains(struct nss_ctx *nctx); static int _domain_comparator(const void *key1, const void *key2); @@ -227,7 +227,7 @@ static void accept_fd_handler(struct event_context *ev, return; } -static int service_identity(DBusMessage *message, void *data, DBusMessage **r) +static int service_identity(DBusMessage *message, struct sbus_conn_ctx *sconn) { dbus_uint16_t version = NSS_SBUS_SERVICE_VERSION; const char *name = NSS_SBUS_SERVICE_NAME; @@ -238,41 +238,54 @@ static int service_identity(DBusMessage *message, void *data, DBusMessage **r) name, version)); reply = dbus_message_new_method_return(message); + if (!reply) return ENOMEM; + ret = dbus_message_append_args(reply, DBUS_TYPE_STRING, &name, DBUS_TYPE_UINT16, &version, DBUS_TYPE_INVALID); if (!ret) { + dbus_message_unref(reply); return EIO; } - *r = reply; + /* send reply back */ + sbus_conn_send_reply(sconn, reply); + dbus_message_unref(reply); + return EOK; } -static int service_pong(DBusMessage *message, void *data, DBusMessage **r) +static int service_pong(DBusMessage *message, struct sbus_conn_ctx *sconn) { DBusMessage *reply; dbus_bool_t ret; reply = dbus_message_new_method_return(message); + if (!reply) return ENOMEM; + ret = dbus_message_append_args(reply, DBUS_TYPE_INVALID); if (!ret) { + dbus_message_unref(reply); return EIO; } - *r = reply; + /* send reply back */ + sbus_conn_send_reply(sconn, reply); + dbus_message_unref(reply); + return EOK; } -static int service_reload(DBusMessage *message, void *data, DBusMessage **r) { +static int service_reload(DBusMessage *message, struct sbus_conn_ctx *sconn) +{ /* Monitor calls this function when we need to reload * our configuration information. Perform whatever steps * are needed to update the configuration objects. */ /* Send an empty reply to acknowledge receipt */ - return service_pong(message, data, r); + return service_pong(message, sconn); } static int nss_sbus_init(struct nss_ctx *nctx) diff --git a/server/nss/nsssrv_dp.c b/server/nss/nsssrv_dp.c index 487ac285..ec8aea8b 100644 --- a/server/nss/nsssrv_dp.c +++ b/server/nss/nsssrv_dp.c @@ -101,7 +101,6 @@ int nss_dp_send_acct_req(struct nss_ctx *nctx, TALLOC_CTX *memctx, DBusMessage *msg; DBusPendingCall *pending_reply; DBusConnection *conn; - DBusError dbus_error; dbus_bool_t ret; uint32_t be_type; const char *attrs = "core"; @@ -144,7 +143,6 @@ int nss_dp_send_acct_req(struct nss_ctx *nctx, TALLOC_CTX *memctx, } conn = sbus_get_connection(nctx->dp_ctx->scon_ctx); - dbus_error_init(&dbus_error); /* create the message */ msg = dbus_message_new_method_call(NULL, @@ -248,6 +246,7 @@ static int nss_dp_get_reply(DBusPendingCall *pending, if (!ret) { DEBUG(1,("Filed to parse message\n")); /* FIXME: Destroy this connection ? */ + if (dbus_error_is_set(&dbus_error)) dbus_error_free(&dbus_error); err = EIO; goto done; } @@ -281,7 +280,7 @@ done: return err; } -static int nss_dp_identity(DBusMessage *message, void *data, DBusMessage **r) +static int nss_dp_identity(DBusMessage *message, struct sbus_conn_ctx *sconn) { dbus_uint16_t version = DATA_PROVIDER_VERSION; dbus_uint16_t clitype = DP_CLI_FRONTEND; @@ -294,6 +293,8 @@ static int nss_dp_identity(DBusMessage *message, void *data, DBusMessage **r) clitype, version, cliname)); reply = dbus_message_new_method_return(message); + if (!reply) return ENOMEM; + ret = dbus_message_append_args(reply, DBUS_TYPE_UINT16, &clitype, DBUS_TYPE_UINT16, &version, @@ -301,10 +302,14 @@ static int nss_dp_identity(DBusMessage *message, void *data, DBusMessage **r) DBUS_TYPE_STRING, &nullname, DBUS_TYPE_INVALID); if (!ret) { + dbus_message_unref(reply); return EIO; } - *r = reply; + /* send reply back */ + sbus_conn_send_reply(sconn, reply); + dbus_message_unref(reply); + return EOK; } |