<?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>54219</bug_id>
          
          <creation_ts>2011-02-10 10:07:15 -0800</creation_ts>
          <short_desc>Crash in WebCore::FrameLoader::continueLoadAfterNavigationPolicy</short_desc>
          <delta_ts>2011-02-15 09:03:30 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Charles Reis">creis</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>beidson</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>eroman</cc>
    
    <cc>fishd</cc>
    
    <cc>jamesr</cc>
    
    <cc>japhet</cc>
    
    <cc>mihaip</cc>
    
    <cc>tonyg</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>349155</commentid>
    <comment_count>0</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-10 10:07:15 -0800</bug_when>
    <thetext>This is currently a top crasher on the Chromium dev channel.

0x5b93e82b	 [chrome.dll	 - frameloader.cpp:2994	WebCore::FrameLoader::continueLoadAfterNavigationPolicy(WebCore::ResourceRequest const &amp;,WTF::PassRefPtr&lt;WebCore::FormState&gt;,bool)
0x5b93e434	 [chrome.dll	 - frameloader.cpp:2875	WebCore::FrameLoader::callContinueLoadAfterNavigationPolicy(void *,WebCore::ResourceRequest const &amp;,WTF::PassRefPtr&lt;WebCore::FormState&gt;,bool)
0x5b9b1d16	 [chrome.dll	 - policycallback.cpp:102	WebCore::PolicyCallback::call(bool)
0x5b9ae695	 [chrome.dll	 - policychecker.cpp:160	WebCore::PolicyChecker::continueAfterNavigationPolicy(WebCore::PolicyAction)
0x5bca7bfc	 [chrome.dll	 - frameloaderclientimpl.cpp:958	WebKit::FrameLoaderClientImpl::dispatchDecidePolicyForNavigationAction(void ( WebCore::PolicyChecker::*)(WebCore::PolicyAction),WebCore::NavigationAction const &amp;,WebCore::ResourceRequest const &amp;,WTF::PassRefPtr&lt;WebCore::FormState&gt;)
0x5b9ae3a2	 [chrome.dll	 - policychecker.cpp:88	WebCore::PolicyChecker::checkNavigationPolicy(WebCore::ResourceRequest const &amp;,WebCore::DocumentLoader *,WTF::PassRefPtr&lt;WebCore::FormState&gt;,void (*)(void *,WebCore::ResourceRequest const &amp;,WTF::PassRefPtr&lt;WebCore::FormState&gt;,bool),void *)
0x5b93bce2	 [chrome.dll	 - frameloader.cpp:1491	WebCore::FrameLoader::loadWithDocumentLoader(WebCore::DocumentLoader *,WebCore::FrameLoadType,WTF::PassRefPtr&lt;WebCore::FormState&gt;)
0x5b93b9ce	 [chrome.dll	 - frameloader.cpp:1408	WebCore::FrameLoader::loadWithNavigationAction(WebCore::ResourceRequest const &amp;,WebCore::NavigationAction const &amp;,bool,WebCore::FrameLoadType,WTF::PassRefPtr&lt;WebCore::FormState&gt;)
0x5b93f327	 [chrome.dll	 - frameloader.cpp:3258	WebCore::FrameLoader::loadDifferentDocumentItem(WebCore::HistoryItem *,WebCore::FrameLoadType)
0x5b9ac494	 [chrome.dll	 - historycontroller.cpp:683	WebCore::HistoryController::recursiveGoToItem(WebCore::HistoryItem *,WebCore::HistoryItem *,WebCore::FrameLoadType)
0x5b9aba59	 [chrome.dll	 - historycontroller.cpp:250	WebCore::HistoryController::goToItem(WebCore::HistoryItem *,WebCore::FrameLoadType)
0x5bc8fcfe	 [chrome.dll	 - webframeimpl.cpp:899	WebKit::WebFrameImpl::loadHistoryItem(WebKit::WebHistoryItem const &amp;)
0x5b507560	 [chrome.dll	 - render_view.cc:1426	RenderView::OnNavigate(ViewMsg_Navigate_Params const &amp;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349156</commentid>
    <comment_count>1</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-10 10:10:17 -0800</bug_when>
    <thetext>It looks like the crash is happening on this line:
    if (isBackForwardLoadType(type) &amp;&amp; history()-&gt;provisionalItem()-&gt;isInPageCache()) {
        loadProvisionalItemFromCachedPage();
        return;
    }

It&apos;s possible history()-&gt;provisionalItem() might be null at the time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>349285</commentid>
    <comment_count>2</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-10 12:42:16 -0800</bug_when>
    <thetext>The location of the crash in the crash dump&apos;s disassembly does seem to confirm that we&apos;ve already called isBackForwardNavigation and then blow up when we access history()-&gt;provisionalItem()-&gt;isInPageCache(), which is inlined.

The curious thing is that the provisional item gets set on the first line of loadDifferentDocumentItem, which is still on the call stack.  That means something between there and here cleared the provisional item.

The closest thing I see is the call to stopAllLoaders just above the crash, but that&apos;s explicitly called with ShouldNotClearProvisionalItem (because we know a new navigation is in progress).  We started clearing provisional items in stopAllLoaders as part of http://trac.webkit.org/changeset/76357.

For what it&apos;s worth, a simple null check is not sufficient to fix the problem-- that just delays the crash until later.  It looks like we&apos;re expecting the provisional item to be valid here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350016</commentid>
    <comment_count>3</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-11 14:12:38 -0800</bug_when>
    <thetext>Eric Roman found a way to repro (posted on the corresponding Chrome bug, http://crbug.com/72458):
1. Visit http://shop.ebay.com/quickshipwarehouse/m.html?_nkw=&amp;_armrs=1&amp;_from=&amp;_ipg=&amp;_trksid=p3686
2. Click any product link and let it load fully.
3. Click the blue &quot;Place Bid&quot; button.
4. Click Back, then click Back again after the page has started to render but before it finishes.

It turns out the product page (from step 2) does a DOMWindow::setLocation to a hash, which makes us call FrameLoader::loadInSameDocument.  I recently updated that to clear the history&apos;s provisional item as part of http://trac.webkit.org/changeset/77705, since we don&apos;t want to leave it dangling in a normal same-document navigation.  That leads to the crash.

However, it&apos;s surprising that this can happen *within* a call to loadDifferentDocumentItem (via stopAllLoaders), as you can see deep within the stack trace below.  In other words, as part of doing a back navigation, we stop the current loaders, which somehow lets the DOMWindow dispatch an event, where it then manages to set the location (even though we already have a navigation in progress).  We then proceed with the back navigation logic that&apos;s already on the call stack, ending up with the crash.

This nested navigation seems broken to me, but I&apos;ll admit that I don&apos;t understand enough of this flow to know whether this is the intended behavior.  Even if we weren&apos;t clearing the provisional item in recursiveUpdateForSameDocumentNavigation, we&apos;ll end up confused due to the nested navigation.

Any thoughts on the right way to fix this?


00 chrome_1210000!WebCore::HistoryController::recursiveUpdateForSameDocumentNavigation
01 chrome_1210000!WebCore::FrameLoader::loadInSameDocument+0x157
02 chrome_1210000!WebCore::FrameLoader::callContinueFragmentScrollAfterNavigationPolicy+0x37
03 chrome_1210000!WebCore::PolicyCallback::call+0x2b
04 chrome_1210000!WebCore::PolicyChecker::continueAfterNavigationPolicy+0xe7
05 chrome_1210000!WebKit::FrameLoaderClientImpl::dispatchDecidePolicyForNavigationAction+0x217
06 chrome_1210000!WebCore::PolicyChecker::checkNavigationPolicy+0x192
07 chrome_1210000!WebCore::FrameLoader::loadURL+0x2a9
08 chrome_1210000!WebCore::FrameLoader::loadFrameRequest+0x153
09 chrome_1210000!WebCore::FrameLoader::urlSelected+0x114
0a chrome_1210000!WebCore::FrameLoader::changeLocation+0x75
0b chrome_1210000!WebCore::NavigationScheduler::scheduleLocationChange+0xad
0c chrome_1210000!WebCore::DOMWindow::setLocation+0xe7
0d chrome_1210000!WebCore::V8Location::replaceCallback+0x65
0e chrome_1210000!v8::internal::HandleApiCallHelper&lt;0&gt;+0x16a
0f chrome_1210000!v8::internal::Builtin_HandleApiCall+0xf
WARNING: Frame IP not in any known module. Following frames may be wrong.
10 0x1e1b028e
11 0x6c23af7
12 chrome_1210000!v8::internal::Invoke+0xf9
13 chrome_1210000!v8::internal::Execution::Call+0x25
14 chrome_1210000!v8::Function::Call+0xea
15 chrome_1210000!WebCore::V8Proxy::callFunction+0x13d
16 chrome_1210000!WebCore::V8EventListener::callListenerFunction+0x55
17 chrome_1210000!WebCore::V8AbstractEventListener::invokeEventHandler+0xdf
18 chrome_1210000!WebCore::V8AbstractEventListener::handleEvent+0x4f
19 chrome_1210000!WebCore::EventTarget::fireEventListeners+0xb6
1a chrome_1210000!WebCore::EventTarget::fireEventListeners+0x47
1b chrome_1210000!WebCore::DOMWindow::dispatchEvent+0x99
1c chrome_1210000!WebCore::DOMWindow::dispatchTimedEvent+0x31
1d chrome_1210000!WebCore::DOMWindow::dispatchLoadEvent+0x85
1e chrome_1210000!WebCore::Document::implicitClose+0xf4
1f chrome_1210000!WebCore::FrameLoader::checkCallImplicitClose+0x4d
20 chrome_1210000!WebCore::FrameLoader::checkCompleted+0x82
21 chrome_1210000!WebCore::FrameLoader::completed+0x59
22 chrome_1210000!WebCore::FrameLoader::checkCompleted+0x96
23 chrome_1210000!WebCore::FrameLoader::mainReceivedCompleteError+0x29
24 chrome_1210000!WebCore::DocumentLoader::mainReceivedError+0x41
25 chrome_1210000!WebCore::FrameLoader::receivedMainResourceError+0xd1
26 chrome_1210000!WebCore::MainResourceLoader::didCancel+0x50
27 chrome_1210000!WebCore::ResourceLoader::cancel+0x4a
28 chrome_1210000!WebCore::ResourceLoader::cancel+0x25
29 chrome_1210000!WebCore::DocumentLoader::stopLoading+0x7b
2a chrome_1210000!WebCore::FrameLoader::stopAllLoaders+0x68
2b chrome_1210000!WebCore::FrameLoader::stopLoadingSubframes+0x1d
2c chrome_1210000!WebCore::FrameLoader::stopAllLoaders+0x56
2d chrome_1210000!WebCore::FrameLoader::stopLoadingSubframes+0x1d
2e chrome_1210000!WebCore::FrameLoader::stopAllLoaders+0x56
2f chrome_1210000!WebCore::FrameLoader::continueLoadAfterNavigationPolicy+0xc8
30 chrome_1210000!WebCore::FrameLoader::callContinueLoadAfterNavigationPolicy+0x1e
31 chrome_1210000!WebCore::PolicyCallback::call+0x2b
32 chrome_1210000!WebCore::PolicyChecker::continueAfterNavigationPolicy+0xe7
33 chrome_1210000!WebKit::FrameLoaderClientImpl::dispatchDecidePolicyForNavigationAction+0x217
34 chrome_1210000!WebCore::PolicyChecker::checkNavigationPolicy+0x192
35 chrome_1210000!WebCore::FrameLoader::loadWithDocumentLoader+0x209
36 chrome_1210000!WebCore::FrameLoader::loadWithNavigationAction+0x135
37 chrome_1210000!WebCore::FrameLoader::loadDifferentDocumentItem+0x2bc
38 chrome_1210000!WebCore::HistoryController::recursiveGoToItem+0x100
39 chrome_1210000!WebCore::HistoryController::goToItem+0x82
3a chrome_1210000!WebKit::WebFrameImpl::loadHistoryItem+0x88
3b chrome_1210000!RenderView::OnNavigate+0x1a2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350031</commentid>
    <comment_count>4</comment_count>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-02-11 14:20:29 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Any thoughts on the right way to fix this?

At the very least, it seems like you&apos;d want to protect the provisional item with a RefPtr. I ran into something similar with http://trac.webkit.org/changeset/71170.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350042</commentid>
    <comment_count>5</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-11 14:34:03 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; Any thoughts on the right way to fix this?
&gt; 
&gt; At the very least, it seems like you&apos;d want to protect the provisional item with a RefPtr. I ran into something similar with http://trac.webkit.org/changeset/71170.

Actually, it&apos;s already protected with a RefPtr in HistoryController.  I suppose we could also put it in a RefPtr in loadDifferentDocumentItem, but that wouldn&apos;t prevent this crash.

In other words, the HistoryItem itself isn&apos;t being deleted and then used.  The problem is that we set the HistoryController&apos;s provisional item, then start an entirely unrelated nested navigation (which sets and commits a different provisional item), and then we expect to commit the first provisional item.  HistoryController isn&apos;t set up to have a stack of navigations in progress.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350920</commentid>
    <comment_count>6</comment_count>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-02-14 15:11:27 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; HistoryController isn&apos;t set up to have a stack of navigations in progress.

It looks like part of the problem is this part of NavigationScheduler::scheduleLocationChange

    // If the URL we&apos;re going to navigate to is the same as the current one, except for the
    // fragment part, we don&apos;t need to schedule the location change.
    KURL parsedURL(ParsedURLString, url);
    if (parsedURL.hasFragmentIdentifier() &amp;&amp; equalIgnoringFragmentIdentifier(m_frame-&gt;document()-&gt;url(), parsedURL)) {
        loader-&gt;changeLocation(securityOrigin, loader-&gt;completeURL(url), referrer, lockHistory, lockBackForwardList);
        return;
    }

Normally all page-initiated location changes are asynchronous, so we don&apos;t end up in this state of having more than one navigation in progress. One possible fix is to remove this special-casing of fragment changes here, and let them be handled like other navigations (which involves enqueuing a task on the NavigationScheduler queue, by the time that fires the previous navigation will be complete).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350937</commentid>
    <comment_count>7</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-14 15:32:44 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; Normally all page-initiated location changes are asynchronous, so we don&apos;t end up in this state of having more than one navigation in progress. One possible fix is to remove this special-casing of fragment changes here, and let them be handled like other navigations (which involves enqueuing a task on the NavigationScheduler queue, by the time that fires the previous navigation will be complete).

I can confirm that change would avoid the crash, but I&apos;m not sure it&apos;ll catch all the ways we might get there.  For example, about:blank does a similar shortcut.

Nate and I were considering returning early from FrameLoader::loadURL if m_inStopAllLoaders is true.  There&apos;s already a check like that in FrameLoader::load, and it would be a good sanity check.

The biggest problem I&apos;m facing right now is not being able to boil this down to a reduced test case.  The Ebay URL in comment 3 works reliably, but only on Windows.  I&apos;ve written a test that puts an onload handler on a slow iframe, navigating to #foo once onload fires.  I can&apos;t seem to get it to fire, though.  Instead, FrameLoader::m_isComplete is true when we get to FrameLoader::checkCompleted (unlike in the Ebay example), so we never call FrameLoader::checkCallImplicitClose.  (See frame 1f in comment 3.)

I should have a patch as soon as I get the test working.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350970</commentid>
    <comment_count>8</comment_count>
      <attachid>82384</attachid>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-14 16:38:26 -0800</bug_when>
    <thetext>Created attachment 82384
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>350979</commentid>
    <comment_count>9</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-14 16:41:49 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; Created an attachment (id=82384) [details]
&gt; Patch

This patch avoids the crash by ensuring we don&apos;t start a new navigation with loadURL while stopAllLoaders is in progress.  It mimics a check we have in FrameLoader::load.

I&apos;m not thrilled with the test-- it can only reproduce the crash if you click the back button in the browser, and not if we use history.back() to go back.  This is currently a top crasher, though, so I wanted to get the fix in review as soon as possible.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>351024</commentid>
    <comment_count>10</comment_count>
      <attachid>82399</attachid>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-14 17:56:18 -0800</bug_when>
    <thetext>Created attachment 82399
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>351026</commentid>
    <comment_count>11</comment_count>
    <who name="Charles Reis">creis</who>
    <bug_when>2011-02-14 17:59:33 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Created an attachment (id=82399) [details]
&gt; Patch

Here&apos;s a patch with a manual test instead, since the layout test in the previous test wouldn&apos;t have caught a regression anyway.

Mihai points out that the difference between Chromium&apos;s back button and history.back() is that the latter calls Page::goToItem (which calls FrameLoader::stopAllLoaders) before HistoryController::goToItem.  That prevents the crash seen in this bug.

It&apos;d be nice to get either a way to call HistoryController::goToItem without Page::goToItem via layoutTestController, or change Chromium to call Page::goToItem.  However, this is currently a top crasher for Chromium, so we&apos;re hoping to get a patch in quickly.  I&apos;m happy to iterate on the test design afterward.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>351034</commentid>
    <comment_count>12</comment_count>
      <attachid>82399</attachid>
    <who name="Mihai Parparita">mihaip</who>
    <bug_when>2011-02-14 18:08:16 -0800</bug_when>
    <thetext>Comment on attachment 82399
Patch

This minimally-invasive change seems fine to not hold up the release, but I&apos;d like a more through follow-up fix too (e.g. change chromium&apos;s WebFrameImpl to use Page::goToItem and/or stop loaders, and add an assert in HistoryController::goToItem that checks that loading is stopped).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>351261</commentid>
    <comment_count>13</comment_count>
      <attachid>82399</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-02-15 07:55:35 -0800</bug_when>
    <thetext>Comment on attachment 82399
Patch

Clearing flags on attachment: 82399

Committed r78561: &lt;http://trac.webkit.org/changeset/78561&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>351263</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-02-15 07:55:40 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>351324</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-15 09:03:30 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/78561 might have broken GTK Linux 64-bit Debug</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82384</attachid>
            <date>2011-02-14 16:38:26 -0800</date>
            <delta_ts>2011-02-14 17:56:15 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-54219-20110214163824.patch</filename>
            <type>text/plain</type>
            <size>5210</size>
            <attacher name="Charles Reis">creis</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc4NTIzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTEtMDItMTQgIENoYXJsaWUg
UmVpcyAgPGNyZWlzQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBDcmFzaCBpbiBXZWJDb3JlOjpGcmFtZUxvYWRlcjo6Y29udGlu
dWVMb2FkQWZ0ZXJOYXZpZ2F0aW9uUG9saWN5CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01NDIxOQorCisgICAgICAgIEVuc3VyZSB3ZSBkbyBub3Qgc3Rh
cnQgYSBuZXcgbmF2aWdhdGlvbiB3aGlsZSB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YKKyAgICAg
ICAgc3RvcHBpbmcgYSBuYXZpZ2F0aW9uLgorCisgICAgICAgICogbG9hZGVyL0ZyYW1lTG9hZGVy
LmNwcDoKKwogMjAxMS0wMi0xNCAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUuY29tPgog
CiAgICAgICAgIENvcHkvcGFzdGUgZnJvbSBhIFdlYktpdCB3aW5kb3cgdG8gYSBUZXh0RWRpdCB3
aW5kb3cgbG9zZXMgZm9udHMuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2Fk
ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5j
cHAJKHJldmlzaW9uIDc4NTIzKQorKysgU291cmNlL1dlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTMwMSw2ICsxMzAxLDkgQEAgdm9pZCBGcmFtZUxvYWRl
cjo6bG9hZEZyYW1lUmVxdWVzdChjb25zdAogdm9pZCBGcmFtZUxvYWRlcjo6bG9hZFVSTChjb25z
dCBLVVJMJiBuZXdVUkwsIGNvbnN0IFN0cmluZyYgcmVmZXJyZXIsIGNvbnN0IFN0cmluZyYgZnJh
bWVOYW1lLCBib29sIGxvY2tIaXN0b3J5LCBGcmFtZUxvYWRUeXBlIG5ld0xvYWRUeXBlLAogICAg
IFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50LCBQYXNzUmVmUHRyPEZvcm1TdGF0ZT4gcHJwRm9ybVN0
YXRlKQogeworICAgIGlmIChtX2luU3RvcEFsbExvYWRlcnMpCisgICAgICAgIHJldHVybjsKKwog
ICAgIFJlZlB0cjxGb3JtU3RhdGU+IGZvcm1TdGF0ZSA9IHBycEZvcm1TdGF0ZTsKICAgICBib29s
IGlzRm9ybVN1Ym1pc3Npb24gPSBmb3JtU3RhdGU7CiAgICAgCkluZGV4OiBMYXlvdXRUZXN0cy9D
aGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA3
ODUyMykKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDE3IEBACisyMDExLTAyLTE0ICBDaGFybGllIFJlaXMgIDxjcmVpc0BjaHJvbWl1bS5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ3Jhc2ggaW4g
V2ViQ29yZTo6RnJhbWVMb2FkZXI6OmNvbnRpbnVlTG9hZEFmdGVyTmF2aWdhdGlvblBvbGljeQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQyMTkKKwor
ICAgICAgICBUZXN0cyB0aGF0IHdlIGRvIG5vdCBzdGFydCBhIG5ldyBuYXZpZ2F0aW9uIGR1ZSB0
byBhbiBvbmxvYWQgaGFuZGxlcgorICAgICAgICB0cmlnZ2VyZWQgYnkgYSBiYWNrIG5hdmlnYXRp
b24uCisKKyAgICAgICAgKiBodHRwL3Rlc3RzL2hpc3RvcnkvbmF2aWdhdGlvbi1kdXJpbmctb25s
b2FkLXRyaWdnZXJlZC1ieS1iYWNrLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogaHR0
cC90ZXN0cy9oaXN0b3J5L25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC10cmlnZ2VyZWQtYnktYmFj
ay5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBodHRwL3Rlc3RzL2hpc3RvcnkvcmVzb3VyY2VzL25h
dmlnYXRpb24tZHVyaW5nLW9ubG9hZC1jb250YWluZXIuaHRtbDogQWRkZWQuCisKIDIwMTEtMDIt
MTQgIFBldGVyIEthc3RpbmcgIDxwa2FzdGluZ0Bnb29nbGUuY29tPgogCiAgICAgICAgIFVucmV2
aWV3ZWQsIENocm9taXVtIHRlc3QgZXhwZWN0YXRpb25zIHVwZGF0ZS4KSW5kZXg6IExheW91dFRl
c3RzL2h0dHAvdGVzdHMvaGlzdG9yeS9uYXZpZ2F0aW9uLWR1cmluZy1vbmxvYWQtdHJpZ2dlcmVk
LWJ5LWJhY2stZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVz
dHMvaGlzdG9yeS9uYXZpZ2F0aW9uLWR1cmluZy1vbmxvYWQtdHJpZ2dlcmVkLWJ5LWJhY2stZXhw
ZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9oaXN0b3J5
L25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC10cmlnZ2VyZWQtYnktYmFjay1leHBlY3RlZC50eHQJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAgQEAKK0NPTlNPTEUgTUVTU0FHRTogbGluZSAyMzog
U3RhcnRpbmcgdGVzdC4KK1Rlc3RzIHRoYXQgYW4gb25sb2FkIGhhbmRsZXIgdGhhdCBuYXZpZ2F0
ZXMgdG8gYSBoYXNoIHdoaWNoIGlzIHRyaWdnZXJlZCBieSBhIGhpc3RvcnkuYmFjaygpIGRvZXNu
J3QgY3Jhc2ggdGhlIGJyb3dzZXIuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmll
cyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQ
QVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDog
TGF5b3V0VGVzdHMvaHR0cC90ZXN0cy9oaXN0b3J5L25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC10
cmlnZ2VyZWQtYnktYmFjay5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2h0dHAvdGVz
dHMvaGlzdG9yeS9uYXZpZ2F0aW9uLWR1cmluZy1vbmxvYWQtdHJpZ2dlcmVkLWJ5LWJhY2suaHRt
bAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2h0dHAvdGVzdHMvaGlzdG9yeS9uYXZpZ2F0
aW9uLWR1cmluZy1vbmxvYWQtdHJpZ2dlcmVkLWJ5LWJhY2suaHRtbAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwzOCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxoZWFkPgorICA8bGluayBy
ZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2pzLXRlc3QtcmVzb3VyY2VzL2pzLXRlc3Qtc3R5
bGUuY3NzIj4KKyAgPHNjcmlwdCBzcmM9Ii4uLy4uL2pzLXRlc3QtcmVzb3VyY2VzL2pzLXRlc3Qt
cHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHAgaWQ9ImRlc2NyaXB0aW9uIj48
L3A+Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworPHNjcmlwdD4KK2Rlc2NyaXB0aW9uKCdU
ZXN0cyB0aGF0IGFuIG9ubG9hZCBoYW5kbGVyIHRoYXQgbmF2aWdhdGVzIHRvIGEgaGFzaCB3aGlj
aCBpcyB0cmlnZ2VyZWQgYnkgYSBoaXN0b3J5LmJhY2soKSBkb2VzblwndCBjcmFzaCB0aGUgYnJv
d3Nlci4nKTsKKworb25sb2FkID0gZnVuY3Rpb24oKQoreworICAgIGlmICh3aW5kb3cubG9jYWxT
dG9yYWdlLnN0YXJ0ZWQpIHsKKyAgICAgICAgZGVsZXRlIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc3Rh
cnRlZDsKKyAgICAgICAgZmluaXNoSlNUZXN0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8g
VG8gbWFrZSBzdXJlIHRoYXQgd2UgaGl0IHRoaXMgYnJhbmNoLCBsb2cgdGhpcyB0byB0aGUgY29u
c29sZSBzbyB0aGF0IAorICAgICAgICAvLyBpdCBzaG93cyB1cCBpbiBleHBlY3RlZCBvdXRwdXQg
KGRlYnVnKCkgd2lsbCBiZSBibG93biBhd2F5IG9uY2Ugd2UKKyAgICAgICAgLy8gbmF2aWdhdGUg
b3V0KS4KKyAgICAgICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIHRlc3QuJyk7CisgICAgICAgIHdp
bmRvdy5sb2NhbFN0b3JhZ2Uuc3RhcnRlZCA9IHRydWU7CisgICAgICAgIC8vIE5hdmlnYXRlIGlu
IGEgdGltZW91dCB0byBtYWtlIHN1cmUgd2UgY3JlYXRlIGEgaGlzdG9yeSBlbnRyeS4KKyAgICAg
ICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5o
cmVmID0gJ3Jlc291cmNlcy9uYXZpZ2F0aW9uLWR1cmluZy1vbmxvYWQtY29udGFpbmVyLmh0bWwn
OworICAgICAgICB9LCAwKTsKKyAgICB9Cit9OworCit2YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0g
dHJ1ZTsKK3ZhciBqc1Rlc3RJc0FzeW5jID0gdHJ1ZTsKKzwvc2NyaXB0PiAKKworPHNjcmlwdCBz
cmM9Ii4uLy4uL2pzLXRlc3QtcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8
L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2hpc3RvcnkvcmVz
b3VyY2VzL25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC1jb250YWluZXIuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9odHRwL3Rlc3RzL2hpc3RvcnkvcmVzb3VyY2VzL25hdmlnYXRpb24t
ZHVyaW5nLW9ubG9hZC1jb250YWluZXIuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2h0dHAvdGVzdHMvaGlzdG9yeS9yZXNvdXJjZXMvbmF2aWdhdGlvbi1kdXJpbmctb25sb2FkLWNv
bnRhaW5lci5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyIEBACis8c2NyaXB0Pgorb25s
b2FkID0gZnVuY3Rpb24oKSB7CisgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjZm9vIik7Cit9
OworPC9zY3JpcHQ+Citjb250YWluZXIKKzxpZnJhbWUgc3JjPSJiYWNrLWR1cmluZy1vbmxvYWQt
bWlkZGxlLmh0bWwiPjwvaWZyYW1lPgorPHNjcmlwdD4KKy8vIE5vdGU6IFRoaXMgYmFjayBuYXZp
Z2F0aW9uIG11c3QgYmUgZG9uZSB3aXRoIHRoZSBicm93c2VyJ3MgYmFjayBidXR0b24gdG8KKy8v
IGNhdXNlIHRoZSBjcmFzaCBzZWVuIGluIGh0dHA6Ly93ZWJraXQub3JnL2IvNTQyMTkuCitoaXN0
b3J5LmJhY2soKTsKKzwvc2NyaXB0Pgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>82399</attachid>
            <date>2011-02-14 17:56:18 -0800</date>
            <delta_ts>2011-02-15 07:55:35 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-54219-20110214175617.patch</filename>
            <type>text/plain</type>
            <size>3183</size>
            <attacher name="Charles Reis">creis</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc4NTIzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTggQEAKKzIwMTEtMDItMTQgIENoYXJsaWUg
UmVpcyAgPGNyZWlzQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBDcmFzaCBpbiBXZWJDb3JlOjpGcmFtZUxvYWRlcjo6Y29udGlu
dWVMb2FkQWZ0ZXJOYXZpZ2F0aW9uUG9saWN5CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD01NDIxOQorCisgICAgICAgIEVuc3VyZXMgd2UgZG8gbm90IHN0
YXJ0IGEgbmV3IG5hdmlnYXRpb24gd2hpbGUgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mCisgICAg
ICAgIHN0b3BwaW5nIGEgbmF2aWdhdGlvbi4gIEFsc28gYWRkcyBhIG1hbnVhbCB0ZXN0LCBzaW5j
ZSB0aGUgY3Jhc2ggY2FuCisgICAgICAgIG9ubHkgYmUgcmVwcm9kdWNlZCB1c2luZyB0aGUgYmFj
ayBidXR0b24gYW5kIG5vdCBoaXN0b3J5LmJhY2soKS4KKworICAgICAgICAqIGxvYWRlci9GcmFt
ZUxvYWRlci5jcHA6CisgICAgICAgICogbWFudWFsLXRlc3RzL25hdmlnYXRpb24tZHVyaW5nLW9u
bG9hZC10cmlnZ2VyZWQtYnktYmFjay5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBtYW51YWwtdGVz
dHMvcmVzb3VyY2VzL25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC1jb250YWluZXIuaHRtbDogQWRk
ZWQuCisKIDIwMTEtMDItMTQgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KIAog
ICAgICAgICBDb3B5L3Bhc3RlIGZyb20gYSBXZWJLaXQgd2luZG93IHRvIGEgVGV4dEVkaXQgd2lu
ZG93IGxvc2VzIGZvbnRzLgpJbmRleDogU291cmNlL1dlYkNvcmUvbG9hZGVyL0ZyYW1lTG9hZGVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9sb2FkZXIvRnJhbWVMb2FkZXIuY3Bw
CShyZXZpc2lvbiA3ODUyMykKKysrIFNvdXJjZS9XZWJDb3JlL2xvYWRlci9GcmFtZUxvYWRlci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMDEsNiArMTMwMSw5IEBAIHZvaWQgRnJhbWVMb2FkZXI6
OmxvYWRGcmFtZVJlcXVlc3QoY29uc3QKIHZvaWQgRnJhbWVMb2FkZXI6OmxvYWRVUkwoY29uc3Qg
S1VSTCYgbmV3VVJMLCBjb25zdCBTdHJpbmcmIHJlZmVycmVyLCBjb25zdCBTdHJpbmcmIGZyYW1l
TmFtZSwgYm9vbCBsb2NrSGlzdG9yeSwgRnJhbWVMb2FkVHlwZSBuZXdMb2FkVHlwZSwKICAgICBQ
YXNzUmVmUHRyPEV2ZW50PiBldmVudCwgUGFzc1JlZlB0cjxGb3JtU3RhdGU+IHBycEZvcm1TdGF0
ZSkKIHsKKyAgICBpZiAobV9pblN0b3BBbGxMb2FkZXJzKQorICAgICAgICByZXR1cm47CisKICAg
ICBSZWZQdHI8Rm9ybVN0YXRlPiBmb3JtU3RhdGUgPSBwcnBGb3JtU3RhdGU7CiAgICAgYm9vbCBp
c0Zvcm1TdWJtaXNzaW9uID0gZm9ybVN0YXRlOwogICAgIApJbmRleDogU291cmNlL1dlYkNvcmUv
bWFudWFsLXRlc3RzL25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC10cmlnZ2VyZWQtYnktYmFjay5o
dG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL21hbnVhbC10ZXN0cy9uYXZpZ2F0aW9u
LWR1cmluZy1vbmxvYWQtdHJpZ2dlcmVkLWJ5LWJhY2suaHRtbAkocmV2aXNpb24gMCkKKysrIFNv
dXJjZS9XZWJDb3JlL21hbnVhbC10ZXN0cy9uYXZpZ2F0aW9uLWR1cmluZy1vbmxvYWQtdHJpZ2dl
cmVkLWJ5LWJhY2suaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+Cis8
aGVhZD4KKzwvaGVhZD4KKzxib2R5PgorPHA+U2FtZS1kb2N1bWVudCBuYXZpZ2F0aW9uIGluIG9u
bG9hZCB0cmlnZ2VyZWQgYnkgYmFjayBuYXZpZ2F0aW9uLjwvcD4KKyAgICA8b2w+CisgICAgICAg
IDxsaT5TdGFydCB0aGUgbGF5b3V0IHRlc3Qgd2ViIHNlcnZlciB3aXRoIFRvb2xzL1NjcmlwdHMv
cnVuLXdlYmtpdC1odHRwZC48L2xpPgorICAgICAgICA8bGk+Q2xpY2sgPGEgaHJlZj0icmVzb3Vy
Y2VzL25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC1jb250YWluZXIuaHRtbCI+aGVyZTwvYT4uPC9s
aT4KKyAgICAgICAgPGxpPkNsaWNrIEJhY2suPC9saT4KKyAgICA8L29sPgorPHA+WW91IHNob3Vs
ZCBub3QgY3Jhc2guPC9wPgorPHA+V2UgY2Fubm90IHVzZSBoaXN0b3J5LmJhY2soKSB0byB0ZXN0
IHRoaXMsIGJlY2F1c2UgaXQgY2FsbHMgUGFnZTo6Z29Ub0l0ZW0KKyh3aGljaCBjYWxscyBGcmFt
ZUxvYWRlcjo6c3RvcEFsbExvYWRlcnMpIGZpcnN0LiAgQ2hyb21pdW0ncyBiYWNrIGJ1dHRvbiBk
b2VzCitub3QgY2FsbCBzdG9wQWxsTG9hZGVycyBmaXJzdC48L3A+Cis8L2JvZHk+Cis8L2h0bWw+
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9tYW51YWwtdGVzdHMvcmVzb3VyY2VzL25hdmlnYXRpb24t
ZHVyaW5nLW9ubG9hZC1jb250YWluZXIuaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9tYW51YWwtdGVzdHMvcmVzb3VyY2VzL25hdmlnYXRpb24tZHVyaW5nLW9ubG9hZC1jb250YWlu
ZXIuaHRtbAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL21hbnVhbC10ZXN0cy9yZXNv
dXJjZXMvbmF2aWdhdGlvbi1kdXJpbmctb25sb2FkLWNvbnRhaW5lci5odG1sCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDEwIEBACis8c2NyaXB0Pgorb25sb2FkID0gZnVuY3Rpb24oKSB7CisgIHdp
bmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjZm9vIik7Cit9OworPC9zY3JpcHQ+Citjb250YWluZXIK
KzxpZnJhbWUgc3JjPSJodHRwOi8vMTI3LjAuMC4xOjgwMDAvaGlzdG9yeS9yZXNvdXJjZXMvYmFj
ay1kdXJpbmctb25sb2FkLW1pZGRsZS5odG1sIj48L2lmcmFtZT4KKzxwPgorQ2xpY2sgdGhlIGJh
Y2sgYnV0dG9uIGFuZCBzZWUgaWYgdGhlIGJyb3dzZXIgY3Jhc2hlcy4KKzwvcD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>