From e15dc6715ef77eecf47de61f511803e872703e66 Mon Sep 17 00:00:00 2001 From: Amolith Date: Sun, 5 Jul 2026 02:37:31 +0000 Subject: [PATCH] fix: free MAM request state on completion Release MAM option/query state and remove message handlers when list or receive completes, errors, or times out. Amp-Thread-ID: https://ampcode.com/threads/T-019f2fe4-f392-7688-8b2f-8d40eb9fa4b8 --- src/mode/mam.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/mode/mam.c b/src/mode/mam.c index ad93c3e09273447e6884d4df6cbe8f5b62e3738c..4b022fe6c3268c704ef5ebccfe3bc8ddc2fb4b79 100644 --- a/src/mode/mam.c +++ b/src/mode/mam.c @@ -87,6 +87,7 @@ static int _mam_finish(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi static int _mam_receive_poll(xmpp_conn_t *const conn, void *const userdata); static int _mam_display_message(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); static int _mam_display_pretty_message(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata); +static void _mam_disconnect_and_free(xmpp_conn_t *conn, mam_run_t *run); static void _mam_add_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *var, const char *value, const char *type); static void _mam_add_ids_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *ids); static void _mam_add_text_child(xmpp_ctx_t *ctx, xmpp_stanza_t *parent, const char *name, const char *text); @@ -348,7 +349,7 @@ static int _mam_finish(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi if (type && strcmp(type, "error") == 0) { logError(run->xmppc, "MAM request failed\n"); - xmpp_disconnect(conn); + _mam_disconnect_and_free(conn, run); return 0; } @@ -357,7 +358,7 @@ static int _mam_finish(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi if (run->receive && run->messages_total == 0 && g_get_monotonic_time() < run->deadline_us) { xmpp_timed_handler_add(conn, _mam_receive_poll, MAM_POLL_PERIOD_MS, run); } else { - xmpp_disconnect(conn); + _mam_disconnect_and_free(conn, run); } } return 0; @@ -367,7 +368,7 @@ static int _mam_receive_poll(xmpp_conn_t *const conn, void *const userdata) { mam_run_t *run = (mam_run_t *)userdata; if (g_get_monotonic_time() >= run->deadline_us) { - xmpp_disconnect(conn); + _mam_disconnect_and_free(conn, run); return 0; } @@ -375,6 +376,15 @@ static int _mam_receive_poll(xmpp_conn_t *const conn, void *const userdata) { return 0; } +static void _mam_disconnect_and_free(xmpp_conn_t *conn, mam_run_t *run) { + xmpp_handler_delete(conn, _mam_display_message); + xmpp_handler_delete(conn, _mam_display_pretty_message); + _mam_options_free(&run->options); + g_free(run->queryid); + g_free(run); + xmpp_disconnect(conn); +} + static void _mam_add_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *var, const char *value, const char *type) { xmpp_stanza_t* field = xmpp_stanza_new(ctx); xmpp_stanza_set_name(field,"field");