Bug 180337
Summary: | Frequent crashes in WorkerCacheStorageConnection | ||
---|---|---|---|
Product: | WebKit | Reporter: | Chris Dumez <cdumez> |
Component: | WebCore Misc. | Assignee: | Nobody <webkit-unassigned> |
Status: | RESOLVED DUPLICATE | ||
Severity: | Normal | CC: | beidson, ggaren, youennf |
Priority: | P2 | ||
Version: | WebKit Nightly Build | ||
Hardware: | Unspecified | ||
OS: | Unspecified |
Chris Dumez
I see frequent crashes in DOMCacheEngine when running the tests locally:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000bbadbeef
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [0]
VM Regions Near 0xbbadbeef:
-->
__TEXT 000000010ee69000-000000010ee6b000 [ 8K] r-x/rwx SM=COW /Volumes/VOLUME/*/WebKit.framework/Versions/A/XPCServices/com.apple.WebKit.WebContent.xpc/Contents/MacOS/com.apple.WebKit.WebContent.Development
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.apple.JavaScriptCore 0x00000005d42681e4 WTFCrash + 36 (Assertions.cpp:273)
1 com.apple.WebCore 0x00000005c7d6c188 WTF::Deque<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >, 0ul>::checkValidity() const + 168 (Deque.h:250)
2 com.apple.WebCore 0x00000005c7d6e73f void WTF::Deque<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >, 0ul>::append<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> > >(std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >&&) + 47 (Deque.h:455)
3 com.apple.WebCore 0x00000005c7d6e705 WTF::Deque<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >, 0ul>::append(std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >&&) + 37 (Deque.h:87)
4 com.apple.WebCore 0x00000005c7d626fb WTF::MessageQueue<WebCore::WorkerRunLoop::Task>::append(std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >) + 75 (MessageQueue.h:97)
5 com.apple.WebCore 0x00000005c7d5fac4 WebCore::WorkerRunLoop::postTaskForMode(WebCore::ScriptExecutionContext::Task&&, WTF::String const&) + 356 (WorkerRunLoop.cpp:252)
6 com.apple.WebCore 0x00000005c7db6b99 WebCore::ServiceWorkerThreadProxy::postTaskForModeToWorkerGlobalScope(WebCore::ScriptExecutionContext::Task&&, WTF::String const&) + 73 (ServiceWorkerThreadProxy.cpp:68)
7 com.apple.WebCore 0x00000005c5f2a75b WebCore::WorkerCacheStorageConnection::doRemove(unsigned long long, unsigned long long)::$_37::operator()()::'lambda'(WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)::operator()(WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&) + 283 (WorkerCacheStorageConnection.cpp:137)
8 com.apple.WebCore 0x00000005c5f2a584 WTF::Function<void (WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)>::CallableWrapper<WebCore::WorkerCacheStorageConnection::doRemove(unsigned long long, unsigned long long)::$_37::operator()()::'lambda'(WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)>::call(WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&) + 52 (Function.h:101)
9 com.apple.WebCore 0x00000005c5eed6ee WTF::Function<void (WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)>::operator()(WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&) const + 158 (Function.h:56)
10 com.apple.WebCore 0x00000005c5eed455 WebCore::CacheStorageConnection::openOrRemoveCompleted(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&) + 85
11 com.apple.WebKit 0x00000005c0805845 WebCore::CacheStorageConnection::removeCompleted(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&) + 37 (CacheStorageConnection.h:62)
12 com.apple.WebKit 0x00000005c0805810 WebKit::WebCacheStorageConnection::removeCompleted(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&) + 48 (WebCacheStorageConnection.cpp:107)
13 com.apple.WebKit 0x00000005c0812060 void IPC::callMemberFunctionImpl<WebKit::WebCacheStorageConnection, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&), std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> >, 0ul, 1ul>(WebKit::WebCacheStorageConnection*, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&), std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> >&&, std::__1::integer_sequence<unsigned long, 0ul, 1ul>) + 192 (HandleMessage.h:41)
14 com.apple.WebKit 0x00000005c0810940 void IPC::callMemberFunction<WebKit::WebCacheStorageConnection, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&), std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> >, std::__1::integer_sequence<unsigned long, 0ul, 1ul> >(std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> >&&, WebKit::WebCacheStorageConnection*, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)) + 96 (HandleMessage.h:47)
15 com.apple.WebKit 0x00000005c08100b8 void IPC::handleMessage<Messages::WebCacheStorageConnection::RemoveCompleted, WebKit::WebCacheStorageConnection, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)>(IPC::Decoder&, WebKit::WebCacheStorageConnection*, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheIdentifierOperationResult, WebCore::DOMCacheEngine::Error> const&)) + 280
16 com.apple.WebKit 0x00000005c080fb0d WebKit::WebCacheStorageConnection::didReceiveMessage(IPC::Connection&, IPC::Decoder&) + 237 (WebCacheStorageConnectionMessageReceiver.cpp:48)
17 com.apple.WebKit 0x00000005c0817eca WebKit::WebCacheStorageProvider::process(IPC::Connection&, IPC::Decoder&) + 90 (WebCacheStorageProvider.cpp:56)
18 com.apple.WebKit 0x00000005c03af7bc WebKit::NetworkProcessConnection::didReceiveMessage(IPC::Connection&, IPC::Decoder&) + 812 (NetworkProcessConnection.cpp:94)
19 com.apple.WebKit 0x00000005c013b333 IPC::Connection::dispatchMessage(IPC::Decoder&) + 51 (Connection.cpp:902)
20 com.apple.WebKit 0x00000005c0130918 IPC::Connection::dispatchMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >) + 712
21 com.apple.WebKit 0x00000005c013b93a IPC::Connection::dispatchOneMessage() + 1530 (Connection.cpp:959)
22 com.apple.WebKit 0x00000005c0153c1d IPC::Connection::enqueueIncomingMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >)::$_14::operator()() + 29 (Connection.cpp:896)
23 com.apple.WebKit 0x00000005c0153b79 WTF::Function<void ()>::CallableWrapper<IPC::Connection::enqueueIncomingMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >)::$_14>::call() + 25 (Function.h:101)
24 com.apple.JavaScriptCore 0x00000005d42810db WTF::Function<void ()>::operator()() const + 139 (Function.h:56)
25 com.apple.JavaScriptCore 0x00000005d42c82d3 WTF::RunLoop::performWork() + 211 (RunLoop.cpp:107)
26 com.apple.JavaScriptCore 0x00000005d42c8b54 WTF::RunLoop::performWork(void*) + 36 (RunLoopCF.cpp:38)
27 com.apple.CoreFoundation 0x00007fff36aaa5a1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
28 com.apple.CoreFoundation 0x00007fff36b6435c __CFRunLoopDoSource0 + 108
29 com.apple.CoreFoundation 0x00007fff36a8d040 __CFRunLoopDoSources0 + 208
30 com.apple.CoreFoundation 0x00007fff36a8c4bd __CFRunLoopRun + 1293
31 com.apple.CoreFoundation 0x00007fff36a8bd23 CFRunLoopRunSpecific + 483
32 com.apple.HIToolbox 0x00007fff35da3e26 RunCurrentEventLoopInMode + 286
33 com.apple.HIToolbox 0x00007fff35da3b96 ReceiveNextEventCommon + 613
34 com.apple.HIToolbox 0x00007fff35da3914 _BlockUntilNextEventMatchingListInModeWithFilter + 64
35 com.apple.AppKit 0x00007fff3406ef5f _DPSNextEvent + 2085
36 com.apple.AppKit 0x00007fff34804b4c -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044
37 com.apple.AppKit 0x00007fff34063d6d -[NSApplication run] + 764
38 com.apple.AppKit 0x00007fff34032f1a NSApplicationMain + 804
39 libxpc.dylib 0x00007fff5e71342f _xpc_objc_main + 580
40 libxpc.dylib 0x00007fff5e712082 xpc_main + 417
41 com.apple.WebKit.WebContent 0x000000010ee6a13b main + 1195 (XPCServiceMain.mm:148)
42 libdyld.dylib 0x00007fff5e446115 start + 1
Attachments | ||
---|---|---|
Add attachment proposed patch, testcase, etc. |
Chris Dumez
Probably same root cause:
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.apple.JavaScriptCore 0x000000013c2681e4 WTFCrash + 36 (Assertions.cpp:273)
1 com.apple.WebCore 0x000000012fd6c188 WTF::Deque<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >, 0ul>::checkValidity() const + 168 (Deque.h:250)
2 com.apple.WebCore 0x000000012fd6e73f void WTF::Deque<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >, 0ul>::append<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> > >(std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >&&) + 47 (Deque.h:455)
3 com.apple.WebCore 0x000000012fd6e705 WTF::Deque<std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >, 0ul>::append(std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >&&) + 37 (Deque.h:87)
4 com.apple.WebCore 0x000000012fd626fb WTF::MessageQueue<WebCore::WorkerRunLoop::Task>::append(std::__1::unique_ptr<WebCore::WorkerRunLoop::Task, std::__1::default_delete<WebCore::WorkerRunLoop::Task> >) + 75 (MessageQueue.h:97)
5 com.apple.WebCore 0x000000012fd5fac4 WebCore::WorkerRunLoop::postTaskForMode(WebCore::ScriptExecutionContext::Task&&, WTF::String const&) + 356 (WorkerRunLoop.cpp:252)
6 com.apple.WebCore 0x000000012fdb6b99 WebCore::ServiceWorkerThreadProxy::postTaskForModeToWorkerGlobalScope(WebCore::ScriptExecutionContext::Task&&, WTF::String const&) + 73 (ServiceWorkerThreadProxy.cpp:68)
7 com.apple.WebCore 0x000000012df2bf90 WebCore::WorkerCacheStorageConnection::doRetrieveCaches(unsigned long long, WTF::String const&, unsigned long long)::$_38::operator()()::'lambda'(WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)::operator()(WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&) + 352 (WorkerCacheStorageConnection.cpp:158)
8 com.apple.WebCore 0x000000012df2bd84 WTF::Function<void (WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)>::CallableWrapper<WebCore::WorkerCacheStorageConnection::doRetrieveCaches(unsigned long long, WTF::String const&, unsigned long long)::$_38::operator()()::'lambda'(WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)>::call(WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&) + 52 (Function.h:101)
9 com.apple.WebCore 0x000000012deeda0e WTF::Function<void (WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)>::operator()(WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&) const + 158 (Function.h:56)
10 com.apple.WebCore 0x000000012deed77d WebCore::CacheStorageConnection::updateCaches(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&) + 93
11 com.apple.WebKit 0x000000012880588d WebKit::WebCacheStorageConnection::updateCaches(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&) + 61 (WebCacheStorageConnection.cpp:112)
12 com.apple.WebKit 0x0000000128814d50 void IPC::callMemberFunctionImpl<WebKit::WebCacheStorageConnection, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&), std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error> >, 0ul, 1ul>(WebKit::WebCacheStorageConnection*, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&), std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error> >&&, std::__1::integer_sequence<unsigned long, 0ul, 1ul>) + 192 (HandleMessage.h:41)
13 com.apple.WebKit 0x0000000128812100 void IPC::callMemberFunction<WebKit::WebCacheStorageConnection, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&), std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error> >, std::__1::integer_sequence<unsigned long, 0ul, 1ul> >(std::__1::tuple<unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error> >&&, WebKit::WebCacheStorageConnection*, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)) + 96 (HandleMessage.h:47)
14 com.apple.WebKit 0x00000001288101fc void IPC::handleMessage<Messages::WebCacheStorageConnection::UpdateCaches, WebKit::WebCacheStorageConnection, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)>(IPC::Decoder&, WebKit::WebCacheStorageConnection*, void (WebKit::WebCacheStorageConnection::*)(unsigned long long, WTF::Expected<WebCore::DOMCacheEngine::CacheInfos, WebCore::DOMCacheEngine::Error>&&)) + 284 (HandleMessage.h:127)
15 com.apple.WebKit 0x000000012880fb90 WebKit::WebCacheStorageConnection::didReceiveMessage(IPC::Connection&, IPC::Decoder&) + 368 (WebCacheStorageConnectionMessageReceiver.cpp:52)
16 com.apple.WebKit 0x0000000128817eca WebKit::WebCacheStorageProvider::process(IPC::Connection&, IPC::Decoder&) + 90 (WebCacheStorageProvider.cpp:56)
17 com.apple.WebKit 0x00000001283af7bc WebKit::NetworkProcessConnection::didReceiveMessage(IPC::Connection&, IPC::Decoder&) + 812 (NetworkProcessConnection.cpp:94)
18 com.apple.WebKit 0x000000012813b333 IPC::Connection::dispatchMessage(IPC::Decoder&) + 51 (Connection.cpp:902)
19 com.apple.WebKit 0x0000000128130918 IPC::Connection::dispatchMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >) + 712
20 com.apple.WebKit 0x000000012813b93a IPC::Connection::dispatchOneMessage() + 1530 (Connection.cpp:959)
21 com.apple.WebKit 0x0000000128153c1d IPC::Connection::enqueueIncomingMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >)::$_14::operator()() + 29 (Connection.cpp:896)
22 com.apple.WebKit 0x0000000128153b79 WTF::Function<void ()>::CallableWrapper<IPC::Connection::enqueueIncomingMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >)::$_14>::call() + 25 (Function.h:101)
23 com.apple.JavaScriptCore 0x000000013c2810db WTF::Function<void ()>::operator()() const + 139 (Function.h:56)
24 com.apple.JavaScriptCore 0x000000013c2c82d3 WTF::RunLoop::performWork() + 211 (RunLoop.cpp:107)
25 com.apple.JavaScriptCore 0x000000013c2c8b54 WTF::RunLoop::performWork(void*) + 36 (RunLoopCF.cpp:38)
26 com.apple.CoreFoundation 0x00007fff36aaa5a1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
27 com.apple.CoreFoundation 0x00007fff36b6435c __CFRunLoopDoSource0 + 108
28 com.apple.CoreFoundation 0x00007fff36a8d040 __CFRunLoopDoSources0 + 208
29 com.apple.CoreFoundation 0x00007fff36a8c4bd __CFRunLoopRun + 1293
30 com.apple.CoreFoundation 0x00007fff36a8bd23 CFRunLoopRunSpecific + 483
31 com.apple.HIToolbox 0x00007fff35da3e26 RunCurrentEventLoopInMode + 286
32 com.apple.HIToolbox 0x00007fff35da3b96 ReceiveNextEventCommon + 613
33 com.apple.HIToolbox 0x00007fff35da3914 _BlockUntilNextEventMatchingListInModeWithFilter + 64
34 com.apple.AppKit 0x00007fff3406ef5f _DPSNextEvent + 2085
35 com.apple.AppKit 0x00007fff34804b4c -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044
36 com.apple.AppKit 0x00007fff34063d6d -[NSApplication run] + 764
37 com.apple.AppKit 0x00007fff34032f1a NSApplicationMain + 804
38 libxpc.dylib 0x00007fff5e71342f _xpc_objc_main + 580
39 libxpc.dylib 0x00007fff5e712082 xpc_main + 417
40 com.apple.WebKit.WebContent 0x000000010d36813b main + 1195 (XPCServiceMain.mm:148)
41 libdyld.dylib 0x00007fff5e446115 start + 1
Chris Dumez
My bet is that WorkerCacheStorageConnection::m_proxy is dead. It is a WorkerLoaderProxy&, nothing seems to keep it alive?
Chris Dumez
Happening on the bots too:
https://build.webkit.org/results/Apple%20Sierra%20Release%20WK2%20(Tests)/r225461%20(6122)/results.html
Chris Dumez
Looks like it causes http/tests/workers/service/service-worker-clear.html to flakily time out.
youenn fablet
I believe this is a dupe of https://bugs.webkit.org/show_bug.cgi?id=180304.
Let's finalize 180304 and see whether this crash is still happening.
Chris Dumez
*** This bug has been marked as a duplicate of bug 180304 ***