Array keys with a intermediate 0-length binary element trigger an assertion
Categories
(Core :: Storage: IndexedDB, defect, P2)
Tracking
()
Tracking | Status | |
---|---|---|
firefox70 | --- | fixed |
People
(Reporter: sg, Assigned: sg)
References
Details
Attachments
(12 files)
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review | |
47 bytes,
text/x-phabricator-request
|
Details | Review |
When keys containing an intermediate 0-length binary element (e.g. [Uint8Array.from([]), Uint8Array.from([1])]
) are processed (encoded and decoded again), an assertion is triggered:
1:32.88 GECKO(1765) Assertion failure: pos >= BufferEnd(), at /home/osboxes/work/mozilla-unified/dom/indexedDB/Key.cpp:793
1:37.00 GECKO(1765) #01: mozilla::dom::indexedDB::Key::ToJSVal(JSContext*, JS::MutableHandle<JS::Value>) const (/home/osboxes/work/mozilla-unified/dom/indexedDB/Key.cpp:793)
1:37.20 GECKO(1765) #02: mozilla::dom::indexedDB::(anonymous namespace)::ResultHelper::GetResult(JSContext*, mozilla::dom::indexedDB::Key const*, JS::MutableHandle<JS::Value>) (/home/osboxes/work/mozilla-unified/dom/indexedDB/ActorsChild.cpp:425)
1:37.20 GECKO(1765) #03: mozilla::dom::indexedDB::(anonymous namespace)::ResultHelper::GetResult(JSContext*, JS::MutableHandle<JS::Value>) (/home/osboxes/work/mozilla-unified/dom/indexedDB/ActorsChild.cpp:330)
1:37.20 GECKO(1765) #04: mozilla::dom::IDBRequest::SetResultCallback(mozilla::dom::IDBRequest::ResultCallback*) (/home/osboxes/work/mozilla-unified/dom/indexedDB/IDBRequest.cpp:296)
1:37.21 GECKO(1765) #05: mozilla::dom::indexedDB::(anonymous namespace)::DispatchSuccessEvent(mozilla::dom::indexedDB::(anonymous namespace)::ResultHelper*, mozilla::dom::Event*) (/home/osboxes/work/mozilla-unified/dom/indexedDB/ActorsChild.cpp:742)
1:37.21 GECKO(1765) #06: mozilla::dom::indexedDB::BackgroundRequestChild::HandleResponse(mozilla::dom::indexedDB::Key const&) (/home/osboxes/work/mozilla-unified/dom/indexedDB/ActorsChild.cpp:2634)
1:37.22 GECKO(1765) #07: mozilla::dom::indexedDB::BackgroundRequestChild::Recv__delete__(mozilla::dom::indexedDB::RequestResponse const&) (/home/osboxes/work/mozilla-unified/dom/indexedDB/ActorsChild.cpp:2841)
1:39.50 GECKO(1765) #08: non-virtual thunk to mozilla::dom::indexedDB::BackgroundRequestChild::Recv__delete__(mozilla::dom::indexedDB::RequestResponse const&) (-:?)
1:39.57 GECKO(1765) #09: mozilla::dom::indexedDB::PBackgroundIDBRequestChild::OnMessageReceived(IPC::Message const&) (/home/osboxes/work/mozilla-unified/obj-x86_64-pc-linux-gnu/ipc/ipdl/PBackgroundIDBRequestChild.cpp:133)
1:39.64 GECKO(1765) #10: mozilla::ipc::PBackgroundChild::OnMessageReceived(IPC::Message const&) (/home/osboxes/work/mozilla-unified/obj-x86_64-pc-linux-gnu/ipc/ipdl/PBackgroundChild.cpp:4717)
1:39.74 GECKO(1765) #11: mozilla::ipc::MessageChannel::DispatchAsyncMessage(mozilla::ipc::ActorLifecycleProxy*, IPC::Message const&) (/home/osboxes/work/mozilla-unified/ipc/glue/MessageChannel.cpp:2158)
1:39.79 GECKO(1765) #12: mozilla::ipc::MessageChannel::DispatchMessage(IPC::Message&&) (-:?)
1:39.85 GECKO(1765) #13: mozilla::ipc::MessageChannel::RunMessage(mozilla::ipc::MessageChannel::MessageTask&) (-:?)
1:39.86 GECKO(1765) #14: mozilla::ipc::MessageChannel::MessageTask::Run() (/home/osboxes/work/mozilla-unified/ipc/glue/MessageChannel.cpp:1971)
1:39.94 GECKO(1765) #15: nsThread::ProcessNextEvent(bool, bool*) (/home/osboxes/work/mozilla-unified/xpcom/threads/nsThread.cpp:1227)
1:39.95 GECKO(1765) #16: NS_ProcessNextEvent(nsIThread*, bool) (/home/osboxes/work/mozilla-unified/xpcom/threads/nsThreadUtils.cpp:486)
1:40.12 GECKO(1765) #17: mozilla::dom::WorkerPrivate::DoRunLoop(JSContext*) (/home/osboxes/work/mozilla-unified/dom/workers/WorkerPrivate.cpp:2815)
1:40.28 GECKO(1765) #18: mozilla::dom::workerinternals::(anonymous namespace)::WorkerThreadPrimaryRunnable::Run() (/home/osboxes/work/mozilla-unified/dom/workers/RuntimeService.cpp:2339)
1:40.28 GECKO(1765) #19: nsThread::ProcessNextEvent(bool, bool*) (/home/osboxes/work/mozilla-unified/xpcom/threads/nsThread.cpp:1227)
1:40.28 GECKO(1765) #20: NS_ProcessNextEvent(nsIThread*, bool) (/home/osboxes/work/mozilla-unified/xpcom/threads/nsThreadUtils.cpp:486)
1:40.29 GECKO(1765) #21: mozilla::ipc::MessagePumpForNonMainThreads::Run(base::MessagePump::Delegate*) (/home/osboxes/work/mozilla-unified/ipc/glue/MessagePump.cpp:334)
1:40.33 GECKO(1765) #22: MessageLoop::RunInternal() (/home/osboxes/work/mozilla-unified/ipc/chromium/src/base/message_loop.cc:315)
1:40.35 GECKO(1765) #23: MessageLoop::RunHandler() (/home/osboxes/work/mozilla-unified/ipc/chromium/src/base/message_loop.cc:309)
1:40.36 GECKO(1765) #24: MessageLoop::Run() (/home/osboxes/work/mozilla-unified/ipc/chromium/src/base/message_loop.cc:290)
1:40.39 GECKO(1765) #25: nsThread::ThreadFunc(void*) (/home/osboxes/work/mozilla-unified/xpcom/threads/nsThread.cpp:461)
1:40.47 GECKO(1765) #26: _pt_root (/home/osboxes/work/mozilla-unified/nsprpub/pr/src/pthreads/ptthread.c:204)
1:40.56 GECKO(1765) #27: start_thread (pthread_create.c:?)
Assignee | ||
Comment 1•5 years ago
|
||
Assignee | ||
Comment 2•5 years ago
|
||
The comment referenced the former 3 prefix used for strings, but this is
no longer correct for strings (which now use a 0x30) prefix, and the
function has been generalized to also work for binaries, and got
a parameter aType specifying the prefix. Updated the comment accordingly.
Depends on D37849
Assignee | ||
Comment 3•5 years ago
|
||
Depends on D37850
Assignee | ||
Comment 4•5 years ago
|
||
Depends on D37851
Assignee | ||
Comment 5•5 years ago
|
||
Depends on D37852
Assignee | ||
Comment 6•5 years ago
|
||
Depends on D37853
Assignee | ||
Comment 7•5 years ago
|
||
Depends on D37854
Assignee | ||
Comment 8•5 years ago
|
||
Depends on D37855
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Assignee | ||
Comment 9•5 years ago
|
||
Depends on D37856
Assignee | ||
Comment 10•5 years ago
|
||
EncodeString and EncodeBinary already use a common backend EncodeAsString,
the same should be done in decoding, as the encoding of a binary is
a special case of the encoding of a string.
Depends on D38075
Assignee | ||
Comment 11•5 years ago
|
||
Assignee | ||
Comment 12•5 years ago
|
||
Depends on D38172
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Updated•5 years ago
|
Assignee | ||
Updated•5 years ago
|
Comment 13•5 years ago
|
||
Pushed by archaeopteryx@coole-files.de:
https://hg.mozilla.org/integration/autoland/rev/bd2e92310857
DecodeBinary violates contract for 0-sized binary r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/800e7de53622
Updated comment r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/594f76e67769
Fixed spelling mistake in comment r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/ba109131fcad
Added TODO comments on duplicated code r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/aac0a4a4fc67
Added handling of ArrayBuffer/binary keys to compareKeys functions r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/5e2dcfefb4f5
Added diagnostic output r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/4815a910245c
Added note declaring that key list must be kept sorted r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/6d8e8f078383
Added test keys with scalar ArrayBuffer and arrays containing ArrayBuffer r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/052b34ddf704
Move sortKey variable declaration close to usage r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/4f4f25ecac5c
Reduced code duplication in DecodeString/DecodeBinary r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/6afea4389eb2
Define and use type aliases EncodedDataType r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/8bdfc4852ae5
Removed duplication between LengthOfEncodedBinary and CalcDecodedStringySize r=ttung,asuth
Comment 14•5 years ago
|
||
Backed out 13 changesets (bug 1544750, bug 1565515) for bustages at /indexedDB/Key.cpp on a CLOSED TREE.
Backout link: https://hg.mozilla.org/integration/autoland/rev/3e0d79dd1de284de827b372abd0e89ac0c87eb09
**Push with failures:**https://treeherder.mozilla.org/#/jobs?repo=autoland&resultStatus=testfailed%2Cbusted%2Cexception&revision=8bdfc4852ae5c9f0052908c02c4b90a9bb6481fc&selectedJob=258546090
Log link: https://treeherder.mozilla.org/logviewer.html#/jobs?job_id=258546090&repo=autoland&lineNumber=26234
Log snippet:
[task 2019-07-26T19:21:08.121Z] 19:21:08 INFO - mkdir -p '.deps/'
[task 2019-07-26T19:21:08.121Z] 19:21:08 INFO - make[4]: Leaving directory '/builds/worker/workspace/build/src/obj-firefox/dom/webauthn'
[task 2019-07-26T19:21:08.121Z] 19:21:08 INFO - make[4]: Entering directory '/builds/worker/workspace/build/src/obj-firefox/dom/webauthn'
[task 2019-07-26T19:21:08.121Z] 19:21:08 INFO - dom/webauthn/Unified_cpp_dom_webauthn0.o
[task 2019-07-26T19:21:08.121Z] 19:21:08 INFO - make[4]: Leaving directory '/builds/worker/workspace/build/src/obj-firefox/dom/webauthn'
[task 2019-07-26T19:21:08.370Z] 19:21:08 INFO - make[4]: Entering directory '/builds/worker/workspace/build/src/obj-firefox/dom/indexedDB'
[task 2019-07-26T19:21:08.370Z] 19:21:08 INFO - /builds/worker/workspace/build/src/sccache/sccache /builds/worker/workspace/build/src/clang/bin/clang++ -m32 -o Key.o -c -I/builds/worker/workspace/build/src/obj-firefox/dist/stl_wrappers -I/builds/worker/workspace/build/src/obj-firefox/dist/system_wrappers -include /builds/worker/workspace/build/src/config/gcc_hidden.h -DDEBUG=1 -DOS_POSIX=1 -DOS_LINUX=1 -DSTATIC_EXPORTABLE_JS_API -DMOZ_HAS_MOZGLUE -DMOZILLA_INTERNAL_API -DIMPL_LIBXUL -I/builds/worker/workspace/build/src/dom/indexedDB -I/builds/worker/workspace/build/src/obj-firefox/dom/indexedDB -I/builds/worker/workspace/build/src/obj-firefox/ipc/ipdl/_ipdlheaders -I/builds/worker/workspace/build/src/ipc/chromium/src -I/builds/worker/workspace/build/src/ipc/glue -I/builds/worker/workspace/build/src/dom/base -I/builds/worker/workspace/build/src/dom/storage -I/builds/worker/workspace/build/src/ipc/glue -I/builds/worker/workspace/build/src/third_party/sqlite3/src -I/builds/worker/workspace/build/src/xpcom/build -I/builds/worker/workspace/build/src/obj-firefox/dist/include -I/builds/worker/workspace/build/src/obj-firefox/dist/include/nspr -I/builds/worker/workspace/build/src/obj-firefox/dist/include/nss -fPIC -DMOZILLA_CLIENT -include /builds/worker/workspace/build/src/obj-firefox/mozilla-config.h -Qunused-arguments -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -Qunused-arguments -Wall -Wbitfield-enum-conversion -Wempty-body -Wignored-qualifiers -Woverloaded-virtual -Wpointer-arith -Wshadow-field-in-constructor-modified -Wsign-compare -Wtype-limits -Wunreachable-code -Wunreachable-code-return -Wwrite-strings -Wno-invalid-offsetof -Wclass-varargs -Wfloat-overflow-conversion -Wfloat-zero-conversion -Wloop-analysis -Wc++1z-compat -Wc++2a-compat -Wcomma -Wimplicit-fallthrough -Werror=non-literal-null-conversion -Wstring-conversion -Wtautological-overlap-compare -Wtautological-unsigned-enum-zero-compare -Wtautological-unsigned-zero-compare -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=backend-plugin -Wno-error=return-std-move -Wno-error=atomic-alignment -Wformat -Wformat-security -Wno-gnu-zero-variadic-macro-arguments -Wno-unknown-warning-option -Wno-return-type-c-linkage -D_GLIBCXX_USE_CXX11_ABI=0 -fno-sized-deallocation -fcrash-diagnostics-dir=/builds/worker/artifacts -march=pentium-m -msse -msse2 -mfpmath=sse -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-exceptions -fno-strict-aliasing -fno-rtti -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -pthread -pipe -g -Xclang -load -Xclang /builds/worker/workspace/build/src/obj-firefox/build/clang-plugin/libclang-plugin.so -Xclang -add-plugin -Xclang moz-check -Os -fno-omit-frame-pointer -funwind-tables -Werror -Wno-error=shadow -MD -MP -MF .deps/Key.o.pp -Wno-error=type-limits /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp
[task 2019-07-26T19:21:08.370Z] 19:21:08 ERROR - /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp:664:34: error: comparison of integers of different signs: 'int' and 'const uint32_t' (aka 'const unsigned int') [-Werror,-Wsign-compare]
[task 2019-07-26T19:21:08.372Z] 19:21:08 INFO - NS_ASSERTION(decodedPos - aOut == aDecodedLength,
[task 2019-07-26T19:21:08.372Z] 19:21:08 INFO - ~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~
[task 2019-07-26T19:21:08.372Z] 19:21:08 INFO - /builds/worker/workspace/build/src/obj-firefox/dist/include/nsDebug.h:100:13: note: expanded from macro 'NS_ASSERTION'
[task 2019-07-26T19:21:08.372Z] 19:21:08 INFO - if (!(expr)) {
[task 2019-07-26T19:21:08.372Z] 19:21:08 INFO - ^~~~
[task 2019-07-26T19:21:08.372Z] 19:21:08 INFO - /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp:695:3: note: in instantiation of function template specialization 'mozilla::dom::indexedDB::Key::DecodeAsStringy<char16_t>' requested here
[task 2019-07-26T19:21:08.373Z] 19:21:08 INFO - DecodeAsStringy(encodedSectionBegin, encodedSectionEnd, decodedLength, out);
[task 2019-07-26T19:21:08.373Z] 19:21:08 INFO - ^
[task 2019-07-26T19:21:08.373Z] 19:21:08 INFO - /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp:703:3: note: in instantiation of function template specialization 'mozilla::dom::indexedDB::Key::DecodeStringy<'0', char16_t, (lambda at /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp:705:7), (lambda at /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp:708:7)>' requested here
[task 2019-07-26T19:21:08.373Z] 19:21:08 INFO - DecodeStringy<eString, char16_t>(
[task 2019-07-26T19:21:08.373Z] 19:21:08 INFO - ^
[task 2019-07-26T19:21:08.376Z] 19:21:08 ERROR - /builds/worker/workspace/build/src/dom/indexedDB/Key.cpp:664:34: error: comparison of integers of different signs: 'int' and 'const uint32_t' (aka 'const unsigned int') [-Werror,-Wsign-compare]
[task 2019-07-26T19:21:08.376Z] 19:21:08 INFO - NS_ASSERTION(decodedPos - aOut == aDecodedLength,
[task 2019-07-26T19:21:08.376Z] 19:21:08 INFO - ~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~
[task 2019-07-26T19:21:08.376Z] 19:21:08 INFO - /builds/worker/workspace/build/src/obj-firefox/dist/include/nsDebug.h:100:13: note: expanded from macro 'NS_ASSERTION'
[task 2019-07-26T19:21:08.376Z] 19:21:08 INFO - if (!(expr)) {
[task 2019-07-26T19:21:08.376Z] 19:21:08 INFO - ^~~~
Assignee | ||
Comment 15•5 years ago
|
||
Sorry for that, I am still new to the workflow. I have resolved the issues and pushed-to-try, I am just waiting for the remaining jobs to complete: https://treeherder.mozilla.org/#/jobs?repo=try&revision=5575ad5211908d5e9b232836e3d48b75c3baaa03
Assignee | ||
Comment 16•5 years ago
|
||
Looks good now on try, hope everything is fine
Comment 17•5 years ago
|
||
Simon, as I can see in lando D39005 and D38360 need review. Should we land the other patches?
Assignee | ||
Comment 18•5 years ago
|
||
(In reply to Razvan Maries from comment #17)
Simon, as I can see in lando D39005 and D38360 need review. Should we land the other patches?
Yes, those two revisions belong to Bug 1565224, which is still in review. This bug can be landed independently from that.
Comment 19•5 years ago
|
||
Pushed by rmaries@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/e0aa82bed5fa
DecodeBinary violates contract for 0-sized binary r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/8f3493b2cae1
Updated comment r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/2359da4989a7
Fixed spelling mistake in comment r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/75cb7938f704
Added TODO comments on duplicated code r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/57ed49a17c9d
Added handling of ArrayBuffer/binary keys to compareKeys functions r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/2c0fb0c0e228
Added diagnostic output r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/91f546c40f98
Added note declaring that key list must be kept sorted r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/93be9fcab443
Added test keys with scalar ArrayBuffer and arrays containing ArrayBuffer r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/90fb12799ecd
Move sortKey variable declaration close to usage r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/d70293010941
Reduced code duplication in DecodeString/DecodeBinary r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/8619e09b03bb
Define and use type aliases EncodedDataType r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/4d8c2c1bce2d
Removed duplication between LengthOfEncodedBinary and CalcDecodedStringySize r=ttung,asuth
Comment 20•5 years ago
|
||
Backed out for hazard bustages
Failure log: https://treeherder.mozilla.org/logviewer.html#/jobs?job_id=258997670&repo=autoland&lineNumber=57621
Backout: https://hg.mozilla.org/integration/autoland/rev/bb23c8be138d1eaf274bdfdfeb7ad3dceb51b93b
Assignee | ||
Comment 21•5 years ago
|
||
Sorry, I now made the opposite misassumption about the synchronisation of try server and Phabricator: While I fixed the issues locally and push-to-try was successful, I missed submitting the changes to Phabricator, which I did just now. I sincerely hope there is no additional caveat I am unaware of.
Comment 22•5 years ago
|
||
Pushed by apavel@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/c56b0517d758
DecodeBinary violates contract for 0-sized binary r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/681fc4db981a
Updated comment r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/4dff1d583029
Fixed spelling mistake in comment r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/ec828d3716ba
Added TODO comments on duplicated code r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/0b1108acd813
Added handling of ArrayBuffer/binary keys to compareKeys functions r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/e0b4db904b60
Added diagnostic output r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/08ae374a7d89
Added note declaring that key list must be kept sorted r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/7fc8d30534b2
Added test keys with scalar ArrayBuffer and arrays containing ArrayBuffer r=asuth,ttung
https://hg.mozilla.org/integration/autoland/rev/1b1ca518ca7a
Move sortKey variable declaration close to usage r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/2aef1859366b
Reduced code duplication in DecodeString/DecodeBinary r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/85fbe0106292
Define and use type aliases EncodedDataType r=ttung,asuth
https://hg.mozilla.org/integration/autoland/rev/3c4a84ec8b3a
Removed duplication between LengthOfEncodedBinary and CalcDecodedStringySize r=ttung,asuth
Comment 23•5 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/c56b0517d758
https://hg.mozilla.org/mozilla-central/rev/681fc4db981a
https://hg.mozilla.org/mozilla-central/rev/4dff1d583029
https://hg.mozilla.org/mozilla-central/rev/ec828d3716ba
https://hg.mozilla.org/mozilla-central/rev/0b1108acd813
https://hg.mozilla.org/mozilla-central/rev/e0b4db904b60
https://hg.mozilla.org/mozilla-central/rev/08ae374a7d89
https://hg.mozilla.org/mozilla-central/rev/7fc8d30534b2
https://hg.mozilla.org/mozilla-central/rev/1b1ca518ca7a
https://hg.mozilla.org/mozilla-central/rev/2aef1859366b
https://hg.mozilla.org/mozilla-central/rev/85fbe0106292
https://hg.mozilla.org/mozilla-central/rev/3c4a84ec8b3a
Description
•