mirror of
https://gitea.osmocom.org/cellular-infrastructure/osmo-mgw.git
synced 2025-10-23 08:12:01 +00:00
mgcp_conn_get(): compare conn Id ('I:') case insensitively
The Connection Identifier is defined as a hex string, so clients may send the ID back in lower case. Convert to upper case before comparing. A specific SCCPlite MSC is observed to DLCX with Connection Identifier in lower case, which would mismatch pefore this patch. Add test_conn_id_matching() in mgcp_test.c to verify case insensitivity. Cosmetic: use strcmp(), not strncmp(). In the presence of a terminating nul as we can assume here, this makes no functional difference, but it clarifies the code. Related: OS#3508 Depends: Ib0ee1206b9f31d7ba25c31f8008119ac55440797 (libosmocore) Change-Id: I8e52278c3abe9e9c8c848c2b1538bce443f68a43
This commit is contained in:
@@ -189,9 +189,18 @@ struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp,
|
||||
struct mgcp_conn *mgcp_conn_get(struct mgcp_endpoint *endp, const char *id)
|
||||
{
|
||||
struct mgcp_conn *conn;
|
||||
const char *id_upper;
|
||||
|
||||
if (!id || !*id)
|
||||
return NULL;
|
||||
|
||||
/* Use uppercase to compare identifiers, to avoid mismatches: RFC3435 2.1.3.2 "Names of
|
||||
* Connections" defines the id as a hex string, so clients may return lower case hex even though
|
||||
* we sent upper case hex in the CRCX response. */
|
||||
id_upper = osmo_str_toupper(id);
|
||||
|
||||
llist_for_each_entry(conn, &endp->conns, entry) {
|
||||
if (strncmp(conn->id, id, sizeof(conn->id)) == 0)
|
||||
if (strcmp(conn->id, id_upper) == 0)
|
||||
return conn;
|
||||
}
|
||||
|
||||
|
@@ -1751,6 +1751,40 @@ static void test_mgcp_codec_pt_translate(void)
|
||||
OSMO_ASSERT(pt_dst == -EINVAL);
|
||||
}
|
||||
|
||||
void test_conn_id_matching()
|
||||
{
|
||||
struct mgcp_endpoint endp = {};
|
||||
struct mgcp_conn *conn;
|
||||
struct mgcp_conn *conn_match;
|
||||
int i;
|
||||
const char *conn_id_generated = "000023AB";
|
||||
const char *conn_id_request[] = {
|
||||
"000023AB",
|
||||
"000023ab",
|
||||
};
|
||||
|
||||
printf("\nTesting %s\n", __func__);
|
||||
|
||||
INIT_LLIST_HEAD(&endp.conns);
|
||||
|
||||
conn = talloc_zero(NULL, struct mgcp_conn);
|
||||
OSMO_ASSERT(conn);
|
||||
osmo_strlcpy(conn->id, conn_id_generated, sizeof(conn->id));
|
||||
llist_add(&conn->entry, &endp.conns);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(conn_id_request); i++) {
|
||||
const char *needle = conn_id_request[i];
|
||||
printf("needle='%s' ", needle);
|
||||
conn_match = mgcp_conn_get(&endp, needle);
|
||||
OSMO_ASSERT(conn_match);
|
||||
printf("found '%s'\n", conn_match->id);
|
||||
OSMO_ASSERT(conn_match == conn);
|
||||
}
|
||||
|
||||
llist_del(&conn->entry);
|
||||
talloc_free(conn);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
void *ctx = talloc_named_const(NULL, 0, "mgcp_test");
|
||||
@@ -1775,6 +1809,7 @@ int main(int argc, char **argv)
|
||||
test_get_lco_identifier();
|
||||
test_check_local_cx_options(ctx);
|
||||
test_mgcp_codec_pt_translate();
|
||||
test_conn_id_matching();
|
||||
|
||||
OSMO_ASSERT(talloc_total_size(msgb_ctx) == 0);
|
||||
OSMO_ASSERT(talloc_total_blocks(msgb_ctx) == 1);
|
||||
|
@@ -1169,4 +1169,8 @@ p:10, a:PCMU -> p:10, a:PCMU
|
||||
Testing get_lco_identifier()
|
||||
p:10, a:PCMU -> p:10, a:PCMU
|
||||
p:10, a:PCMU -> p:10, a:PCMU
|
||||
'XXXX, p:10, a:PCMU' -> 'p:10, a:PCMU'
|
||||
'XXXX,p:10,a:PCMU' -> 'p:10,a:PCMU'
|
||||
'10,a:PCMU' -> 'a:PCMU'
|
||||
'10, a:PCMU' -> 'a:PCMU'
|
||||
'10,a: PCMU' -> 'a: PCMU'
|
||||
|
Reference in New Issue
Block a user