From eb80d3049e62fae576a18e634a54518014ded27d Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 21 May 2025 12:07:55 -0500 Subject: [PATCH 1/4] Restore SM data ready for resume The resume functionality assumes id is in previd and that the full JID is in the sm_state as well. --- src/conn.c | 5 +++-- tests/test_serialize_sm.c | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/conn.c b/src/conn.c index f586a59d..0b09d339 100644 --- a/src/conn.c +++ b/src/conn.c @@ -1388,8 +1388,9 @@ int xmpp_conn_restore_sm_state(xmpp_conn_t *conn, memset(conn->sm_state, 0, sizeof(*conn->sm_state)); conn->sm_state->ctx = conn->ctx; + conn->sm_state->bound_jid = strophe_strdup(conn->ctx, conn->jid); conn->sm_state->sm_support = 1; - conn->sm_state->sm_enabled = 1; + conn->sm_state->sm_enabled = 0; conn->sm_state->can_resume = 1; conn->sm_state->resume = 1; @@ -1403,7 +1404,7 @@ int xmpp_conn_restore_sm_state(xmpp_conn_t *conn, goto err_reload; size_t id_len; - ret = sm_load_string(&sm, &conn->sm_state->id, &id_len); + ret = sm_load_string(&sm, &conn->sm_state->previd, &id_len); if (ret) goto err_reload; diff --git a/tests/test_serialize_sm.c b/tests/test_serialize_sm.c index ce4846a1..9197ec93 100644 --- a/tests/test_serialize_sm.c +++ b/tests/test_serialize_sm.c @@ -44,7 +44,7 @@ void callback(xmpp_conn_t *conn, xmpp_conn_restore_sm_state(newconn, sm_state, sm_state_len); ENSURE_EQ(newconn->sm_state->sm_sent_nr, 0); ENSURE_EQ(newconn->sm_state->sm_handled_nr, 0); - COMPARE(newconn->sm_state->id, "SMID"); + COMPARE(newconn->sm_state->previd, "SMID"); ENSURE_EQ(newconn->send_queue_len, 2); ENSURE_EQ(newconn->send_queue_user_len, 2); ENSURE_EQ((size_t)(newconn->sm_state->sm_queue.head), 0); @@ -66,7 +66,7 @@ void callback(xmpp_conn_t *conn, xmpp_conn_restore_sm_state(newconn, sm_state, sm_state_len); ENSURE_EQ(newconn->sm_state->sm_sent_nr, 1); ENSURE_EQ(newconn->sm_state->sm_handled_nr, 0); - COMPARE(newconn->sm_state->id, "SMID"); + COMPARE(newconn->sm_state->previd, "SMID"); ENSURE_EQ(newconn->send_queue_len, 1); ENSURE_EQ(newconn->send_queue_user_len, 1); ENSURE_EQ(newconn->sm_state->sm_queue.head->sm_h, 0); @@ -86,7 +86,7 @@ void callback(xmpp_conn_t *conn, xmpp_conn_restore_sm_state(newconn, sm_state, sm_state_len); ENSURE_EQ(newconn->sm_state->sm_sent_nr, 1); ENSURE_EQ(newconn->sm_state->sm_handled_nr, 0); - COMPARE(newconn->sm_state->id, "SMID"); + COMPARE(newconn->sm_state->previd, "SMID"); ENSURE_EQ(newconn->send_queue_len, 0); ENSURE_EQ(newconn->send_queue_user_len, 0); ENSURE_EQ(newconn->sm_state->sm_queue.head->sm_h, 0); From bd4de7c6fa40777e35cd4ef220a341a0a7ac8a87 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 21 May 2025 12:09:13 -0500 Subject: [PATCH 2/4] The serialize code assumes there is an id set --- src/conn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conn.c b/src/conn.c index 0b09d339..fd2fec92 100644 --- a/src/conn.c +++ b/src/conn.c @@ -1485,7 +1485,7 @@ static int sm_store_u32(unsigned char **next_, static size_t sm_state_serialize(xmpp_conn_t *conn, unsigned char **buf) { if (!conn->sm_state->sm_support || !conn->sm_state->sm_enabled || - !conn->sm_state->can_resume) { + !conn->sm_state->can_resume || !conn->sm_state->id) { *buf = NULL; return 0; } From 29656e4a9e2cb2331f4a2f714f90d912f967ec61 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 21 May 2025 12:09:43 -0500 Subject: [PATCH 3/4] Was freeing the wrong level buf is a pointer to the pointer we allocated. --- src/conn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conn.c b/src/conn.c index fd2fec92..b57bdb55 100644 --- a/src/conn.c +++ b/src/conn.c @@ -1571,7 +1571,7 @@ static size_t sm_state_serialize(xmpp_conn_t *conn, unsigned char **buf) err_serialize: strophe_error(conn->ctx, "conn", "Can't serialize more data, buffer full"); - strophe_free(conn->ctx, buf); + strophe_free(conn->ctx, *buf); return 0; } From ae6dc127b518b45e955b3b0571b964c160c716df Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Wed, 21 May 2025 12:11:10 -0500 Subject: [PATCH 4/4] Do not start sending updates until SM been enabled --- src/conn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conn.c b/src/conn.c index b57bdb55..bb07fa24 100644 --- a/src/conn.c +++ b/src/conn.c @@ -1577,7 +1577,7 @@ static size_t sm_state_serialize(xmpp_conn_t *conn, unsigned char **buf) void trigger_sm_callback(xmpp_conn_t *conn) { - if (!conn || !conn->sm_callback) + if (!conn || !conn->sm_callback || !conn->sm_state->sm_enabled) return; unsigned char *buf;