fix: free message archive lookup state

Amolith created

Remove archive lookup handlers and release copied lookup fields after
printing the sent message archive cursor.

Amp-Thread-ID: https://ampcode.com/threads/T-019f2fe4-f392-7688-8b2f-8d40eb9fa4b8

Change summary

src/mode/message.c | 31 ++++++++++++++++++++++++-------
1 file changed, 24 insertions(+), 7 deletions(-)

Detailed changes

src/mode/message.c 🔗

@@ -77,7 +77,8 @@ static bool _message_has_origin_id(xmpp_stanza_t *message, const char *id);
 static void _message_add_text_child(xmpp_ctx_t *ctx, xmpp_stanza_t *parent, const char *name, const char *text);
 static void _message_add_field(xmpp_ctx_t *ctx, xmpp_stanza_t *x, const char *var, const char *value, const char *type);
 static char *_message_lookup_start_time(void);
-static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup);
+static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup, bool delete_id_handler);
+static void _message_archive_lookup_free(message_archive_lookup_t *lookup);
 static void _message_print_sent(message_archive_lookup_t *lookup);
 static void _message_print_escaped_attr(const char *text);
 
@@ -192,13 +193,13 @@ static int _message_archive_query_finished(xmpp_conn_t *const conn, xmpp_stanza_
   }
 
   if (lookup->archive_id) {
-    _message_finish_sent(conn, lookup);
+    _message_finish_sent(conn, lookup, false);
     return 0;
   }
 
   if (type && strcmp(type, "error") == 0) {
     logError(lookup->xmppc, "MAM archive lookup failed\n");
-    _message_finish_sent(conn, lookup);
+    _message_finish_sent(conn, lookup, false);
     return 0;
   }
 
@@ -206,7 +207,7 @@ static int _message_archive_query_finished(xmpp_conn_t *const conn, xmpp_stanza_
     xmpp_timed_handler_add(conn, _message_archive_query_poll, MESSAGE_ARCHIVE_LOOKUP_POLL_MS, lookup);
   } else {
     logError(lookup->xmppc, "MAM archive lookup timed out\n");
-    _message_finish_sent(conn, lookup);
+    _message_finish_sent(conn, lookup, false);
   }
 
   return 0;
@@ -221,7 +222,7 @@ static int _message_archive_query_poll(xmpp_conn_t *const conn, void *const user
 
   if (g_get_monotonic_time() >= lookup->deadline_us) {
     logError(lookup->xmppc, "MAM archive lookup timed out\n");
-    _message_finish_sent(conn, lookup);
+    _message_finish_sent(conn, lookup, false);
     return 0;
   }
 
@@ -234,7 +235,7 @@ static int _message_archive_lookup_timeout(xmpp_conn_t *const conn, void *const
 
   if (!lookup->done) {
     logError(lookup->xmppc, "MAM archive lookup timed out\n");
-    _message_finish_sent(conn, lookup);
+    _message_finish_sent(conn, lookup, true);
   }
 
   return 0;
@@ -314,16 +315,32 @@ static char *_message_lookup_start_time(void) {
   return formatted;
 }
 
-static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup) {
+static void _message_finish_sent(xmpp_conn_t *conn, message_archive_lookup_t *lookup, bool delete_id_handler) {
   if (lookup->done) {
     return;
   }
 
   lookup->done = true;
   _message_print_sent(lookup);
+  xmpp_handler_delete(conn, _message_archive_result_handler);
+  xmpp_timed_handler_delete(conn, _message_archive_query_poll);
+  xmpp_timed_handler_delete(conn, _message_archive_lookup_timeout);
+  if (delete_id_handler && lookup->queryid) {
+    xmpp_id_handler_delete(conn, _message_archive_query_finished, lookup->queryid);
+  }
+  _message_archive_lookup_free(lookup);
   xmpp_disconnect(conn);
 }
 
+static void _message_archive_lookup_free(message_archive_lookup_t *lookup) {
+  g_free(lookup->to);
+  g_free(lookup->message_id);
+  g_free(lookup->start);
+  g_free(lookup->queryid);
+  g_free(lookup->archive_id);
+  g_free(lookup);
+}
+
 static void _message_print_sent(message_archive_lookup_t *lookup) {
   printf("<sent archive-id=\"");
   _message_print_escaped_attr(lookup->archive_id ? lookup->archive_id : "");