i_zero(rctx);
- pool = request->pool;
+ pool = pool_alloconly_create(
+ MEMPOOL_GROWING"sasl_server_request", 2048);
req = p_new(pool, struct sasl_server_request, 1);
req->pool = pool;
+ req->refcount = 1;
req->sinst = sinst;
req->rctx = rctx;
mreq->set = &sinst->set;
mreq->mech = mech;
mreq->mech_event = event_parent;
- mreq->protocol = p_strdup(mreq->pool, protocol);
+ mreq->protocol = p_strdup(pool, protocol);
req->mech = mreq;
rctx->mech = mech;
rctx->request = req;
}
-void sasl_server_request_destroy(struct sasl_server_req_ctx *rctx)
+void sasl_server_mech_request_ref(struct sasl_server_mech_request *mreq)
{
- struct sasl_server_request *req = rctx->request;
+ i_assert(mreq->req->refcount > 0);
+ mreq->req->refcount++;
+}
- i_zero(rctx);
- if (req == NULL)
+void sasl_server_mech_request_unref(struct sasl_server_mech_request **_mreq)
+{
+ struct sasl_server_mech_request *mreq = *_mreq;
+
+ *_mreq = NULL;
+ if (mreq == NULL)
+ return;
+
+ struct sasl_server_request *req = mreq->req;
+
+ i_assert(req->refcount > 0);
+ if (--req->refcount > 0)
return;
struct sasl_server_instance *sinst = req->sinst;
struct sasl_server *server = sinst->server;
- struct sasl_server_mech_request *mreq = req->mech;
i_assert(sinst->requests > 0);
sinst->requests--;
if (mreq->mech->def->funcs->auth_free != NULL)
mreq->mech->def->funcs->auth_free(mreq);
+
+ if (req->rctx != NULL)
+ i_zero(req->rctx);
+ pool_unref(&req->pool);
+}
+
+void sasl_server_request_ref(struct sasl_server_req_ctx *rctx)
+{
+ sasl_server_mech_request_ref(rctx->request->mech);
+}
+
+void sasl_server_request_unref(struct sasl_server_req_ctx *rctx)
+{
+ struct sasl_server_request *req = rctx->request;
+
+ i_zero(rctx);
+ if (req == NULL)
+ return;
+
+ struct sasl_server_mech_request *mreq = req->mech;
+
+ sasl_server_mech_request_unref(&mreq);
+}
+
+void sasl_server_request_destroy(struct sasl_server_req_ctx *rctx)
+{
+ struct sasl_server_request *req = rctx->request;
+
+ if (req == NULL) {
+ i_zero(rctx);
+ return;
+ }
+
+ req->rctx = NULL;
+ sasl_server_request_unref(rctx);
}
static bool
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
+ sasl_server_mech_request_ref(mreq);
i_assert(mech->def->funcs->auth_initial != NULL);
mech->def->funcs->auth_initial(mreq, data, data_size);
+ sasl_server_mech_request_unref(&mreq);
}
void sasl_server_request_input(struct sasl_server_req_ctx *rctx,
if (sasl_server_request_fail_on_nuls(req, data, data_size))
return;
+ sasl_server_mech_request_ref(mreq);
i_assert(mech->def->funcs->auth_continue != NULL);
mech->def->funcs->auth_continue(mreq, data, data_size);
+ sasl_server_mech_request_unref(&mreq);
}
void sasl_server_request_test_set_authid(struct sasl_server_req_ctx *rctx,
mreq->authid = p_strdup(req->pool, authid);
+ i_assert(req->rctx != NULL);
i_assert(funcs->request_set_authid != NULL);
return funcs->request_set_authid(req->rctx, authid_type, authid);
}
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
i_assert(funcs->request_set_authzid != NULL);
return funcs->request_set_authzid(req->rctx, authzid);
}
i_assert(mreq->realm == NULL);
mreq->realm = p_strdup(req->pool, realm);
+ i_assert(req->rctx != NULL);
i_assert(funcs->request_set_realm != NULL);
funcs->request_set_realm(req->rctx, realm);
}
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
if (funcs->request_get_extra_field == NULL) {
*field_r = NULL;
return FALSE;
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
i_assert(funcs->request_start_channel_binding != NULL);
funcs->request_start_channel_binding(req->rctx, type);
}
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
i_assert(funcs->request_accept_channel_binding != NULL);
return funcs->request_accept_channel_binding(req->rctx, data_r);
}
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
+
const struct sasl_server_output output = {
.status = SASL_SERVER_OUTPUT_CONTINUE,
.data = data,
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
+
const struct sasl_server_output output = {
.status = SASL_SERVER_OUTPUT_SUCCESS,
.data = data,
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
+
const struct sasl_server_output output = {
.status = status,
.data = data,
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
+
req->passdb_type = SASL_SERVER_PASSDB_TYPE_VERIFY_PLAIN;
req->passdb_callback = callback;
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
+
req->passdb_type = SASL_SERVER_PASSDB_TYPE_LOOKUP_CREDENTIALS;
req->passdb_callback = callback;
struct sasl_server *server = req->sinst->server;
const struct sasl_server_request_funcs *funcs = server->funcs;
+ i_assert(req->rctx != NULL);
+
req->passdb_type = SASL_SERVER_PASSDB_TYPE_SET_CREDENTIALS;
req->passdb_callback = callback;