<?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>181620</bug_id>
          
          <creation_ts>2018-01-12 16:08:55 -0800</creation_ts>
          <short_desc>Use a helper function for checked arithmetic in WebGL validation</short_desc>
          <delta_ts>2018-01-15 14:37:19 -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>New Bugs</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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>181621</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dean Jackson">dino</reporter>
          <assigned_to name="Dean Jackson">dino</assigned_to>
          <cc>cdumez</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>graouts</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1388998</commentid>
    <comment_count>0</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2018-01-12 16:08:55 -0800</bug_when>
    <thetext>Use a helper function for checked arithmetic in WebGL validation</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1389000</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2018-01-12 16:10:13 -0800</bug_when>
    <thetext>&lt;rdar://problem/36485879&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1389003</commentid>
    <comment_count>2</comment_count>
      <attachid>331250</attachid>
    <who name="Dean Jackson">dino</who>
    <bug_when>2018-01-12 16:11:50 -0800</bug_when>
    <thetext>Created attachment 331250
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1389008</commentid>
    <comment_count>3</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2018-01-12 16:31:22 -0800</bug_when>
    <thetext>Committed r226927: &lt;https://trac.webkit.org/changeset/226927&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1389016</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2018-01-12 16:44:03 -0800</bug_when>
    <thetext>Re-opened since this is blocked by bug 181621</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1389354</commentid>
    <comment_count>5</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2018-01-15 12:44:14 -0800</bug_when>
    <thetext>Committed r226953: &lt;https://trac.webkit.org/changeset/226953&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1389383</commentid>
    <comment_count>6</comment_count>
      <attachid>331250</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-01-15 14:37:19 -0800</bug_when>
    <thetext>Comment on attachment 331250
Patch

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

&gt; Source/WebCore/html/canvas/WebGL2RenderingContext.cpp:1830
&gt; -    Checked&lt;unsigned, RecordOverflow&gt; checkedNumElementsRequired = Checked&lt;unsigned&gt;(maxIndex.value());
&gt; -    checkedNumElementsRequired += 1;
&gt; -    if (checkedNumElementsRequired.hasOverflowed())
&gt; +    auto checkedNumElementsRequired = checkedAddAndMultiply&lt;unsigned&gt;(maxIndex.value(), 1, 1);
&gt; +    if (!checkedNumElementsRequired)
&gt;          return false;
&gt; -    numElementsRequired = checkedNumElementsRequired.unsafeGet();
&gt; +    numElementsRequired = checkedNumElementsRequired.value();
&gt; +
&gt;      return true;

I am not sure the new helper function is so great here since we don’t have any multiplying to do. Idiomatic use of Checked would be simple. Like this:

    auto checkedNumElementsRequired = Checked&lt;unsigned, RecordOverflow&gt;(maxIndex.value()) + 1;
    if (checkedNumElementsRequired.hasOverflowed())
        return false;
    numElementsRequired = checkedNumElementsRequired.unsafeGet();
    return true;

I don’t think the checkedAddAndMultiply version is better.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:727
&gt; -    // The number of required elements is one more than the maximum
&gt; -    // index that will be accessed.
&gt; -    Checked&lt;unsigned, RecordOverflow&gt; checkedNumElementsRequired = Checked&lt;unsigned&gt;(maxIndex.value());
&gt; -    checkedNumElementsRequired += 1;
&gt; -    if (checkedNumElementsRequired.hasOverflowed())
&gt; +    // The number of required elements is one more than the maximum index that will be accessed.
&gt; +    auto checkedNumElementsRequired = checkedAddAndMultiply&lt;unsigned&gt;(maxIndex.value(), 1, 1);
&gt; +    if (!checkedNumElementsRequired)
&gt;          return false;
&gt; -    numElementsRequired = checkedNumElementsRequired.unsafeGet();
&gt; +    numElementsRequired = checkedNumElementsRequired.value();
&gt; +
&gt;      return true;

Ditto.

&gt; Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp:1851
&gt; +    Checked&lt;T, RecordOverflow&gt; checkedResult = Checked&lt;T&gt;(value);
&gt; +    checkedResult += Checked&lt;T&gt;(add);
&gt; +    checkedResult *= Checked&lt;T&gt;(multiply);

If we decide to keep this:

We don’t need so many typecasts here. Once something is Checked we can do arithmetic and everything stays checked. Also Checked&lt;T&gt; is not a good type to mix with Checked&lt;T, RecordOverflow&gt;. Here’s how I would write this:

    auto checkedResult = (Checked&lt;GC3Dint, RecordOverflow&gt;(value) + add) * multiply;

The typecasts are not needed. When a value is Checked&lt;&gt;, you don’t need to convert the other values to Checked&lt;&gt; before doing math with them. Everything stays checked as long as one of the two arguments to each operator is checked and the right type.

&gt; Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp:1911
&gt; -    Checked&lt;unsigned, RecordOverflow&gt; checkedNumElementsRequired = Checked&lt;unsigned&gt;(lastIndex);
&gt; -    checkedNumElementsRequired += 1;
&gt; -    if (checkedNumElementsRequired.hasOverflowed())
&gt; +    auto checkedNumElementsRequired = checkedAddAndMultiply&lt;unsigned&gt;(lastIndex, 1, 1);
&gt; +    if (!checkedNumElementsRequired)
&gt;          return false;
&gt; -    numElementsRequired = checkedNumElementsRequired.unsafeGet();
&gt; +    numElementsRequired = checkedNumElementsRequired.value();
&gt;      return true;

Another case where the multiplying doesn’t really come in handy. So same comment as the first two call sites.

&gt; Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp:2024
&gt; -    Checked&lt;GC3Dint, RecordOverflow&gt; checkedFirst(first);
&gt; -    Checked&lt;GC3Dint, RecordOverflow&gt; checkedCount(count);
&gt; -    Checked&lt;GC3Dint, RecordOverflow&gt; checkedSum = checkedFirst + checkedCount;
&gt; +    Checked&lt;GC3Dint, RecordOverflow&gt; checkedSum = Checked&lt;GC3Dint, RecordOverflow&gt;(first) + Checked&lt;GC3Dint, RecordOverflow&gt;(count);

Don’t need so many typecasts here. This is a good way to write it:

    auto checkedSum = Checked&lt;GC3Dint, RecordOverflow&gt;(first) + count;

&gt; Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp:5732
&gt; -    Checked&lt;GC3Duint, RecordOverflow&gt; bufferSize(numVertex);
&gt; -    bufferSize += 1;
&gt; -    bufferSize *= Checked&lt;GC3Duint&gt;(4);
&gt; -    if (bufferSize.hasOverflowed())
&gt; +    auto bufferSize = checkedAddAndMultiply&lt;GC3Duint&gt;(numVertex, 1, 4);
&gt; +    if (!bufferSize)
&gt;          return false;
&gt; -    Checked&lt;GC3Dsizeiptr, RecordOverflow&gt; bufferDataSize(bufferSize);
&gt; +
&gt; +    Checked&lt;GC3Dsizeiptr, RecordOverflow&gt; bufferDataSize(bufferSize.value());
&gt;      bufferDataSize *= Checked&lt;GC3Dsizeiptr&gt;(sizeof(GC3Dfloat));
&gt;      return !bufferDataSize.hasOverflowed() &amp;&amp; bufferDataSize.unsafeGet() &gt; 0;

I think this can be written more simply without the helper function:

    auto bufferSize = (Checked&lt;GC3Duint, RecordOverflow&gt;(numVertex) + 1) * 4;
    auto bufferDataSize = Checked&lt;GC3Dsizeiptr, RecordOverflow&gt;(bufferSize) * sizeof(GC3Dfloat);
    return !bufferDataSize.hasOverflowed() &amp;&amp; bufferDataSize.unsafeGet() &gt; 0;

If bufferSize overflowed, then bufferDataSize will be set to overflowed also, so no extra code is needed to explicitly check that.

&gt; Source/WebCore/html/canvas/WebGLRenderingContextBase.h:832
&gt; +    template &lt;typename T&gt; static std::optional&lt;T&gt; checkedAddAndMultiply(T value, T add, T multiply);

Not sure that std::optional&lt;T&gt; is a better return type than Checked&lt;T, RecordOverflow&gt;. The only difference for callers is that we need to check overflowed() instead of checking has_value() and use unsafeGet() instead of value(). Doesn’t seem much different.

I don’t think this function made things better in any of the four places we used it. I think the real problem is that we are writing Checked&lt;&gt; code in an excessively complex way. All we need to do is cast one value to the appropriate Checked&lt;&gt; type and not specify explicit types for things after that, and the code ends up being pretty readable.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>331250</attachid>
            <date>2018-01-12 16:11:50 -0800</date>
            <delta_ts>2018-01-12 16:22:34 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-181620-20180113111147.patch</filename>
            <type>text/plain</type>
            <size>10494</size>
            <attacher name="Dean Jackson">dino</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjI2NTIxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmVhMDJhNGIwZjA4NDAz
MmMwNzEwNGI5YmRjMTMyNjdlNGM1NDdkNS4uNzA0MzNlNGJlODA4YWI5YmQ0ZmQ5MThlNTc3MDhk
NWVhMjkzNGUxMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI2IEBACisyMDE4LTAxLTEyICBEZWFu
IEphY2tzb24gIDxkaW5vQGFwcGxlLmNvbT4KKworICAgICAgICBVc2UgYSBoZWxwZXIgZnVuY3Rp
b24gZm9yIGNoZWNrZWQgYXJpdGhtZXRpYyBpbiBXZWJHTCB2YWxpZGF0aW9uCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODE2MjAKKyAgICAgICAgPHJk
YXI6Ly9wcm9ibGVtLzM2NDg1ODc5PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEVyaWMgcmVjb21tZW5kZWQgdXNpbmcgYSB0ZW1wbGF0ZWQgaGVscGVy
IGZ1bmN0aW9uIHRvIGRvCisgICAgICAgIGEgY29tbW9uIGFyaXRobWV0aWMgY2hlY2sgaW4gV2Vi
R0wgdmFsaWRhdGlvbi4KKworICAgICAgICAqIGh0bWwvY2FudmFzL1dlYkdMMlJlbmRlcmluZ0Nv
bnRleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0wyUmVuZGVyaW5nQ29udGV4dDo6dmFs
aWRhdGVJbmRleEFycmF5Q29uc2VydmF0aXZlKToKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJH
TFJlbmRlcmluZ0NvbnRleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdD
b250ZXh0Ojp2YWxpZGF0ZUluZGV4QXJyYXlDb25zZXJ2YXRpdmUpOgorICAgICAgICAqIGh0bWwv
Y2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
V2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZTo6Y2hlY2tlZEFkZEFuZE11bHRpcGx5KTogTmV3IGhl
bHBlci4KKyAgICAgICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2U6OnZhbGlk
YXRlSW5kZXhBcnJheVByZWNpc2UpOgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdD
b250ZXh0QmFzZTo6dmFsaWRhdGVEcmF3QXJyYXlzKToKKyAgICAgICAgKFdlYkNvcmU6OldlYkdM
UmVuZGVyaW5nQ29udGV4dEJhc2U6OnZhbGlkYXRlU2ltdWxhdGVkVmVydGV4QXR0cmliMCk6Cisg
ICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlOjpzaW11bGF0ZVZlcnRl
eEF0dHJpYjApOgorICAgICAgICAqIGh0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dEJh
c2UuaDoKKwogMjAxOC0wMS0xMSAgRGVhbiBKYWNrc29uICA8ZGlub0BhcHBsZS5jb20+CiAKICAg
ICAgICAgW1dlYkdMXSBTaW11bGF0ZWQgdmVydGV4QXR0cmliMCBjYW4gc29tZXRpbWVzIGNhdXNl
IE9VVF9PRl9NRU1PUlkgZXJyb3JzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL2Nh
bnZhcy9XZWJHTDJSZW5kZXJpbmdDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMMlJlbmRlcmluZ0NvbnRleHQuY3BwCmluZGV4IDFlZTI2ODc0OTYxMmZlMDUyMjFh
MTQ1Y2NiYjhhMDA0NWVkYWE3YWQuLmRkZDA5NDcyMmIyNTAwNTRhZmRhMGM2OGEyOGQ0ODExMTg0
YTQ2NTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMMlJlbmRl
cmluZ0NvbnRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMMlJl
bmRlcmluZ0NvbnRleHQuY3BwCkBAIC0xODIyLDExICsxODIyLDExIEBAIGJvb2wgV2ViR0wyUmVu
ZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVJbmRleEFycmF5Q29uc2VydmF0aXZlKEdDM0RlbnVtIHR5
cGUsIHVuc2lnCiAKICAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcXVpcmVkIGVsZW1lbnRzIGlzIG9u
ZSBtb3JlIHRoYW4gdGhlIG1heGltdW0KICAgICAvLyBpbmRleCB0aGF0IHdpbGwgYmUgYWNjZXNz
ZWQuCi0gICAgQ2hlY2tlZDx1bnNpZ25lZCwgUmVjb3JkT3ZlcmZsb3c+IGNoZWNrZWROdW1FbGVt
ZW50c1JlcXVpcmVkID0gQ2hlY2tlZDx1bnNpZ25lZD4obWF4SW5kZXgudmFsdWUoKSk7Ci0gICAg
Y2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQgKz0gMTsKLSAgICBpZiAoY2hlY2tlZE51bUVsZW1l
bnRzUmVxdWlyZWQuaGFzT3ZlcmZsb3dlZCgpKQorICAgIGF1dG8gY2hlY2tlZE51bUVsZW1lbnRz
UmVxdWlyZWQgPSBjaGVja2VkQWRkQW5kTXVsdGlwbHk8dW5zaWduZWQ+KG1heEluZGV4LnZhbHVl
KCksIDEsIDEpOworICAgIGlmICghY2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQpCiAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICBudW1FbGVtZW50c1JlcXVpcmVkID0gY2hlY2tlZE51bUVsZW1l
bnRzUmVxdWlyZWQudW5zYWZlR2V0KCk7CisgICAgbnVtRWxlbWVudHNSZXF1aXJlZCA9IGNoZWNr
ZWROdW1FbGVtZW50c1JlcXVpcmVkLnZhbHVlKCk7CisKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250
ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4
dC5jcHAKaW5kZXggZDY5M2EyNmJmOGNlOTg5ZThkY2E0ZTQ2NTYyMzJkYjE1Y2UwOGIzOC4uYjEw
MWIxNjFmYzU2NjNkNDA1NjlkOTZjMGRmZTI2YWI1NGNlYTM5MCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCkBAIC03MTgs
MTMgKzcxOCwxMiBAQCBib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVJbmRleEFy
cmF5Q29uc2VydmF0aXZlKEdDM0RlbnVtIHR5cGUsIHVuc2lnbgogICAgIGlmICghbWF4SW5kZXgp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIC8vIFRoZSBudW1iZXIgb2YgcmVxdWlyZWQg
ZWxlbWVudHMgaXMgb25lIG1vcmUgdGhhbiB0aGUgbWF4aW11bQotICAgIC8vIGluZGV4IHRoYXQg
d2lsbCBiZSBhY2Nlc3NlZC4KLSAgICBDaGVja2VkPHVuc2lnbmVkLCBSZWNvcmRPdmVyZmxvdz4g
Y2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQgPSBDaGVja2VkPHVuc2lnbmVkPihtYXhJbmRleC52
YWx1ZSgpKTsKLSAgICBjaGVja2VkTnVtRWxlbWVudHNSZXF1aXJlZCArPSAxOwotICAgIGlmIChj
aGVja2VkTnVtRWxlbWVudHNSZXF1aXJlZC5oYXNPdmVyZmxvd2VkKCkpCisgICAgLy8gVGhlIG51
bWJlciBvZiByZXF1aXJlZCBlbGVtZW50cyBpcyBvbmUgbW9yZSB0aGFuIHRoZSBtYXhpbXVtIGlu
ZGV4IHRoYXQgd2lsbCBiZSBhY2Nlc3NlZC4KKyAgICBhdXRvIGNoZWNrZWROdW1FbGVtZW50c1Jl
cXVpcmVkID0gY2hlY2tlZEFkZEFuZE11bHRpcGx5PHVuc2lnbmVkPihtYXhJbmRleC52YWx1ZSgp
LCAxLCAxKTsKKyAgICBpZiAoIWNoZWNrZWROdW1FbGVtZW50c1JlcXVpcmVkKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgbnVtRWxlbWVudHNSZXF1aXJlZCA9IGNoZWNrZWROdW1FbGVtZW50
c1JlcXVpcmVkLnVuc2FmZUdldCgpOworICAgIG51bUVsZW1lbnRzUmVxdWlyZWQgPSBjaGVja2Vk
TnVtRWxlbWVudHNSZXF1aXJlZC52YWx1ZSgpOworCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4
dEJhc2UuY3BwIGIvU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250
ZXh0QmFzZS5jcHAKaW5kZXggNmQ3ZjgyOTA2YjU3MjUzZjRkOGNmZjJlN2QwZGIwZTdmZDg5ZTkz
MS4uYzMxZGQ5MzY2MjllOWU2MDlkYmM2YzE4MTdjYzE3OGJmYTRlZTZjYSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFz
ZS5jcHAKQEAgLTE4NDMsNiArMTg0MywxOCBAQCBib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dEJh
c2U6OnZhbGlkYXRlRWxlbWVudEFycmF5U2l6ZShHQzNEc2l6ZWkgY291bnQsIEdDM0RlbgogICAg
IHJldHVybiB0cnVlOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6b3B0aW9uYWw8
VD4gV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZTo6Y2hlY2tlZEFkZEFuZE11bHRpcGx5KFQgdmFs
dWUsIFQgYWRkLCBUIG11bHRpcGx5KQoreworICAgIENoZWNrZWQ8VCwgUmVjb3JkT3ZlcmZsb3c+
IGNoZWNrZWRSZXN1bHQgPSBDaGVja2VkPFQ+KHZhbHVlKTsKKyAgICBjaGVja2VkUmVzdWx0ICs9
IENoZWNrZWQ8VD4oYWRkKTsKKyAgICBjaGVja2VkUmVzdWx0ICo9IENoZWNrZWQ8VD4obXVsdGlw
bHkpOworICAgIGlmIChjaGVja2VkUmVzdWx0Lmhhc092ZXJmbG93ZWQoKSkKKyAgICAgICAgcmV0
dXJuIHN0ZDo6bnVsbG9wdDsKKworICAgIHJldHVybiBjaGVja2VkUmVzdWx0LnVuc2FmZUdldCgp
OworfQorCiBib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dEJhc2U6OnZhbGlkYXRlSW5kZXhBcnJh
eVByZWNpc2UoR0MzRHNpemVpIGNvdW50LCBHQzNEZW51bSB0eXBlLCBHQzNEaW50cHRyIG9mZnNl
dCwgdW5zaWduZWQmIG51bUVsZW1lbnRzUmVxdWlyZWQpCiB7CiAgICAgQVNTRVJUKGNvdW50ID49
IDAgJiYgb2Zmc2V0ID49IDApOwpAQCAtMTg5MiwxMSArMTkwNCwxMCBAQCBib29sIFdlYkdMUmVu
ZGVyaW5nQ29udGV4dEJhc2U6OnZhbGlkYXRlSW5kZXhBcnJheVByZWNpc2UoR0MzRHNpemVpIGNv
dW50LCBHQzNEZQogICAgIH0KIAogICAgIC8vIFRoZW4gc2V0IHRoZSBsYXN0IGluZGV4IGluIHRo
ZSBpbmRleCBhcnJheSBhbmQgbWFrZSBzdXJlIGl0IGlzIHZhbGlkLgotICAgIENoZWNrZWQ8dW5z
aWduZWQsIFJlY29yZE92ZXJmbG93PiBjaGVja2VkTnVtRWxlbWVudHNSZXF1aXJlZCA9IENoZWNr
ZWQ8dW5zaWduZWQ+KGxhc3RJbmRleCk7Ci0gICAgY2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQg
Kz0gMTsKLSAgICBpZiAoY2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQuaGFzT3ZlcmZsb3dlZCgp
KQorICAgIGF1dG8gY2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQgPSBjaGVja2VkQWRkQW5kTXVs
dGlwbHk8dW5zaWduZWQ+KGxhc3RJbmRleCwgMSwgMSk7CisgICAgaWYgKCFjaGVja2VkTnVtRWxl
bWVudHNSZXF1aXJlZCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG51bUVsZW1lbnRzUmVx
dWlyZWQgPSBjaGVja2VkTnVtRWxlbWVudHNSZXF1aXJlZC51bnNhZmVHZXQoKTsKKyAgICBudW1F
bGVtZW50c1JlcXVpcmVkID0gY2hlY2tlZE51bUVsZW1lbnRzUmVxdWlyZWQudmFsdWUoKTsKICAg
ICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjAxMCw5ICsyMDIxLDcgQEAgYm9vbCBXZWJHTFJlbmRl
cmluZ0NvbnRleHRCYXNlOjp2YWxpZGF0ZURyYXdBcnJheXMoY29uc3QgY2hhciogZnVuY3Rpb25O
YW1lLCBHQzMKICAgICB9CiAKICAgICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIHJlbmRlcmlu
ZyBzdGF0ZS4KLSAgICBDaGVja2VkPEdDM0RpbnQsIFJlY29yZE92ZXJmbG93PiBjaGVja2VkRmly
c3QoZmlyc3QpOwotICAgIENoZWNrZWQ8R0MzRGludCwgUmVjb3JkT3ZlcmZsb3c+IGNoZWNrZWRD
b3VudChjb3VudCk7Ci0gICAgQ2hlY2tlZDxHQzNEaW50LCBSZWNvcmRPdmVyZmxvdz4gY2hlY2tl
ZFN1bSA9IGNoZWNrZWRGaXJzdCArIGNoZWNrZWRDb3VudDsKKyAgICBDaGVja2VkPEdDM0RpbnQs
IFJlY29yZE92ZXJmbG93PiBjaGVja2VkU3VtID0gQ2hlY2tlZDxHQzNEaW50LCBSZWNvcmRPdmVy
Zmxvdz4oZmlyc3QpICsgQ2hlY2tlZDxHQzNEaW50LCBSZWNvcmRPdmVyZmxvdz4oY291bnQpOwog
ICAgIENoZWNrZWQ8R0MzRGludCwgUmVjb3JkT3ZlcmZsb3c+IGNoZWNrZWRQcmltaXRpdmVDb3Vu
dChwcmltaXRpdmVDb3VudCk7CiAgICAgaWYgKGNoZWNrZWRTdW0uaGFzT3ZlcmZsb3dlZCgpIHx8
IGNoZWNrZWRQcmltaXRpdmVDb3VudC5oYXNPdmVyZmxvd2VkKCkgfHwgIXZhbGlkYXRlVmVydGV4
QXR0cmlidXRlcyhjaGVja2VkU3VtLnVuc2FmZUdldCgpLCBjaGVja2VkUHJpbWl0aXZlQ291bnQu
dW5zYWZlR2V0KCkpKSB7CiAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29udGV4
dDNEOjpJTlZBTElEX09QRVJBVElPTiwgZnVuY3Rpb25OYW1lLCAiYXR0ZW1wdCB0byBhY2Nlc3Mg
b3V0IG9mIGJvdW5kcyBhcnJheXMiKTsKQEAgLTU3MTQsMTIgKzU3MjMsMTEgQEAgYm9vbCBXZWJH
TFJlbmRlcmluZ0NvbnRleHRCYXNlOjp2YWxpZGF0ZVNpbXVsYXRlZFZlcnRleEF0dHJpYjAoR0Mz
RHVpbnQgbnVtVmVydGUKICAgICBpZiAoc3RhdGUuZW5hYmxlZCkKICAgICAgICAgcmV0dXJuIHRy
dWU7CiAKLSAgICBDaGVja2VkPEdDM0R1aW50LCBSZWNvcmRPdmVyZmxvdz4gYnVmZmVyU2l6ZShu
dW1WZXJ0ZXgpOwotICAgIGJ1ZmZlclNpemUgKz0gMTsKLSAgICBidWZmZXJTaXplICo9IENoZWNr
ZWQ8R0MzRHVpbnQ+KDQpOwotICAgIGlmIChidWZmZXJTaXplLmhhc092ZXJmbG93ZWQoKSkKKyAg
ICBhdXRvIGJ1ZmZlclNpemUgPSBjaGVja2VkQWRkQW5kTXVsdGlwbHk8R0MzRHVpbnQ+KG51bVZl
cnRleCwgMSwgNCk7CisgICAgaWYgKCFidWZmZXJTaXplKQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgQ2hlY2tlZDxHQzNEc2l6ZWlwdHIsIFJlY29yZE92ZXJmbG93PiBidWZmZXJEYXRhU2l6
ZShidWZmZXJTaXplKTsKKworICAgIENoZWNrZWQ8R0MzRHNpemVpcHRyLCBSZWNvcmRPdmVyZmxv
dz4gYnVmZmVyRGF0YVNpemUoYnVmZmVyU2l6ZS52YWx1ZSgpKTsKICAgICBidWZmZXJEYXRhU2l6
ZSAqPSBDaGVja2VkPEdDM0RzaXplaXB0cj4oc2l6ZW9mKEdDM0RmbG9hdCkpOwogICAgIHJldHVy
biAhYnVmZmVyRGF0YVNpemUuaGFzT3ZlcmZsb3dlZCgpICYmIGJ1ZmZlckRhdGFTaXplLnVuc2Fm
ZUdldCgpID4gMDsKIH0KQEAgLTU3NDAsMjIgKzU3NDgsMTkgQEAgc3RkOjpvcHRpb25hbDxib29s
PiBXZWJHTFJlbmRlcmluZ0NvbnRleHRCYXNlOjpzaW11bGF0ZVZlcnRleEF0dHJpYjAoR0MzRHVp
bnQgbnUKICAgICBtX3ZlcnRleEF0dHJpYjBVc2VkQmVmb3JlID0gdHJ1ZTsKICAgICBtX2NvbnRl
eHQtPmJpbmRCdWZmZXIoR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUiwgbV92ZXJ0ZXhB
dHRyaWIwQnVmZmVyLT5vYmplY3QoKSk7CiAKLSAgICBDaGVja2VkPEdDM0R1aW50PiBidWZmZXJT
aXplKG51bVZlcnRleCk7Ci0gICAgYnVmZmVyU2l6ZSArPSAxOwotICAgIGJ1ZmZlclNpemUgKj0g
Q2hlY2tlZDxHQzNEdWludD4oNCk7Ci0KLSAgICBDaGVja2VkPEdDM0RzaXplaXB0cj4gYnVmZmVy
RGF0YVNpemUoYnVmZmVyU2l6ZSk7Ci0gICAgYnVmZmVyRGF0YVNpemUgKj0gQ2hlY2tlZDxHQzNE
c2l6ZWlwdHI+KHNpemVvZihHQzNEZmxvYXQpKTsKKyAgICAvLyBXZSBrbm93IGJ1ZmZlclNpemUg
YW5kIGJ1ZmZlckRhdGFTaXplIHdvbid0IG92ZXJmbG93IG9yIGdvIG5lZ2F0aXZlLCB0aGFua3Mg
dG8gdmFsaWRhdGVTaW11bGF0ZWRWZXJ0ZXhBdHRyaWIwCisgICAgR0MzRHVpbnQgYnVmZmVyU2l6
ZSA9IChudW1WZXJ0ZXggKyAxKSAqIDQ7CisgICAgR0MzRHNpemVpcHRyIGJ1ZmZlckRhdGFTaXpl
ID0gYnVmZmVyU2l6ZSAqIHNpemVvZihHQzNEZmxvYXQpOwogCi0gICAgaWYgKGJ1ZmZlckRhdGFT
aXplLnVuc2FmZUdldCgpID4gbV92ZXJ0ZXhBdHRyaWIwQnVmZmVyU2l6ZSkgeworICAgIGlmIChi
dWZmZXJEYXRhU2l6ZSA+IG1fdmVydGV4QXR0cmliMEJ1ZmZlclNpemUpIHsKICAgICAgICAgbV9j
b250ZXh0LT5tb3ZlRXJyb3JzVG9TeW50aGV0aWNFcnJvckxpc3QoKTsKLSAgICAgICAgbV9jb250
ZXh0LT5idWZmZXJEYXRhKEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIGJ1ZmZlckRh
dGFTaXplLnVuc2FmZUdldCgpLCAwLCBHcmFwaGljc0NvbnRleHQzRDo6RFlOQU1JQ19EUkFXKTsK
KyAgICAgICAgbV9jb250ZXh0LT5idWZmZXJEYXRhKEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9C
VUZGRVIsIGJ1ZmZlckRhdGFTaXplLCAwLCBHcmFwaGljc0NvbnRleHQzRDo6RFlOQU1JQ19EUkFX
KTsKICAgICAgICAgaWYgKG1fY29udGV4dC0+Z2V0RXJyb3IoKSAhPSBHcmFwaGljc0NvbnRleHQz
RDo6Tk9fRVJST1IpIHsKICAgICAgICAgICAgIC8vIFdlIHdlcmUgdW5hYmxlIHRvIGNyZWF0ZSBh
IGJ1ZmZlci4KICAgICAgICAgICAgIG1fdmVydGV4QXR0cmliMFVzZWRCZWZvcmUgPSBmYWxzZTsK
ICAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CiAgICAgICAgIH0KLSAgICAgICAgbV92
ZXJ0ZXhBdHRyaWIwQnVmZmVyU2l6ZSA9IGJ1ZmZlckRhdGFTaXplLnVuc2FmZUdldCgpOworICAg
ICAgICBtX3ZlcnRleEF0dHJpYjBCdWZmZXJTaXplID0gYnVmZmVyRGF0YVNpemU7CiAgICAgICAg
IG1fZm9yY2VBdHRyaWIwQnVmZmVyUmVmaWxsID0gdHJ1ZTsKICAgICB9CiAKQEAgLTU3NjgsNyAr
NTc3Myw3IEBAIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZTo6
c2ltdWxhdGVWZXJ0ZXhBdHRyaWIwKEdDM0R1aW50IG51CiAgICAgICAgICAgICB8fCBhdHRyaWJW
YWx1ZS52YWx1ZVsyXSAhPSBtX3ZlcnRleEF0dHJpYjBCdWZmZXJWYWx1ZVsyXQogICAgICAgICAg
ICAgfHwgYXR0cmliVmFsdWUudmFsdWVbM10gIT0gbV92ZXJ0ZXhBdHRyaWIwQnVmZmVyVmFsdWVb
M10pKSB7CiAKLSAgICAgICAgYXV0byBidWZmZXJEYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxHQzNE
ZmxvYXRbXT4oYnVmZmVyU2l6ZS51bnNhZmVHZXQoKSk7CisgICAgICAgIGF1dG8gYnVmZmVyRGF0
YSA9IHN0ZDo6bWFrZV91bmlxdWU8R0MzRGZsb2F0W10+KGJ1ZmZlclNpemUpOwogICAgICAgICBm
b3IgKEdDM0R1aW50IGlpID0gMDsgaWkgPCBudW1WZXJ0ZXggKyAxOyArK2lpKSB7CiAgICAgICAg
ICAgICBidWZmZXJEYXRhW2lpICogNF0gPSBhdHRyaWJWYWx1ZS52YWx1ZVswXTsKICAgICAgICAg
ICAgIGJ1ZmZlckRhdGFbaWkgKiA0ICsgMV0gPSBhdHRyaWJWYWx1ZS52YWx1ZVsxXTsKQEAgLTU3
ODAsNyArNTc4NSw3IEBAIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gV2ViR0xSZW5kZXJpbmdDb250ZXh0
QmFzZTo6c2ltdWxhdGVWZXJ0ZXhBdHRyaWIwKEdDM0R1aW50IG51CiAgICAgICAgIG1fdmVydGV4
QXR0cmliMEJ1ZmZlclZhbHVlWzJdID0gYXR0cmliVmFsdWUudmFsdWVbMl07CiAgICAgICAgIG1f
dmVydGV4QXR0cmliMEJ1ZmZlclZhbHVlWzNdID0gYXR0cmliVmFsdWUudmFsdWVbM107CiAgICAg
ICAgIG1fZm9yY2VBdHRyaWIwQnVmZmVyUmVmaWxsID0gZmFsc2U7Ci0gICAgICAgIG1fY29udGV4
dC0+YnVmZmVyU3ViRGF0YShHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCAwLCBidWZm
ZXJEYXRhU2l6ZS51bnNhZmVHZXQoKSwgYnVmZmVyRGF0YS5nZXQoKSk7CisgICAgICAgIG1fY29u
dGV4dC0+YnVmZmVyU3ViRGF0YShHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCAwLCBi
dWZmZXJEYXRhU2l6ZSwgYnVmZmVyRGF0YS5nZXQoKSk7CiAgICAgfQogICAgIG1fY29udGV4dC0+
dmVydGV4QXR0cmliUG9pbnRlcigwLCA0LCBHcmFwaGljc0NvbnRleHQzRDo6RkxPQVQsIDAsIDAs
IDApOwogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9j
YW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZS5oIGIvU291cmNlL1dlYkNvcmUvaHRtbC9j
YW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0QmFzZS5oCmluZGV4IDFlYmRkYmFhOTRjYmNlNjY2
MWU0NmQ2ZTUxMGFkNmJlOTU0MjE1NmIuLmFkM2I0MGFmZjk4ZjJmMTg0MjVjMTcxZjUwNWIyNWM2
Mzc4YTZmNGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVu
ZGVyaW5nQ29udGV4dEJhc2UuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJH
TFJlbmRlcmluZ0NvbnRleHRCYXNlLmgKQEAgLTgyOSw2ICs4MjksOCBAQCBwcm90ZWN0ZWQ6CiAg
ICAgSFRNTENhbnZhc0VsZW1lbnQqIGh0bWxDYW52YXMoKTsKICAgICBPZmZzY3JlZW5DYW52YXMq
IG9mZnNjcmVlbkNhbnZhcygpOwogCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBz
dGQ6Om9wdGlvbmFsPFQ+IGNoZWNrZWRBZGRBbmRNdWx0aXBseShUIHZhbHVlLCBUIGFkZCwgVCBt
dWx0aXBseSk7CisKIHByaXZhdGU6CiAgICAgYm9vbCB2YWxpZGF0ZUFycmF5QnVmZmVyVHlwZShj
b25zdCBjaGFyKiBmdW5jdGlvbk5hbWUsIEdDM0RlbnVtIHR5cGUsIHN0ZDo6b3B0aW9uYWw8SlND
OjpUeXBlZEFycmF5VHlwZT4pOwogICAgIHZvaWQgcmVnaXN0ZXJXaXRoV2ViR0xTdGF0ZVRyYWNr
ZXIoKTsK
</data>
<flag name="review"
          id="350221"
          type_id="1"
          status="+"
          setter="eric.carlson"
    />
          </attachment>
      

    </bug>

</bugzilla>