[webkit-changes] [WebKit/WebKit] 37e534: Memory leak in compression stream to blob conversion

youennf noreply at github.com
Tue May 23 23:55:16 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 37e5346e6e2813aebde62407b48f70a81850959c
      https://github.com/WebKit/WebKit/commit/37e5346e6e2813aebde62407b48f70a81850959c
  Author: Youenn Fablet <youennf at gmail.com>
  Date:   2023-05-23 (Tue, 23 May 2023)

  Changed paths:
    M LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.serviceworker-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.sharedworker-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.worker-expected.txt
    M Source/WebCore/CMakeLists.txt
    M Source/WebCore/DerivedSources-input.xcfilelist
    M Source/WebCore/DerivedSources.make
    M Source/WebCore/Modules/compression/CompressionStream.js
    M Source/WebCore/Modules/compression/DecompressionStream.js
    A Source/WebCore/Modules/streams/TransformStream.cpp
    A Source/WebCore/Modules/streams/TransformStream.h
    M Source/WebCore/Modules/streams/TransformStream.idl
    R Source/WebCore/Modules/streams/TransformStream.js
    M Source/WebCore/Modules/streams/TransformStreamInternals.js
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/dom/TextDecoderStream.js
    M Source/WebCore/dom/TextEncoderStream.js

  Log Message:
  -----------
  Memory leak in compression stream to blob conversion
https://bugs.webkit.org/show_bug.cgi?id=256837
rdar://109409251

Reviewed by Chris Dumez.

TransformStream is keeping a reference ot its ReadableStream and its InternalReadableStream.
InternalReadableStream is keeping a reference to its TransformStream as part of the algorithms.
This triggers a reference cycle that cannot be broken until the stream context is stopped as:
- InternalReadableStream is DOMGuarded.
- ReadableStream keeps a reference to its InternalReadableStream.

To prevent this, we do the same change we did in the past for ReadableStream and WritableStream:
- TransformStream becomes a C++ object.
- TransformStream keeps a reference to its InternalTransformStream which is a JS object.
- To prevent GC, we make sure to let TransformStream mark its InternalTransformStream instead of relying on DOMGuarded.
- InternalTransformStream keeps a reference to InternalReadableStream, but not to the corresponding ReadableStream, which ensures therre is no ref cycles.

We update transforms tream creation call sites accordingly.

Manually tested.
Existing tests ensure that streams behavior and related remains the same.

* LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.serviceworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.sharedworker-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.worker-expected.txt:
* Source/WebCore/CMakeLists.txt:
* Source/WebCore/DerivedSources-input.xcfilelist:
* Source/WebCore/DerivedSources.make:
* Source/WebCore/Modules/compression/CompressionStream.js:
(initializeCompressionStream):
(getter.readable):
(getter.writable):
* Source/WebCore/Modules/compression/DecompressionStream.js:
(initializeDecompressionStream):
(getter.readable):
(getter.writable):
* Source/WebCore/Modules/streams/TransformStream.cpp: Added.
(WebCore::TransformStream::create):
(WebCore::TransformStream::TransformStream):
(WebCore::TransformStream::~TransformStream):
(WebCore::invokeTransformStreamFunction):
(WebCore::createInternalTransformStream):
(WebCore::JSTransformStream::visitAdditionalChildren):
* Source/WebCore/Modules/streams/TransformStream.h: Added.
(WebCore::TransformStream::readable):
(WebCore::TransformStream::writable):
(WebCore::TransformStream::internalTransformStream):
* Source/WebCore/Modules/streams/TransformStream.idl:
* Source/WebCore/Modules/streams/TransformStream.js: Removed.
* Source/WebCore/Modules/streams/TransformStreamInternals.js:
(isTransformStream):
(createInternalTransformStreamFromTransformer):
(createTransformStream):
(initializeTransformStream):
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/dom/TextDecoderStream.js:
(initializeTextDecoderStream):
(getter.readable):
(getter.writable):
* Source/WebCore/dom/TextEncoderStream.js:
(initializeTextEncoderStream):
(getter.readable):
(getter.writable):

Canonical link: https://commits.webkit.org/264462@main




More information about the webkit-changes mailing list