]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
channelstorage_cpp_map_name_id: Fix get_by_name_prefix prefix match
authorJasper Hafkenscheid <jasper.hafkenscheid@voys.nl>
Wed, 21 Jan 2026 06:51:36 +0000 (07:51 +0100)
committergithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Fri, 23 Jan 2026 15:25:43 +0000 (15:25 +0000)
Lower bound filter did not ensure prefix match.

Resolves: #1730

main/channelstorage.c
main/channelstorage_cpp_map_name_id.cc

index 63b551443edd188047bf88b21809138377e0f1c7..de49f15f2e2ac244fab355b2cc46719a96027374 100644 (file)
@@ -265,6 +265,25 @@ static void *test_storage_thread(void *data)
        elapsed = ast_tvdiff_us(end, start);
        ast_test_status_update(test, "%*s: %8ld\n", collen, "by name prefix", elapsed);
 
+       /* Test negative cases - prefixes that should NOT match */
+       start = ast_tvnow();
+       for (i = 0; i < 10; i++) {
+               /* Search for non-existent prefix between existing channels
+                * e.g., "TestChannel-{rand}-0000a" falls between 0000 and 0001
+                */
+               sprintf(search1, "TestChannel-%ld-%04da", rand, i * 50);
+               mock_channel = CHANNELSTORAGE_API(storage_instance, get_by_name_prefix_or_uniqueid, search1, strlen(search1), 1);
+               ast_test_validate_cleanup_custom(test, mock_channel == NULL, res, done,
+                       "Expected NULL for non-existent prefix '%s' but got '%s'\n",
+                       search1, mock_channel ? ast_channel_name(mock_channel) : "NULL");
+               if (mock_channel) {
+                       ast_channel_unref(mock_channel);
+               }
+       }
+       end = ast_tvnow();
+       elapsed = ast_tvdiff_us(end, start);
+       ast_test_status_update(test, "%*s: %8ld\n", collen, "prefix no-match", elapsed);
+
        start = ast_tvnow();
        for (i = 0; i < CHANNEL_COUNT; i++) {
                sprintf(search1, "TestContext-%ld-%04d", rand, i % 100);
index dfbfbb9a92ac547aed7259a77aaa035c986f5602..5862f9dc94d96724e7b13e3d9f58470085e506f7 100644 (file)
@@ -531,7 +531,10 @@ static struct ast_channel *get_by_name_prefix(struct ast_channelstorage_instance
        }
        auto rtn = getdb(driver).lower_bound(l_name);
        if (rtn != getdb(driver).end()) {
-               chan = ao2_bump((struct ast_channel *)rtn->second);
+               /* Check if the channel name actually starts with the requested prefix */
+               if (rtn->first.compare(0, name_len, l_name, name_len) == 0) {
+                       chan = ao2_bump((struct ast_channel *)rtn->second);
+               }
        }
        if (lock) {
                unlock(driver);