<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>171319</bug_id>
          
          <creation_ts>2017-04-26 03:11:27 -0700</creation_ts>
          <short_desc>sendMessageScoped&apos;s signal handler calls LocklessBag::consumeAll, which causes heap deallocation in signal handler and leads deadlock</short_desc>
          <delta_ts>2017-04-26 11:46:27 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Template Framework</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>benjamin</cc>
    
    <cc>buildbot</cc>
    
    <cc>cdumez</cc>
    
    <cc>cgarcia</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>dbates</cc>
    
    <cc>fpizlo</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>saam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1301549</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-04-26 03:11:27 -0700</bug_when>
    <thetext>In sendMessageScoped, we call LocklessBag&lt;SignalHandler&gt;::consumeAll `thread-&gt;threadMessages().consumeAll()`.
In LocklessBag::consumeAll, we call `delete` on Nodes.
The problem is that this is called under the context of signal handler. Thus, when calling this, the original
thread may hold the lock in bmalloc. In that case, this `delete` call attempts to lock the heap lock recursively,
and causes deadlock.

Making heap lock to recursive one easily breaks invariant guarded by that lock in bmalloc.
Should not do that. I believe the correct way to solve it is not calling heap functions inside signal handler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301550</commentid>
    <comment_count>1</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-04-26 03:13:58 -0700</bug_when>
    <thetext>http://sprunge.us/XLYG log.
The signal handler is invoked on Thread 19 when the thread is dealing with bmalloc.

#5  &lt;signal handler called&gt;
#6  0x00007f2ef35732f0 in bmalloc::Heap::deallocateSmallLine(std::lock_guard&lt;bmalloc::StaticMutex&gt;&amp;, bmalloc::Object) ()
   from /home/cgarcia/src/git/gnome/WebKit/WebKitBuild/Release/lib/libjavascriptcoregtk-4.0.so.18
#7  0x00007f2ef3572bc6 in bmalloc::Deallocator::processObjectLog(std::lock_guard&lt;bmalloc::StaticMutex&gt;&amp;) ()
   from /home/cgarcia/src/git/gnome/WebKit/WebKitBuild/Release/lib/libjavascriptcoregtk-4.0.so.18
#8  0x00007f2ef3571dd8 in bmalloc::Allocator::refillAllocatorSlowCase(bmalloc::BumpAllocator&amp;, unsigned long) ()
   from /home/cgarcia/src/git/gnome/WebKit/WebKitBuild/Release/lib/libjavascriptcoregtk-4.0.so.18

And calls deallocation.

#0  0x00007f2ee923eb57 in sched_yield () at ../sysdeps/unix/syscall-template.S:84
#1  0x00007f2ef35766a5 in bmalloc::StaticMutex::lockSlowCase() () from /home/cgarcia/src/git/gnome/WebKit/WebKitBuild/Release/lib/libjavascriptcoregtk-4.0.so.18
#2  0x00007f2ef3572ced in bmalloc::Deallocator::deallocateSlowCase(void*) () from /home/cgarcia/src/git/gnome/WebKit/WebKitBuild/Release/lib/libjavascriptcoregtk-4.0.so.18
#3  0x00007f2ef353a13e in WTF::Function&lt;WTF::SignalAction (int, siginfo_t*, void*)&gt;::CallableWrapper&lt;WTF::sendMessageScoped(WTF::Thread&amp;, WTF::ScopedLambda&lt;void (siginfo_t*, ucontext*)&gt; const&amp;)::{lambda()#1}::operator()() const::{lambda(int, siginfo_t*, void*)#1}&gt;::call(int, siginfo_t*, void*) ()
   from /home/cgarcia/src/git/gnome/WebKit/WebKitBuild/Release/lib/libjavascriptcoregtk-4.0.so.18

Then, deadlock.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301553</commentid>
    <comment_count>2</comment_count>
      <attachid>308236</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-04-26 04:18:24 -0700</bug_when>
    <thetext>Created attachment 308236
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301562</commentid>
    <comment_count>3</comment_count>
      <attachid>308236</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-04-26 06:22:55 -0700</bug_when>
    <thetext>Comment on attachment 308236
Patch

Wow! How did I miss this r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301565</commentid>
    <comment_count>4</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-04-26 06:34:27 -0700</bug_when>
    <thetext>Committed r215798: &lt;http://trac.webkit.org/changeset/215798&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301611</commentid>
    <comment_count>5</comment_count>
      <attachid>308236</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-26 09:09:29 -0700</bug_when>
    <thetext>Comment on attachment 308236
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=308236&amp;action=review

&gt; Source/WTF/wtf/ThreadMessage.cpp:154
&gt;          clearPipe();

Don&apos;t we need to delete it also here after ensuring we&apos;ve ran?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301612</commentid>
    <comment_count>6</comment_count>
      <attachid>308236</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-04-26 09:11:20 -0700</bug_when>
    <thetext>Comment on attachment 308236
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=308236&amp;action=review

&gt;&gt; Source/WTF/wtf/ThreadMessage.cpp:154
&gt;&gt;          clearPipe();
&gt; 
&gt; Don&apos;t we need to delete it also here after ensuring we&apos;ve ran?

No, because the only exit to the loop is above.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301614</commentid>
    <comment_count>7</comment_count>
      <attachid>308236</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2017-04-26 09:12:37 -0700</bug_when>
    <thetext>Comment on attachment 308236
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=308236&amp;action=review

&gt;&gt; Source/WTF/wtf/ThreadMessage.cpp:154
&gt;&gt;          clearPipe();
&gt; 
&gt; Don&apos;t we need to delete it also here after ensuring we&apos;ve ran?

This is not necessary because this goes to `while (true)`.
And we will go to `if (Node* node = data.ran.load()) {` again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1301708</commentid>
    <comment_count>8</comment_count>
      <attachid>308236</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-04-26 11:46:27 -0700</bug_when>
    <thetext>Comment on attachment 308236
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=308236&amp;action=review

&gt;&gt;&gt;&gt; Source/WTF/wtf/ThreadMessage.cpp:154
&gt;&gt;&gt;&gt;          clearPipe();
&gt;&gt;&gt; 
&gt;&gt;&gt; Don&apos;t we need to delete it also here after ensuring we&apos;ve ran?
&gt;&gt; 
&gt;&gt; No, because the only exit to the loop is above.
&gt; 
&gt; This is not necessary because this goes to `while (true)`.
&gt; And we will go to `if (Node* node = data.ran.load()) {` again.

ah, right. Oops, I did not read the whole loop. Thanks for clarifying.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>308236</attachid>
            <date>2017-04-26 04:18:24 -0700</date>
            <delta_ts>2017-04-26 06:22:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-171319-20170426201823.patch</filename>
            <type>text/plain</type>
            <size>4455</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjE1Nzk3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5n
ZUxvZyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCmluZGV4IGRiMDNlYTljMWMzMjRkMDg4NDFkZTdl
YzQ5MTg4NWIzYWY1YzBjZmEuLmI2YzZhNGEyZjIyZDRhNmIwNTI4ZWEwYzk2ZjRhZTRlOWU5ZjRi
YzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMjQgQEAKKzIwMTctMDQtMjYgIFl1c3VrZSBTdXp1a2kgIDx1dGF0
YW5lLnRlYUBnbWFpbC5jb20+CisKKyAgICAgICAgc2VuZE1lc3NhZ2VTY29wZWQncyBzaWduYWwg
aGFuZGxlciBjYWxscyBMb2NrbGVzc0JhZzo6Y29uc3VtZUFsbCwgd2hpY2ggY2F1c2VzIGhlYXAg
ZGVhbGxvY2F0aW9uIGluIHNpZ25hbCBoYW5kbGVyIGFuZCBsZWFkcyBkZWFkbG9jaworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTcxMzE5CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW4gc2VuZE1lc3NhZ2VT
Y29wZWQsIHdlIGNhbGwgTG9ja2xlc3NCYWc8U2lnbmFsSGFuZGxlcj46OmNvbnN1bWVBbGwgYHRo
cmVhZC0+dGhyZWFkTWVzc2FnZXMoKS5jb25zdW1lQWxsKClgLgorICAgICAgICBJbiBMb2NrbGVz
c0JhZzo6Y29uc3VtZUFsbCwgd2UgY2FsbCBgZGVsZXRlYCBvbiBOb2Rlcy4KKyAgICAgICAgVGhl
IHByb2JsZW0gaXMgdGhhdCB0aGlzIGlzIGNhbGxlZCB1bmRlciB0aGUgY29udGV4dCBvZiBzaWdu
YWwgaGFuZGxlci4gVGh1cywgd2hlbiBjYWxsaW5nIHRoaXMsIHRoZSBvcmlnaW5hbAorICAgICAg
ICB0aHJlYWQgbWF5IGhvbGQgdGhlIGxvY2sgaW4gYm1hbGxvYy4gSW4gdGhhdCBjYXNlLCB0aGlz
IGBkZWxldGVgIGNhbGwgYXR0ZW1wdHMgdG8gbG9jayB0aGUgaGVhcCBsb2NrIHJlY3Vyc2l2ZWx5
LAorICAgICAgICBhbmQgY2F1c2VzIGRlYWRsb2NrLgorCisgICAgICAgIEluc3RlYWQsIHRoaXMg
cGF0Y2ggdHJhbnNmZXJzIHRoZSBMb2NrbGVzc0JhZydzIE5vZGUgdG8gdGhlIHNlbmRlciB0aHJl
YWQuIEFuZCB0aGUgc2VuZGVyIHRocmVhZCBkZWxldGVzIGl0IGluc3RlYWQuCisKKyAgICAgICAg
KiB3dGYvTG9ja2xlc3NCYWcuaDoKKyAgICAgICAgKFdURjo6TG9ja2xlc3NCYWc6OmNvbnN1bWVB
bGxXaXRoTm9kZSk6CisgICAgICAgICogd3RmL1RocmVhZE1lc3NhZ2UuY3BwOgorICAgICAgICAo
V1RGOjpUaHJlYWRNZXNzYWdlRGF0YTo6VGhyZWFkTWVzc2FnZURhdGEpOgorICAgICAgICAoV1RG
OjpzZW5kTWVzc2FnZVNjb3BlZCk6CisKIDIwMTctMDQtMjUgIERvbiBPbG1zdGVhZCAgPGRvbi5v
bG1zdGVhZEBhbS5zb255LmNvbT4KIAogICAgICAgICBbV2luXSBVc2UgQ2xhbmcncyBfX2hhc19k
ZWNsc3BlY19hdHRyaWJ1dGUgZm9yIGV4cG9ydCBtYWNyb3MKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
VEYvd3RmL0xvY2tsZXNzQmFnLmggYi9Tb3VyY2UvV1RGL3d0Zi9Mb2NrbGVzc0JhZy5oCmluZGV4
IDE5Y2FjMDMyZGJlOWY3ODViNzNkZDYyMWJlY2RjODJkZTMwMzYwMjUuLjYxZDhhM2RjYjFkOGQ0
MTEyMjE0ODNiN2MyYmMzYzY0Mzc5YTYyZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL0xv
Y2tsZXNzQmFnLmgKKysrIGIvU291cmNlL1dURi93dGYvTG9ja2xlc3NCYWcuaApAQCAtMzQsMTQg
KzM0LDE0IEBAIG5hbWVzcGFjZSBXVEYgewogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIGNsYXNzIExv
Y2tsZXNzQmFnIHsKICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShMb2NrbGVzc0JhZyk7Ci0KK3B1
YmxpYzoKICAgICBzdHJ1Y3QgTm9kZSB7CiAgICAgICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OwogICAgIHB1YmxpYzoKICAgICAgICAgVCBkYXRhOwogICAgICAgICBOb2RlKiBuZXh0OwogICAg
IH07Ci1wdWJsaWM6CisKICAgICBMb2NrbGVzc0JhZygpCiAgICAgICAgIDogbV9oZWFkKG51bGxw
dHIpCiAgICAgewpAQCAtOTAsNiArOTAsMTcgQEAgY2xhc3MgTG9ja2xlc3NCYWcgewogICAgICAg
ICB9CiAgICAgfQogCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRnVuY3Rvcj4KKyAgICB2b2lkIGNv
bnN1bWVBbGxXaXRoTm9kZShjb25zdCBGdW5jdG9yJiBmdW5jKQorICAgIHsKKyAgICAgICAgTm9k
ZSogbm9kZSA9IG1faGVhZC5leGNoYW5nZShudWxscHRyKTsKKyAgICAgICAgd2hpbGUgKG5vZGUp
IHsKKyAgICAgICAgICAgIE5vZGUqIG9sZE5vZGUgPSBub2RlOworICAgICAgICAgICAgbm9kZSA9
IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBmdW5jKFdURk1vdmUob2xkTm9kZS0+ZGF0YSksIG9s
ZE5vZGUpOworICAgICAgICB9CisgICAgfQorCiBwcml2YXRlOgogICAgIEF0b21pYzxOb2RlKj4g
bV9oZWFkOwogfTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvd3RmL1RocmVhZE1lc3NhZ2UuY3Bw
IGIvU291cmNlL1dURi93dGYvVGhyZWFkTWVzc2FnZS5jcHAKaW5kZXggZjJmOGE3YjIyNWVjZmM2
MzE3MTQzNjZlYWE2N2ZlNWI5OTE2ZDhlYy4uZjE0YmM0NWQzNjE0YzdjNjYzNWViMTdhYjBlMjcy
ODE2YTEzNzNkZCAxMDA2NDQKLS0tIGEvU291cmNlL1dURi93dGYvVGhyZWFkTWVzc2FnZS5jcHAK
KysrIGIvU291cmNlL1dURi93dGYvVGhyZWFkTWVzc2FnZS5jcHAKQEAgLTM5LDE2ICszOSwxOCBA
QAogCiBuYW1lc3BhY2UgV1RGIHsKIAordXNpbmcgTm9kZSA9IExvY2tsZXNzQmFnPFRocmVhZE1l
c3NhZ2VEYXRhKj46Ok5vZGU7CisKIGNsYXNzIFRocmVhZE1lc3NhZ2VEYXRhIHsKICAgICBXVEZf
TUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKICAgICBUaHJlYWRNZXNzYWdlRGF0YShjb25z
dCBUaHJlYWRNZXNzYWdlJiBtKQotICAgICAgICA6IHJhbihmYWxzZSkKKyAgICAgICAgOiByYW4o
bnVsbHB0cikKICAgICAgICAgLCBtZXNzYWdlKG0pCiAgICAgewogICAgIH0KIAotICAgIEF0b21p
Yzxib29sPiByYW47CisgICAgQXRvbWljPE5vZGUqPiByYW47CiAgICAgY29uc3QgVGhyZWFkTWVz
c2FnZSYgbWVzc2FnZTsKIH07CiAKQEAgLTk0LDkgKzk2LDEyIEBAIE1lc3NhZ2VTdGF0dXMgc2Vu
ZE1lc3NhZ2VTY29wZWQoVGhyZWFkJiB0aHJlYWQsIGNvbnN0IFRocmVhZE1lc3NhZ2UmIG1lc3Nh
Z2UpCiAgICAgICAgICAgICAgICAgcmV0dXJuIFNpZ25hbEFjdGlvbjo6Tm90SGFuZGxlZDsKICAg
ICAgICAgICAgIH0KIAotICAgICAgICAgICAgdGhyZWFkLT50aHJlYWRNZXNzYWdlcygpLmNvbnN1
bWVBbGwoWyZdIChUaHJlYWRNZXNzYWdlRGF0YSogZGF0YSkgeworICAgICAgICAgICAgLy8gTm9k
ZSBzaG91bGQgYmUgZGVsZXRlZCBpbiB0aGUgc2VuZGVyIHRocmVhZC4gRGVsZXRpbmcgTm9kZXMg
aW4gc2lnbmFsIGhhbmRsZXIgY2F1c2VzIGRlYWQgbG9jay4KKyAgICAgICAgICAgIHRocmVhZC0+
dGhyZWFkTWVzc2FnZXMoKS5jb25zdW1lQWxsV2l0aE5vZGUoWyZdIChUaHJlYWRNZXNzYWdlRGF0
YSogZGF0YSwgTm9kZSogbm9kZSkgewogICAgICAgICAgICAgICAgIGRhdGEtPm1lc3NhZ2UoaW5m
bywgc3RhdGljX2Nhc3Q8dWNvbnRleHRfdCo+KHVhcCkpOwotICAgICAgICAgICAgICAgIGRhdGEt
PnJhbi5zdG9yZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBCeSBzZXR0aW5nIHJhbiB2YXJp
YWJsZSwgKDEpIHRoZSBzZW5kZXIgYWNrbm93bGVkZ2VzIHRoZSBjb21wbGV0aW9uIGFuZAorICAg
ICAgICAgICAgICAgIC8vICgyKSBnZXRzIHRoZSBOb2RlIHRvIGJlIGRlbGV0ZWQuCisgICAgICAg
ICAgICAgICAgZGF0YS0+cmFuLnN0b3JlKG5vZGUpOwogICAgICAgICAgICAgfSk7CiAKICAgICAg
ICAgICAgIHdoaWxlICh3cml0ZShmaWxlRGVzY3JpcHRvcnNbV3JpdGVdLCBtYWdpY0J5dGUsIDEp
ID09IC0xKQpAQCAtMTM3LDEyICsxNDIsMTQgQEAgTWVzc2FnZVN0YXR1cyBzZW5kTWVzc2FnZVNj
b3BlZChUaHJlYWQmIHRocmVhZCwgY29uc3QgVGhyZWFkTWVzc2FnZSYgbWVzc2FnZSkKICAgICAg
ICAgICAgIGZjbnRsKGZpbGVEZXNjcmlwdG9yc1tSZWFkXSwgRl9TRVRGTCwgZmxhZ3MpOwogICAg
ICAgICB9OwogCi0gICAgICAgIGlmIChkYXRhLnJhbi5sb2FkKCkpIHsKKyAgICAgICAgaWYgKE5v
ZGUqIG5vZGUgPSBkYXRhLnJhbi5sb2FkKCkpIHsKICAgICAgICAgICAgIGNsZWFyUGlwZSgpOwor
ICAgICAgICAgICAgZGVsZXRlIG5vZGU7CiAgICAgICAgICAgICByZXR1cm4gTWVzc2FnZVN0YXR1
czo6TWVzc2FnZVJhbjsKICAgICAgICAgfQogCi0gICAgICAgIHJlYWQoZmlsZURlc2NyaXB0b3Jz
W1JlYWRdLCBidWZmZXIsIDEpOworICAgICAgICBpbnQgcmV0ID0gcmVhZChmaWxlRGVzY3JpcHRv
cnNbUmVhZF0sIGJ1ZmZlciwgMSk7CisgICAgICAgIFVOVVNFRF9QQVJBTShyZXQpOwogICAgICAg
ICBBU1NFUlQoYnVmZmVyWzBdID09IG1hZ2ljQnl0ZVswXSk7CiAgICAgICAgIGNsZWFyUGlwZSgp
OwogICAgIH0K
</data>
<flag name="review"
          id="329405"
          type_id="1"
          status="+"
          setter="keith_miller"
    />
          </attachment>
      

    </bug>

</bugzilla>