diff --git a/include/asterisk/event.h b/include/asterisk/event.h index e7d0f7e2f8..78926c74e7 100644 --- a/include/asterisk/event.h +++ b/include/asterisk/event.h @@ -590,9 +590,10 @@ size_t ast_event_get_size(const struct ast_event *event); * \param iterator The iterator instance to initialize * \param event The event that will be iterated through * - * \return Nothing + * \retval 0 Success, there are IEs available to iterate + * \retval -1 Failure, there are no IEs in the event to iterate */ -void ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event); +int ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event); /*! * \brief Move iterator instance to next IE diff --git a/main/event.c b/main/event.c index 60dde3bb28..f83a15c6f4 100644 --- a/main/event.c +++ b/main/event.c @@ -809,12 +809,20 @@ struct ast_event_sub *ast_event_unsubscribe(struct ast_event_sub *sub) return NULL; } -void ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event) +int ast_event_iterator_init(struct ast_event_iterator *iterator, const struct ast_event *event) { + int res = 0; + iterator->event_len = ntohs(event->event_len); iterator->event = event; - iterator->ie = (struct ast_event_ie *) ( ((char *) event) + sizeof(*event) ); - return; + if (iterator->event_len >= sizeof(*event) + sizeof(struct ast_event_ie)) { + iterator->ie = (struct ast_event_ie *) ( ((char *) event) + sizeof(*event) ); + } else { + iterator->ie = NULL; + res = -1; + } + + return res; } int ast_event_iterator_next(struct ast_event_iterator *iterator) @@ -884,9 +892,10 @@ const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_i struct ast_event_iterator iterator; int res = 0; - for (ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) { - if (ast_event_iterator_get_ie_type(&iterator) == ie_type) + for (res = ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) { + if (ast_event_iterator_get_ie_type(&iterator) == ie_type) { return ast_event_iterator_get_ie_raw(&iterator); + } } return NULL;