<?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>105363</bug_id>
          
          <creation_ts>2012-12-18 16:24:48 -0800</creation_ts>
          <short_desc>[Chromium] [V8] IndexedDB: flaky crashes in storage/indexeddb/key-type-array.html</short_desc>
          <delta_ts>2013-02-27 11:57:08 -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>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>110206</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>110916</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Joshua Bell">jsbell</reporter>
          <assigned_to name="Joshua Bell">jsbell</assigned_to>
          <cc>abarth</cc>
    
    <cc>alecflett</cc>
    
    <cc>dgrogan</cc>
    
    <cc>haraken</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>794150</commentid>
    <comment_count>0</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2012-12-18 16:24:48 -0800</bug_when>
    <thetext>Low frequency of crashes on Mac OS:

http://test-results.appspot.com/dashboards/flakiness_dashboard.html#tests=storage%2Findexeddb%2Fkey-type-array.html

Sample crash:

http://build.chromium.org/p/chromium.webkit/builders/WebKit%20Mac10.7%20(dbg)/builds/1433/steps/webkit_tests/logs/stdio

Stack is useless:

23:52:18.696 1242 worker/2 storage/indexeddb/key-type-array.html crashed, (stderr lines):
23:52:18.696 1242   
23:52:18.696 1242   
23:52:18.696 1242   #
23:52:18.696 1242   # Fatal error in ../../src/heap-inl.h, line 292
23:52:18.696 1242   # CHECK(!result || gc_state_ != NOT_IN_GC || InToSpace(object)) failed
23:52:18.696 1242   #
23:52:18.696 1242</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>794168</commentid>
    <comment_count>1</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2012-12-18 16:33:09 -0800</bug_when>
    <thetext>haraken@ - could you take a look in IDBBindingUtilities.cpp&apos;s createIDBKeyFromValue and V8IDBKeyCustom.cpp&apos;s toV8() and see if any lifetime issues stand out, e.g. wrong sort of handle being used? I&apos;ll dig in as well, of course.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>799844</commentid>
    <comment_count>2</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-03 16:47:03 -0800</bug_when>
    <thetext>Vaguely informative stack:

16:00:29.015 9152 worker/21 storage/indexeddb/key-type-array.html crashed, (stderr lines):
16:00:29.015 9152   Received signal 11
16:00:29.015 9152   	base::debug::StackTrace::StackTrace() [0x7f103dd3ffde]
16:00:29.015 9152   	base::debug::(anonymous namespace)::StackDumpSignalHandler() [0x7f103dd3fc93]
16:00:29.015 9152   	&lt;unknown&gt; [0x7f10337a5af0]
16:00:29.015 9152   	v8::internal::Map::instance_type() [0x7f103fb24bea]
16:00:29.015 9152   	v8::internal::Object::IsOddball() [0x7f103fb23a3a]
16:00:29.015 9152   	v8::internal::Object::IsTheHole() [0x7f103fb23cc0]
16:00:29.015 9152   	v8::internal::ObjectHashTable::Put() [0x7f103fd60fc4]
16:00:29.015 9152   	v8::internal::JSObject::SetHiddenProperty() [0x7f103fd428de]
16:00:29.015 9152   	v8::internal::JSObject::SetHiddenProperty() [0x7f103fd424bc]
16:00:29.015 9152   	v8::Object::SetHiddenValue() [0x7f103fb3a785]
16:00:29.015 9152   	WebCore::V8DOMWrapper::setNamedHiddenReference() [0x7f103ace323d]
16:00:29.015 9152   	WebCore::IDBRequestV8Internal::resultAttrGetter() [0x7f103b77d93a]
16:00:29.016 9152   	&lt;unknown&gt; [0x17ca2781a213]
16:00:29.018 8939 [22998/26975] storage/indexeddb/key-type-array.html failed unexpectedly (DumpRenderTree crashed [pid=9189])</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>799845</commentid>
    <comment_count>3</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-03 16:47:08 -0800</bug_when>
    <thetext>One oddity in the generated code (although I don&apos;t think this is related):

static v8::Handle&lt;v8::Value&gt; resultAttrGetter(v8::Local&lt;v8::String&gt; name, const v8::AccessorInfo&amp; info)
{
    IDBRequest* imp = V8IDBRequest::toNative(info.Holder());
    ExceptionCode ec = 0;
    RefPtr&lt;IDBAny&gt; v = imp-&gt;result(ec);
    if (UNLIKELY(ec))
        return setDOMException(ec, info.GetIsolate());
    RefPtr&lt;IDBAny&gt; result = imp-&gt;result(ec);

...

Note how imp-&gt;result() is called twice. That seems... inefficient.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>799846</commentid>
    <comment_count>4</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-03 16:48:49 -0800</bug_when>
    <thetext>I wonder if this crash is due to walking the recursive array in toV8(). I wonder if the JS object gets accidentally released due to a refcount temporarily bouncing off of 0?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>804813</commentid>
    <comment_count>5</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-10 16:27:42 -0800</bug_when>
    <thetext>Note that the place in the test where IDBRequest.result is accessed is reading the string result out (expecting &quot;value11&quot; or some such). In instances where this fails with TEXT (not CRASH) the result is a corrupted string (non-ASCII data).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>804824</commentid>
    <comment_count>6</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-10 16:58:14 -0800</bug_when>
    <thetext>haraken@, abarth@ - I notice that in the generated V8IDBRequest::resultAttrGetter we&apos;re stashing the result of toV8() via:

        wrapper = toV8(result.get(), info.Holder(), info.GetIsolate());
        if (!wrapper.IsEmpty())
            V8DOMWrapper::setNamedHiddenReference(info.Holder(), &quot;result&quot;, wrapper);

toV8() in this case is going to be the result of V8IDBAnyCustom.cpp&apos;s toV8(IDBAny*, ...) which in turn calls V8IDBKeyCustom.cpp&apos;s toV8(IDBKey*, ...) which is returning a v8::Local&lt;v8::Array&gt;. Is that safe?

(Grasping at straws here.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805016</commentid>
    <comment_count>7</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-01-11 00:07:22 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; toV8() in this case is going to be the result of V8IDBAnyCustom.cpp&apos;s toV8(IDBAny*, ...) which in turn calls V8IDBKeyCustom.cpp&apos;s toV8(IDBKey*, ...) which is returning a v8::Local&lt;v8::Array&gt;. Is that safe?

I don&apos;t think it&apos;s safe. An object returned by toV8() should be a wrapper. A wrapper needs to hold a C++ pointer to the corresponding DOM object. For example, please look at V8ScriptProfileCustom.cpp::toV8():

Handle&lt;Value&gt; toV8() {
  ...;
  v8::Local&lt;v8::Object&gt; instance = ...;
  V8DOMWrapper::setNativeInfo(instance, &amp;V8ScriptProfile::info, impl); // Setting native information on the wrapper object.
  return instance;
}</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805291</commentid>
    <comment_count>8</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-11 08:51:59 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; I don&apos;t think it&apos;s safe. An object returned by toV8() should be a wrapper. A wrapper needs to hold a C++ pointer to the corresponding DOM object. 

In some of the IDBAny cases a V8-only value is being returned (i.e. there is no DOM object). Some IDBAny types produce undefined, null, strings, or numbers, and the IDBKey case (one of the possible types of an IDBAny) yields null, string, number, date or array of the previous types.

Is the AttrGetter code gen incorrect for IDBAny? Should it only be creating a wrapper in cases where there&apos;s a backing DOM object?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805303</commentid>
    <comment_count>9</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-01-11 09:05:59 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; In some of the IDBAny cases a V8-only value is being returned (i.e. there is no DOM object). Some IDBAny types produce undefined, null, strings, or numbers, and the IDBKey case (one of the possible types of an IDBAny) yields null, string, number, date or array of the previous types.
&gt; 
&gt; Is the AttrGetter code gen incorrect for IDBAny? Should it only be creating a wrapper in cases where there&apos;s a backing DOM object?

Sorry for my previous comment. Returning strings, numbers, arrays etc from toV8() sounds a bit strange but is not a problem.

I thought that if an IDBAny getter is called for a wrapper object returned by toV8() without setting native information, the getter will crash when it tries to retrieve a native pointer from the wrapper object. However, this shouldn&apos;t be happen as long as toV8() returns strings, numbers, arrays etc from toV8(). (This kind of problem happens only when toV8() returns a wrapper object of IDBAny without setting native information.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805310</commentid>
    <comment_count>10</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-11 09:15:09 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; Sorry for my previous comment. Returning strings, numbers, arrays etc from toV8() sounds a bit strange but is not a problem.
&gt; 
&gt; I thought that if an IDBAny getter is called for a wrapper object returned by toV8() without setting native information, the getter will crash when it tries to retrieve a native pointer from the wrapper object. However, this shouldn&apos;t be happen as long as toV8() returns strings, numbers, arrays etc from toV8(). (This kind of problem happens only when toV8() returns a wrapper object of IDBAny without setting native information.)

Okay. And in the cases where toV8(IDBAny) is returning a DOM object, it&apos;s doing so by calling the auto-generated toV8() for those so they&apos;re handled correctly.

...

So, back to the bug: sometime late in 2012 there started to be infrequent flaky crashes or corrupted string data in Array-type IDBKey edge-case tests, with no corresponding changes to the IDBKey code or tests. I haven&apos;t been able to repro locally at all. :(

The stacks above may be a red herring, since they could be the resultAttrGetter wandering into already corrupted data. The creation of the V8 value in V8IDBKeyCustom.cpp::toV8 looks correct, but I&apos;m still nervous about the v8::Local there - should it just be v8::Handle ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805313</commentid>
    <comment_count>11</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-01-11 09:19:35 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; I&apos;m still nervous about the v8::Local there - should it just be v8::Handle ?

At least, this is not a problem. In V8 there are Local handles and Persistent handles. Handle is just a super class of Local and Persistent. We&apos;re likely to use Handle instead of Local and Persistent to pass values around.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806629</commentid>
    <comment_count>12</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-14 14:25:56 -0800</bug_when>
    <thetext>I managed to repro this once while working on http://wkbug.com/97375, same stack plus registers, and haven&apos;t been able to trigger it again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>809777</commentid>
    <comment_count>13</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-17 14:20:20 -0800</bug_when>
    <thetext>Still poking, with no luck - haven&apos;t been able to trigger this again despite many attempts on Linux and MacOS and poking at the test in various ways.

Just to reiterate, the core of the test is:

var value = &quot;simple string value&quot;;
var key = [ long, complex, array, of, dates, and, other, stuff, ... ];
var putreq = objectStore.put(value, key);
var getreq = objectStore.get(key);
getreq.onsuccess = function () {
  shouldBeEqualToString(&quot;getreq.result&quot;, value);
};

On Linux, occasionally the access to getreq.result generates a crash. On MacOS, the output of getreq.result is a garbage string.

Given that the trigger is a long array key, the suspect areas would be:
(1) conversion of JS value to IDBKey during the put() call
(2) handling of the putreq result (but that appears to not even touch v8)
(3) conversion of JS value to IDBKey during the get() call
(4) handling of the getreq result

Given the difficulty to reproduce and the distance between the trigger (array key) and crash (attribute fetch), it feels to me like an issue where either (1) or (3) has a bug, then GC runs corrupting the heap, then (4) exposes it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>809861</commentid>
    <comment_count>14</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-01-17 15:14:36 -0800</bug_when>
    <thetext>... and the stacks w/ registers on the flakiness dashboard show pointers indicating ZapFromSpace has been called on heap objects, which only happens in GarbageCollectionEpilogue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>831460</commentid>
    <comment_count>15</comment_count>
      <attachid>187973</attachid>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-02-12 17:25:58 -0800</bug_when>
    <thetext>Created attachment 187973
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>831463</commentid>
    <comment_count>16</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-02-12 17:29:24 -0800</bug_when>
    <thetext>Ugh, my reliable repro is no longer reliably reproducing. :P

(In reply to comment #15)
&gt; Created an attachment (id=187973) [details]
&gt; Patch

One thing that made the repro stop (but then again, so did nearly everything else I tried...) was not producing extraneous wrappers around value types coming out of the IDBAny variant type. I uploaded a patch that implements this in the code generator.

It&apos;s ugly - and we could add a IDBAny::isValueType() to simplify - but I think it&apos;s more correct than what we do now. That said, it&apos;s still unclear why the wrapper path would be causing strings to be released prematurely (which seems to be the root of the problem).

Thoughts?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>831492</commentid>
    <comment_count>17</comment_count>
      <attachid>187973</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-12 18:16:47 -0800</bug_when>
    <thetext>Comment on attachment 187973
Patch

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

&gt; Source/WebCore/bindings/scripts/CodeGeneratorV8.pm:1052
&gt; +        if ($returnType eq &quot;IDBAny&quot;) {
&gt; +            push(@implContentDecls, &quot;    if (!result.get() || result-&gt;type() == IDBAny::UndefinedType || result-&gt;type() == IDBAny::NullType || result-&gt;type() == IDBAny::ScriptValueType || result-&gt;type() == IDBAny::StringType || result-&gt;type() == IDBAny::IntegerType) {\n&quot;);
&gt; +            push(@implContentDecls, &quot;        return toV8(result.get(), info.Holder(), info.GetIsolate());\n&quot;);
&gt; +            push(@implContentDecls, &quot;    }\n&quot;);
&gt; +        }

How about writing this in V8IDBCustom.cpp::toV8()?

I understand this is more correct than the current implementation but this patch will hide a potential bug, as you mentioned.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>831656</commentid>
    <comment_count>18</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-02-12 22:56:56 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; How about writing this in V8IDBCustom.cpp::toV8()?

To be clear, that would mean marking IDBAny as a non-wrapper type in the code generator, and somehow having the custom toV8 implementation handle creating the wrapper and hidden property on the container object for when the IDBAny is holding a wrappable object? Otherwise we&apos;re losing the benefit of what the code generator is doing.

&gt; I understand this is more correct than the current implementation but this patch will hide a potential bug, as you mentioned.

Yes, so I don&apos;t think we should land it until we understand what&apos;s going on. I&apos;ll see if I can get it reproing again.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>831658</commentid>
    <comment_count>19</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-12 23:00:05 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; How about writing this in V8IDBCustom.cpp::toV8()?
&gt; 
&gt; To be clear, that would mean marking IDBAny as a non-wrapper type in the code generator, and somehow having the custom toV8 implementation handle creating the wrapper and hidden property on the container object for when the IDBAny is holding a wrappable object? Otherwise we&apos;re losing the benefit of what the code generator is doing.

Sorry I meant V8IDBAnyCustom.cpp. V8IDBAnyCustom.cpp already has custom toV8(). Why can&apos;t you do what you want to do by tweaking the custom toV8(). (Maybe I&apos;m misunderstanding your problem.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>831987</commentid>
    <comment_count>20</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-02-13 09:43:47 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; Sorry I meant V8IDBAnyCustom.cpp. V8IDBAnyCustom.cpp already has custom toV8(). Why can&apos;t you do what you want to do by tweaking the custom toV8(). (Maybe I&apos;m misunderstanding your problem.)

IDBAny is a variant/union type which is not exposed to script. In a simplified form, pretend it has two types it can hold: either ScriptValue or an IDBIndex, distinguished by calling IDBAny::type() which gives ScriptValueType or IndexType. In the case where V8IDBRequest::resultAttrGetter is called, this leads to a call to IDBRequest::result() which gives a RefPtr&lt;IDBAny&gt;.

V8IDBAnyCustom&apos;s toV8 basically does:

switch(r-&gt;type()) {
  ScriptValueType: return r-&gt;scriptValue().v8Value(); // already v8 value
  IndexType: return toV8(r-&gt;index(), holder, isolate); // wrap
}

Now the autogenerated code for wrapper types kicks in to check the DOMDataStore::getWrapper and setNamedHiddenReference on the IDBRequest w/ &quot;result&quot; and the v8value, to try and prevent the wrapper from being GC&apos;d too early. This makes sense for IDBAny&apos;s of IndexType (where IDBIndex would be a &quot;wrapper-type&quot; from codegen&apos;s perspective) but so far as I can understand things not for IDBAny&apos;s of ScriptValueType (which would be a &quot;non-wrapper-type&quot; from codegen&apos;s perspective).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832518</commentid>
    <comment_count>21</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-13 16:41:52 -0800</bug_when>
    <thetext>(In reply to comment #20)
&gt; Now the autogenerated code for wrapper types kicks in to check the DOMDataStore::getWrapper and setNamedHiddenReference on the IDBRequest w/ &quot;result&quot; and the v8value, to try and prevent the wrapper from being GC&apos;d too early. This makes sense for IDBAny&apos;s of IndexType (where IDBIndex would be a &quot;wrapper-type&quot; from codegen&apos;s perspective) but so far as I can understand things not for IDBAny&apos;s of ScriptValueType (which would be a &quot;non-wrapper-type&quot; from codegen&apos;s perspective).

Thanks for the detailed explanation. I understood.

But personally I feel that we might want to solve the original GC problem first. Then we might not need to add such tricky logic to code generators. I&apos;ll be in town from next week, so I can help.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>843335</commentid>
    <comment_count>22</comment_count>
    <who name="Joshua Bell">jsbell</who>
    <bug_when>2013-02-27 11:57:08 -0800</bug_when>
    <thetext>From the investigation so far, this seems to be caused by https://bugs.webkit.org/show_bug.cgi?id=110206

*** This bug has been marked as a duplicate of bug 110206 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>187973</attachid>
            <date>2013-02-12 17:25:58 -0800</date>
            <delta_ts>2013-02-12 18:16:47 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-105363-20130212172228.patch</filename>
            <type>text/plain</type>
            <size>2363</size>
            <attacher name="Joshua Bell">jsbell</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQyNjQ2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYjUwODgzMjRkMzU1ZThh
ZDRiMmMzNTcwNTRiZjMzNzUzMjJjY2E0MS4uZTQ4NDZhMzQ4NWFhNDkyZTJlZTE0N2Q2ZTIxOTMy
YTQ2YjMwNmNiOSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE1IEBACisyMDEzLTAyLTEyICBKb3No
dWEgQmVsbCAgPGpzYmVsbEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW0Nocm9taXVtXSBbVjhd
IEluZGV4ZWREQjogZmxha3kgY3Jhc2hlcyBpbiBzdG9yYWdlL2luZGV4ZWRkYi9rZXktdHlwZS1h
cnJheS5odG1sCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xMDUzNjMKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBObyBuZXcgdGVzdHMgKE9PUFMhKS4KKworICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvQ29k
ZUdlbmVyYXRvclY4LnBtOgorICAgICAgICAoR2VuZXJhdGVOb3JtYWxBdHRyR2V0dGVyKToKKwog
MjAxMy0wMi0xMiAgVG9tYXMgUG9wZWxhICA8dHBvcGVsYUByZWRoYXQuY29tPgogCiAgICAgICAg
IFtHVEtdW0ludHJvc3BlY3Rpb25dIEdPYmplY3QgYmluZGluZ3MgZm9yIERhdGFUcmFuc2Zlckl0
ZW1MaXN0IC0gb25lIGFkZCgpIG1ldGhvZCBtdXN0IGJlIHJlbW92ZWQgZnJvbSAuaWRsCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0NvZGVHZW5lcmF0b3JWOC5w
bSBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtCmlu
ZGV4IDg2ZjhlYWJmZjFhZjFhMWE0YzZmNTY4NmJjMjhmNWU3YTZmNTI3NDYuLmI2YWRiMGJmMmU2
YzhhNzUxMGFkNzM4OTdmNTNlYjZkNDA5MDdkMmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2JpbmRpbmdzL3NjcmlwdHMvQ29kZUdlbmVyYXRvclY4LnBtCkBAIC0xMDQ1LDYgKzEwNDUsMTEg
QEAgRU5ECiAgICAgICAgICMgQ2hlY2sgZm9yIGEgd3JhcHBlciBpbiB0aGUgd3JhcHBlciBjYWNo
ZS4gSWYgdGhlcmUgaXMgb25lLCB3ZSBrbm93IHRoYXQgYSBoaWRkZW4gcmVmZXJlbmNlIGhhcyBh
bHJlYWR5CiAgICAgICAgICMgYmVlbiBjcmVhdGVkLiBJZiB3ZSBkb24ndCBmaW5kIGEgd3JhcHBl
ciwgd2UgY3JlYXRlIGJvdGggYSB3cmFwcGVyIGFuZCBhIGhpZGRlbiByZWZlcmVuY2UuCiAgICAg
ICAgIHB1c2goQGltcGxDb250ZW50RGVjbHMsICIgICAgUmVmUHRyPCRyZXR1cm5UeXBlPiByZXN1
bHQgPSAke2dldHRlclN0cmluZ307XG4iKTsKKyAgICAgICAgaWYgKCRyZXR1cm5UeXBlIGVxICJJ
REJBbnkiKSB7CisgICAgICAgICAgICBwdXNoKEBpbXBsQ29udGVudERlY2xzLCAiICAgIGlmICgh
cmVzdWx0LmdldCgpIHx8IHJlc3VsdC0+dHlwZSgpID09IElEQkFueTo6VW5kZWZpbmVkVHlwZSB8
fCByZXN1bHQtPnR5cGUoKSA9PSBJREJBbnk6Ok51bGxUeXBlIHx8IHJlc3VsdC0+dHlwZSgpID09
IElEQkFueTo6U2NyaXB0VmFsdWVUeXBlIHx8IHJlc3VsdC0+dHlwZSgpID09IElEQkFueTo6U3Ry
aW5nVHlwZSB8fCByZXN1bHQtPnR5cGUoKSA9PSBJREJBbnk6OkludGVnZXJUeXBlKSB7XG4iKTsK
KyAgICAgICAgICAgIHB1c2goQGltcGxDb250ZW50RGVjbHMsICIgICAgICAgIHJldHVybiB0b1Y4
KHJlc3VsdC5nZXQoKSwgaW5mby5Ib2xkZXIoKSwgaW5mby5HZXRJc29sYXRlKCkpO1xuIik7Cisg
ICAgICAgICAgICBwdXNoKEBpbXBsQ29udGVudERlY2xzLCAiICAgIH1cbiIpOworICAgICAgICB9
CiAgICAgICAgIHB1c2goQGltcGxDb250ZW50RGVjbHMsICIgICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHdyYXBwZXIgPSByZXN1bHQuZ2V0KCkgPyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oRE9NRGF0
YVN0b3JlOjpnZXRXcmFwcGVyKHJlc3VsdC5nZXQoKSwgaW5mby5HZXRJc29sYXRlKCkpKSA6IHY4
VW5kZWZpbmVkKCk7XG4iKTsKICAgICAgICAgcHVzaChAaW1wbENvbnRlbnREZWNscywgIiAgICBp
ZiAod3JhcHBlci5Jc0VtcHR5KCkpIHtcbiIpOwogICAgICAgICBwdXNoKEBpbXBsQ29udGVudERl
Y2xzLCAiICAgICAgICB3cmFwcGVyID0gdG9WOChyZXN1bHQuZ2V0KCksIGluZm8uSG9sZGVyKCks
IGluZm8uR2V0SXNvbGF0ZSgpKTtcbiIpOyAjIEZJWE1FOiBDb3VsZCB1c2Ugd3JhcCBoZXJlIHNp
bmNlIHRoZSB3cmFwcGVyIGlzIGVtcHR5Lgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>