]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 269417 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Wed, 9 Jun 2010 21:13:30 +0000 (21:13 +0000)
committerRussell Bryant <russell@russellbryant.com>
Wed, 9 Jun 2010 21:13:30 +0000 (21:13 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

........
  r269417 | russell | 2010-06-09 16:11:43 -0500 (Wed, 09 Jun 2010) | 6 lines

  Resolve an invalid memory read on an event.

  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/branches/1.6.2@269418 65c4cc65-6c06-0410-ace0-fbb531ad65f3

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

index e7d0f7e2f8c6c9b1812b7401ec36e972e6a26629..78926c74e75bec9cb23fd6b1642d3c675dc1fe35 100644 (file)
@@ -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
index 60dde3bb284efc29556a749700c16323a6430529..f83a15c6f44553bcb5dd0ae68fbef61fc67e119e 100644 (file)
@@ -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;