summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/util/sss_ldap.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/util/sss_ldap.c b/src/util/sss_ldap.c
index d1bf0373f..c440d5445 100644
--- a/src/util/sss_ldap.c
+++ b/src/util/sss_ldap.c
@@ -304,6 +304,22 @@ struct sss_ldap_init_state {
#endif
};
+static int sss_ldap_init_state_destructor(void *data)
+{
+ struct sss_ldap_init_state *state = (struct sss_ldap_init_state *)data;
+
+ if (state->ldap) {
+ DEBUG(SSSDBG_TRACE_FUNC,
+ "calling ldap_unbind_ext for ldap:[%p] sd:[%d]\n",
+ state->ldap, state->sd);
+ ldap_unbind_ext(state->ldap, NULL, NULL);
+ } else if (state->sd != -1) {
+ DEBUG(SSSDBG_TRACE_FUNC, "closing socket [%d]\n", state->sd);
+ close(state->sd);
+ }
+
+ return 0;
+}
struct tevent_req *sss_ldap_init_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
@@ -321,6 +337,8 @@ struct tevent_req *sss_ldap_init_send(TALLOC_CTX *mem_ctx,
return NULL;
}
+ talloc_set_destructor((TALLOC_CTX *)state, sss_ldap_init_state_destructor);
+
state->ldap = NULL;
state->uri = uri;
@@ -370,9 +388,6 @@ struct tevent_req *sss_ldap_init_send(TALLOC_CTX *mem_ctx,
return req;
fail:
- if(state->sd >= 0) {
- close(state->sd);
- }
tevent_req_error(req, ret);
#else
DEBUG(SSSDBG_MINOR_FAILURE, "ldap_init_fd not available, "
@@ -457,11 +472,6 @@ static void sss_ldap_init_sys_connect_done(struct tevent_req *subreq)
return;
fail:
- if (state->ldap) {
- ldap_unbind_ext(state->ldap, NULL, NULL);
- } else {
- close(state->sd);
- }
tevent_req_error(req, ret);
}
#endif
@@ -472,6 +482,9 @@ int sss_ldap_init_recv(struct tevent_req *req, LDAP **ldap, int *sd)
struct sss_ldap_init_state);
TEVENT_REQ_RETURN_ON_ERROR(req);
+ /* Everything went well therefore we do not want to release resources */
+ talloc_set_destructor(state, NULL);
+
*ldap = state->ldap;
*sd = state->sd;