Changeset 95619 in webkit


Ignore:
Timestamp:
Sep 21, 2011 6:08:19 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Protect against misuse of EventListenerIterator.
https://bugs.webkit.org/show_bug.cgi?id=68364

Patch by Andreas Kling <kling@webkit.org> on 2011-09-21
Reviewed by Darin Adler.

In debug mode, keep track of the number of active EventListenerIterators
on an EventListenerMap, and assert that there are no iterators when the
map is being modified.

  • dom/EventListenerMap.cpp:

(WebCore::EventListenerMap::EventListenerMap):
(WebCore::EventListenerMap::clear):
(WebCore::EventListenerMap::add):
(WebCore::EventListenerMap::remove):
(WebCore::EventListenerMap::find):
(WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
(WebCore::EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget):
(WebCore::EventListenerIterator::EventListenerIterator):
(WebCore::EventListenerIterator::~EventListenerIterator):

  • dom/EventListenerMap.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r95614 r95619  
     12011-09-21  Andreas Kling  <kling@webkit.org>
     2
     3        Protect against misuse of EventListenerIterator.
     4        https://bugs.webkit.org/show_bug.cgi?id=68364
     5
     6        Reviewed by Darin Adler.
     7
     8        In debug mode, keep track of the number of active EventListenerIterators
     9        on an EventListenerMap, and assert that there are no iterators when the
     10        map is being modified.
     11
     12        * dom/EventListenerMap.cpp:
     13        (WebCore::EventListenerMap::EventListenerMap):
     14        (WebCore::EventListenerMap::clear):
     15        (WebCore::EventListenerMap::add):
     16        (WebCore::EventListenerMap::remove):
     17        (WebCore::EventListenerMap::find):
     18        (WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
     19        (WebCore::EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget):
     20        (WebCore::EventListenerIterator::EventListenerIterator):
     21        (WebCore::EventListenerIterator::~EventListenerIterator):
     22        * dom/EventListenerMap.h:
     23
    1242011-09-21  Pavel Feldman  <pfeldman@google.com>
    225
  • trunk/Source/WebCore/dom/EventListenerMap.cpp

    r95372 r95619  
    4545
    4646EventListenerMap::EventListenerMap()
     47#ifndef NDEBUG
     48    : m_activeIteratorCount(0)
     49#endif
    4750{
    4851}
     
    6972void EventListenerMap::clear()
    7073{
     74    ASSERT(!m_activeIteratorCount);
     75
    7176    if (m_hashMap) {
    7277        deleteAllValues(*m_hashMap);
     
    106111bool EventListenerMap::add(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
    107112{
     113    ASSERT(!m_activeIteratorCount);
     114
    108115    if (m_singleEventListenerVector && m_singleEventListenerType != eventType) {
    109116        // We already have a single (first) listener vector, and this event is not
     
    144151bool EventListenerMap::remove(const AtomicString& eventType, EventListener* listener, bool useCapture, size_t& indexOfRemovedListener)
    145152{
     153    ASSERT(!m_activeIteratorCount);
     154
    146155    if (!m_hashMap) {
    147156        if (m_singleEventListenerType != eventType)
     
    169178EventListenerVector* EventListenerMap::find(const AtomicString& eventType)
    170179{
     180    ASSERT(!m_activeIteratorCount);
     181
    171182    if (m_hashMap) {
    172183        EventListenerHashMap::iterator it = m_hashMap->find(eventType);
     
    201212void EventListenerMap::removeFirstEventListenerCreatedFromMarkup(const AtomicString& eventType)
    202213{
     214    ASSERT(!m_activeIteratorCount);
     215
    203216    if (m_hashMap) {
    204217        EventListenerHashMap::iterator result = m_hashMap->find(eventType);
     
    240253void EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget(EventTarget* target)
    241254{
     255    ASSERT(!m_activeIteratorCount);
     256
    242257    if (m_hashMap) {
    243258        EventListenerHashMap::iterator end = m_hashMap->end();
     
    273288    m_map = &data->eventListenerMap;
    274289
     290#ifndef NDEBUG
     291    m_map->m_activeIteratorCount++;
     292#endif
     293
    275294    if (m_map->m_hashMap) {
    276295        m_mapIterator = m_map->m_hashMap->begin();
     
    278297    }
    279298}
     299
     300#ifndef NDEBUG
     301EventListenerIterator::~EventListenerIterator()
     302{
     303    if (m_map)
     304        m_map->m_activeIteratorCount--;
     305}
     306#endif
    280307
    281308EventListener* EventListenerIterator::nextListener()
  • trunk/Source/WebCore/dom/EventListenerMap.h

    r95372 r95619  
    7676    AtomicString m_singleEventListenerType;
    7777    OwnPtr<EventListenerVector> m_singleEventListenerVector;
     78
     79#ifndef NDEBUG
     80    int m_activeIteratorCount;
     81#endif
    7882};
    7983
     
    8286public:
    8387    EventListenerIterator();
    84 
    85     // EventTarget must not be modified while an iterator is active.
    8688    EventListenerIterator(EventTarget*);
     89#ifndef NDEBUG
     90    ~EventListenerIterator();
     91#endif
    8792
    8893    EventListener* nextListener();
Note: See TracChangeset for help on using the changeset viewer.