Closed Bug 1279993 Opened 8 years ago Closed 5 years ago

ThreadActor can crash the browser (debug build) when attaching to a page with worker

Categories

(DevTools :: Debugger, defect, P3)

defect

Tracking

(firefox50 affected)

RESOLVED INVALID
Tracking Status
firefox50 --- affected

People

(Reporter: jsnajdr, Unassigned, NeedInfo)

References

(Blocks 1 open bug)

Details

(Keywords: stale-bug)

Attachments

(1 file)

I discovered this when working on bug 1278778, playing with fetch and workers.

Steps to reproduce:
1. The attached ZIP contains a static HTML page, page script and a worker script.
2. Run a static localhost server with these files
3. Set the http://localhost/worker.html page as your home page
4. Build Firefox in debug mode
5. Start Firefox with mach run --devtools
6. The home page will be loaded at the same time as devtools, triggering a race condition.

Result:
The debug build will crash with a MOZ_ASSERT:

Assertion failure: mParentSuspended (Resumed more than once!), at /Users/jsnajdr/src/gecko-dev/dom/workers/WorkerPrivate.cpp:2835
#01: nsGlobalWindow::ResumeTimeouts(bool, bool)[/Users/jsnajdr/src/gecko-dev/obj-x86_64-apple-darwin15.5.0/dist/NightlyDebug.app/Contents/MacOS/XUL +0x11c6fc6]
#02: nsDOMWindowUtils::ResumeTimeouts()[/Users/jsnajdr/src/gecko-dev/obj-x86_64-apple-darwin15.5.0/dist/NightlyDebug.app/Contents/MacOS/XUL +0x1174f30]
#03: NS_InvokeByIndex[/Users/jsnajdr/src/gecko-dev/obj-x86_64-apple-darwin15.5.0/dist/NightlyDebug.app/Contents/MacOS/XUL +0x108a7f]
#04: CallMethodHelper::Call()[/Users/jsnajdr/src/gecko-dev/obj-x86_64-apple-darwin15.5.0/dist/NightlyDebug.app/Contents/MacOS/XUL +0xb4fb06]

The JS stack trace is at the windowUtils.resumeTimeouts call at:
_ctors/webbrowser.js 1802 postNest
_er/actors/script.js 361 EventLoop.prototype.enter
_er/actors/script.js 541 ThreadActor<._pushThreadPause
_er/actors/script.js 656 ThreadActor<.onAttach
_ools/server/main.js 1648 DSC_onPacket
_nsport/transport.js 568 LocalDebuggerTransport.prototype.send/<
_afeDevToolsUtils.js 101 exports.makeInfallible/<
_afeDevToolsUtils.js 101 exports.makeInfallible/<

Why it happened?
- at [1], windowUtils.suspendTimeouts() is called, and a while later, at [2], we call windowUtils.resumeTimeouts().
- one part of the suspend/resume process is suspending/resuming workers at [3] and [4].
- when suspending the workers, the window doesn't yet have any.
- when resuming the workers, one got created in the meantime.
- because the new worker was never suspended, the resume fails an assert at [5].

To trigger the race condition, several things must work together:
- the worker-script.js cannot be inline in the HTML page, must be loaded from a separate file
- cannot just call new Worker("worker-script.js"), we must go through the blob URL
- without this, the crash disappeared and I couldn't reproduce it

[1] https://dxr.mozilla.org/mozilla-central/source/devtools/server/actors/script.js#346
[2] https://dxr.mozilla.org/mozilla-central/source/devtools/server/actors/script.js#361
[3] https://dxr.mozilla.org/mozilla-central/source/dom/base/nsGlobalWindow.cpp#13003
[4] https://dxr.mozilla.org/mozilla-central/source/dom/base/nsGlobalWindow.cpp#13095
[5] https://dxr.mozilla.org/mozilla-central/source/dom/workers/WorkerPrivate.cpp#2833
Summary: ThreadActor can crash debug build of browser when attaching to a page with worker → ThreadActor can crash the browser (debug build) when attaching to a page with worker
Note: I can reproduce this reliably only in non-e10s. Not sure if the race condition is in e10s, too.
This is a crasher, so I'm marking this as P1.

This looks like a race condition in the worker debugger API, so I'm probably the most qualified person to look into it.
Assignee: nobody → ejpbruel
Priority: -- → P1
Assignee: ejpbruel → nobody
Product: Firefox → DevTools
Moving to p3 because no activity for at least 24 weeks.
See https://github.com/mozilla/bug-handling/blob/master/policy/triage-bugzilla.md#how-do-you-triage for more information
Priority: P1 → P3

Honza, jarda, could you verify that this still crashes?

Blocks: dbg-worker
Flags: needinfo?(odvarko)
Flags: needinfo?(jarda)

I followed the steps in comment #0 and I can't reproduce the crash on my machine (Win 10, Nightly debug build)

Closing

Honza

Status: NEW → RESOLVED
Closed: 5 years ago
Flags: needinfo?(odvarko)
Resolution: --- → INVALID
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: