]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: sasl-server-mech - Add facilities for maintaining per-instance mechanism state
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 24 Oct 2023 01:33:44 +0000 (03:33 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 9 Oct 2025 08:41:22 +0000 (08:41 +0000)
src/auth/sasl-server-mech.c
src/auth/sasl-server-private.h
src/auth/sasl-server-protected.h
src/auth/sasl-server.c

index 039166c002ea567bca71f17a3973e4e64d17f6e7..438ea121a670c645ecb4ec5d0c69c926705c585f 100644 (file)
@@ -127,7 +127,10 @@ sasl_server_mech_create(struct sasl_server_instance *sinst,
 {
        struct sasl_server_mech *mech;
 
-       mech = p_new(sinst->pool, struct sasl_server_mech, 1);
+       if (def->funcs->mech_new != NULL)
+               mech = def->funcs->mech_new(sinst->pool);
+       else
+               mech = p_new(sinst->pool, struct sasl_server_mech, 1);
        mech->pool = sinst->pool;
        mech->sinst = sinst;
        mech->def = def;
@@ -208,6 +211,10 @@ sasl_server_mech_find(struct sasl_server_instance *sinst, const char *name)
 static void sasl_server_mech_reg_free(struct sasl_server_mech_reg *mech_reg)
 {
        struct sasl_server_mech *mech = mech_reg->mech;
+
+       if (mech->def->funcs->mech_free != NULL)
+               mech->def->funcs->mech_free(mech);
+
        struct sasl_server_mech_def_reg *mech_dreg = mech_reg->def_reg;
 
        i_assert(mech_dreg->def == mech->def);
@@ -263,6 +270,28 @@ void sasl_server_mech_unregister(struct sasl_server_instance *sinst,
        sasl_server_mech_reg_free(mech_reg);
 }
 
+static struct sasl_server_mech_reg *
+sasl_server_mech_reg_list_free(struct sasl_server_mech_reg *mech_reg_list)
+{
+       struct sasl_server_mech_reg *mech_reg;
+
+       mech_reg = mech_reg_list;
+       while (mech_reg != NULL) {
+               struct sasl_server_mech_reg *mech_reg_next = mech_reg->next;
+
+               sasl_server_mech_reg_free(mech_reg);
+               mech_reg = mech_reg_next;
+       }
+       return NULL;
+}
+
+void sasl_server_instance_mech_registry_free(
+       struct sasl_server_instance *sinst)
+{
+       sasl_server_mech_reg_list_free(sinst->mechs_head);
+       sasl_server_mech_reg_list_free(sinst->mechs_hidden);
+}
+
 /*
  * Iterator
  */
index 7b908dd48199f91f6f5f15ca9bdd5b25f9e52bac..7e65426a0e3fa9162ded5dcb862d954a81030fdc 100644 (file)
@@ -73,4 +73,11 @@ struct sasl_server {
        unsigned int requests;
 };
 
+/*
+ * Mechanism
+ */
+
+void sasl_server_instance_mech_registry_free(
+       struct sasl_server_instance *sinst);
+
 #endif
index ea50817ec2d1587d13d4a777e252ed29203325a0..2df4340b55dea3cf8e285c273469674e1ef7bed2 100644 (file)
@@ -21,6 +21,9 @@ struct sasl_server_mech_funcs {
        void (*auth_continue)(struct sasl_server_mech_request *req,
                              const unsigned char *data, size_t data_size);
        void (*auth_free)(struct sasl_server_mech_request *req);
+
+       struct sasl_server_mech *(*mech_new)(pool_t pool);
+       void (*mech_free)(struct sasl_server_mech *mech);
 };
 
 struct sasl_server_mech_def {
index ac1bd3b86e16ec5904775271ab329582e892096a..f12028703168bd52ab4e3c29168f01d17aa411a4 100644 (file)
@@ -66,6 +66,8 @@ void sasl_server_instance_unref(struct sasl_server_instance **_sinst)
 
        i_assert(sinst->requests == 0);
 
+       sasl_server_instance_mech_registry_free(sinst);
+
        DLLIST_REMOVE(&server->instances, sinst);
 
        event_unref(&sinst->event);