<?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>201803</bug_id>
          
          <creation_ts>2019-09-15 06:11:07 -0700</creation_ts>
          <short_desc>REGRESSION (r233409): Leak of NSMapTable in -[JSVirtualMachine addManagedReference:withOwner:]</short_desc>
          <delta_ts>2019-09-15 10:56:03 -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>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=186973</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Kilzer (:ddkilzer)">ddkilzer</reporter>
          <assigned_to name="David Kilzer (:ddkilzer)">ddkilzer</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>joepeck</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mitz</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1570927</commentid>
    <comment_count>0</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2019-09-15 06:11:07 -0700</bug_when>
    <thetext>-[JSVirtualMachine addManagedReference:withOwner:] leaks an NSMapTable every time a new one is created.

- (void)addManagedReference:(id)object withOwner:(id)owner
{    
    [...]
    NSMapTable *ownedObjects = [m_externalObjectGraph objectForKey:owner];  // ownedObjects is retained by m_externalObjectGraph.
    if (!ownedObjects) {
        NSPointerFunctionsOptions weakIDOptions = NSPointerFunctionsWeakMemory | NSPointerFunctionsObjectPersonality;
        NSPointerFunctionsOptions integerOptions = NSPointerFunctionsOpaqueMemory | NSPointerFunctionsIntegerPersonality;
        ownedObjects = [[NSMapTable alloc] initWithKeyOptions:weakIDOptions valueOptions:integerOptions capacity:1];  // ownedObjects is +1 retained by -alloc.

        [m_externalObjectGraph setObject:ownedObjects forKey:owner]; // ownedObjects is +2 retained by m_externalObjectGraph.
    }

    size_t count = reinterpret_cast&lt;size_t&gt;(NSMapGet(ownedObjects, (__bridge void*)object));
    NSMapInsert(ownedObjects, (__bridge void*)object, reinterpret_cast&lt;void*&gt;(count + 1));
    // FIXME: When `ownedObjects` is created, it leaks one reference count from -alloc when returning from this method.
}

&lt;https://trac.webkit.org/browser/webkit/trunk/Source/JavaScriptCore/API/JSVirtualMachine.mm#L167&gt;

Caused by:

Bug 186973: [Cocoa] Improve ARC compatibility of more code in JavaScriptCore
&lt;https://bugs.webkit.org/show_bug.cgi?id=186973&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570928</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2019-09-15 06:12:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/55377721&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570931</commentid>
    <comment_count>2</comment_count>
      <attachid>378810</attachid>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2019-09-15 06:42:30 -0700</bug_when>
    <thetext>Created attachment 378810
Patch v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570942</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2019-09-15 09:33:43 -0700</bug_when>
    <thetext>Wow that was a mismerge. I had a patch that actually converted to ARC, and when making the &quot;prepare to use ARC&quot; version I accidentally left in the deletion of the call to release.

It would have been simpler to just add the release back in, but it&apos;s also OK to use RetainPtr.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570946</commentid>
    <comment_count>4</comment_count>
      <attachid>378810</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-09-15 10:17:09 -0700</bug_when>
    <thetext>Comment on attachment 378810
Patch v1

Clearing flags on attachment: 378810

Committed r249885: &lt;https://trac.webkit.org/changeset/249885&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570947</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2019-09-15 10:17:10 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570950</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2019-09-15 10:48:23 -0700</bug_when>
    <thetext>Seriously, could have just added back the release, but rewrite to use RetainPtr was OK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1570952</commentid>
    <comment_count>7</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2019-09-15 10:56:03 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #6)
&gt; Seriously, could have just added back the release, but rewrite to use
&gt; RetainPtr was OK.

I didn&apos;t add back the -release because:
- It would need to be removed to enable ARC again.
- Extra insight is required to realize `ownedObjects` isn&apos;t being over-released (and is thus still valid) because it was added to m_externalObjectGraph.  I&apos;m not sure if the clang static analyzer would have enough context to &quot;know&quot; this.
- RetainPtr&lt;&gt; is basically doing the same thing ARC would have done W.r.t. retain counting `ownedObjects`.
- I assume that folks will make additional passes through WebKit to remove the use of unnecessary RetainPtr&lt;&gt; for NS objects once the conversion to ARC occurs (and isn&apos;t rolled out).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>378810</attachid>
            <date>2019-09-15 06:42:30 -0700</date>
            <delta_ts>2019-09-15 10:17:09 -0700</delta_ts>
            <desc>Patch v1</desc>
            <filename>bug-201803-20190915064357.patch</filename>
            <type>text/plain</type>
            <size>2716</size>
            <attacher name="David Kilzer (:ddkilzer)">ddkilzer</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjQ5ODUyCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCA0
ODhiMTc0YWY2ZDZjMDM1MzFhMzlkYjcyNWY1YTM0OGU1NjYzMWE1Li5mN2U5YTkyNjcyNmQzOTUy
ZWQ5ZmQyM2ZhZjRmYjNkMzNlYTQwYjAyIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxNCBAQAorMjAxOS0wOS0xNSAgRGF2aWQgS2lsemVyICA8ZGRraWx6ZXJAYXBwbGUuY29t
PgorCisgICAgICAgIExlYWsgb2YgTlNNYXBUYWJsZSBpbiAtW0pTVmlydHVhbE1hY2hpbmUgYWRk
TWFuYWdlZFJlZmVyZW5jZTp3aXRoT3duZXI6XQorICAgICAgICA8aHR0cHM6Ly93ZWJraXQub3Jn
L2IvMjAxODAzPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgICogQVBJL0pTVmlydHVhbE1hY2hpbmUubW06CisgICAgICAgICgtW0pTVmlydHVhbE1hY2hp
bmUgYWRkTWFuYWdlZFJlZmVyZW5jZTp3aXRoT3duZXI6XSk6IFVzZQorICAgICAgICBSZXRhaW5Q
dHI8PiB0byBmaXggdGhlIGxlYWsuCisKIDIwMTktMDktMTMgIFl1c3VrZSBTdXp1a2kgIDx5c3V6
dWtpQGFwcGxlLmNvbT4KIAogICAgICAgICBbSlNDXSBNaWNyby1vcHRpbWl6ZSBZYXJySklUJ3Mg
c3Vycm9nYXRlIHBhaXIgaGFuZGxpbmcKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9BUEkvSlNWaXJ0dWFsTWFjaGluZS5tbSBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNW
aXJ0dWFsTWFjaGluZS5tbQppbmRleCBkMWI2Yjk0OWVkYzMzOGQ1ZGMzOWIyYTgxOWRiMjE5Yjgy
ZmUyY2JjLi5iOWFkMmY2Mjk1MjdlNjE5YmZkNzdkMDE1YTI1ODIwMmQzZTBiMjdmIDEwMDY0NAot
LS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0pTVmlydHVhbE1hY2hpbmUubW0KKysrIGIv
U291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1ZpcnR1YWxNYWNoaW5lLm1tCkBAIC00MCw2ICs0
MCw3IEBACiAjaW1wb3J0IDxtdXRleD4KICNpbXBvcnQgPHd0Zi9CbG9ja1B0ci5oPgogI2ltcG9y
dCA8d3RmL0xvY2suaD4KKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KIAogc3RhdGljIE5TTWFw
VGFibGUgKmdsb2JhbFdyYXBwZXJDYWNoZSA9IDA7CiAKQEAgLTE4MCwxNyArMTgxLDE3IEBAIC0g
KHZvaWQpYWRkTWFuYWdlZFJlZmVyZW5jZTooaWQpb2JqZWN0IHdpdGhPd25lcjooaWQpb3duZXIK
ICAgICAgICAgW3NlbGYgYWRkRXh0ZXJuYWxSZW1lbWJlcmVkT2JqZWN0Om93bmVyXTsKICAKICAg
ICBhdXRvIGV4dGVybmFsRGF0YU11dGV4TG9ja2VyID0gaG9sZExvY2sobV9leHRlcm5hbERhdGFN
dXRleCk7Ci0gICAgTlNNYXBUYWJsZSAqb3duZWRPYmplY3RzID0gW21fZXh0ZXJuYWxPYmplY3RH
cmFwaCBvYmplY3RGb3JLZXk6b3duZXJdOworICAgIFJldGFpblB0cjxOU01hcFRhYmxlPiBvd25l
ZE9iamVjdHMgPSBbbV9leHRlcm5hbE9iamVjdEdyYXBoIG9iamVjdEZvcktleTpvd25lcl07CiAg
ICAgaWYgKCFvd25lZE9iamVjdHMpIHsKICAgICAgICAgTlNQb2ludGVyRnVuY3Rpb25zT3B0aW9u
cyB3ZWFrSURPcHRpb25zID0gTlNQb2ludGVyRnVuY3Rpb25zV2Vha01lbW9yeSB8IE5TUG9pbnRl
ckZ1bmN0aW9uc09iamVjdFBlcnNvbmFsaXR5OwogICAgICAgICBOU1BvaW50ZXJGdW5jdGlvbnNP
cHRpb25zIGludGVnZXJPcHRpb25zID0gTlNQb2ludGVyRnVuY3Rpb25zT3BhcXVlTWVtb3J5IHwg
TlNQb2ludGVyRnVuY3Rpb25zSW50ZWdlclBlcnNvbmFsaXR5OwotICAgICAgICBvd25lZE9iamVj
dHMgPSBbW05TTWFwVGFibGUgYWxsb2NdIGluaXRXaXRoS2V5T3B0aW9uczp3ZWFrSURPcHRpb25z
IHZhbHVlT3B0aW9uczppbnRlZ2VyT3B0aW9ucyBjYXBhY2l0eToxXTsKKyAgICAgICAgb3duZWRP
YmplY3RzID0gYWRvcHROUyhbW05TTWFwVGFibGUgYWxsb2NdIGluaXRXaXRoS2V5T3B0aW9uczp3
ZWFrSURPcHRpb25zIHZhbHVlT3B0aW9uczppbnRlZ2VyT3B0aW9ucyBjYXBhY2l0eToxXSk7CiAK
LSAgICAgICAgW21fZXh0ZXJuYWxPYmplY3RHcmFwaCBzZXRPYmplY3Q6b3duZWRPYmplY3RzIGZv
cktleTpvd25lcl07CisgICAgICAgIFttX2V4dGVybmFsT2JqZWN0R3JhcGggc2V0T2JqZWN0Om93
bmVkT2JqZWN0cy5nZXQoKSBmb3JLZXk6b3duZXJdOwogICAgIH0KIAotICAgIHNpemVfdCBjb3Vu
dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihOU01hcEdldChvd25lZE9iamVjdHMsIChfX2Jy
aWRnZSB2b2lkKilvYmplY3QpKTsKLSAgICBOU01hcEluc2VydChvd25lZE9iamVjdHMsIChfX2Jy
aWRnZSB2b2lkKilvYmplY3QsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGNvdW50ICsgMSkpOwor
ICAgIHNpemVfdCBjb3VudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihOU01hcEdldChvd25l
ZE9iamVjdHMuZ2V0KCksIChfX2JyaWRnZSB2b2lkKilvYmplY3QpKTsKKyAgICBOU01hcEluc2Vy
dChvd25lZE9iamVjdHMuZ2V0KCksIChfX2JyaWRnZSB2b2lkKilvYmplY3QsIHJlaW50ZXJwcmV0
X2Nhc3Q8dm9pZCo+KGNvdW50ICsgMSkpOwogfQogCiAtICh2b2lkKXJlbW92ZU1hbmFnZWRSZWZl
cmVuY2U6KGlkKW9iamVjdCB3aXRoT3duZXI6KGlkKW93bmVyCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>