requests.
--HG--
branch : HEAD
{
struct auth_request *auth_request = value;
- auth_request->auth_free(auth_request);
+ auth_request->conn = NULL;
+ auth_request_unref(auth_request);
}
void auth_client_connection_destroy(struct auth_client_connection *conn)
pool = pool_alloconly_create("anonymous_auth_request", 256);
auth_request = p_new(pool, struct auth_request, 1);
+ auth_request->refcount = 1;
auth_request->pool = pool;
auth_request->auth_continue = mech_anonymous_auth_continue;
auth_request->auth_free = mech_anonymous_auth_free;
pool = pool_alloconly_create("cyrus_sasl_auth_request", 256);
cyrus_request = p_new(pool, struct cyrus_auth_request, 1);
+ cyrus_request->auth_request.refcount = 1;
cyrus_request->auth_request.pool = pool;
cyrus_request->auth_request.auth_continue =
cyrus_sasl_auth_continue;
auth = p_new(pool, struct digest_auth_request, 1);
auth->pool = pool;
+ auth->auth_request.refcount = 1;
auth->auth_request.pool = pool;
auth->auth_request.auth_continue = mech_digest_md5_auth_continue;
auth->auth_request.auth_free = mech_digest_md5_auth_free;
pool = pool_alloconly_create("plain_auth_request", 256);
auth_request = p_new(pool, struct auth_request, 1);
+ auth_request->refcount = 1;
auth_request->pool = pool;
auth_request->auth_continue = mech_plain_auth_continue;
auth_request->auth_free = mech_plain_auth_free;
void mech_request_free(struct auth_client_connection *conn,
struct auth_request *auth_request, unsigned int id)
{
- auth_request->auth_free(auth_request);
+ auth_request_unref(auth_request);
hash_remove(conn->auth_requests, POINTER_CAST(id));
}
return TRUE;
}
+void auth_request_ref(struct auth_request *request)
+{
+ request->refcount++;
+}
+
+int auth_request_unref(struct auth_request *request)
+{
+ if (--request->refcount > 0)
+ return TRUE;
+
+ request->auth_free(request);
+ return FALSE;
+}
+
extern struct mech_module mech_plain;
extern struct mech_module mech_digest_md5;
extern struct mech_module mech_anonymous;
struct auth_client_connection *conn);
struct auth_request {
+ int refcount;
+
pool_t pool;
char *user;
struct auth_client_request_new *request,
mech_callback_t *callback);
+void auth_request_ref(struct auth_request *request);
+int auth_request_unref(struct auth_request *request);
+
void mech_init(void);
void mech_deinit(void);
}
}
+ /* LDAP result is free'd now. we can check if auth_request is
+ even needed anymore */
+ if (!auth_request_unref(auth_request))
+ return;
+
scheme = password_get_scheme(&password);
if (scheme == NULL) {
scheme = conn->set.default_pass_scheme;
filter = str_c(str);
}
+ auth_request_ref(auth_request);
ldap_request->callback = handle_request;
ldap_request->context = auth_request;
}
}
- request->callback(result, request->request);
+ if (auth_request_unref(request->request))
+ request->callback(result, request->request);
if (close(request->fd) < 0)
i_error("PAM: close(child input) failed: %m");
if (close(fd[1]) < 0)
i_error("PAM: close(fd[1]) failed: %m");
+ auth_request_ref(request);
pam_auth_request = i_new(struct pam_auth_request, 1);
pam_auth_request->fd = fd[0];
pam_auth_request->request = request;