⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278329 in webkit


Ignore:
Timestamp:
Jun 1, 2021, 3:03:35 PM (5 years ago)
Author:
Chris Dumez
Message:

Fix unsafe access to m_upload in XMLHttpRequest::virtualHasPendingActivity()
https://bugs.webkit.org/show_bug.cgi?id=226508

Reviewed by Geoffrey Garen.

Source/WebCore:

Fix unsafe access to m_upload in XMLHttpRequest::virtualHasPendingActivity() as virtualHasPendingActivity()
may get called off the main thread and m_upload gets initialized lazily on the main thread.

Tests: fast/xmlhttprequest/xmlhttprequest-upload-sameobject.html

http/tests/xmlhttprequest/upload-progress-events-gc.html

  • xml/XMLHttpRequest.cpp:

(WebCore::XMLHttpRequest::updateHasRelevantEventListener):
(WebCore::XMLHttpRequest::eventListenersDidChange):
(WebCore::XMLHttpRequest::virtualHasPendingActivity const):

  • xml/XMLHttpRequest.h:
  • xml/XMLHttpRequest.idl:
  • xml/XMLHttpRequestUpload.cpp:

(WebCore::XMLHttpRequestUpload::eventListenersDidChange):
(WebCore::XMLHttpRequestUpload::hasRelevantEventListener const):

  • xml/XMLHttpRequestUpload.h:

LayoutTests:

Improve layout test coverage to make sure that XMLHttpRequest.upload always returns
the same object and that progress events on XMLHttpRequest.upload still get fired
after GC.

  • fast/xmlhttprequest/xmlhttprequest-upload-sameobject-expected.txt: Added.
  • fast/xmlhttprequest/xmlhttprequest-upload-sameobject.html: Added.
  • http/tests/xmlhttprequest/upload-progress-events-gc-expected.txt: Added.
  • http/tests/xmlhttprequest/upload-progress-events-gc.html: Added.
Location:
trunk
Files:
4 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r278304 r278329  
     12021-06-01  Chris Dumez  <cdumez@apple.com>
     2
     3        Fix unsafe access to m_upload in XMLHttpRequest::virtualHasPendingActivity()
     4        https://bugs.webkit.org/show_bug.cgi?id=226508
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Improve layout test coverage to make sure that XMLHttpRequest.upload always returns
     9        the same object and that progress events on XMLHttpRequest.upload still get fired
     10        after GC.
     11
     12        * fast/xmlhttprequest/xmlhttprequest-upload-sameobject-expected.txt: Added.
     13        * fast/xmlhttprequest/xmlhttprequest-upload-sameobject.html: Added.
     14        * http/tests/xmlhttprequest/upload-progress-events-gc-expected.txt: Added.
     15        * http/tests/xmlhttprequest/upload-progress-events-gc.html: Added.
     16
    1172021-06-01  Sam Weinig  <weinig@apple.com>
    218
  • trunk/Source/WebCore/ChangeLog

    r278328 r278329  
     12021-06-01  Chris Dumez  <cdumez@apple.com>
     2
     3        Fix unsafe access to m_upload in XMLHttpRequest::virtualHasPendingActivity()
     4        https://bugs.webkit.org/show_bug.cgi?id=226508
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Fix unsafe access to m_upload in XMLHttpRequest::virtualHasPendingActivity() as virtualHasPendingActivity()
     9        may get called off the main thread and m_upload gets initialized lazily on the main thread.
     10
     11        Tests: fast/xmlhttprequest/xmlhttprequest-upload-sameobject.html
     12               http/tests/xmlhttprequest/upload-progress-events-gc.html
     13
     14        * xml/XMLHttpRequest.cpp:
     15        (WebCore::XMLHttpRequest::updateHasRelevantEventListener):
     16        (WebCore::XMLHttpRequest::eventListenersDidChange):
     17        (WebCore::XMLHttpRequest::virtualHasPendingActivity const):
     18        * xml/XMLHttpRequest.h:
     19        * xml/XMLHttpRequest.idl:
     20        * xml/XMLHttpRequestUpload.cpp:
     21        (WebCore::XMLHttpRequestUpload::eventListenersDidChange):
     22        (WebCore::XMLHttpRequestUpload::hasRelevantEventListener const):
     23        * xml/XMLHttpRequestUpload.h:
     24
    1252021-06-01  Fujii Hironori  <Hironori.Fujii@sony.com>
    226
  • trunk/Source/WebCore/xml/XMLHttpRequest.cpp

    r278253 r278329  
    11621162}
    11631163
    1164 void XMLHttpRequest::eventListenersDidChange()
     1164void XMLHttpRequest::updateHasRelevantEventListener()
    11651165{
    11661166    m_hasRelevantEventListener = hasEventListeners(eventNames().abortEvent)
     
    11701170        || hasEventListeners(eventNames().progressEvent)
    11711171        || hasEventListeners(eventNames().readystatechangeEvent)
    1172         || hasEventListeners(eventNames().timeoutEvent);
     1172        || hasEventListeners(eventNames().timeoutEvent)
     1173        || (m_upload && m_upload->hasRelevantEventListener());
     1174}
     1175
     1176void XMLHttpRequest::eventListenersDidChange()
     1177{
     1178    updateHasRelevantEventListener();
    11731179}
    11741180
     
    11771183bool XMLHttpRequest::virtualHasPendingActivity() const
    11781184{
    1179     if (!m_hasRelevantEventListener && !(m_upload && m_upload->hasRelevantEventListener()))
     1185    if (!m_hasRelevantEventListener)
    11801186        return false;
    11811187
  • trunk/Source/WebCore/xml/XMLHttpRequest.h

    r278253 r278329  
    134134
    135135private:
     136    friend class XMLHttpRequestUpload;
    136137    explicit XMLHttpRequest(ScriptExecutionContext&);
     138
     139    void updateHasRelevantEventListener();
    137140
    138141    // EventTarget.
     
    248251    std::optional<ExceptionCode> m_exceptionCode;
    249252    RefPtr<UserGestureToken> m_userGestureToken;
    250     bool m_hasRelevantEventListener { false };
     253    std::atomic<bool> m_hasRelevantEventListener;
    251254};
    252255
  • trunk/Source/WebCore/xml/XMLHttpRequest.idl

    r274832 r278329  
    6767    attribute unsigned long timeout;
    6868    attribute boolean withCredentials;
    69     readonly attribute XMLHttpRequestUpload upload;
     69    [SameObject] readonly attribute XMLHttpRequestUpload upload;
    7070    undefined send(optional (Document or BodyInit)? body = null);
    7171    undefined abort();
  • trunk/Source/WebCore/xml/XMLHttpRequestUpload.cpp

    r259080 r278329  
    4444void XMLHttpRequestUpload::eventListenersDidChange()
    4545{
    46     m_hasRelevantEventListener = hasEventListeners(eventNames().abortEvent)
     46    m_request.updateHasRelevantEventListener();
     47}
     48
     49bool XMLHttpRequestUpload::hasRelevantEventListener() const
     50{
     51    return hasEventListeners(eventNames().abortEvent)
    4752        || hasEventListeners(eventNames().errorEvent)
    4853        || hasEventListeners(eventNames().loadEvent)
  • trunk/Source/WebCore/xml/XMLHttpRequestUpload.h

    r259080 r278329  
    4141    void dispatchProgressEvent(const AtomString& type, unsigned long long loaded, unsigned long long total);
    4242
    43     bool hasRelevantEventListener() const { return m_hasRelevantEventListener; }
     43    bool hasRelevantEventListener() const;
    4444
    4545private:
     
    5353
    5454    XMLHttpRequest& m_request;
    55     bool m_hasRelevantEventListener { false };
    5655};
    5756   
Note: See TracChangeset for help on using the changeset viewer.