mirror of
https://github.com/asterisk/asterisk.git
synced 2026-07-28 00:10:25 -07:00
Distributed Device State broken at sites using res_xmpp or res_jabber where Secuity Advisory AST-2012-015 is inplace
res_jabber/res_xmpp were not adding AST_EVENT_IE_CACHABLE to the event as each message came in, then devstate_change_collector_cb() was unable to find AST_EVENT_IE_CACHABLE in the event, so defaulted incorrectly to AST_DEVSTATE_NOT_CACHABLE. (issue ASTERISK-20175) (closes issue ASTERISK-21429) (closes issue ASTERISK-21069) (closes issue ASTERISK-21164) Reported by: alecdavis Tested by: alecdavis alecdavis (license 585) Review https://reviewboard.asterisk.org/r/2452/ ........ Merged revisions 385916 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@385917 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
+11
-2
@@ -705,7 +705,7 @@ static void *run_devstate_collector(void *data)
|
||||
static void devstate_change_collector_cb(const struct ast_event *event, void *data)
|
||||
{
|
||||
struct devstate_change *sc;
|
||||
const char *device;
|
||||
const char *device, *cachable_str;
|
||||
const struct ast_eid *eid;
|
||||
uint32_t state;
|
||||
enum ast_devstate_cache cachable = AST_DEVSTATE_CACHABLE;
|
||||
@@ -713,7 +713,6 @@ static void devstate_change_collector_cb(const struct ast_event *event, void *da
|
||||
device = ast_event_get_ie_str(event, AST_EVENT_IE_DEVICE);
|
||||
eid = ast_event_get_ie_raw(event, AST_EVENT_IE_EID);
|
||||
state = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
|
||||
cachable = ast_event_get_ie_uint(event, AST_EVENT_IE_CACHABLE);
|
||||
|
||||
if (ast_strlen_zero(device) || !eid) {
|
||||
ast_log(LOG_ERROR, "Invalid device state change event received\n");
|
||||
@@ -726,6 +725,16 @@ static void devstate_change_collector_cb(const struct ast_event *event, void *da
|
||||
strcpy(sc->device, device);
|
||||
sc->eid = *eid;
|
||||
sc->state = state;
|
||||
|
||||
/* For 'cachable' we cannot use ast_event_get_ie_uint(), it overwrites the default of AST_DEVSTATE_CACHABLE we
|
||||
* have already setup for 'cachable', if for whatever reason the AST_EVENT_IE_CACHABLE wasn't
|
||||
* posted in the event ast_event_get_ie_uint() is going will return 0,
|
||||
* which equates to AST_DEVSTATE_NOT_CACHABLE the first enumeration in 'ast_devstate_cache'.
|
||||
*/
|
||||
|
||||
if ((cachable_str = ast_event_get_ie_str(event, AST_EVENT_IE_CACHABLE))) {
|
||||
sscanf(cachable_str, "%30u", &cachable);
|
||||
}
|
||||
sc->cachable = cachable;
|
||||
|
||||
ast_mutex_lock(&devstate_collector.lock);
|
||||
|
||||
+3
-2
@@ -3339,14 +3339,15 @@ static int aji_handle_pubsub_event(void *data, ikspak *pak)
|
||||
return IKS_FILTER_EAT;
|
||||
}
|
||||
if (!strcasecmp(iks_name(item_content), "state")) {
|
||||
device_state = iks_find_cdata(item, "state");
|
||||
if ((cachable_str = iks_find_cdata(item, "cachable"))) {
|
||||
if ((cachable_str = iks_find_attrib(item_content, "cachable"))) {
|
||||
sscanf(cachable_str, "%30d", &cachable);
|
||||
}
|
||||
device_state = iks_find_cdata(item, "state");
|
||||
if (!(event = ast_event_new(AST_EVENT_DEVICE_STATE_CHANGE,
|
||||
AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, item_id, AST_EVENT_IE_STATE,
|
||||
AST_EVENT_IE_PLTYPE_UINT, ast_devstate_val(device_state), AST_EVENT_IE_EID,
|
||||
AST_EVENT_IE_PLTYPE_RAW, &pubsub_eid, sizeof(pubsub_eid),
|
||||
AST_EVENT_IE_CACHABLE, AST_EVENT_IE_PLTYPE_UINT, cachable,
|
||||
AST_EVENT_IE_END))) {
|
||||
return IKS_FILTER_EAT;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user