From 0c38ca0c5042e89307f891de3c0ed2ac35b7f338 Mon Sep 17 00:00:00 2001 From: "jabber.developer2" Date: Tue, 2 Dec 2025 19:42:40 +0300 Subject: [PATCH] fix: Fix XMPP stream parsing depth tracking and add debug logging - Reset depth counter in parser_init() to fix stanza parsing between connections - Properly track depth for virtual wrapper element - Add debug logging in stanzas_verify_any() to trace stanza matching --- src/server/stanzas.c | 10 ++++++++++ src/server/stream_parser.c | 20 ++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/server/stanzas.c b/src/server/stanzas.c index 0e27412..c437062 100644 --- a/src/server/stanzas.c +++ b/src/server/stanzas.c @@ -75,15 +75,25 @@ stanzas_verify_any(XMPPStanza *stanza) return 0; } + char *expected_str = stanza_to_string(stanza); + fprintf(stderr, "DEBUG verify_any: Looking for: %s\n", expected_str); + free(expected_str); + GList *curr = g_list_last(stanzas); + int idx = g_list_length(stanzas) - 1; while (curr) { XMPPStanza *curr_stanza = curr->data; + char *curr_str = stanza_to_string(curr_stanza); + fprintf(stderr, "DEBUG verify_any: [%d] %s\n", idx, curr_str); + free(curr_str); + if (_stanzas_equal(stanza, curr_stanza) == 0) { pthread_mutex_unlock(&stanzas_lock); return 1; } curr = g_list_previous(curr); + idx--; } pthread_mutex_unlock(&stanzas_lock); diff --git a/src/server/stream_parser.c b/src/server/stream_parser.c index 2764b91..6fbada0 100644 --- a/src/server/stream_parser.c +++ b/src/server/stream_parser.c @@ -53,6 +53,7 @@ parser_init(stream_start_func startcb, auth_func authcb, id_func idcb, query_fun g_string_free(curr_string, TRUE); } curr_string = g_string_new(""); + depth = 0; // Reset depth on parser init stream_start_cb = startcb; auth_cb = authcb; @@ -116,15 +117,17 @@ parser_reset(void) parser_close(); parser_init(stream_start_cb, auth_cb, id_cb, query_cb); + // Feed a virtual root element to allow multiple stanzas after reset + XML_Parse(parser, "", 9, 0); do_reset = 0; } static void _start_element(void *data, const char *element, const char **attributes) { - - // Ignore our virtual wrapper element + // Virtual wrapper element - track depth but don't create stanza if (g_strcmp0(element, "wrapper") == 0) { + depth++; return; } @@ -137,7 +140,8 @@ _start_element(void *data, const char *element, const char **attributes) XMPPStanza *stanza = stanza_new(element, attributes); - if (depth == 0) { + // depth == 1 means we're at wrapper level, so this is a root XMPP stanza + if (depth == 1) { curr_stanza = stanza; curr_stanza->parent = NULL; } else { @@ -151,8 +155,16 @@ _start_element(void *data, const char *element, const char **attributes) static void _end_element(void *data, const char *element) { + // Virtual wrapper element - just track depth + if (g_strcmp0(element, "wrapper") == 0) { + depth--; + return; + } + depth--; - if (depth > 0) { + + // depth == 1 means we're back at wrapper level - stanza is complete + if (depth > 1) { stanza_add_child(curr_stanza->parent, curr_stanza); curr_stanza = curr_stanza->parent; return;