From 2752019158a8215ab8d1bb9ec17c533a259b141e Mon Sep 17 00:00:00 2001 From: Jabber Developer Date: Mon, 1 Sep 2025 22:55:46 +0200 Subject: [PATCH] fix(cmd_sub): Prevent crash with malformed JID in /sub command Added null check for jidp in cmd_sub to handle jid_create returning NULL. Crash occurred when processing malformed JID inputs like @example.com. Ensures robust handling of invalid JIDs. Fixes #22 --- src/command/cmd_funcs.c | 5 +++++ tests/unittests/test_cmd_sub.c | 13 +++++++++++++ tests/unittests/test_cmd_sub.h | 1 + tests/unittests/unittests.c | 1 + 4 files changed, 20 insertions(+) diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index bcc6b85c..ae3d0600 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -1263,6 +1263,11 @@ cmd_sub(ProfWin* window, const char* const command, gchar** args) auto_jid Jid* jidp = jid_create(jid); + if (jidp == NULL) { + cons_show("Malformed JID: %s", jid); + return TRUE; + } + if (strcmp(subcmd, "allow") == 0) { presence_subscription(jidp->barejid, PRESENCE_SUBSCRIBED); cons_show("Accepted subscription for %s", jidp->barejid); diff --git a/tests/unittests/test_cmd_sub.c b/tests/unittests/test_cmd_sub.c index d03f6b5c..37842f8c 100644 --- a/tests/unittests/test_cmd_sub.c +++ b/tests/unittests/test_cmd_sub.c @@ -40,3 +40,16 @@ cmd_sub_shows_usage_when_no_arg(void** state) gboolean result = cmd_sub(NULL, CMD_SUB, args); assert_true(result); } + +void +test_cmd_sub_malformed_jid(void** state) +{ + ProfWin win; + gchar* args[] = { "request", "@example.com" }; + + will_return(connection_get_status, JABBER_CONNECTED); + + expect_cons_show("Malformed JID: @example.com"); + gboolean result = cmd_sub((ProfWin*)&win, CMD_SUB, args); + assert_true(result); +} \ No newline at end of file diff --git a/tests/unittests/test_cmd_sub.h b/tests/unittests/test_cmd_sub.h index 6cebf649..fa86d540 100644 --- a/tests/unittests/test_cmd_sub.h +++ b/tests/unittests/test_cmd_sub.h @@ -1,2 +1,3 @@ void cmd_sub_shows_message_when_not_connected(void** state); void cmd_sub_shows_usage_when_no_arg(void** state); +void test_cmd_sub_malformed_jid(void** state); \ No newline at end of file diff --git a/tests/unittests/unittests.c b/tests/unittests/unittests.c index 7b94ebcf..88e1ec98 100644 --- a/tests/unittests/unittests.c +++ b/tests/unittests/unittests.c @@ -386,6 +386,7 @@ main(int argc, char* argv[]) cmocka_unit_test(cmd_sub_shows_message_when_not_connected), cmocka_unit_test(cmd_sub_shows_usage_when_no_arg), + cmocka_unit_test(test_cmd_sub_malformed_jid), cmocka_unit_test(contact_in_group), cmocka_unit_test(contact_not_in_group),