]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Resolve an invalid memory read on an event.
authorRussell Bryant <russell@russellbryant.com>
Wed, 9 Jun 2010 21:11:43 +0000 (21:11 +0000)
committerRussell Bryant <russell@russellbryant.com>
Wed, 9 Jun 2010 21:11:43 +0000 (21:11 +0000)
Valgrind pointed out that attempting to get an IE value from an event that has
no IEs produces an invalid memory read past the end of the event.  Thanks to
mmichelson for pointing the problem out to me and then testing the fix.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@269417 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/event.h
main/event.c

index 727553c24d481cd2d1ca259e6dee9174e5508b47..12459fc9de1bb8d708b4735de837221150f2b24b 100644 (file)
@@ -663,9 +663,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
index 51a3a45ab580598168483098bf70e960548ab7bd..23fd7af8e6a9169cba53087aedef76f44a5de00f 100644 (file)
@@ -935,11 +935,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 = ast_event_get_size(event);
        iterator->event = event;
-       iterator->ie = (struct ast_event_ie *) ( ((char *) event) + sizeof(*event) );
+       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)
@@ -1021,9 +1030,9 @@ const char *ast_event_get_ie_str(const struct ast_event *event, enum ast_event_i
 const void *ast_event_get_ie_raw(const struct ast_event *event, enum ast_event_ie_type ie_type)
 {
        struct ast_event_iterator iterator;
-       int res = 0;
+       int res;
 
-       for (ast_event_iterator_init(&iterator, event); !res; res = ast_event_iterator_next(&iterator)) {
+       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);
                }