Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 0b63ffe87813e5068683d0b5b86bfccb364bffad
https://github.com/WebKit/WebKit/commit/0b63ffe87813e5068683d0b5b86bfccb364bffad
Author: Vitor Roriz <[email protected]>
Date: 2023-10-20 (Fri, 20 Oct 2023)
Changed paths:
M Source/WebCore/loader/cache/CachedFontLoadRequest.h
Log Message:
-----------
Ensure that CachedFontLoadRequest::fontLoaded longs Font before font is
released
https://bugs.webkit.org/show_bug.cgi?id=263400
rdar://117077759
Reviewed by Chris Dumez.
The problem happens because CachedFontLoadRequest::fontLoaded calls
m_fontLoadRequestClient->fontLoaded(*this) which will end up destroying
CachedFontLoadRequest itself.
We use a local Ref object to try to guarantee the ownership of the object's
CSSFontFace& m_face.
We end up calling the destructor of CSSFontFace once we leave the function's
scope. This means that this Ref was the only one to the FontFace, but there was
no way for us to know that, since we have a l-value ref to it here.
The CSSFontFace will destroy its unique_ptr to CSSFontFaceSource which will
destroy its FontLoadRequest (actually a CachedFontLoadRequest) that will
finally destroy its CachedResourceHandle<CachedFont> m_font;
The caller of CSSFontFaceSource::fontLoaded is
CachedFontLoadRequest::fontLoaded. CachedFontLoadRequest has a
CachedResourceHandle<CachedFont> m_font that is accessed in fontLoaded, causing
the bug.
Proposed solution:
CachedFontLoadRequest::fontLoaded is the function that does the actual use
after free by using the object's m_font member after this pointer is deleted.
We can simply do the logging before m_fontLoadRequestClient->fontLoaded starts
the deallocation cycle.
This will work to avoid this specific use, but we should strengthen, but
we should consider using a WeakPtr to CSSFontFace at CSSFontFaceSource
instead of a l-value reference so we can check if the FontFace that owns this
CSSFontFaceSource is no longer existent.
* Source/WebCore/loader/cache/CachedFontLoadRequest.h:
Canonical link: https://commits.webkit.org/269562@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes