<?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>165790</bug_id>
          
          <creation_ts>2016-12-12 22:52:13 -0800</creation_ts>
          <short_desc>makeString UChar* adaptor is silly</short_desc>
          <delta_ts>2022-02-28 03:46:39 -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>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>DUPLICATE</resolution>
          <dup_id>190187</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>147142</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="JF Bastien">jfbastien</reporter>
          <assigned_to name="JF Bastien">jfbastien</assigned_to>
          <cc>achristensen</cc>
    
    <cc>andersca</cc>
    
    <cc>ap</cc>
    
    <cc>beidson</cc>
    
    <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>dbates</cc>
    
    <cc>fpizlo</cc>
    
    <cc>jfbastien</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mcatanzaro</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1259344</commentid>
    <comment_count>0</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-12 22:52:13 -0800</bug_when>
    <thetext>This code seems silly:

        unsigned length = 0;
        while (m_characters[length])
            ++length;

        if (length &gt; std::numeric_limits&lt;unsigned&gt;::max())
            CRASH();

I&apos;ll clean it up as a follow-up to #147142. I&apos;d appreciate guidance on what a good upper-bound is. IMO getting to anything &quot;big&quot; without finding a 0 means we&apos;re severely broken already, so crashing is the right action. I&apos;m just not sure:

  1. Has this ever happened? Even ignoring the unsigned comparison to its maximum, we&apos;d need to have 4GiB of continuous non-zero readable data.
  2. What would a better limit be for strings? I&apos;m not a fan of hard-coded values, but there&apos;s got to be a number which ought to be Good Enough for Everyone™.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1259769</commentid>
    <comment_count>1</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-14 09:27:36 -0800</bug_when>
    <thetext>String length overflow checks have indeed been critical for security in the past. We started without having almost any of them in WebKit and added lots of them over the years as we resolved specific security issues, and especially as we started dealing with a mix of 32-bit and 64-bit values.

Some checks that seem obviously impossible to hit actually can be hit quite easily on 64-bit systems with lots of RAM, when code runs that intentionally tries to get the engine to generate a giant string. It’s not immediately obvious from looking at one function what callers might be directly or indirectly controlled by an attacker looking for a vulnerability.

Adding a new lower limit is an interesting project; it’s hard to know what cases might legitimately lead to a long string just from looking at the lowest level. You typically have to look at all the callers to understand what they are doing. Having a lower limit simply changes a &quot;hang&quot; into a &quot;crash&quot;, so the benefit of finding a lower value is a modest one, unless we use the limit is some other way, perhaps throwing a JavaScript exception or something like that.

Typically when we add the overflow checks, most don’t try to implement a global “sensible policy”, but rather catch things that actually reach points we know the implementation can’t handle without overflowing or such. It’s much harder to come up with an arbitrarily “biggest normal value” limit. Not that it can’t be done, but it’s more challenging.

Strings stored in WTF::StringImpl have a maximum length smaller than the maximum 32-bit unsigned integer, depending on how the StringImpl is created. The practical limit is in the neighborhood of 2^31.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1259771</commentid>
    <comment_count>2</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-14 09:29:16 -0800</bug_when>
    <thetext>(In reply to comment #0)
&gt; This code seems silly:
&gt; 
&gt;         unsigned length = 0;
&gt;         while (m_characters[length])
&gt;             ++length;
&gt; 
&gt;         if (length &gt; std::numeric_limits&lt;unsigned&gt;::max())
&gt;             CRASH();

Wait, that’s beyond silly. That’s just dead unreachable code. If the length is greater than the maximum unsigned, then we will have already overflowed before checking it. I’m surprised the compiler doesn’t issue an error or warning.

The length local variable had a 64-bit type then the code would be “merely silly”.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1259773</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-14 09:29:34 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; The length local variable had a 64-bit type then the code would be “merely
&gt; silly”.

If the ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1259774</commentid>
    <comment_count>4</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-14 09:30:22 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (In reply to comment #0)
&gt; &gt; This code seems silly:
&gt; &gt; 
&gt; &gt;         unsigned length = 0;
&gt; &gt;         while (m_characters[length])
&gt; &gt;             ++length;
&gt; &gt; 
&gt; &gt;         if (length &gt; std::numeric_limits&lt;unsigned&gt;::max())
&gt; &gt;             CRASH();
&gt; 
&gt; Wait, that’s beyond silly. That’s just dead unreachable code. If the length
&gt; is greater than the maximum unsigned, then we will have already overflowed
&gt; before checking it. I’m surprised the compiler doesn’t issue an error or
&gt; warning.
&gt; 
&gt; The length local variable had a 64-bit type then the code would be “merely
&gt; silly”.

:-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1259781</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-14 09:39:17 -0800</bug_when>
    <thetext>I suggest we change this to use size_t and otherwise leave it alone, based on the rationale I gave above.

But perhaps there’s something even better we can do.

Seems unimportant to optimize this case; null-character terminated UChar strings are super rare on iOS and macOS, and come up mostly in when dealing with results of functions on Windows, so this isn’t likely to be used in hot code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260177</commentid>
    <comment_count>6</comment_count>
      <attachid>297201</attachid>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-15 10:40:52 -0800</bug_when>
    <thetext>Created attachment 297201
patch

I don&apos;t think size_t is a good idea: on 32-bit platforms we&apos;re back to the same problem.
On 64-bit platforms we&apos;ll just keep counting as we were before: way too much! Better to just call it a day IMO.

If we ever encounter a 1GiB string without a null terminator in it then we&apos;re already having a bad time. WDYT?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260217</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-15 12:45:03 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; on 32-bit platforms we&apos;re back to the same problem

On 32-bit platforms there&apos;s no way to overflow a 32-bit usigned integer walking through a string a byte at a time unless the entire computer has no zero bytes in it. So the code is dead code, and code that does no harm. The whole point of the code, I think, is to prevent us from overflowing 32 bits and passing an inappropriately small value to the create function.

&gt; On 64-bit platforms we&apos;ll just keep counting as we were before: way too
&gt; much! Better to just call it a day IMO.

I don’t know what “better to call it a day” means in practice.

&gt; If we ever encounter a 1GiB string without a null terminator in it then
&gt; we&apos;re already having a bad time. WDYT?

I don’t think we should waste our time choosing an arbitrary limit. I don’t think a 1GiB limit is better than a 4GiB limit.

Maybe you could give a concrete example where you think the smaller limit will make things significantly better?

I think maybe we should could just remove the check entirely, because the symptom of creating a too-small string might be harmless.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260964</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2016-12-17 14:49:50 -0800</bug_when>
    <thetext>One scenario where we&apos;ve seen large blobs of data is dealing with files (especially uploading videos to YouTube). Indeed, it seems unlikely that those will ever be passed through this adapter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261317</commentid>
    <comment_count>9</comment_count>
      <attachid>297504</attachid>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-19 20:41:56 -0800</bug_when>
    <thetext>Created attachment 297504
patch

You&apos;re right, the limit isn&apos;t helpful and deleting the check is better. I bumped the length to a size_t though, so at least it doesn&apos;t wrap around if we do get a huge string (though as was pointed out the subsequent string may have its own arbitrary limit).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261680</commentid>
    <comment_count>10</comment_count>
      <attachid>297504</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-20 12:45:42 -0800</bug_when>
    <thetext>Comment on attachment 297504
patch

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

&gt; Source/WTF/wtf/text/StringConcatenate.h:147
&gt; +    size_t length() const { return m_length; }

Where are the callers to this length function? Did we audit them to make sure they correctly handle size_t rather than unsigned?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1262117</commentid>
    <comment_count>11</comment_count>
      <attachid>297504</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-12-21 13:24:22 -0800</bug_when>
    <thetext>Comment on attachment 297504
patch

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

&gt;&gt; Source/WTF/wtf/text/StringConcatenate.h:147
&gt;&gt; +    size_t length() const { return m_length; }
&gt; 
&gt; Where are the callers to this length function? Did we audit them to make sure they correctly handle size_t rather than unsigned?

I will likely immediately r+ this patch once I get the answer to this, either by researching it myself, or by you answering here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1262133</commentid>
    <comment_count>12</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-21 13:33:52 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; Comment on attachment 297504 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=297504&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WTF/wtf/text/StringConcatenate.h:147
&gt; &gt;&gt; +    size_t length() const { return m_length; }
&gt; &gt; 
&gt; &gt; Where are the callers to this length function? Did we audit them to make sure they correctly handle size_t rather than unsigned?
&gt; 
&gt; I will likely immediately r+ this patch once I get the answer to this,
&gt; either by researching it myself, or by you answering here.

Sorry for the slow response rater on this. It&apos;s a great question and I want to go through the code properly before getting back to you. I&apos;ll do this soon, but have a few other things I want to get to first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1392608</commentid>
    <comment_count>13</comment_count>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2018-01-24 09:55:41 -0800</bug_when>
    <thetext>Apparently this will be flagged as a tautological compare by upcoming clang:
    length &gt; std::numeric_limits&lt;unsigned&gt;::max()

Should we just remove it for now (since it is tautological) or use size_t as I suggest? I don&apos;t have time to audit code as I said I would (then forgot...).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1399143</commentid>
    <comment_count>14</comment_count>
      <attachid>297504</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2018-02-14 10:36:37 -0800</bug_when>
    <thetext>Comment on attachment 297504
patch

Patches that have been up for review since 2016 are almost certainly too stale to be relevant to trunk in their current form.

If this patch is still important please rebase it and post it for review again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1402274</commentid>
    <comment_count>15</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2018-02-26 21:23:24 -0800</bug_when>
    <thetext>(In reply to JF Bastien from comment #13)
&gt; Apparently this will be flagged as a tautological compare by upcoming clang:
&gt;     length &gt; std::numeric_limits&lt;unsigned&gt;::max()
&gt; 
&gt; Should we just remove it for now (since it is tautological) or use size_t as
&gt; I suggest? I don&apos;t have time to audit code as I said I would (then
&gt; forgot...).

I think that you should remove the comparison first and then do the size_t thing and audit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1465733</commentid>
    <comment_count>16</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2018-10-02 13:06:42 -0700</bug_when>
    <thetext>This issue will be handled when we fix https://bugs.webkit.org/show_bug.cgi?id=190187.

*** This bug has been marked as a duplicate of bug 190187 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297201</attachid>
            <date>2016-12-15 10:40:52 -0800</date>
            <delta_ts>2016-12-19 20:41:56 -0800</delta_ts>
            <desc>patch</desc>
            <filename>0001-makeString-UChar.patch</filename>
            <type>text/plain</type>
            <size>1952</size>
            <attacher name="JF Bastien">jfbastien</attacher>
            
              <data encoding="base64">RnJvbSA1NTdmMmY3YThkODNkODkyYTg4MWFmYTFkMTBhZDUyMmJmNDdhOGUzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKRiBCYXN0aWVuIDxqZmJhc3RpZW5AYXBwbGUuY29tPgpEYXRl
OiBUaHUsIDE1IERlYyAyMDE2IDEwOjM1OjQ1IC0wODAwClN1YmplY3Q6IFtQQVRDSF0gbWFrZVN0
cmluZyBVQ2hhcgoKLS0tCiBTb3VyY2UvV1RGL0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAg
fCAxNiArKysrKysrKysrKysrKysrCiBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0NvbmNhdGVu
YXRlLmggfCAgNSArKystLQogMiBmaWxlcyBjaGFuZ2VkLCAxOSBpbnNlcnRpb25zKCspLCAyIGRl
bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL1NvdXJjZS9XVEYvQ2hhbmdlTG9nIGIvU291cmNlL1dU
Ri9DaGFuZ2VMb2cKaW5kZXggYzNmMjdkYS4uNDU2ZWVkOSAxMDA2NDQKLS0tIGEvU291cmNlL1dU
Ri9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dURi9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxNi0xMi0xNSAgSkYgQmFzdGllbiAgPGpmYmFzdGllbkBhcHBsZS5jb20+CisKKyAgICAgICAg
bWFrZVN0cmluZyBVQ2hhciogYWRhcHRvciBwZXJmb3JtcyB1c2VsZXNzIHJhbmdlcyBjaGVjawor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NzkwCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhlIG9sZCBj
aGVjayBjb3VsZCBuZXZlciBmaXJlLCBpdCBub3cgZW5mb3JjZXMgYW4gYXJiaXRyYXJ5IGJ1dAor
ICAgICAgICBsYXJnZSBsaW1pdC4gV2VyZSB3ZSBldmVyIHRvIGhpdCBhIGxhcmdlIGxpbWl0IChh
bnkgbGltaXQpIGl0CisgICAgICAgIHdvdWxkIG1lYW4gdGhhdCB3ZSd2ZSByZWNlaXZlZCBhIGh1
Z2Ugc3RyaW5nLCBhbmQgd2UndmUgdHJhdmVyc2VkCisgICAgICAgIGFsbCBvZiBpdHMgbWVtb3J5
LCBhbmQgaGF2ZW4ndCBmb3VuZCBhIHNpbmdsZSB6ZXJvLiBUaGF0J3MgaGlnaGx5CisgICAgICAg
IHVubGlrZWx5LCBhbmQgaWYgZXZlciBpdCBoYXBwZW5zIHRoZW4gc29tZXRoaW5nIHJlYWxseSBi
YWQgaXMKKyAgICAgICAgZ29pbmcgb24uCisKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJpbmdDb25j
YXRlbmF0ZS5oOgorCiAyMDE2LTEyLTE1ICBZdXN1a2UgU3V6dWtpICA8dXRhdGFuZS50ZWFAZ21h
aWwuY29tPgogCiAgICAgICAgIFtKU0NdIE9wdGltaXplIEtyYWtlbiBzdHJpbmdpZnkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nQ29uY2F0ZW5hdGUuaCBiL1NvdXJjZS9X
VEYvd3RmL3RleHQvU3RyaW5nQ29uY2F0ZW5hdGUuaAppbmRleCBhZmZiN2UxLi4yYzMzMTYxIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0NvbmNhdGVuYXRlLmgKKysrIGIv
U291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdDb25jYXRlbmF0ZS5oCkBAIC0xMzgsMTAgKzEzOCwx
MSBAQCBwdWJsaWM6CiAgICAgICAgIDogbV9jaGFyYWN0ZXJzKGNoYXJhY3RlcnMpCiAgICAgewog
ICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSAwOwotICAgICAgICB3aGlsZSAobV9jaGFyYWN0ZXJz
W2xlbmd0aF0pCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxpbWl0ID0gMSA8PCAzMDsKKyAgICAg
ICAgd2hpbGUgKG1fY2hhcmFjdGVyc1tsZW5ndGhdICYmIGxlbmd0aCA8IGxpbWl0KQogICAgICAg
ICAgICAgKytsZW5ndGg7CiAKLSAgICAgICAgaWYgKGxlbmd0aCA+IHN0ZDo6bnVtZXJpY19saW1p
dHM8dW5zaWduZWQ+OjptYXgoKSkgLy8gRklYTUUgdGhpcyBpcyBzaWxseSBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1NzkwCisgICAgICAgIGlmIChsZW5ndGggPj0g
bGltaXQpCiAgICAgICAgICAgICBDUkFTSCgpOwogCiAgICAgICAgIG1fbGVuZ3RoID0gbGVuZ3Ro
OwotLSAKMi4xMC4xCgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297504</attachid>
            <date>2016-12-19 20:41:56 -0800</date>
            <delta_ts>2022-02-28 03:46:39 -0800</delta_ts>
            <desc>patch</desc>
            <filename>0001-makeString-max.patch</filename>
            <type>text/plain</type>
            <size>2377</size>
            <attacher name="JF Bastien">jfbastien</attacher>
            
              <data encoding="base64">RnJvbSA4MTg1ODgyNjBmNmZkNzcxYjI3MGIwZmRmODZjOTY2ODA1YWZiZjAwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKRiBCYXN0aWVuIDxqZmJhc3RpZW5AYXBwbGUuY29tPgpEYXRl
OiBNb24sIDE5IERlYyAyMDE2IDIwOjM4OjIzIC0wODAwClN1YmplY3Q6IFtQQVRDSF0gbWFrZVN0
cmluZy1tYXgKCi0tLQogU291cmNlL1dURi9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgIHwg
MTUgKysrKysrKysrKysrKysrCiBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0NvbmNhdGVuYXRl
LmggfCAgOSArKystLS0tLS0KIDIgZmlsZXMgY2hhbmdlZCwgMTggaW5zZXJ0aW9ucygrKSwgNiBk
ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9Tb3VyY2UvV1RGL0NoYW5nZUxvZyBiL1NvdXJjZS9X
VEYvQ2hhbmdlTG9nCmluZGV4IDZlYmRhM2MuLmI0ZjBhNjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
VEYvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XVEYvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTggQEAK
KzIwMTYtMTItMTkgIEpGIEJhc3RpZW4gIDxqZmJhc3RpZW5AYXBwbGUuY29tPgorCisgICAgICAg
IG1ha2VTdHJpbmcgVUNoYXIqIGFkYXB0b3IgaGFzIHVzZWxlc3MgY2hlY2sKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE2NTc5MAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogd3RmL3RleHQvU3RyaW5nQ29u
Y2F0ZW5hdGUuaDogVGhlIGNoZWNrIGNvdWxkIG5ldmVyIGZpcmUgYmVjYXVzZQorICAgICAgICBh
biBpbnRlZ2VyIGNhbiBuZXZlciBiZSBncmVhdGVyIHRoYW4gaXRzIHR5cGUncyBtYXhpbXVtLiBJ
bnN0ZWFkCisgICAgICAgIG9mIGVuZm9yY2luZyBhbiBhcmJpdHJhcnkgbGltaXQsIGp1c3QgcmVt
b3ZlIHRoZSBjaGVjaywgYnV0IGNvdWxkCisgICAgICAgIHVzaW5nIHNpemVfdCB0byBtYWtlIHN1
cmUgYW55IHJpZGljdWxvdXMgc3RyaW5nIGtlZXBzIHdvcmtpbmcuIFRvCisgICAgICAgIGhpdCBz
dWNoIGEgc3RyaW5nIG9uZSB3b3VsZCBuZWVkIGEgNjQtYml0IGFyY2hpdGVjdHVyZSB3aXRoIG92
ZXIKKyAgICAgICAgNEdpQiBvZiBub24temVybyBkYXRhLiBJbiBzdWNoIGEgY2FzZSwgd2UnbGwg
YmUgY29ycmVjdCwgYnV0IHRoZQorICAgICAgICBzdHJpbmcgd2UncmUgdHJ5aW5nIHRvIGNvbmNh
dGVuYXRlIGludG8gbWF5IGdldCBzYWQuCisKIDIwMTYtMTItMTkgIE1hcmsgTGFtICA8bWFyay5s
YW1AYXBwbGUuY29tPgogCiAgICAgICAgIFJvbGxpbmcgb3V0IHIyMDk5NzQgYW5kIHIyMDk5NTIu
IFRoZXkgYnJlYWsgc29tZSB3ZWJzaXRlcyBpbiBteXN0ZXJpb3VzIHdheXMuIFN0ZXAgMjogUm9s
bG91dCByMjA5OTUyLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdDb25j
YXRlbmF0ZS5oIGIvU291cmNlL1dURi93dGYvdGV4dC9TdHJpbmdDb25jYXRlbmF0ZS5oCmluZGV4
IGFmZmI3ZTEuLjUzZTA0NDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5n
Q29uY2F0ZW5hdGUuaAorKysgYi9Tb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0NvbmNhdGVuYXRl
LmgKQEAgLTEzNywxNyArMTM3LDE0IEBAIHB1YmxpYzoKICAgICBTdHJpbmdUeXBlQWRhcHRlcihj
b25zdCBVQ2hhciogY2hhcmFjdGVycykKICAgICAgICAgOiBtX2NoYXJhY3RlcnMoY2hhcmFjdGVy
cykKICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IDA7CisgICAgICAgIHNpemVfdCBs
ZW5ndGggPSAwOwogICAgICAgICB3aGlsZSAobV9jaGFyYWN0ZXJzW2xlbmd0aF0pCiAgICAgICAg
ICAgICArK2xlbmd0aDsKIAotICAgICAgICBpZiAobGVuZ3RoID4gc3RkOjpudW1lcmljX2xpbWl0
czx1bnNpZ25lZD46Om1heCgpKSAvLyBGSVhNRSB0aGlzIGlzIHNpbGx5IGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjU3OTAKLSAgICAgICAgICAgIENSQVNIKCk7Ci0K
ICAgICAgICAgbV9sZW5ndGggPSBsZW5ndGg7CiAgICAgfQogCi0gICAgdW5zaWduZWQgbGVuZ3Ro
KCkgY29uc3QgeyByZXR1cm4gbV9sZW5ndGg7IH0KKyAgICBzaXplX3QgbGVuZ3RoKCkgY29uc3Qg
eyByZXR1cm4gbV9sZW5ndGg7IH0KICAgICBib29sIGlzOEJpdCgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9CiAKICAgICBOT19SRVRVUk5fRFVFX1RPX0NSQVNIIHZvaWQgd3JpdGVUbyhMQ2hhciop
IGNvbnN0CkBAIC0xNjQsNyArMTYxLDcgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIGNvbnN0
IFVDaGFyKiBtX2NoYXJhY3RlcnM7Ci0gICAgdW5zaWduZWQgbV9sZW5ndGg7CisgICAgc2l6ZV90
IG1fbGVuZ3RoOwogfTsKIAogdGVtcGxhdGU8PgotLSAKMi45LjMKCg==
</data>
<flag name="review"
          id="319812"
          type_id="1"
          status="-"
          setter="beidson"
    />
          </attachment>
      

    </bug>

</bugzilla>