mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-13 05:18:55 +00:00
Fix case-sensitivity for device-specific event subscriptions and CCSS
This change fixes case-sensitivity for device-specific subscriptions such that the technology identifier is case-insensitive while the remainder of the device string is still case-sensitive. This should also preserve the original case of the device string as passed in to the event system. CCSS is the only feature affected as it is the only consumer of device-specific event subscriptions. The second part of this patch addresses similar case-sensitivity issues within CCSS itself that prevented it from functioning correctly after the fix to the events system. This adds a unit test to verify that the event system works as expected. (closes issue ASTERISK-19422) Review: https://reviewboard.asterisk.org/r/1780/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@357940 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
41
main/event.c
41
main/event.c
@@ -411,8 +411,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,
|
||||
@@ -576,8 +584,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;
|
||||
@@ -820,7 +839,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);
|
||||
|
||||
@@ -1116,7 +1141,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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user