<?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>60594</bug_id>
          
          <creation_ts>2011-05-10 16:06:43 -0700</creation_ts>
          <short_desc>Protect self in [WebCoreResourceHandleAsDelegate connection:didReceiveDataArray:]</short_desc>
          <delta_ts>2011-05-10 17:47:02 -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>Platform</component>
          <version>528+ (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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Pratik Solanki">psolanki</reporter>
          <assigned_to name="Pratik Solanki">psolanki</assigned_to>
          <cc>ap</cc>
    
    <cc>psolanki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>401605</commentid>
    <comment_count>0</comment_count>
    <who name="Pratik Solanki">psolanki</who>
    <bug_when>2011-05-10 16:06:43 -0700</bug_when>
    <thetext>In [WebCoreResourceHandleAsDelegate connection:didReceiveDataArray:], we do

       for (NSData *data in dataArray)
           m_handle-&gt;client()-&gt;didReceiveData(m_handle, static_cast&lt;const char*&gt;([data bytes]), [data length], static_cast&lt;int&gt;([data length]));

However, in the didReceiveData() callback, the client can cancel the load which would result in the delegate (self) being freed. This means we could crash in the subsequent iteration of the loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401606</commentid>
    <comment_count>1</comment_count>
    <who name="Pratik Solanki">psolanki</who>
    <bug_when>2011-05-10 16:07:16 -0700</bug_when>
    <thetext>&lt;rdar://problem/9203259&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401617</commentid>
    <comment_count>2</comment_count>
      <attachid>93038</attachid>
    <who name="Pratik Solanki">psolanki</who>
    <bug_when>2011-05-10 16:20:24 -0700</bug_when>
    <thetext>Created attachment 93038
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401631</commentid>
    <comment_count>3</comment_count>
      <attachid>93038</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-05-10 16:31:52 -0700</bug_when>
    <thetext>Comment on attachment 93038
Patch

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

&gt; Source/WebCore/ChangeLog:4
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=60594

Please add a Radar link here, too.

Also, there needs to be an explanation why there are no tests (e.g. &quot;no bot tests CFNETWORK_DATA_ARRAY_CALLBACK&quot;).

&gt; Source/WebCore/platform/network/mac/ResourceHandleMac.mm:831
&gt; +        // The call to didReceiveData below could cancel a load, which would result in the delegate
&gt; +        // (self) being released. Retain self so we can at least check the value of m_handle without
&gt; +        // crashing and return safely in case the load got cancelled.

Please remove the second sentence - it just states what the code below does.

&gt; Source/WebCore/platform/network/mac/ResourceHandleMac.mm:832
&gt; +        RetainPtr&lt;WebCoreResourceHandleAsDelegate&gt; protectDelegate(self);

protect(self) reads more like an English sentence than protectDelegate(self).

&gt; Source/WebCore/platform/network/mac/ResourceHandleMac.mm:835
&gt; +            if (m_handle &amp;&amp; m_handle-&gt;client())
&gt; +                m_handle-&gt;client()-&gt;didReceiveData(m_handle, static_cast&lt;const char*&gt;([data bytes]), [data length], static_cast&lt;int&gt;([data length]));

Is the check for m_handle-&gt;client() necessary? Let&apos;s not add it unless it&apos;s necessary, since it would be confusing readers otherwise.

I&apos;d have used an early return:

            if (!m_handle)
                break;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401667</commentid>
    <comment_count>4</comment_count>
      <attachid>93038</attachid>
    <who name="Pratik Solanki">psolanki</who>
    <bug_when>2011-05-10 17:31:31 -0700</bug_when>
    <thetext>Comment on attachment 93038
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:4
&gt;&gt; +        https://bugs.webkit.org/show_bug.cgi?id=60594
&gt; 
&gt; Please add a Radar link here, too.
&gt; 
&gt; Also, there needs to be an explanation why there are no tests (e.g. &quot;no bot tests CFNETWORK_DATA_ARRAY_CALLBACK&quot;).

Done.

&gt;&gt; Source/WebCore/platform/network/mac/ResourceHandleMac.mm:831
&gt;&gt; +        // crashing and return safely in case the load got cancelled.
&gt; 
&gt; Please remove the second sentence - it just states what the code below does.

Ok.

&gt;&gt; Source/WebCore/platform/network/mac/ResourceHandleMac.mm:835
&gt;&gt; +                m_handle-&gt;client()-&gt;didReceiveData(m_handle, static_cast&lt;const char*&gt;([data bytes]), [data length], static_cast&lt;int&gt;([data length]));
&gt; 
&gt; Is the check for m_handle-&gt;client() necessary? Let&apos;s not add it unless it&apos;s necessary, since it would be confusing readers otherwise.
&gt; 
&gt; I&apos;d have used an early return:
&gt; 
&gt;             if (!m_handle)
&gt;                 break;

Removed the check for m_handle-&gt;client() since its not necessary. And added the early return.

Thanks for the review. I&apos;ll commit with the changes you suggested.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>401674</commentid>
    <comment_count>5</comment_count>
    <who name="Pratik Solanki">psolanki</who>
    <bug_when>2011-05-10 17:47:02 -0700</bug_when>
    <thetext>Committed r86200: &lt;http://trac.webkit.org/changeset/86200&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>93038</attachid>
            <date>2011-05-10 16:20:24 -0700</date>
            <delta_ts>2011-05-10 17:31:31 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-60594-20110510162022.patch</filename>
            <type>text/plain</type>
            <size>2405</size>
            <attacher name="Pratik Solanki">psolanki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODYxNjMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAxZWZhNzdlMGFhY2VhZWE2
ZmUzZTg0YjU5YTEyYjI4ZDQ0ZTA2Zjk4Li5kYjkzMjVhMzc5ZGU3YWU0MzE4MmE1ZTg4MWVkMzJi
MmM2MTljMTEwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDUtMTAgIFByYXRp
ayBTb2xhbmtpICA8cHNvbGFua2lAYXBwbGUuY29tPgorCisgICAgICAgIFByb3RlY3Qgc2VsZiBp
biBbV2ViQ29yZVJlc291cmNlSGFuZGxlQXNEZWxlZ2F0ZSBjb25uZWN0aW9uOmRpZFJlY2VpdmVE
YXRhQXJyYXk6XQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NjA1OTQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvbWFjL1Jlc291cmNlSGFuZGxlTWFjLm1tOgorICAgICAgICAo
LVtXZWJDb3JlUmVzb3VyY2VIYW5kbGVBc0RlbGVnYXRlIGNvbm5lY3Rpb246ZGlkUmVjZWl2ZURh
dGFBcnJheTpdKTogVGhlIGRpZFJlY2VpdmVEYXRhKCkKKyAgICAgICAgY2FsbGJhY2sgb24gY2xp
ZW50IGNhbiByZXN1bHQgaW4gdGhlIGxvYWQgYmVpbmcgY2FuY2VsbGVkLiBUaGlzIHJlc3VsdHMg
aW4gdGhlIGRlbGVnYXRlCisgICAgICAgIChzZWxmKSBiZWluZyBmcmVlZC4gIFByb3RlY3Qgc2Vs
ZiBkdXJpbmcgdGhlIGxvb3Agc28gd2UgY2FuIGNoZWNrIGZvciBtX2hhbmRsZSBhbmQgc2FmZWx5
CisgICAgICAgIHJldHVybiB3aXRob3V0IGNyYXNoaW5nLgorCiAyMDExLTA1LTEwICBFcmljIENh
cmxzb24gIDxlcmljLmNhcmxzb25AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERh
cmluIEFkbGVyLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9t
YWMvUmVzb3VyY2VIYW5kbGVNYWMubW0gYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L21hYy9SZXNvdXJjZUhhbmRsZU1hYy5tbQppbmRleCAzY2RkOTM5ZjU1ODc2ZWFlYTI0MmZiMTlh
ZGQ2YTQwZjlmYzhlZGVlLi4zZTk3MjUxZmZiNjJlMGIzMDNjZmEzMDgwOGNjNTg4YTg2MjE5Zjg5
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9SZXNvdXJj
ZUhhbmRsZU1hYy5tbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9S
ZXNvdXJjZUhhbmRsZU1hYy5tbQpAQCAtODI2LDggKzgyNiwxNCBAQCBTdHJpbmcgUmVzb3VyY2VI
YW5kbGU6OnByaXZhdGVCcm93c2luZ1N0b3JhZ2VTZXNzaW9uSWRlbnRpZmllckRlZmF1bHRCYXNl
KCkKICAgICBpZiAobV9oYW5kbGUtPmNsaWVudCgpLT5zdXBwb3J0c0RhdGFBcnJheSgpKQogICAg
ICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhQXJyYXkobV9oYW5kbGUsIHJl
aW50ZXJwcmV0X2Nhc3Q8Q0ZBcnJheVJlZj4oZGF0YUFycmF5KSk7CiAgICAgZWxzZSB7Ci0gICAg
ICAgIGZvciAoTlNEYXRhICpkYXRhIGluIGRhdGFBcnJheSkKLSAgICAgICAgICAgIG1faGFuZGxl
LT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9oYW5kbGUsIHN0YXRpY19jYXN0PGNvbnN0IGNo
YXIqPihbZGF0YSBieXRlc10pLCBbZGF0YSBsZW5ndGhdLCBzdGF0aWNfY2FzdDxpbnQ+KFtkYXRh
IGxlbmd0aF0pKTsKKyAgICAgICAgLy8gVGhlIGNhbGwgdG8gZGlkUmVjZWl2ZURhdGEgYmVsb3cg
Y291bGQgY2FuY2VsIGEgbG9hZCwgd2hpY2ggd291bGQgcmVzdWx0IGluIHRoZSBkZWxlZ2F0ZQor
ICAgICAgICAvLyAoc2VsZikgYmVpbmcgcmVsZWFzZWQuIFJldGFpbiBzZWxmIHNvIHdlIGNhbiBh
dCBsZWFzdCBjaGVjayB0aGUgdmFsdWUgb2YgbV9oYW5kbGUgd2l0aG91dAorICAgICAgICAvLyBj
cmFzaGluZyBhbmQgcmV0dXJuIHNhZmVseSBpbiBjYXNlIHRoZSBsb2FkIGdvdCBjYW5jZWxsZWQu
CisgICAgICAgIFJldGFpblB0cjxXZWJDb3JlUmVzb3VyY2VIYW5kbGVBc0RlbGVnYXRlPiBwcm90
ZWN0RGVsZWdhdGUoc2VsZik7CisgICAgICAgIGZvciAoTlNEYXRhICpkYXRhIGluIGRhdGFBcnJh
eSkgeworICAgICAgICAgICAgaWYgKG1faGFuZGxlICYmIG1faGFuZGxlLT5jbGllbnQoKSkKKyAg
ICAgICAgICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1faGFuZGxl
LCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oW2RhdGEgYnl0ZXNdKSwgW2RhdGEgbGVuZ3RoXSwg
c3RhdGljX2Nhc3Q8aW50PihbZGF0YSBsZW5ndGhdKSk7CisgICAgICAgIH0KICAgICB9CiAgICAg
cmV0dXJuOwogfQo=
</data>
<flag name="review"
          id="86118"
          type_id="1"
          status="+"
          setter="ap"
    />
    <flag name="commit-queue"
          id="86127"
          type_id="3"
          status="-"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>