[SSSD] [PATCHES] Fixes for nss responder (for 1.2)
Sumit Bose
sbose at redhat.com
Tue Nov 2 14:13:33 UTC 2010
Hi,
please find attached the backports to the 1.2 series of the fixes for
ticket #654.
bye,
Sumit
-------------- next part --------------
From f0fe4c2c5fe705d48f6910ef131c8da95cc6427d Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Fri, 22 Oct 2010 12:01:23 +0200
Subject: [PATCH 1/3] Remove all nss requests after a reconnect
Currently we do not handle the open nss request after a reconnect and
wait until they timeout (which is a couple of minutes!). This patch adds
a handler that terminates all requests after a reconnect. Then responder
will return matching cache entries or nothing.
---
src/responder/common/responder.h | 2 ++
src/responder/common/responder_dp.c | 19 +++++++++++++++++++
src/responder/nss/nsssrv.c | 6 +++++-
3 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
index deb1e5a..43e91a1 100644
--- a/src/responder/common/responder.h
+++ b/src/responder/common/responder.h
@@ -146,6 +146,8 @@ struct cli_protocol_version *register_cli_protocol_version(void);
typedef void (*sss_dp_callback_t)(uint16_t err_maj, uint32_t err_min,
const char *err_msg, void *ptr);
+void handle_requests_after_reconnect(void);
+
int sss_dp_send_acct_req(struct resp_ctx *rctx, TALLOC_CTX *callback_memctx,
sss_dp_callback_t callback, void *callback_ctx,
int timeout, const char *domain,
diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c
index a5c1c51..c8ed1b7 100644
--- a/src/responder/common/responder_dp.c
+++ b/src/responder/common/responder_dp.c
@@ -107,6 +107,25 @@ static int sss_dp_req_destructor(void *ptr)
return 0;
}
+static bool reconnect_handler(hash_entry_t *item, void *user_data)
+{
+ struct sss_dp_req *sdp_req = talloc_get_type(item->value.ptr,
+ struct sss_dp_req);
+
+ return (talloc_free(sdp_req) == EOK ? true : false);
+}
+
+void handle_requests_after_reconnect(void)
+{
+ int ret;
+
+ ret = hash_iterate(dp_requests, reconnect_handler, NULL);
+ if (ret != HASH_SUCCESS) {
+ DEBUG(1, ("hash_iterate failed, "
+ "not all request might be handled after reconnect.\n"));
+ }
+}
+
static void sdp_req_timeout(struct tevent_context *ev,
struct tevent_timer *te,
struct timeval t, void *ptr)
diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c
index f14d698..a50085a 100644
--- a/src/responder/nss/nsssrv.c
+++ b/src/responder/nss/nsssrv.c
@@ -39,6 +39,7 @@
#include "dbus/dbus.h"
#include "sbus/sssd_dbus.h"
#include "responder/common/responder_packet.h"
+#include "responder/common/responder.h"
#include "providers/data_provider.h"
#include "monitor/monitor_interfaces.h"
#include "sbus/sbus_client.h"
@@ -143,7 +144,10 @@ static void nss_dp_reconnect_init(struct sbus_connection *conn,
DATA_PROVIDER_VERSION,
"NSS");
/* all fine */
- if (ret == EOK) return;
+ if (ret == EOK) {
+ handle_requests_after_reconnect();
+ return;
+ }
}
/* Failed to reconnect */
--
1.7.2.3
-------------- next part --------------
From b387f4033920a62395af45363e5fac8facea5aaa Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Tue, 2 Nov 2010 14:49:13 +0100
Subject: [PATCH 2/3] Always use talloc_zero() to allocate cmdctx
---
src/responder/nss/nsssrv_cmd.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 7a86453..a4b8dc1 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -1426,7 +1426,7 @@ static int nss_cmd_getpwent(struct cli_ctx *cctx)
return nss_cmd_setpwent_ext(cctx, true);
}
- cmdctx = talloc(cctx, struct nss_cmd_ctx);
+ cmdctx = talloc_zero(cctx, struct nss_cmd_ctx);
if (!cmdctx) {
return ENOMEM;
}
@@ -2725,7 +2725,7 @@ static int nss_cmd_getgrent(struct cli_ctx *cctx)
return nss_cmd_setgrent_ext(cctx, true);
}
- cmdctx = talloc(cctx, struct nss_cmd_ctx);
+ cmdctx = talloc_zero(cctx, struct nss_cmd_ctx);
if (!cmdctx) {
return ENOMEM;
}
--
1.7.2.3
-------------- next part --------------
From ce978357acc080479ea5bea5643022d3444488cf Mon Sep 17 00:00:00 2001
From: Sumit Bose <sbose at redhat.com>
Date: Mon, 25 Oct 2010 11:14:04 +0200
Subject: [PATCH 3/3] Fix double free issue
---
src/responder/common/responder_dp.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c
index c8ed1b7..e1670f9 100644
--- a/src/responder/common/responder_dp.c
+++ b/src/responder/common/responder_dp.c
@@ -95,12 +95,12 @@ static int sss_dp_req_destructor(void *ptr)
cb = sdp_req->cb_list;
while (cb) {
+ next = cb->next;
+ /* It is the responsibility of the callback to free cb */
cb->callback(sdp_req->err_maj,
sdp_req->err_min,
sdp_req->err_msg,
cb->callback_ctx);
- next = cb->next;
- talloc_free(cb);
cb = next;
}
--
1.7.2.3
More information about the sssd-devel
mailing list