<?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>234916</bug_id>
          
          <creation_ts>2022-01-06 03:17:14 -0800</creation_ts>
          <short_desc>length argument passed to didReceiveData can never be negative.</short_desc>
          <delta_ts>2022-01-06 05:04:36 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>Other</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>
          
          <blocked>232424</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jean-Yves Avenard [:jya]">jean-yves.avenard</reporter>
          <assigned_to name="Jean-Yves Avenard [:jya]">jean-yves.avenard</assigned_to>
          <cc>ews-watchlist</cc>
    
    <cc>hi</cc>
    
    <cc>joepeck</cc>
    
    <cc>pangle</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>youennf</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1828551</commentid>
    <comment_count>0</comment_count>
    <who name="Jean-Yves Avenard [:jya]">jean-yves.avenard</who>
    <bug_when>2022-01-06 03:17:14 -0800</bug_when>
    <thetext>As seen in bug 232424;

We have code pattern such as:
https://webkit-search.igalia.com/webkit/source/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp#127-136

```
    void didReceiveData(const uint8_t* data, int dataLength) override
    {
        if (!dataLength)
            return;

        if (dataLength == -1)
            dataLength = strlen(reinterpret_cast&lt;const char*&gt;(data));

        m_responseText.append(m_decoder-&gt;decode(data, dataLength));
    }
```

If the dataLength argument passed is negative; then the length will be calculated from running strlen on the uint8_t buffer.

We also have this code pattern in:
- XMLHttpRequest::didReceiveData
and:
- WorkerScriptLoader::didReceiveData

The common code path to end in those routines is from : DocumentThreadableLoader::didReceiveData
https://webkit-search.igalia.com/webkit/source/Source/WebCore/loader/DocumentThreadableLoader.cpp#447-455

The data itself originates from the network process where to carry the size it will use either a size_t (unsigned) or a FragmentedSharedBuffer (also unsigned size() ) so the size_t ends up being cast to an int64_t over IPC and cast again to an int.

If the data is cached; it originates from CachedRawResource::didAddClient
https://webkit-search.igalia.com/webkit/source/Source/WebCore/loader/cache/CachedRawResource.cpp#172-177
            if (m_data) {
                m_data-&gt;forEachSegment([&amp;](auto&amp; segment) {
                    if (hasClient(*client))
                        client-&gt;dataReceived(*this, segment.data(), segment.size());
                });
            }
 
and here segment.size() returns a size_t

if the data is not cached, it comes from:
void SubresourceLoader::didReceiveBuffer or SubresourceLoader::didReceiveData; which in either case will use an unsigned for the dataLength.

For non-webkit 2 code; the curl library always use size_t to pass the data length ; cocoa platform are using NSData which also uses an unsigned int to specify the size.

In some code such as:
bool FrameLoader::willLoadMediaElementURL
we have length set to -1:
https://webkit-search.igalia.com/webkit/source/Source/WebCore/loader/FrameLoader.cpp#1690

however, in this case the const uint8_t* is null and as such the length parameter is not used.


length/dataLength as used with didReceiveData methods can never be negative.

To simplify bug 232424, as mentioned in the review, we should simplify the code separately and remove the test checking that the length == -1.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1828552</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-01-06 03:17:50 -0800</bug_when>
    <thetext>&lt;rdar://problem/87190340&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1828555</commentid>
    <comment_count>2</comment_count>
      <attachid>448485</attachid>
    <who name="Jean-Yves Avenard [:jya]">jean-yves.avenard</who>
    <bug_when>2022-01-06 03:53:14 -0800</bug_when>
    <thetext>Created attachment 448485
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1828568</commentid>
    <comment_count>3</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2022-01-06 05:04:33 -0800</bug_when>
    <thetext>Committed r287681 (245777@main): &lt;https://commits.webkit.org/245777@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 448485.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>448485</attachid>
            <date>2022-01-06 03:53:14 -0800</date>
            <delta_ts>2022-01-06 05:04:35 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-234916-20220106225312.patch</filename>
            <type>text/plain</type>
            <size>2818</size>
            <attacher name="Jean-Yves Avenard [:jya]">jean-yves.avenard</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjg3NjcyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmVmZDZkNDY3NWVlYTcx
ODdlN2YzMzA4YjFkN2JiNzY3OWNlZjZhOS4uOWJhYjUwOTg4NTc0M2ExZDhmNGY1NmRjZGIxM2I5
MzE3ZTEyNzQzMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIxIEBACisyMDIyLTAxLTA2ICBKZWFu
LVl2ZXMgQXZlbmFyZCAgPGp5YUBhcHBsZS5jb20+CisKKyAgICAgICAgbGVuZ3RoIGFyZ3VtZW50
IHBhc3NlZCB0byBkaWRSZWNlaXZlRGF0YSBjYW4gbmV2ZXIgYmUgbmVnYXRpdmUuCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzQ5MTYKKyAgICAgICAg
cmRhcjovL3Byb2JsZW0vODcxOTAzNDAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBTaWduZWQgaW50IGFyZ3VtZW50IHdpbGwgYmUgcmVtb3ZlZCBpbiBi
dWcgMjMyNDI0LgorCisgICAgICAgIE5vIGNoYW5nZSBpbiBvYnNlcnZhYmxlIGJlaGF2aW91ci4g
Q292ZXJlZCBieSBleGlzdGluZyB0ZXN0cy4KKworICAgICAgICAqIGluc3BlY3Rvci9hZ2VudHMv
SW5zcGVjdG9yTmV0d29ya0FnZW50LmNwcDoKKyAgICAgICAgKiB3b3JrZXJzL1dvcmtlclNjcmlw
dExvYWRlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJTY3JpcHRMb2FkZXI6OmRpZFJl
Y2VpdmVEYXRhKToKKyAgICAgICAgKiB4bWwvWE1MSHR0cFJlcXVlc3QuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6WE1MSHR0cFJlcXVlc3Q6OmRpZFJlY2VpdmVEYXRhKToKKwogMjAyMi0wMS0wNSAg
V2Vuc29uIEhzaWVoICA8d2Vuc29uX2hzaWVoQGFwcGxlLmNvbT4KIAogICAgICAgICBNb2RhbCBj
b250YWluZXIgb2JzZXJ2ZXIgc2hvdWxkIGRldGVjdCBhbmQgc3VwcHJlc3MgZWxlbWVudHMgdGhh
dCBwcmV2ZW50IHVzZXIgaW50ZXJhY3Rpb24KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2lu
c3BlY3Rvci9hZ2VudHMvSW5zcGVjdG9yTmV0d29ya0FnZW50LmNwcCBiL1NvdXJjZS9XZWJDb3Jl
L2luc3BlY3Rvci9hZ2VudHMvSW5zcGVjdG9yTmV0d29ya0FnZW50LmNwcAppbmRleCAzY2ViNGI0
N2YxMDY4YTBhZmVhZjAwZjE3OWMyODAwYzQ3NmJkNmIxLi4zYTEzYjg1MmQ4MmQyNWVlNTExYWU5
Mjc3OTkzNmNkZDBmMGYzNTU4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9pbnNwZWN0b3Iv
YWdlbnRzL0luc3BlY3Rvck5ldHdvcmtBZ2VudC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaW5z
cGVjdG9yL2FnZW50cy9JbnNwZWN0b3JOZXR3b3JrQWdlbnQuY3BwCkBAIC0xMjksOSArMTI5LDYg
QEAgcHVibGljOgogICAgICAgICBpZiAoIWRhdGFMZW5ndGgpCiAgICAgICAgICAgICByZXR1cm47
CiAKLSAgICAgICAgaWYgKGRhdGFMZW5ndGggPT0gLTEpCi0gICAgICAgICAgICBkYXRhTGVuZ3Ro
ID0gc3RybGVuKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpKTsKLQogICAgICAg
ICBtX3Jlc3BvbnNlVGV4dC5hcHBlbmQobV9kZWNvZGVyLT5kZWNvZGUoZGF0YSwgZGF0YUxlbmd0
aCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJT
Y3JpcHRMb2FkZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJTY3JpcHRMb2Fk
ZXIuY3BwCmluZGV4IGJmNWE0NGZlMzQ4ZDJmZmNlOTE2ZmIxOTQ5MTVlNjdiZmRhOWFlYzEuLjMy
MzVkY2ViNjFkOWNiODU2MDJhZWJmY2ZjODlmZmQzYTRlNjA5ZTcgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyU2NyaXB0TG9hZGVyLmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS93b3JrZXJzL1dvcmtlclNjcmlwdExvYWRlci5jcHAKQEAgLTIxNSw5ICsyMTUsNiBAQCB2
b2lkIFdvcmtlclNjcmlwdExvYWRlcjo6ZGlkUmVjZWl2ZURhdGEoY29uc3QgdWludDhfdCogZGF0
YSwgaW50IGxlbikKICAgICBpZiAoIWxlbikKICAgICAgICAgcmV0dXJuOwogICAgIAotICAgIGlm
IChsZW4gPT0gLTEpCi0gICAgICAgIGxlbiA9IHN0cmxlbihyZWludGVycHJldF9jYXN0PGNvbnN0
IGNoYXIqPihkYXRhKSk7Ci0KICAgICBtX3NjcmlwdC5hcHBlbmQobV9kZWNvZGVyLT5kZWNvZGUo
ZGF0YSwgbGVuKSk7CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3htbC9YTUxIdHRw
UmVxdWVzdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS94bWwvWE1MSHR0cFJlcXVlc3QuY3BwCmluZGV4
IDliMTEyYjlkYjJjZDg0ZDAzMmY1OWRhZmE4ZThlMzhlMDcwZTUzZjcuLmZmOGRjYTVhMzlhMDE0
NTAwN2M1NDVhZTFjOWY0MWU5ZWE5MGQyZGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3ht
bC9YTUxIdHRwUmVxdWVzdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUveG1sL1hNTEh0dHBSZXF1
ZXN0LmNwcApAQCAtMTA1NSw5ICsxMDU1LDYgQEAgdm9pZCBYTUxIdHRwUmVxdWVzdDo6ZGlkUmVj
ZWl2ZURhdGEoY29uc3QgdWludDhfdCogZGF0YSwgaW50IGxlbikKICAgICBpZiAoIWxlbikKICAg
ICAgICAgcmV0dXJuOwogCi0gICAgaWYgKGxlbiA9PSAtMSkKLSAgICAgICAgbGVuID0gc3RybGVu
KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpKTsKLQogICAgIGlmICh1c2VEZWNv
ZGVyKQogICAgICAgICBtX3Jlc3BvbnNlQnVpbGRlci5hcHBlbmQobV9kZWNvZGVyLT5kZWNvZGUo
ZGF0YSwgbGVuKSk7CiAgICAgZWxzZSB7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>