diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h index 5827dda9ba..6764125d13 100644 --- a/include/asterisk/strings.h +++ b/include/asterisk/strings.h @@ -896,6 +896,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 * diff --git a/main/ccss.c b/main/ccss.c index e0b440fbc8..5585e78e55 100644 --- a/main/ccss.c +++ b/main/ccss.c @@ -1209,7 +1209,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"); } @@ -1231,15 +1234,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 fc1d668e6e..eb1924b06e 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 4924e3f20f..92fb4ec78a 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);