<?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>31494</bug_id>
          
          <creation_ts>2009-11-13 14:35:55 -0800</creation_ts>
          <short_desc>Add unauthenticated proxy support to SocketStreamHandleCFNet</short_desc>
          <delta_ts>2009-11-16 09:59:42 -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>Platform</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="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>163528</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-13 14:35:55 -0800</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163529</commentid>
    <comment_count>1</comment_count>
      <attachid>43205</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-13 14:38:06 -0800</bug_when>
    <thetext>Created attachment 43205
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163780</commentid>
    <comment_count>2</comment_count>
      <attachid>43205</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-11-15 15:04:10 -0800</bug_when>
    <thetext>Comment on attachment 43205
proposed patch

&gt;  void SocketStreamHandle::chooseProxy()
&gt;  {
&gt; -    // FIXME: Retrieve proxy information.
&gt; +#if !defined(BUILDING_ON_TIGER) &amp;&amp; !defined(BUILDING_ON_LEOPARD)
&gt; +    RetainPtr&lt;CFDictionaryRef&gt; proxyDictionary(AdoptCF, CFNetworkCopySystemProxySettings());
&gt; +#else
&gt; +    // We don&apos;t need proxy information often, so there is no need to set up a permanent dynamic store session.
&gt; +    RetainPtr&lt;CFDictionaryRef&gt; proxyDictionary(AdoptCF, SCDynamicStoreCopyProxies(0));
&gt; +#endif
&gt; +
&gt; +    // SOCKS or HTTPS (AKA CONNECT) proxies are supported.
&gt; +    // WebSocket protocol relies on handshake being transferred unchanged, so we need a proxy that will not modify headers.
&gt; +    // Since HTTP proxies must add Via headers, they are highly unlikely to work.
&gt; +    // Many CONNECT proxies limit connectivity to port 443, so we prefer SOCKS, if configured.
&gt; +
&gt; +    if (!proxyDictionary) {
&gt; +        m_connectionType = Direct;
&gt; +        return;
&gt; +    }
&gt; +
&gt; +#ifndef BUILDING_ON_TIGER
&gt; +    // CFNetworkCopyProxiesForURL doesn&apos;t know about WebSocket schemes, so pretend to use http.
&gt; +    // Always use &quot;https&quot; to get HTTPS proxies in result - we&apos;ll try to use those for ws:. even though many are configured to reject connections to ports other than 443.
&gt; +    KURL httpsURL(KURL(), &quot;https://&quot; + m_url.host());
&gt; +    RetainPtr&lt;CFURLRef&gt; httpsURLCF(AdoptCF, httpsURL.createCFURL());
&gt; +
&gt; +    RetainPtr&lt;CFArrayRef&gt; proxyArray(AdoptCF, CFNetworkCopyProxiesForURL(httpsURLCF.get(), proxyDictionary.get()));
&gt; +    CFIndex proxyArrayCount = CFArrayGetCount(proxyArray.get());
&gt; +
&gt; +    // FIXME: Support PAC files (always the preferred entry).
&gt; +
&gt; +    CFDictionaryRef chosenProxy = 0;
&gt; +    for (CFIndex i = 0; i &lt; proxyArrayCount; ++i) {
&gt; +        CFDictionaryRef proxyInfo = static_cast&lt;CFDictionaryRef&gt;(CFArrayGetValueAtIndex(proxyArray.get(), i));
&gt; +        CFTypeRef proxyType = CFDictionaryGetValue(proxyInfo, kCFProxyTypeKey);
&gt; +        if (proxyType &amp;&amp; CFGetTypeID(proxyType) == CFStringGetTypeID()) {
&gt; +            if (CFEqual(proxyType, kCFProxyTypeSOCKS)) {
&gt; +                m_connectionType = SOCKSProxy;
&gt; +                chosenProxy = proxyInfo;
&gt; +                break;
&gt; +            }
&gt; +            if (CFEqual(proxyType, kCFProxyTypeHTTPS)) {
&gt; +                m_connectionType = CONNECTProxy;
&gt; +                chosenProxy = proxyInfo;
&gt; +                // Keep looking for proxies, as a SOCKS one is preferable.
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +
&gt; +    if (chosenProxy) {
&gt; +        ASSERT(m_connectionType != Unknown);
&gt; +        ASSERT(m_connectionType != Direct);
&gt; +
&gt; +        CFTypeRef proxyHost = CFDictionaryGetValue(chosenProxy, kCFProxyHostNameKey);
&gt; +        CFTypeRef proxyPort = CFDictionaryGetValue(chosenProxy, kCFProxyPortNumberKey);
&gt; +
&gt; +        if (proxyHost &amp;&amp; CFGetTypeID(proxyHost) == CFStringGetTypeID() &amp;&amp; proxyPort &amp;&amp; CFGetTypeID(proxyPort) == CFNumberGetTypeID()) {
&gt; +            m_proxyHost = static_cast&lt;CFStringRef&gt;(proxyHost);
&gt; +            m_proxyPort = static_cast&lt;CFNumberRef&gt;(proxyPort);
&gt; +            return;
&gt; +        }
&gt; +    }
&gt; +#else // BUILDING_ON_TIGER
&gt; +    // FIXME: check proxy bypass list and ExcludeSimpleHostnames.
&gt; +    // FIXME: Support PAC files.
&gt; +
&gt; +    CFTypeRef socksEnableCF = CFDictionaryGetValue(proxyDictionary.get(), kSCPropNetProxiesSOCKSEnable);
&gt; +    int socksEnable;
&gt; +    if (socksEnableCF &amp;&amp; CFGetTypeID(socksEnableCF) == CFNumberGetTypeID() &amp;&amp; CFNumberGetValue(static_cast&lt;CFNumberRef&gt;(socksEnableCF), kCFNumberIntType, &amp;socksEnable) &amp;&amp; socksEnable) {
&gt; +        CFTypeRef proxyHost = CFDictionaryGetValue(proxyDictionary.get(), kSCPropNetProxiesSOCKSProxy);
&gt; +        CFTypeRef proxyPort = CFDictionaryGetValue(proxyDictionary.get(), kSCPropNetProxiesSOCKSPort);
&gt; +        if (proxyHost &amp;&amp; CFGetTypeID(proxyHost) == CFStringGetTypeID() &amp;&amp; proxyPort &amp;&amp; CFGetTypeID(proxyPort) == CFNumberGetTypeID()) {
&gt; +            m_proxyHost = static_cast&lt;CFStringRef&gt;(proxyHost);
&gt; +            m_proxyPort = static_cast&lt;CFNumberRef&gt;(proxyPort);
&gt; +            m_connectionType = SOCKSProxy;
&gt; +            return;
&gt; +        }
&gt; +    }
&gt; +
&gt; +    CFTypeRef httpsEnableCF = CFDictionaryGetValue(proxyDictionary.get(), kSCPropNetProxiesHTTPSEnable);
&gt; +    int httpsEnable;
&gt; +    if (httpsEnableCF &amp;&amp; CFGetTypeID(httpsEnableCF) == CFNumberGetTypeID() &amp;&amp; CFNumberGetValue(static_cast&lt;CFNumberRef&gt;(httpsEnableCF), kCFNumberIntType, &amp;httpsEnable) &amp;&amp; httpsEnable) {
&gt; +        CFTypeRef proxyHost = CFDictionaryGetValue(proxyDictionary.get(), kSCPropNetProxiesHTTPSProxy);
&gt; +        CFTypeRef proxyPort = CFDictionaryGetValue(proxyDictionary.get(), kSCPropNetProxiesHTTPSPort);
&gt; +
&gt; +        if (proxyHost &amp;&amp; CFGetTypeID(proxyHost) == CFStringGetTypeID() &amp;&amp; proxyPort &amp;&amp; CFGetTypeID(proxyPort) == CFNumberGetTypeID()) {
&gt; +            m_proxyHost = static_cast&lt;CFStringRef&gt;(proxyHost);
&gt; +            m_proxyPort = static_cast&lt;CFNumberRef&gt;(proxyPort);
&gt; +            m_connectionType = CONNECTProxy;
&gt; +            return;
&gt; +        }
&gt; +    }
&gt; +#endif
&gt; +
&gt;      m_connectionType = Direct;
&gt;  }

So much of this is #ifdef&apos;d that it seems maybe we should have an entirely separate copy of the function for Tiger.

&gt; +    case SOCKSProxy: {
&gt; +        // FIXME: SOCKS5 doesn&apos;t do challenge-response, should we try to apply credentials from Keychain right away?
&gt; +        // But SOCKS5 credentials don&apos;t work at the time of this writing anyway, see &lt;rdar://6776698&gt;.
&gt; +        const void* proxyKeys[] = { kCFStreamPropertySOCKSProxyHost, kCFStreamPropertySOCKSProxyPort };
&gt; +        const void* proxyValues[] = { m_proxyHost.get(), m_proxyPort.get() };
&gt; +        RetainPtr&lt;CFDictionaryRef&gt; connectDictionary(AdoptCF, CFDictionaryCreate(0, proxyKeys, proxyValues, sizeof(proxyKeys) / sizeof(*proxyKeys), &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks));
&gt; +        CFReadStreamSetProperty(m_readStream.get(), kCFStreamPropertySOCKSProxy, connectDictionary.get());
&gt; +        break;
&gt; +        }
&gt; +    case CONNECTProxy: {
&gt; +        const void* proxyKeys[] = { kCFStreamPropertyCONNECTProxyHost, kCFStreamPropertyCONNECTProxyPort };
&gt; +        const void* proxyValues[] = { m_proxyHost.get(), m_proxyPort.get() };
&gt; +        RetainPtr&lt;CFDictionaryRef&gt; connectDictionary(AdoptCF, CFDictionaryCreate(0, proxyKeys, proxyValues, sizeof(proxyKeys) / sizeof(*proxyKeys), &amp;kCFTypeDictionaryKeyCallBacks, &amp;kCFTypeDictionaryValueCallBacks));
&gt; +        CFReadStreamSetProperty(m_readStream.get(), kCFStreamPropertyCONNECTProxy, connectDictionary.get());
&gt; +        break;
&gt; +        }
&gt; +    }

I think the braces are not right here. Either we need to indent the code another level, or move the ending brace one level to the left.

I think this shows why some were pushing to indent cases one level inside a switch statement. I think I was one of those people. Too bad we didn&apos;t discuss this aspect of it. We should probably briefly discuss on webkit-dev, although I am sick of coding style discussions!

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163807</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-15 16:40:50 -0800</bug_when>
    <thetext>&gt; I think this shows why some were pushing to indent cases one level inside a
&gt; switch statement.

That&apos;s certainly why I prefer that style!

With the current guidelines, I think that what I have here is better than having two braces right underneath each other.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>164015</commentid>
    <comment_count>4</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-16 09:59:42 -0800</bug_when>
    <thetext>Committed &lt;http://trac.webkit.org/changeset/51040&gt;.

&gt; So much of this is #ifdef&apos;d that it seems maybe we should have an entirely
&gt; separate copy of the function for Tiger.

Sorry, missed this comment at first. I did consider this when making the patch, and have somewhat mixed feelings about it. I&apos;ll keep your comment in mind when working with this code next time (soon) to add PAC file support etc.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43205</attachid>
            <date>2009-11-13 14:38:06 -0800</date>
            <delta_ts>2009-11-15 15:04:09 -0800</delta_ts>
            <desc>proposed patch</desc>
            <filename>WSProxies.txt</filename>
            <type>text/plain</type>
            <size>8417</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDk2OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYgQEAKKzIwMDktMTEtMTMgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMxNDk0CisgICAgICAgIEFk
ZCB1bmF1dGhlbnRpY2F0ZWQgcHJveHkgc3VwcG9ydCB0byBTb2NrZXRTdHJlYW1IYW5kbGVDRk5l
dAorCisgICAgICAgIENhbm5vdCBiZSB0ZXN0ZWQgaW4gRFJULgorCisgICAgICAgICogcGxhdGZv
cm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGVDRk5ldC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNob29zZVByb3h5KTogRmV0Y2ggcHJveHkgaW5mb3Jt
YXRpb24gZnJvbSBPUy4KKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6Y3Jl
YXRlU3RyZWFtcyk6IEFwcGx5IGl0IHRvIHRoZSBuZXdseSBjcmVhdGVkIHN0cmVhbXMuCisKIDIw
MDktMTEtMTMgIEhpcm9ub3JpIEJvbm8gIDxoYm9ub0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgT2xpdmVyIEh1bnQuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y2YvU29ja2V0U3RyZWFtSGFuZGxlQ0ZOZXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGVDRk5ldC5jcHAJKHJldmlzaW9uIDUw
OTUzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZUNG
TmV0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsNiArMzYsMTggQEAKICNpbmNsdWRlICJTb2Nr
ZXRTdHJlYW1FcnJvci5oIgogI2luY2x1ZGUgIlNvY2tldFN0cmVhbUhhbmRsZUNsaWVudC5oIgog
CisjaWYgZGVmaW5lZChCVUlMRElOR19PTl9USUdFUikgfHwgZGVmaW5lZChCVUlMRElOR19PTl9M
RU9QQVJEKQorI2luY2x1ZGUgPFN5c3RlbUNvbmZpZ3VyYXRpb24vU3lzdGVtQ29uZmlndXJhdGlv
bi5oPgorI2VuZGlmCisKKyNpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSA8Q0ZOZXR3b3JrL0NG
U29ja2V0U3RyZWFtUHJpdi5oPgorI2Vsc2UKK2V4dGVybiBjb25zdCBDRlN0cmluZ1JlZiBrQ0ZT
dHJlYW1Qcm9wZXJ0eUNPTk5FQ1RQcm94eTsKK2V4dGVybiBjb25zdCBDRlN0cmluZ1JlZiBrQ0ZT
dHJlYW1Qcm9wZXJ0eUNPTk5FQ1RQcm94eUhvc3Q7CitleHRlcm4gY29uc3QgQ0ZTdHJpbmdSZWYg
a0NGU3RyZWFtUHJvcGVydHlDT05ORUNUUHJveHlQb3J0OworI2VuZGlmCisKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogU29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUoY29uc3Qg
S1VSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNsaWVudCkKQEAgLTc0LDcgKzg2
LDk3IEBAIFNvY2tldFN0cmVhbUhhbmRsZTo6U29ja2V0U3RyZWFtSGFuZGxlKGMKIAogdm9pZCBT
b2NrZXRTdHJlYW1IYW5kbGU6OmNob29zZVByb3h5KCkKIHsKLSAgICAvLyBGSVhNRTogUmV0cmll
dmUgcHJveHkgaW5mb3JtYXRpb24uCisjaWYgIWRlZmluZWQoQlVJTERJTkdfT05fVElHRVIpICYm
ICFkZWZpbmVkKEJVSUxESU5HX09OX0xFT1BBUkQpCisgICAgUmV0YWluUHRyPENGRGljdGlvbmFy
eVJlZj4gcHJveHlEaWN0aW9uYXJ5KEFkb3B0Q0YsIENGTmV0d29ya0NvcHlTeXN0ZW1Qcm94eVNl
dHRpbmdzKCkpOworI2Vsc2UKKyAgICAvLyBXZSBkb24ndCBuZWVkIHByb3h5IGluZm9ybWF0aW9u
IG9mdGVuLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCB1cCBhIHBlcm1hbmVudCBkeW5hbWlj
IHN0b3JlIHNlc3Npb24uCisgICAgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4gcHJveHlEaWN0
aW9uYXJ5KEFkb3B0Q0YsIFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoMCkpOworI2VuZGlmCisK
KyAgICAvLyBTT0NLUyBvciBIVFRQUyAoQUtBIENPTk5FQ1QpIHByb3hpZXMgYXJlIHN1cHBvcnRl
ZC4KKyAgICAvLyBXZWJTb2NrZXQgcHJvdG9jb2wgcmVsaWVzIG9uIGhhbmRzaGFrZSBiZWluZyB0
cmFuc2ZlcnJlZCB1bmNoYW5nZWQsIHNvIHdlIG5lZWQgYSBwcm94eSB0aGF0IHdpbGwgbm90IG1v
ZGlmeSBoZWFkZXJzLgorICAgIC8vIFNpbmNlIEhUVFAgcHJveGllcyBtdXN0IGFkZCBWaWEgaGVh
ZGVycywgdGhleSBhcmUgaGlnaGx5IHVubGlrZWx5IHRvIHdvcmsuCisgICAgLy8gTWFueSBDT05O
RUNUIHByb3hpZXMgbGltaXQgY29ubmVjdGl2aXR5IHRvIHBvcnQgNDQzLCBzbyB3ZSBwcmVmZXIg
U09DS1MsIGlmIGNvbmZpZ3VyZWQuCisKKyAgICBpZiAoIXByb3h5RGljdGlvbmFyeSkgeworICAg
ICAgICBtX2Nvbm5lY3Rpb25UeXBlID0gRGlyZWN0OworICAgICAgICByZXR1cm47CisgICAgfQor
CisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgLy8gQ0ZOZXR3b3JrQ29weVByb3hpZXNG
b3JVUkwgZG9lc24ndCBrbm93IGFib3V0IFdlYlNvY2tldCBzY2hlbWVzLCBzbyBwcmV0ZW5kIHRv
IHVzZSBodHRwLgorICAgIC8vIEFsd2F5cyB1c2UgImh0dHBzIiB0byBnZXQgSFRUUFMgcHJveGll
cyBpbiByZXN1bHQgLSB3ZSdsbCB0cnkgdG8gdXNlIHRob3NlIGZvciB3czouIGV2ZW4gdGhvdWdo
IG1hbnkgYXJlIGNvbmZpZ3VyZWQgdG8gcmVqZWN0IGNvbm5lY3Rpb25zIHRvIHBvcnRzIG90aGVy
IHRoYW4gNDQzLgorICAgIEtVUkwgaHR0cHNVUkwoS1VSTCgpLCAiaHR0cHM6Ly8iICsgbV91cmwu
aG9zdCgpKTsKKyAgICBSZXRhaW5QdHI8Q0ZVUkxSZWY+IGh0dHBzVVJMQ0YoQWRvcHRDRiwgaHR0
cHNVUkwuY3JlYXRlQ0ZVUkwoKSk7CisKKyAgICBSZXRhaW5QdHI8Q0ZBcnJheVJlZj4gcHJveHlB
cnJheShBZG9wdENGLCBDRk5ldHdvcmtDb3B5UHJveGllc0ZvclVSTChodHRwc1VSTENGLmdldCgp
LCBwcm94eURpY3Rpb25hcnkuZ2V0KCkpKTsKKyAgICBDRkluZGV4IHByb3h5QXJyYXlDb3VudCA9
IENGQXJyYXlHZXRDb3VudChwcm94eUFycmF5LmdldCgpKTsKKworICAgIC8vIEZJWE1FOiBTdXBw
b3J0IFBBQyBmaWxlcyAoYWx3YXlzIHRoZSBwcmVmZXJyZWQgZW50cnkpLgorCisgICAgQ0ZEaWN0
aW9uYXJ5UmVmIGNob3NlblByb3h5ID0gMDsKKyAgICBmb3IgKENGSW5kZXggaSA9IDA7IGkgPCBw
cm94eUFycmF5Q291bnQ7ICsraSkgeworICAgICAgICBDRkRpY3Rpb25hcnlSZWYgcHJveHlJbmZv
ID0gc3RhdGljX2Nhc3Q8Q0ZEaWN0aW9uYXJ5UmVmPihDRkFycmF5R2V0VmFsdWVBdEluZGV4KHBy
b3h5QXJyYXkuZ2V0KCksIGkpKTsKKyAgICAgICAgQ0ZUeXBlUmVmIHByb3h5VHlwZSA9IENGRGlj
dGlvbmFyeUdldFZhbHVlKHByb3h5SW5mbywga0NGUHJveHlUeXBlS2V5KTsKKyAgICAgICAgaWYg
KHByb3h5VHlwZSAmJiBDRkdldFR5cGVJRChwcm94eVR5cGUpID09IENGU3RyaW5nR2V0VHlwZUlE
KCkpIHsKKyAgICAgICAgICAgIGlmIChDRkVxdWFsKHByb3h5VHlwZSwga0NGUHJveHlUeXBlU09D
S1MpKSB7CisgICAgICAgICAgICAgICAgbV9jb25uZWN0aW9uVHlwZSA9IFNPQ0tTUHJveHk7Cisg
ICAgICAgICAgICAgICAgY2hvc2VuUHJveHkgPSBwcm94eUluZm87CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQ0ZFcXVhbChwcm94eVR5cGUs
IGtDRlByb3h5VHlwZUhUVFBTKSkgeworICAgICAgICAgICAgICAgIG1fY29ubmVjdGlvblR5cGUg
PSBDT05ORUNUUHJveHk7CisgICAgICAgICAgICAgICAgY2hvc2VuUHJveHkgPSBwcm94eUluZm87
CisgICAgICAgICAgICAgICAgLy8gS2VlcCBsb29raW5nIGZvciBwcm94aWVzLCBhcyBhIFNPQ0tT
IG9uZSBpcyBwcmVmZXJhYmxlLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgaWYgKGNob3NlblByb3h5KSB7CisgICAgICAgIEFTU0VSVChtX2Nvbm5lY3Rpb25UeXBlICE9
IFVua25vd24pOworICAgICAgICBBU1NFUlQobV9jb25uZWN0aW9uVHlwZSAhPSBEaXJlY3QpOwor
CisgICAgICAgIENGVHlwZVJlZiBwcm94eUhvc3QgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShjaG9z
ZW5Qcm94eSwga0NGUHJveHlIb3N0TmFtZUtleSk7CisgICAgICAgIENGVHlwZVJlZiBwcm94eVBv
cnQgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShjaG9zZW5Qcm94eSwga0NGUHJveHlQb3J0TnVtYmVy
S2V5KTsKKworICAgICAgICBpZiAocHJveHlIb3N0ICYmIENGR2V0VHlwZUlEKHByb3h5SG9zdCkg
PT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSAmJiBwcm94eVBvcnQgJiYgQ0ZHZXRUeXBlSUQocHJveHlQ
b3J0KSA9PSBDRk51bWJlckdldFR5cGVJRCgpKSB7CisgICAgICAgICAgICBtX3Byb3h5SG9zdCA9
IHN0YXRpY19jYXN0PENGU3RyaW5nUmVmPihwcm94eUhvc3QpOworICAgICAgICAgICAgbV9wcm94
eVBvcnQgPSBzdGF0aWNfY2FzdDxDRk51bWJlclJlZj4ocHJveHlQb3J0KTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8vIEJVSUxESU5HX09OX1RJR0VSCisg
ICAgLy8gRklYTUU6IGNoZWNrIHByb3h5IGJ5cGFzcyBsaXN0IGFuZCBFeGNsdWRlU2ltcGxlSG9z
dG5hbWVzLgorICAgIC8vIEZJWE1FOiBTdXBwb3J0IFBBQyBmaWxlcy4KKworICAgIENGVHlwZVJl
ZiBzb2Nrc0VuYWJsZUNGID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0aW9uYXJ5Lmdl
dCgpLCBrU0NQcm9wTmV0UHJveGllc1NPQ0tTRW5hYmxlKTsKKyAgICBpbnQgc29ja3NFbmFibGU7
CisgICAgaWYgKHNvY2tzRW5hYmxlQ0YgJiYgQ0ZHZXRUeXBlSUQoc29ja3NFbmFibGVDRikgPT0g
Q0ZOdW1iZXJHZXRUeXBlSUQoKSAmJiBDRk51bWJlckdldFZhbHVlKHN0YXRpY19jYXN0PENGTnVt
YmVyUmVmPihzb2Nrc0VuYWJsZUNGKSwga0NGTnVtYmVySW50VHlwZSwgJnNvY2tzRW5hYmxlKSAm
JiBzb2Nrc0VuYWJsZSkgeworICAgICAgICBDRlR5cGVSZWYgcHJveHlIb3N0ID0gQ0ZEaWN0aW9u
YXJ5R2V0VmFsdWUocHJveHlEaWN0aW9uYXJ5LmdldCgpLCBrU0NQcm9wTmV0UHJveGllc1NPQ0tT
UHJveHkpOworICAgICAgICBDRlR5cGVSZWYgcHJveHlQb3J0ID0gQ0ZEaWN0aW9uYXJ5R2V0VmFs
dWUocHJveHlEaWN0aW9uYXJ5LmdldCgpLCBrU0NQcm9wTmV0UHJveGllc1NPQ0tTUG9ydCk7Cisg
ICAgICAgIGlmIChwcm94eUhvc3QgJiYgQ0ZHZXRUeXBlSUQocHJveHlIb3N0KSA9PSBDRlN0cmlu
Z0dldFR5cGVJRCgpICYmIHByb3h5UG9ydCAmJiBDRkdldFR5cGVJRChwcm94eVBvcnQpID09IENG
TnVtYmVyR2V0VHlwZUlEKCkpIHsKKyAgICAgICAgICAgIG1fcHJveHlIb3N0ID0gc3RhdGljX2Nh
c3Q8Q0ZTdHJpbmdSZWY+KHByb3h5SG9zdCk7CisgICAgICAgICAgICBtX3Byb3h5UG9ydCA9IHN0
YXRpY19jYXN0PENGTnVtYmVyUmVmPihwcm94eVBvcnQpOworICAgICAgICAgICAgbV9jb25uZWN0
aW9uVHlwZSA9IFNPQ0tTUHJveHk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBDRlR5cGVSZWYgaHR0cHNFbmFibGVDRiA9IENGRGljdGlvbmFyeUdldFZhbHVl
KHByb3h5RGljdGlvbmFyeS5nZXQoKSwga1NDUHJvcE5ldFByb3hpZXNIVFRQU0VuYWJsZSk7Cisg
ICAgaW50IGh0dHBzRW5hYmxlOworICAgIGlmIChodHRwc0VuYWJsZUNGICYmIENGR2V0VHlwZUlE
KGh0dHBzRW5hYmxlQ0YpID09IENGTnVtYmVyR2V0VHlwZUlEKCkgJiYgQ0ZOdW1iZXJHZXRWYWx1
ZShzdGF0aWNfY2FzdDxDRk51bWJlclJlZj4oaHR0cHNFbmFibGVDRiksIGtDRk51bWJlckludFR5
cGUsICZodHRwc0VuYWJsZSkgJiYgaHR0cHNFbmFibGUpIHsKKyAgICAgICAgQ0ZUeXBlUmVmIHBy
b3h5SG9zdCA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdGlvbmFyeS5nZXQoKSwga1ND
UHJvcE5ldFByb3hpZXNIVFRQU1Byb3h5KTsKKyAgICAgICAgQ0ZUeXBlUmVmIHByb3h5UG9ydCA9
IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdGlvbmFyeS5nZXQoKSwga1NDUHJvcE5ldFBy
b3hpZXNIVFRQU1BvcnQpOworCisgICAgICAgIGlmIChwcm94eUhvc3QgJiYgQ0ZHZXRUeXBlSUQo
cHJveHlIb3N0KSA9PSBDRlN0cmluZ0dldFR5cGVJRCgpICYmIHByb3h5UG9ydCAmJiBDRkdldFR5
cGVJRChwcm94eVBvcnQpID09IENGTnVtYmVyR2V0VHlwZUlEKCkpIHsKKyAgICAgICAgICAgIG1f
cHJveHlIb3N0ID0gc3RhdGljX2Nhc3Q8Q0ZTdHJpbmdSZWY+KHByb3h5SG9zdCk7CisgICAgICAg
ICAgICBtX3Byb3h5UG9ydCA9IHN0YXRpY19jYXN0PENGTnVtYmVyUmVmPihwcm94eVBvcnQpOwor
ICAgICAgICAgICAgbV9jb25uZWN0aW9uVHlwZSA9IENPTk5FQ1RQcm94eTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCiAgICAgbV9jb25uZWN0aW9uVHlw
ZSA9IERpcmVjdDsKIH0KIApAQCAtOTcsNyArMTk5LDI5IEBAIHZvaWQgU29ja2V0U3RyZWFtSGFu
ZGxlOjpjcmVhdGVTdHJlYW1zKCkKICAgICBtX3JlYWRTdHJlYW0uYWRvcHRDRihyZWFkU3RyZWFt
KTsKICAgICBtX3dyaXRlU3RyZWFtLmFkb3B0Q0Yod3JpdGVTdHJlYW0pOwogCi0gICAgLy8gRklY
TUU6IEFwcGx5IHByb3h5IGluZm9ybWF0aW9uIHRvIHN0cmVhbXMuCisgICAgc3dpdGNoIChtX2Nv
bm5lY3Rpb25UeXBlKSB7CisgICAgY2FzZSBVbmtub3duOgorICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEaXJlY3Q6CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgU09DS1NQcm94eTogeworICAgICAgICAvLyBGSVhNRTogU09DS1M1IGRvZXNu
J3QgZG8gY2hhbGxlbmdlLXJlc3BvbnNlLCBzaG91bGQgd2UgdHJ5IHRvIGFwcGx5IGNyZWRlbnRp
YWxzIGZyb20gS2V5Y2hhaW4gcmlnaHQgYXdheT8KKyAgICAgICAgLy8gQnV0IFNPQ0tTNSBjcmVk
ZW50aWFscyBkb24ndCB3b3JrIGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyBhbnl3YXksIHNl
ZSA8cmRhcjovLzY3NzY2OTg+LgorICAgICAgICBjb25zdCB2b2lkKiBwcm94eUtleXNbXSA9IHsg
a0NGU3RyZWFtUHJvcGVydHlTT0NLU1Byb3h5SG9zdCwga0NGU3RyZWFtUHJvcGVydHlTT0NLU1By
b3h5UG9ydCB9OworICAgICAgICBjb25zdCB2b2lkKiBwcm94eVZhbHVlc1tdID0geyBtX3Byb3h5
SG9zdC5nZXQoKSwgbV9wcm94eVBvcnQuZ2V0KCkgfTsKKyAgICAgICAgUmV0YWluUHRyPENGRGlj
dGlvbmFyeVJlZj4gY29ubmVjdERpY3Rpb25hcnkoQWRvcHRDRiwgQ0ZEaWN0aW9uYXJ5Q3JlYXRl
KDAsIHByb3h5S2V5cywgcHJveHlWYWx1ZXMsIHNpemVvZihwcm94eUtleXMpIC8gc2l6ZW9mKCpw
cm94eUtleXMpLCAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlv
bmFyeVZhbHVlQ2FsbEJhY2tzKSk7CisgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KG1f
cmVhZFN0cmVhbS5nZXQoKSwga0NGU3RyZWFtUHJvcGVydHlTT0NLU1Byb3h5LCBjb25uZWN0RGlj
dGlvbmFyeS5nZXQoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBDT05O
RUNUUHJveHk6IHsKKyAgICAgICAgY29uc3Qgdm9pZCogcHJveHlLZXlzW10gPSB7IGtDRlN0cmVh
bVByb3BlcnR5Q09OTkVDVFByb3h5SG9zdCwga0NGU3RyZWFtUHJvcGVydHlDT05ORUNUUHJveHlQ
b3J0IH07CisgICAgICAgIGNvbnN0IHZvaWQqIHByb3h5VmFsdWVzW10gPSB7IG1fcHJveHlIb3N0
LmdldCgpLCBtX3Byb3h5UG9ydC5nZXQoKSB9OworICAgICAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPiBjb25uZWN0RGljdGlvbmFyeShBZG9wdENGLCBDRkRpY3Rpb25hcnlDcmVhdGUoMCwg
cHJveHlLZXlzLCBwcm94eVZhbHVlcywgc2l6ZW9mKHByb3h5S2V5cykgLyBzaXplb2YoKnByb3h5
S2V5cyksICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywgJmtDRlR5cGVEaWN0aW9uYXJ5
VmFsdWVDYWxsQmFja3MpKTsKKyAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkobV9yZWFk
U3RyZWFtLmdldCgpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eUNPTk5FQ1RQcm94eSwgY29ubmVjdERpY3Rp
b25hcnkuZ2V0KCkpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlm
IChzaG91bGRVc2VTU0woKSkgewogICAgICAgICBjb25zdCB2b2lkKiBrZXlzW10gPSB7IGtDRlN0
cmVhbVNTTFBlZXJOYW1lLCBrQ0ZTdHJlYW1TU0xMZXZlbCB9Owo=
</data>
<flag name="review"
          id="24900"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>