summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/strings.h20
-rw-r--r--main/ccss.c10
-rw-r--r--main/event.c41
-rw-r--r--tests/test_event.c19
4 files changed, 83 insertions, 7 deletions
diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h
index 5827dda9b..6764125d1 100644
--- a/include/asterisk/strings.h
+++ b/include/asterisk/strings.h
@@ -897,6 +897,26 @@ int ast_check_digits(const char *arg),
)
/*!
+ * \brief Convert the tech portion of a device string to upper case
+ *
+ * \retval dev_str Returns the char* passed in for convenience
+ */
+AST_INLINE_API(
+char *ast_tech_to_upper(char *dev_str),
+{
+ char *pos;
+ if (!dev_str || !strchr(dev_str, '/')) {
+ return dev_str;
+ }
+
+ for (pos = dev_str; *pos && *pos != '/'; pos++) {
+ *pos = toupper(*pos);
+ }
+ return dev_str;
+}
+)
+
+/*!
* \brief Compute a hash value on a string
*
* This famous hash algorithm was written by Dan Bernstein and is
diff --git a/main/ccss.c b/main/ccss.c
index 31270c41e..fe748e98c 100644
--- a/main/ccss.c
+++ b/main/ccss.c
@@ -1232,7 +1232,10 @@ static int generic_monitor_cmp_fn(void *obj, void *arg, int flags)
static struct generic_monitor_instance_list *find_generic_monitor_instance_list(const char * const device_name)
{
- struct generic_monitor_instance_list finder = {.device_name = device_name};
+ struct generic_monitor_instance_list finder = {0};
+ char *uppertech = ast_strdupa(device_name);
+ ast_tech_to_upper(uppertech);
+ finder.device_name = uppertech;
return ao2_t_find(generic_monitors, &finder, OBJ_POINTER, "Finding generic monitor instance list");
}
@@ -1254,15 +1257,18 @@ static struct generic_monitor_instance_list *create_new_generic_list(struct ast_
{
struct generic_monitor_instance_list *generic_list = ao2_t_alloc(sizeof(*generic_list),
generic_monitor_instance_list_destructor, "allocate generic monitor instance list");
+ char * device_name;
if (!generic_list) {
return NULL;
}
- if (!(generic_list->device_name = ast_strdup(monitor->interface->device_name))) {
+ if (!(device_name = ast_strdup(monitor->interface->device_name))) {
cc_unref(generic_list, "Failed to strdup the monitor's device name");
return NULL;
}
+ ast_tech_to_upper(device_name);
+ generic_list->device_name = device_name;
if (!(generic_list->sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE,
generic_monitor_devstate_cb, "Requesting CC", NULL,
diff --git a/main/event.c b/main/event.c
index fc1d668e6..eb1924b06 100644
--- a/main/event.c
+++ b/main/event.c
@@ -415,8 +415,16 @@ static int match_sub_ie_val_to_event(const struct ast_event_ie_val *sub_ie_val,
res = (sub_ie_val->payload.uint & event_ie_val->payload.uint);
break;
case AST_EVENT_IE_PLTYPE_STR:
- res = !strcmp(sub_ie_val->payload.str, event_ie_val->payload.str);
+ {
+ const char *substr = sub_ie_val->payload.str;
+ const char *estr = event_ie_val->payload.str;
+ if (sub_ie_val->ie_type == AST_EVENT_IE_DEVICE) {
+ substr = ast_tech_to_upper(ast_strdupa(substr));
+ estr = ast_tech_to_upper(ast_strdupa(estr));
+ }
+ res = !strcmp(substr, estr);
break;
+ }
case AST_EVENT_IE_PLTYPE_RAW:
res = (sub_ie_val->raw_datalen == event_ie_val->raw_datalen
&& !memcmp(sub_ie_val->payload.raw, event_ie_val->payload.raw,
@@ -580,8 +588,19 @@ static int match_ie_val(const struct ast_event *event,
}
str = event2 ? ast_event_get_ie_str(event2, ie_val->ie_type) : ie_val->payload.str;
- if (str && !strcmp(str, ast_event_get_ie_str(event, ie_val->ie_type))) {
- return 1;
+ if (str) {
+ const char *e1str, *e2str;
+ e1str = ast_event_get_ie_str(event, ie_val->ie_type);
+ e2str = str;
+
+ if (ie_val->ie_type == AST_EVENT_IE_DEVICE) {
+ e1str = ast_tech_to_upper(ast_strdupa(e1str));
+ e2str = ast_tech_to_upper(ast_strdupa(e2str));
+ }
+
+ if (!strcmp(e1str, e2str)) {
+ return 1;
+ }
}
return 0;
@@ -824,7 +843,13 @@ int ast_event_sub_append_ie_str(struct ast_event_sub *sub,
return -1;
}
- ie_val->payload.hash = ast_str_hash(str);
+ if (ie_type == AST_EVENT_IE_DEVICE) {
+ char *uppertech = ast_strdupa(str);
+ ast_tech_to_upper(uppertech);
+ ie_val->payload.hash = ast_str_hash(uppertech);
+ } else {
+ ie_val->payload.hash = ast_str_hash(str);
+ }
AST_LIST_INSERT_TAIL(&sub->ie_vals, ie_val, entry);
@@ -1120,7 +1145,13 @@ int ast_event_append_ie_str(struct ast_event **event, enum ast_event_ie_type ie_
str_payload = alloca(payload_len);
strcpy(str_payload->str, str);
- str_payload->hash = ast_str_hash(str);
+ if (ie_type == AST_EVENT_IE_DEVICE) {
+ char *uppertech = ast_strdupa(str);
+ ast_tech_to_upper(uppertech);
+ str_payload->hash = ast_str_hash(uppertech);
+ } else {
+ str_payload->hash = ast_str_hash(str);
+ }
return ast_event_append_ie_raw(event, ie_type, str_payload, payload_len);
}
diff --git a/tests/test_event.c b/tests/test_event.c
index 4924e3f20..92fb4ec78 100644
--- a/tests/test_event.c
+++ b/tests/test_event.c
@@ -606,6 +606,25 @@ AST_TEST_DEFINE(event_sub_test)
res = AST_TEST_FAIL;
}
+ /* Make sure that the tech portion of the device string is case-insensitive */
+ sub_res = ast_event_check_subscriber(AST_EVENT_CUSTOM,
+ AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, "foo/bar",
+ AST_EVENT_IE_END);
+ if (sub_res != AST_EVENT_SUB_EXISTS) {
+ ast_test_status_update(test, "Str FOO/bar subscription lacks proper case-sensitivity for device strings\n");
+ res = AST_TEST_FAIL;
+ }
+
+ /* Make sure that the non-tech portion of the device string is case-sensitive
+ * and fails to match appropriately */
+ sub_res = ast_event_check_subscriber(AST_EVENT_CUSTOM,
+ AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, "FOO/BAR",
+ AST_EVENT_IE_END);
+ if (sub_res == AST_EVENT_SUB_EXISTS) {
+ ast_test_status_update(test, "Str FOO/bar subscription lacks proper case-sensitivity for device strings\n");
+ res = AST_TEST_FAIL;
+ }
+
sub_res = ast_event_check_subscriber(AST_EVENT_CUSTOM,
AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, "Money",
AST_EVENT_IE_END);