<?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>106056</bug_id>
          
          <creation_ts>2013-01-03 15:37:52 -0800</creation_ts>
          <short_desc>Objective-C objects that are passed to JavaScript leak (until the JSContext is destroyed)</short_desc>
          <delta_ts>2013-01-14 23:12:47 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>REOPENED</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Mark Hahnenberg">mhahnenberg</assigned_to>
          <cc>barraclough</cc>
    
    <cc>ggaren</cc>
    
    <cc>mhahnenberg</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>799770</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-01-03 15:37:52 -0800</bug_when>
    <thetext>The JSContext keeps alive all JSValues that reference Objective-C objects, even if the Objective-C objects and the JSValues have otherwise become unreachable. This means that if you have an event loop that regularly sends events to JavaScript code, you have a serious memory use problem.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>804647</commentid>
    <comment_count>1</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-01-10 12:43:48 -0800</bug_when>
    <thetext>For now, let&apos;s do this:

    (1) JSValue is a strong reference to JSContext

    (2) JSContext holds a WeakGCMap keyed on raw Objective-C pointer, whose value is the JavaScript wrapper. Wrapper creation runs through this map.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805444</commentid>
    <comment_count>2</comment_count>
      <attachid>182378</attachid>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-11 11:17:12 -0800</bug_when>
    <thetext>Created attachment 182378
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805471</commentid>
    <comment_count>3</comment_count>
      <attachid>182378</attachid>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-11 11:41:31 -0800</bug_when>
    <thetext>Comment on attachment 182378
Patch

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

&gt; Source/JavaScriptCore/API/JSWrapperMap.mm:-38
&gt; -static void wrapperFinalize(JSObjectRef object)

Not sure why I did this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805478</commentid>
    <comment_count>4</comment_count>
      <attachid>182387</attachid>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-11 11:46:27 -0800</bug_when>
    <thetext>Created attachment 182387
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805500</commentid>
    <comment_count>5</comment_count>
      <attachid>182387</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-01-11 12:11:06 -0800</bug_when>
    <thetext>Comment on attachment 182387
Patch

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

&gt; Source/JavaScriptCore/API/JSWrapperMap.mm:379
&gt; -    JSContext *m_context;
&gt; +    JSContext* m_context;

Why move the *? Isn’t JSContext an Objective-C class?

&gt; Source/JavaScriptCore/API/JSWrapperMap.mm:381
&gt; +    JSC::WeakGCMap&lt;id, JSC::JSObject&gt;* m_cachedWrappers;

This should be an OwnPtr. But also, if it works, can’t we just have it be a WeakGCMap rather than an OwnPtr&lt;WeakGCMap&gt;?

&gt; Source/JavaScriptCore/API/JSWrapperMap.mm:399
&gt; +    delete m_cachedWrappers;

Why not use an OwnPtr?

&gt; Source/JavaScriptCore/API/JSWrapperMap.mm:425
&gt; +    JSValue* wrapper = nil;

This should be:

    JSValue *wrapper;

For Objective-C types we use the other * placement (yuck, I wish we’d change that rule), and there is no need to initialize this since it’s initialized in all branches of the code below.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805543</commentid>
    <comment_count>6</comment_count>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-11 12:57:40 -0800</bug_when>
    <thetext>Committed r139486: &lt;http://trac.webkit.org/changeset/139486&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805545</commentid>
    <comment_count>7</comment_count>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-11 12:59:07 -0800</bug_when>
    <thetext>I made one small change, which was to add retain/release for the JSContext * in JSValue since we&apos;re not using ARC for this particular file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>805553</commentid>
    <comment_count>8</comment_count>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-11 13:08:41 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; I made one small change, which was to add retain/release for the JSContext * in JSValue since we&apos;re not using ARC for this particular file.

(RS&apos;ed by ggaren).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>806975</commentid>
    <comment_count>9</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2013-01-14 21:49:05 -0800</bug_when>
    <thetext>Hey Mark,

There are number more changes that should be made as a part of this change:

(1) The documentation in the API  is now incorrect.  The comments on the JSValue &amp; JSContext classes describe the object lifecycle, these are now utterly wrong.  The second paragraph of the JSValue documentation should probably just be removed, and you need to add text indicating that the context in which the value is created will be retained. 

(2) JSContext m_protectCounts, protect, unprotect are all now unnecessary overhead, and should all be removed.  These exist to handle the context going away before the value does; the context need to be able to unprotect values early.  Since the value is keeping the context alive there is no longer any danger of this happening; instead you should just protect/unprotect the value in JSValue&apos;s init/dealloc methods.

(3) m_context is no longer weak, so there is now a lot of dead code in in JSValue.mm, and a wasted message send on every API call.  In the head of just about every method in JSValue.mm we&apos;re doing:
    JSContext *context = [self context];
    if (!context)
        return nil;
This is getting a retained copy of the context, which is no longer necessary now m_context is no longer weak.  Just delete all these lines from all functions doing this, and where they were referring to the local variable &apos;context&apos;, instead you can just access m_context directly.

(4) context @property is no longer weak – the context property is declared as:
    @property(readonly, weak) JSContext *context;
This is really only informative (since we&apos;re not presently synthesizing the ivar), but it is now misleading, please change this to:
    @property(readonly, retain) JSContext *context;

(5) the JSContext ivar and accessor can be automatically generated.  Since we&apos;re no longer doing anything special with m_context, we can just let the compiler handle the ivar for us.  delete:
    JSContext *m_context;
and:
    - (JSContext *)context
    {
        return m_context;
    }
and find&amp;replace &quot;m_context&quot; to &quot;_context&quot; in JSValue.mm.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807019</commentid>
    <comment_count>10</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-01-14 23:11:51 -0800</bug_when>
    <thetext>&lt;rdar://problem/13014028&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>807020</commentid>
    <comment_count>11</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-01-14 23:12:47 -0800</bug_when>
    <thetext>Reopening based on Gavin&apos;s comments.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>182378</attachid>
            <date>2013-01-11 11:17:12 -0800</date>
            <delta_ts>2013-01-11 11:46:25 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-106056-20130111111414.patch</filename>
            <type>text/plain</type>
            <size>6826</size>
            <attacher name="Mark Hahnenberg">mhahnenberg</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTM5NDY0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBA
CisyMDEzLTAxLTExICBNYXJrIEhhaG5lbmJlcmcgIDxtaGFobmVuYmVyZ0BhcHBsZS5jb20+CisK
KyAgICAgICAgT2JqZWN0aXZlLUMgb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdG8gSmF2YVNjcmlw
dCBsZWFrICh1bnRpbCB0aGUgSlNDb250ZXh0IGlzIGRlc3Ryb3llZCkKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjA1NgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogQVBJL0FQSUpTVmFsdWUuaDoKKyAg
ICAgICAgKiBBUEkvSlNWYWx1ZS5tbTogTWFrZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBKU0NvbnRl
eHQgc3Ryb25nLgorICAgICAgICAoLVtKU1ZhbHVlIGNvbnRleHRdKToKKyAgICAgICAgKC1bSlNW
YWx1ZSBpbml0V2l0aFZhbHVlOmluQ29udGV4dDpdKToKKyAgICAgICAgKC1bSlNWYWx1ZSBkZWFs
bG9jXSk6CisgICAgICAgICogQVBJL0pTV3JhcHBlck1hcC5tbTogTWFrZSB0aGUgcmVmZXJlbmNl
IGJhY2sgZnJvbSB3cmFwcGVycyB0byBPYmotQyBvYmplY3RzIHdlYWsgaW5zdGVhZCBvZiBzdHJv
bmcuCisgICAgICAgIEFsc28gYWRkIGFuIGV4cGxpY2l0IFdlYWtHQ01hcCBpbiB0aGUgSlNXcmFw
cGVyTWFwIHJhdGhlciB0aGFuIHVzaW5nIE9iai1DIGFzc29jaWF0ZWQgb2JqZWN0IEFQSSB3aGlj
aCAKKyAgICAgICAgd2FzIGNhdXNpbmcgbWVtb3J5IGxlYWtzLgorICAgICAgICAod3JhcHBlckNs
YXNzKToKKyAgICAgICAgKC1bSlNPYmpDQ2xhc3NJbmZvIHdyYXBwZXJGb3JPYmplY3Q6XSk6Cisg
ICAgICAgICgtW0pTV3JhcHBlck1hcCBpbml0V2l0aENvbnRleHQ6XSk6CisgICAgICAgICgtW0pT
V3JhcHBlck1hcCBkZWFsbG9jXSk6CisgICAgICAgICgtW0pTV3JhcHBlck1hcCB3cmFwcGVyRm9y
T2JqZWN0Ol0pOgorCiAyMDEzLTAxLTEwICBaYW4gRG9iZXJzZWsgIDx6YW5kb2JlcnNla0BnbWFp
bC5jb20+CiAKICAgICAgICAgUmVtb3ZlIHRoZSBFTkFCTEVfQU5JTUFUSU9OX0FQSSBmZWF0dXJl
IGRlZmluZSBvY2N1cmVuY2VzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0FQSUpT
VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0FQSUpTVmFs
dWUuaAkocmV2aXNpb24gMTM5MzkyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9BUElK
U1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI5LDcgKzI5LDcgQEAKIAogLy8gQSBKU1ZhbHVl
IGlzIGEgcmVmZXJlbmNlIHRvIGEgdmFsdWUgd2l0aGluIHRoZSBKYXZhU2NyaXB0IG9iamVjdCBz
cGFjZSBvZiBhCiAvLyBKU1ZpcnR1YWxNYWNoaW5lLiBBbGwgaW5zdGFuY2VzIG9mIEpTVmFsdWUg
b3JpZ2luYXRlIGZyb20gYSBKU0NvbnRleHQsIGFuZAotLy8gaG9sZCBhIHdlYWsgcmVmZXJlbmNl
IHRvIHRoaXMgSlNDb250ZXh0LiBXaGVyZSBhbiBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZAor
Ly8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBKU0NvbnRleHQuIFdoZXJlIGFuIGlu
c3RhbmNlIG1ldGhvZCBpcyBpbnZva2VkCiAvLyB1cG9uIGEgSlNWYWx1ZSwgYW5kIHRoaXMgcmV0
dXJucyBhbm90aGVyIEpTVmFsdWUsIHRoZSByZXR1cm5lZCBKU1ZhbHVlIHdpbGwKIC8vIG9yaWdp
bmF0ZSBmcm9tIHRoZSBzYW1lIEpTQ29udGV4dCBhcyB0aGUgSlNWYWx1ZSBvbiB3aGljaCB0aGUg
bWV0aG9kIHdhcwogLy8gaW52b2tlZC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkv
SlNWYWx1ZS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0pTVmFs
dWUubW0JKHJldmlzaW9uIDEzOTM5MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNW
YWx1ZS5tbQkod29ya2luZyBjb3B5KQpAQCAtNTMsNyArNTMsNyBAQCBOU1N0cmluZyAqIGNvbnN0
IEpTUHJvcGVydHlEZXNjcmlwdG9yU2V0CiAKIEBpbXBsZW1lbnRhdGlvbiBKU1ZhbHVlIHsKICAg
ICBKU1ZhbHVlUmVmIG1fdmFsdWU7Ci0gICAgSlNDb250ZXh0ICptX3dlYWtDb250ZXh0OworICAg
IEpTQ29udGV4dCAqbV9jb250ZXh0OwogfQogCiArIChKU1ZhbHVlICopdmFsdWVXaXRoT2JqZWN0
OihpZCl2YWx1ZSBpbkNvbnRleHQ6KEpTQ29udGV4dCAqKWNvbnRleHQKQEAgLTUyMSw3ICs1MjEs
NyBAQCAtIChKU1ZhbHVlICopaW52b2tlTWV0aG9kOihOU1N0cmluZyAqKW1lCiAKIC0gKEpTQ29u
dGV4dCAqKWNvbnRleHQKIHsKLSAgICByZXR1cm4gb2JqY19sb2FkV2VhaygmbV93ZWFrQ29udGV4
dCk7CisgICAgcmV0dXJuIG1fY29udGV4dDsKIH0KIAogQGVuZApAQCAtMTA0OSw3ICsxMDQ5LDcg
QEAgLSAoSlNWYWx1ZSAqKWluaXRXaXRoVmFsdWU6KEpTVmFsdWVSZWYpdgogICAgICAgICByZXR1
cm4gbmlsOwogCiAgICAgQVNTRVJUKHZhbHVlKTsKLSAgICBvYmpjX2luaXRXZWFrKCZtX3dlYWtD
b250ZXh0LCBjb250ZXh0KTsKKyAgICBtX2NvbnRleHQgPSBjb250ZXh0OwogICAgIFtjb250ZXh0
IHByb3RlY3Q6dmFsdWVdOwogICAgIG1fdmFsdWUgPSB2YWx1ZTsKICAgICByZXR1cm4gc2VsZjsK
QEAgLTExNzIsNyArMTE3Miw3IEBAIC0gKHZvaWQpZGVhbGxvYwogICAgIEpTQ29udGV4dCAqY29u
dGV4dCA9IFtzZWxmIGNvbnRleHRdOwogICAgIGlmIChjb250ZXh0KQogICAgICAgICBbY29udGV4
dCB1bnByb3RlY3Q6bV92YWx1ZV07Ci0gICAgb2JqY19kZXN0cm95V2VhaygmbV93ZWFrQ29udGV4
dCk7CisgICAgbV9jb250ZXh0ID0gbmlsOwogICAgIFtzdXBlciBkZWFsbG9jXTsKIH0KIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1dyYXBwZXJNYXAubW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1dyYXBwZXJNYXAubW0JKHJldmlzaW9uIDEz
OTM5MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNXcmFwcGVyTWFwLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yOCwxOCArMjgsMTUgQEAKIAogI2lmIEpTX09CSkNfQVBJX0VOQUJMRUQK
IAorI2ltcG9ydCAiQVBJQ2FzdC5oIgogI2ltcG9ydCAiSlNDb250ZXh0SW50ZXJuYWwuaCIKICNp
bXBvcnQgIkpTV3JhcHBlck1hcC5oIgogI2ltcG9ydCAiT2JqQ0NhbGxiYWNrRnVuY3Rpb24uaCIK
ICNpbXBvcnQgIk9iamNSdW50aW1lRXh0cmFzLmgiCisjaW1wb3J0ICJXZWFrR0NNYXAuaCIKICNp
bXBvcnQgPHd0Zi9UQ1NwaW5Mb2NrLmg+CiAjaW1wb3J0ICJ3dGYvVmVjdG9yLmgiCiAKLXN0YXRp
YyB2b2lkIHdyYXBwZXJGaW5hbGl6ZShKU09iamVjdFJlZiBvYmplY3QpCi17Ci0gICAgWyhpZClK
U09iamVjdEdldFByaXZhdGUob2JqZWN0KSByZWxlYXNlXTsKLX0KLQogLy8gQWxsIHdyYXBwZXIg
b2JqZWN0cyBhbmQgY29uc3RydWN0b3Igb2JqZWN0cyBkZXJpdmUgZnJvbSB0aGlzIHR5cGUsIHNv
IHdlIGNhbiBkZXRlY3QgJiB1bndyYXAgT2JqZWN0aXZlLUMgaW5zdGFuY2VzL0NsYXNzZXMuCiBz
dGF0aWMgSlNDbGFzc1JlZiB3cmFwcGVyQ2xhc3MoKQogewpAQCAtNTIsNyArNDksNiBAQCBzdGF0
aWMgSlNDbGFzc1JlZiB3cmFwcGVyQ2xhc3MoKQogICAgICAgICBKU0NsYXNzRGVmaW5pdGlvbiBk
ZWZpbml0aW9uOwogICAgICAgICBkZWZpbml0aW9uID0ga0pTQ2xhc3NEZWZpbml0aW9uRW1wdHk7
CiAgICAgICAgIGRlZmluaXRpb24uY2xhc3NOYW1lID0gIm9iamNfY2xhc3MiOwotICAgICAgICBk
ZWZpbml0aW9uLmZpbmFsaXplID0gd3JhcHBlckZpbmFsaXplOwogICAgICAgICBjbGFzc1JlZiA9
IEpTQ2xhc3NDcmVhdGUoJmRlZmluaXRpb24pOwogICAgIH0KIApAQCAtMzYxLDcgKzM1Nyw3IEBA
IC0gKEpTVmFsdWUgKil3cmFwcGVyRm9yT2JqZWN0OihpZClvYmplY3QKICAgICBBU1NFUlQoSlNW
YWx1ZUlzT2JqZWN0KGNvbnRleHRJbnRlcm5hbENvbnRleHQobV9jb250ZXh0KSwgcHJvdG90eXBl
VmFsdWUpKTsKICAgICBKU09iamVjdFJlZiBwcm90b3R5cGUgPSBKU1ZhbHVlVG9PYmplY3QoY29u
dGV4dEludGVybmFsQ29udGV4dChtX2NvbnRleHQpLCBwcm90b3R5cGVWYWx1ZSwgMCk7CiAKLSAg
ICBKU09iamVjdFJlZiB3cmFwcGVyID0gSlNPYmplY3RNYWtlKGNvbnRleHRJbnRlcm5hbENvbnRl
eHQobV9jb250ZXh0KSwgbV9jbGFzc1JlZiwgW29iamVjdCByZXRhaW5dKTsKKyAgICBKU09iamVj
dFJlZiB3cmFwcGVyID0gSlNPYmplY3RNYWtlKGNvbnRleHRJbnRlcm5hbENvbnRleHQobV9jb250
ZXh0KSwgbV9jbGFzc1JlZiwgb2JqZWN0KTsKICAgICBKU09iamVjdFNldFByb3RvdHlwZShjb250
ZXh0SW50ZXJuYWxDb250ZXh0KG1fY29udGV4dCksIHdyYXBwZXIsIHByb3RvdHlwZSk7CiAgICAg
cmV0dXJuIFtKU1ZhbHVlIHZhbHVlV2l0aFZhbHVlOndyYXBwZXIgaW5Db250ZXh0Om1fY29udGV4
dF07CiB9CkBAIC0zNzQsOCArMzcwLDkgQEAgLSAoSlNWYWx1ZSAqKWNvbnN0cnVjdG9yCiBAZW5k
CiAKIEBpbXBsZW1lbnRhdGlvbiBKU1dyYXBwZXJNYXAgewotICAgIEpTQ29udGV4dCAqbV9jb250
ZXh0OworICAgIEpTQ29udGV4dCogbV9jb250ZXh0OwogICAgIE5TTXV0YWJsZURpY3Rpb25hcnkg
Km1fY2xhc3NNYXA7CisgICAgSlNDOjpXZWFrR0NNYXA8aWQsIEpTQzo6SlNPYmplY3Q+KiBtX2Nh
Y2hlZFdyYXBwZXJzOwogfQogCiAtIChpZClpbml0V2l0aENvbnRleHQ6KEpTQ29udGV4dCAqKWNv
bnRleHQKQEAgLTM4NiwxMiArMzgzLDE0IEBAIC0gKGlkKWluaXRXaXRoQ29udGV4dDooSlNDb250
ZXh0ICopY29udGUKIAogICAgIG1fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgbV9jbGFzc01hcCA9
IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07CisgICAgbV9jYWNoZWRXcmFwcGVy
cyA9IG5ldyBKU0M6OldlYWtHQ01hcDxpZCwgSlNDOjpKU09iamVjdD4oKTsKICAgICByZXR1cm4g
c2VsZjsKIH0KIAogLSAodm9pZClkZWFsbG9jCiB7CiAgICAgW21fY2xhc3NNYXAgcmVsZWFzZV07
CisgICAgZGVsZXRlIG1fY2FjaGVkV3JhcHBlcnM7CiAgICAgW3N1cGVyIGRlYWxsb2NdOwogfQog
CkBAIC00MTMsMTAgKzQxMiwxMSBAQCAtIChKU09iakNDbGFzc0luZm8qKWNsYXNzSW5mb0ZvckNs
YXNzOihDCiAKIC0gKEpTVmFsdWUgKil3cmFwcGVyRm9yT2JqZWN0OihpZClvYmplY3QKIHsKLSAg
ICBKU1ZhbHVlICp3cmFwcGVyID0gb2JqY19nZXRBc3NvY2lhdGVkT2JqZWN0KG9iamVjdCwgbV9j
b250ZXh0KTsKLSAgICBpZiAod3JhcHBlciAmJiB3cmFwcGVyLmNvbnRleHQpCi0gICAgICAgIHJl
dHVybiB3cmFwcGVyOworICAgIEpTQzo6SlNPYmplY3QqIGpzV3JhcHBlciA9IG1fY2FjaGVkV3Jh
cHBlcnMtPmdldChvYmplY3QpOworICAgIGlmIChqc1dyYXBwZXIpCisgICAgICAgIHJldHVybiBb
SlNWYWx1ZSB2YWx1ZVdpdGhWYWx1ZTp0b1JlZihqc1dyYXBwZXIpIGluQ29udGV4dDptX2NvbnRl
eHRdOwogCisgICAgSlNWYWx1ZSogd3JhcHBlciA9IG5pbDsKICAgICBpZiAoY2xhc3NfaXNNZXRh
Q2xhc3Mob2JqZWN0X2dldENsYXNzKG9iamVjdCkpKQogICAgICAgICB3cmFwcGVyID0gW1tzZWxm
IGNsYXNzSW5mb0ZvckNsYXNzOihDbGFzcylvYmplY3RdIGNvbnN0cnVjdG9yXTsKICAgICBlbHNl
IHsKQEAgLTQyOSw3ICs0MjksOSBAQCAtIChKU1ZhbHVlICopd3JhcHBlckZvck9iamVjdDooaWQp
b2JqZWN0CiAgICAgLy8gKDEpIEZvciBpbW1vcnRhbCBvYmplY3RzIEpTVmFsdWVzIHdpbGwgZWZm
ZWN0aXZlbHkgbGVhayBhbmQgdGhpcyByZXN1bHRzIGluIGVycm9yIG91dHB1dCBiZWluZyBsb2dn
ZWQgLSB3ZSBzaG91bGQgYXZvaWQgYWRkaW5nIGFzc29jaWF0ZWQgb2JqZWN0cyB0byBpbW1vcnRh
bCBvYmplY3RzLgogICAgIC8vICgyKSBBIGxvbmcgbGl2ZWQgb2JqZWN0IG1heSByYWNrIHVwIG1h
bnkgSlNWYWx1ZXMuIFdoZW4gdGhlIGNvbnRleHRzIGFyZSByZWxlYXNlZCB0aGVzZSB3aWxsIHVu
cHJvY3RlY3QgdGhlIGFzc29jaWF0ZWQgSmF2YVNjcmlwdCBvYmplY3RzLAogICAgIC8vICAgICBi
dXQgc3RpbGwsIHdvdWxkIHByb2JhYmx5IG5pY2VyIGlmIHdlIG1hZGUgaXQgc28gdGhhdCBvbmx5
IG9uZSBhc3NvY2lhdGVkIG9iamVjdCB3YXMgcmVxdWlyZWQsIGJyb2FkY2FzdGluZyBvYmplY3Qg
ZGVhbGxvYy4KLSAgICBvYmpjX3NldEFzc29jaWF0ZWRPYmplY3Qob2JqZWN0LCBtX2NvbnRleHQs
IHdyYXBwZXIsIE9CSkNfQVNTT0NJQVRJT05fUkVUQUlOKTsKKyAgICBKU0M6OkV4ZWNTdGF0ZSog
ZXhlYyA9IHRvSlMoY29udGV4dEludGVybmFsQ29udGV4dChtX2NvbnRleHQpKTsKKyAgICBqc1dy
YXBwZXIgPSB0b0pTKGV4ZWMsIHZhbHVlSW50ZXJuYWxWYWx1ZSh3cmFwcGVyKSkudG9PYmplY3Qo
ZXhlYyk7CisgICAgbV9jYWNoZWRXcmFwcGVycy0+c2V0KGV4ZWMtPmdsb2JhbERhdGEoKSwgb2Jq
ZWN0LCBqc1dyYXBwZXIpOwogICAgIHJldHVybiB3cmFwcGVyOwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>182387</attachid>
            <date>2013-01-11 11:46:27 -0800</date>
            <delta_ts>2013-01-11 12:11:05 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-106056-20130111114329.patch</filename>
            <type>text/plain</type>
            <size>5673</size>
            <attacher name="Mark Hahnenberg">mhahnenberg</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTM5NDY0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI0IEBA
CisyMDEzLTAxLTExICBNYXJrIEhhaG5lbmJlcmcgIDxtaGFobmVuYmVyZ0BhcHBsZS5jb20+CisK
KyAgICAgICAgT2JqZWN0aXZlLUMgb2JqZWN0cyB0aGF0IGFyZSBwYXNzZWQgdG8gSmF2YVNjcmlw
dCBsZWFrICh1bnRpbCB0aGUgSlNDb250ZXh0IGlzIGRlc3Ryb3llZCkKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEwNjA1NgorCisgICAgICAgIFJldmll
d2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogQVBJL0FQSUpTVmFsdWUuaDoKKyAg
ICAgICAgKiBBUEkvSlNWYWx1ZS5tbTogTWFrZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBKU0NvbnRl
eHQgc3Ryb25nLgorICAgICAgICAoLVtKU1ZhbHVlIGNvbnRleHRdKToKKyAgICAgICAgKC1bSlNW
YWx1ZSBpbml0V2l0aFZhbHVlOmluQ29udGV4dDpdKToKKyAgICAgICAgKC1bSlNWYWx1ZSBkZWFs
bG9jXSk6CisgICAgICAgICogQVBJL0pTV3JhcHBlck1hcC5tbTogTWFrZSB0aGUgcmVmZXJlbmNl
IGJhY2sgZnJvbSB3cmFwcGVycyB0byBPYmotQyBvYmplY3RzIHdlYWsgaW5zdGVhZCBvZiBzdHJv
bmcuCisgICAgICAgIEFsc28gYWRkIGFuIGV4cGxpY2l0IFdlYWtHQ01hcCBpbiB0aGUgSlNXcmFw
cGVyTWFwIHJhdGhlciB0aGFuIHVzaW5nIE9iai1DIGFzc29jaWF0ZWQgb2JqZWN0IEFQSSB3aGlj
aCAKKyAgICAgICAgd2FzIGNhdXNpbmcgbWVtb3J5IGxlYWtzLgorICAgICAgICAod3JhcHBlckNs
YXNzKToKKyAgICAgICAgKC1bSlNPYmpDQ2xhc3NJbmZvIHdyYXBwZXJGb3JPYmplY3Q6XSk6Cisg
ICAgICAgICgtW0pTV3JhcHBlck1hcCBpbml0V2l0aENvbnRleHQ6XSk6CisgICAgICAgICgtW0pT
V3JhcHBlck1hcCBkZWFsbG9jXSk6CisgICAgICAgICgtW0pTV3JhcHBlck1hcCB3cmFwcGVyRm9y
T2JqZWN0Ol0pOgorCiAyMDEzLTAxLTEwICBaYW4gRG9iZXJzZWsgIDx6YW5kb2JlcnNla0BnbWFp
bC5jb20+CiAKICAgICAgICAgUmVtb3ZlIHRoZSBFTkFCTEVfQU5JTUFUSU9OX0FQSSBmZWF0dXJl
IGRlZmluZSBvY2N1cmVuY2VzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0FQSUpT
VmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0FQSUpTVmFs
dWUuaAkocmV2aXNpb24gMTM5MzkyKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9BUElK
U1ZhbHVlLmgJKHdvcmtpbmcgY29weSkKQEAgLTI5LDcgKzI5LDcgQEAKIAogLy8gQSBKU1ZhbHVl
IGlzIGEgcmVmZXJlbmNlIHRvIGEgdmFsdWUgd2l0aGluIHRoZSBKYXZhU2NyaXB0IG9iamVjdCBz
cGFjZSBvZiBhCiAvLyBKU1ZpcnR1YWxNYWNoaW5lLiBBbGwgaW5zdGFuY2VzIG9mIEpTVmFsdWUg
b3JpZ2luYXRlIGZyb20gYSBKU0NvbnRleHQsIGFuZAotLy8gaG9sZCBhIHdlYWsgcmVmZXJlbmNl
IHRvIHRoaXMgSlNDb250ZXh0LiBXaGVyZSBhbiBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZAor
Ly8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBKU0NvbnRleHQuIFdoZXJlIGFuIGlu
c3RhbmNlIG1ldGhvZCBpcyBpbnZva2VkCiAvLyB1cG9uIGEgSlNWYWx1ZSwgYW5kIHRoaXMgcmV0
dXJucyBhbm90aGVyIEpTVmFsdWUsIHRoZSByZXR1cm5lZCBKU1ZhbHVlIHdpbGwKIC8vIG9yaWdp
bmF0ZSBmcm9tIHRoZSBzYW1lIEpTQ29udGV4dCBhcyB0aGUgSlNWYWx1ZSBvbiB3aGljaCB0aGUg
bWV0aG9kIHdhcwogLy8gaW52b2tlZC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkv
SlNWYWx1ZS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0pTVmFs
dWUubW0JKHJldmlzaW9uIDEzOTM5MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNW
YWx1ZS5tbQkod29ya2luZyBjb3B5KQpAQCAtNTMsNyArNTMsNyBAQCBOU1N0cmluZyAqIGNvbnN0
IEpTUHJvcGVydHlEZXNjcmlwdG9yU2V0CiAKIEBpbXBsZW1lbnRhdGlvbiBKU1ZhbHVlIHsKICAg
ICBKU1ZhbHVlUmVmIG1fdmFsdWU7Ci0gICAgSlNDb250ZXh0ICptX3dlYWtDb250ZXh0OworICAg
IEpTQ29udGV4dCAqbV9jb250ZXh0OwogfQogCiArIChKU1ZhbHVlICopdmFsdWVXaXRoT2JqZWN0
OihpZCl2YWx1ZSBpbkNvbnRleHQ6KEpTQ29udGV4dCAqKWNvbnRleHQKQEAgLTUyMSw3ICs1MjEs
NyBAQCAtIChKU1ZhbHVlICopaW52b2tlTWV0aG9kOihOU1N0cmluZyAqKW1lCiAKIC0gKEpTQ29u
dGV4dCAqKWNvbnRleHQKIHsKLSAgICByZXR1cm4gb2JqY19sb2FkV2VhaygmbV93ZWFrQ29udGV4
dCk7CisgICAgcmV0dXJuIG1fY29udGV4dDsKIH0KIAogQGVuZApAQCAtMTA0OSw3ICsxMDQ5LDcg
QEAgLSAoSlNWYWx1ZSAqKWluaXRXaXRoVmFsdWU6KEpTVmFsdWVSZWYpdgogICAgICAgICByZXR1
cm4gbmlsOwogCiAgICAgQVNTRVJUKHZhbHVlKTsKLSAgICBvYmpjX2luaXRXZWFrKCZtX3dlYWtD
b250ZXh0LCBjb250ZXh0KTsKKyAgICBtX2NvbnRleHQgPSBjb250ZXh0OwogICAgIFtjb250ZXh0
IHByb3RlY3Q6dmFsdWVdOwogICAgIG1fdmFsdWUgPSB2YWx1ZTsKICAgICByZXR1cm4gc2VsZjsK
QEAgLTExNzIsNyArMTE3Miw3IEBAIC0gKHZvaWQpZGVhbGxvYwogICAgIEpTQ29udGV4dCAqY29u
dGV4dCA9IFtzZWxmIGNvbnRleHRdOwogICAgIGlmIChjb250ZXh0KQogICAgICAgICBbY29udGV4
dCB1bnByb3RlY3Q6bV92YWx1ZV07Ci0gICAgb2JqY19kZXN0cm95V2VhaygmbV93ZWFrQ29udGV4
dCk7CisgICAgbV9jb250ZXh0ID0gbmlsOwogICAgIFtzdXBlciBkZWFsbG9jXTsKIH0KIApJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1dyYXBwZXJNYXAubW0KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1dyYXBwZXJNYXAubW0JKHJldmlzaW9uIDEz
OTM5MikKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNXcmFwcGVyTWFwLm1tCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yOCwxMCArMjgsMTIgQEAKIAogI2lmIEpTX09CSkNfQVBJX0VOQUJMRUQK
IAorI2ltcG9ydCAiQVBJQ2FzdC5oIgogI2ltcG9ydCAiSlNDb250ZXh0SW50ZXJuYWwuaCIKICNp
bXBvcnQgIkpTV3JhcHBlck1hcC5oIgogI2ltcG9ydCAiT2JqQ0NhbGxiYWNrRnVuY3Rpb24uaCIK
ICNpbXBvcnQgIk9iamNSdW50aW1lRXh0cmFzLmgiCisjaW1wb3J0ICJXZWFrR0NNYXAuaCIKICNp
bXBvcnQgPHd0Zi9UQ1NwaW5Mb2NrLmg+CiAjaW1wb3J0ICJ3dGYvVmVjdG9yLmgiCiAKQEAgLTM3
NCw4ICszNzYsOSBAQCAtIChKU1ZhbHVlICopY29uc3RydWN0b3IKIEBlbmQKIAogQGltcGxlbWVu
dGF0aW9uIEpTV3JhcHBlck1hcCB7Ci0gICAgSlNDb250ZXh0ICptX2NvbnRleHQ7CisgICAgSlND
b250ZXh0KiBtX2NvbnRleHQ7CiAgICAgTlNNdXRhYmxlRGljdGlvbmFyeSAqbV9jbGFzc01hcDsK
KyAgICBKU0M6OldlYWtHQ01hcDxpZCwgSlNDOjpKU09iamVjdD4qIG1fY2FjaGVkV3JhcHBlcnM7
CiB9CiAKIC0gKGlkKWluaXRXaXRoQ29udGV4dDooSlNDb250ZXh0ICopY29udGV4dApAQCAtMzg2
LDEyICszODksMTQgQEAgLSAoaWQpaW5pdFdpdGhDb250ZXh0OihKU0NvbnRleHQgKiljb250ZQog
CiAgICAgbV9jb250ZXh0ID0gY29udGV4dDsKICAgICBtX2NsYXNzTWFwID0gW1tOU011dGFibGVE
aWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKKyAgICBtX2NhY2hlZFdyYXBwZXJzID0gbmV3IEpTQzo6
V2Vha0dDTWFwPGlkLCBKU0M6OkpTT2JqZWN0PigpOwogICAgIHJldHVybiBzZWxmOwogfQogCiAt
ICh2b2lkKWRlYWxsb2MKIHsKICAgICBbbV9jbGFzc01hcCByZWxlYXNlXTsKKyAgICBkZWxldGUg
bV9jYWNoZWRXcmFwcGVyczsKICAgICBbc3VwZXIgZGVhbGxvY107CiB9CiAKQEAgLTQxMywxMCAr
NDE4LDExIEBAIC0gKEpTT2JqQ0NsYXNzSW5mbyopY2xhc3NJbmZvRm9yQ2xhc3M6KEMKIAogLSAo
SlNWYWx1ZSAqKXdyYXBwZXJGb3JPYmplY3Q6KGlkKW9iamVjdAogewotICAgIEpTVmFsdWUgKndy
YXBwZXIgPSBvYmpjX2dldEFzc29jaWF0ZWRPYmplY3Qob2JqZWN0LCBtX2NvbnRleHQpOwotICAg
IGlmICh3cmFwcGVyICYmIHdyYXBwZXIuY29udGV4dCkKLSAgICAgICAgcmV0dXJuIHdyYXBwZXI7
CisgICAgSlNDOjpKU09iamVjdCoganNXcmFwcGVyID0gbV9jYWNoZWRXcmFwcGVycy0+Z2V0KG9i
amVjdCk7CisgICAgaWYgKGpzV3JhcHBlcikKKyAgICAgICAgcmV0dXJuIFtKU1ZhbHVlIHZhbHVl
V2l0aFZhbHVlOnRvUmVmKGpzV3JhcHBlcikgaW5Db250ZXh0Om1fY29udGV4dF07CiAKKyAgICBK
U1ZhbHVlKiB3cmFwcGVyID0gbmlsOwogICAgIGlmIChjbGFzc19pc01ldGFDbGFzcyhvYmplY3Rf
Z2V0Q2xhc3Mob2JqZWN0KSkpCiAgICAgICAgIHdyYXBwZXIgPSBbW3NlbGYgY2xhc3NJbmZvRm9y
Q2xhc3M6KENsYXNzKW9iamVjdF0gY29uc3RydWN0b3JdOwogICAgIGVsc2UgewpAQCAtNDI5LDcg
KzQzNSw5IEBAIC0gKEpTVmFsdWUgKil3cmFwcGVyRm9yT2JqZWN0OihpZClvYmplY3QKICAgICAv
LyAoMSkgRm9yIGltbW9ydGFsIG9iamVjdHMgSlNWYWx1ZXMgd2lsbCBlZmZlY3RpdmVseSBsZWFr
IGFuZCB0aGlzIHJlc3VsdHMgaW4gZXJyb3Igb3V0cHV0IGJlaW5nIGxvZ2dlZCAtIHdlIHNob3Vs
ZCBhdm9pZCBhZGRpbmcgYXNzb2NpYXRlZCBvYmplY3RzIHRvIGltbW9ydGFsIG9iamVjdHMuCiAg
ICAgLy8gKDIpIEEgbG9uZyBsaXZlZCBvYmplY3QgbWF5IHJhY2sgdXAgbWFueSBKU1ZhbHVlcy4g
V2hlbiB0aGUgY29udGV4dHMgYXJlIHJlbGVhc2VkIHRoZXNlIHdpbGwgdW5wcm9jdGVjdCB0aGUg
YXNzb2NpYXRlZCBKYXZhU2NyaXB0IG9iamVjdHMsCiAgICAgLy8gICAgIGJ1dCBzdGlsbCwgd291
bGQgcHJvYmFibHkgbmljZXIgaWYgd2UgbWFkZSBpdCBzbyB0aGF0IG9ubHkgb25lIGFzc29jaWF0
ZWQgb2JqZWN0IHdhcyByZXF1aXJlZCwgYnJvYWRjYXN0aW5nIG9iamVjdCBkZWFsbG9jLgotICAg
IG9iamNfc2V0QXNzb2NpYXRlZE9iamVjdChvYmplY3QsIG1fY29udGV4dCwgd3JhcHBlciwgT0JK
Q19BU1NPQ0lBVElPTl9SRVRBSU4pOworICAgIEpTQzo6RXhlY1N0YXRlKiBleGVjID0gdG9KUyhj
b250ZXh0SW50ZXJuYWxDb250ZXh0KG1fY29udGV4dCkpOworICAgIGpzV3JhcHBlciA9IHRvSlMo
ZXhlYywgdmFsdWVJbnRlcm5hbFZhbHVlKHdyYXBwZXIpKS50b09iamVjdChleGVjKTsKKyAgICBt
X2NhY2hlZFdyYXBwZXJzLT5zZXQoZXhlYy0+Z2xvYmFsRGF0YSgpLCBvYmplY3QsIGpzV3JhcHBl
cik7CiAgICAgcmV0dXJuIHdyYXBwZXI7CiB9CiAK
</data>
<flag name="review"
          id="200373"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>