<?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>108264</bug_id>
          
          <creation_ts>2013-01-29 17:08:53 -0800</creation_ts>
          <short_desc>Objective-C API: Fix insertion of values greater than the max index allowed by the spec</short_desc>
          <delta_ts>2013-01-31 10:56:35 -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>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="Joseph Pecoraro">joepeck</reporter>
          <assigned_to name="Mark Hahnenberg">mhahnenberg</assigned_to>
          <cc>barraclough</cc>
    
    <cc>ggaren</cc>
    
    <cc>joepeck</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>819536</commentid>
    <comment_count>0</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2013-01-29 17:08:53 -0800</bug_when>
    <thetext>Addressing some of my review comments on the ObjC JSC API:

    &gt; Source/JavaScriptCore/API/JSValue.mm:306
    &gt; +    if (index != (unsigned)index)
    &gt; +        [self valueForProperty:[[JSValue valueWithDouble:index inContext:context] toString]];

    Missing return!

    &gt; Source/JavaScriptCore/API/JSValue.mm:919
    &gt; +        if ([object isKindOfClass:[NSArray class]])
    &gt; +            return (ObjcContainerConvertor::Task){ object, JSObjectMakeArray(contextInternalContext(context), 0, NULL, 0), ContainerArray };

    NSArray is already handled above. These 2 lines can be removed.

    &gt; Source/JavaScriptCore/API/JSValue.mm:922
    &gt; +        if ([object isKindOfClass:[NSDictionary class]])
    &gt; +            return (ObjcContainerConvertor::Task){ object, JSObjectMake(contextInternalContext(context), 0, 0), ContainerDictionary };

    NSDictionary is already handled above. These 2 lines can be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>819553</commentid>
    <comment_count>1</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2013-01-29 17:19:30 -0800</bug_when>
    <thetext>Hmm, I&apos;d like to write a test for the valueAtIndex: change, but it seems I don&apos;t
have what I need to satisfy JS_OBJC_API_ENABLED. I can take a stab at it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>819636</commentid>
    <comment_count>2</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2013-01-29 18:22:35 -0800</bug_when>
    <thetext>Reassigning to Mark. I passed him a patch and test case, but I cannot test on 10.8 and he has a good understanding of this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>819652</commentid>
    <comment_count>3</comment_count>
      <attachid>185370</attachid>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-29 18:33:49 -0800</bug_when>
    <thetext>Created attachment 185370
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>819669</commentid>
    <comment_count>4</comment_count>
      <attachid>185370</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2013-01-29 18:41:34 -0800</bug_when>
    <thetext>Comment on attachment 185370
Patch

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

&gt; Source/JavaScriptCore/API/JSValue.mm:277
&gt; +    // Properties that are higher than the max index allowed by the spec (2^32 - 1) are converted to normal double properties.

Would it be more accurate to say they are converted to string / keyed properties? The terminology &quot;normal double property&quot; sounds strange to me.

A comment like this would be good in the API header to clarify to users of the API what happens with indices outside the specced range. Since it looks like we&apos;ve decided to handle it in a non-obvious way. It is non-obvious that this API might not change the Array&apos;s length.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>819708</commentid>
    <comment_count>5</comment_count>
      <attachid>185370</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2013-01-29 19:33:11 -0800</bug_when>
    <thetext>Comment on attachment 185370
Patch

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

&gt; Source/JavaScriptCore/API/tests/testapi.mm:272
&gt; +        NSUInteger highIndex = UINT_MAX;
&gt; +        [array setValue:value1 atIndex:lowIndex];
&gt; +        checkResult(@&quot;arrayLengthLow&quot;, [[array[@&quot;length&quot;] toNumber] unsignedIntegerValue] == (lowIndex + 1));
&gt; +        [array setValue:value2 atIndex:highIndex];
&gt; +        checkResult(@&quot;arrayLengthHigh&quot;, [[array[@&quot;length&quot;] toNumber] unsignedIntegerValue] == (lowIndex + 1));
&gt; +        checkResult(@&quot;valueAtIndex:lowIndex&quot;, [[array valueAtIndex:lowIndex] toInt32] == 42);
&gt; +        checkResult(@&quot;valueAtIndex:highIndex&quot;, [[array valueAtIndex:highIndex] toInt32] == 24);

UINT_MAX is good but I would also have a test for the exact boundary. Such tests avoid off-by-1 bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>819949</commentid>
    <comment_count>6</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2013-01-30 01:37:03 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 185370 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=185370&amp;action=review
&gt; 
&gt; &gt; Source/JavaScriptCore/API/tests/testapi.mm:272
&gt; &gt; +        NSUInteger highIndex = UINT_MAX;
&gt; &gt; +        [array setValue:value1 atIndex:lowIndex];
&gt; &gt; +        checkResult(@&quot;arrayLengthLow&quot;, [[array[@&quot;length&quot;] toNumber] unsignedIntegerValue] == (lowIndex + 1));
&gt; &gt; +        [array setValue:value2 atIndex:highIndex];
&gt; &gt; +        checkResult(@&quot;arrayLengthHigh&quot;, [[array[@&quot;length&quot;] toNumber] unsignedIntegerValue] == (lowIndex + 1));
&gt; &gt; +        checkResult(@&quot;valueAtIndex:lowIndex&quot;, [[array valueAtIndex:lowIndex] toInt32] == 42);
&gt; &gt; +        checkResult(@&quot;valueAtIndex:highIndex&quot;, [[array valueAtIndex:highIndex] toInt32] == 24);
&gt; 
&gt; UINT_MAX is good but I would also have a test for the exact boundary. Such tests avoid off-by-1 bugs.

Also, the path that this is meant to be testing should test an index above UINT_MAX anyways.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>820226</commentid>
    <comment_count>7</comment_count>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-30 08:30:57 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; (From update of attachment 185370 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=185370&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/JavaScriptCore/API/tests/testapi.mm:272
&gt; &gt; &gt; +        NSUInteger highIndex = UINT_MAX;
&gt; &gt; &gt; +        [array setValue:value1 atIndex:lowIndex];
&gt; &gt; &gt; +        checkResult(@&quot;arrayLengthLow&quot;, [[array[@&quot;length&quot;] toNumber] unsignedIntegerValue] == (lowIndex + 1));
&gt; &gt; &gt; +        [array setValue:value2 atIndex:highIndex];
&gt; &gt; &gt; +        checkResult(@&quot;arrayLengthHigh&quot;, [[array[@&quot;length&quot;] toNumber] unsignedIntegerValue] == (lowIndex + 1));
&gt; &gt; &gt; +        checkResult(@&quot;valueAtIndex:lowIndex&quot;, [[array valueAtIndex:lowIndex] toInt32] == 42);
&gt; &gt; &gt; +        checkResult(@&quot;valueAtIndex:highIndex&quot;, [[array valueAtIndex:highIndex] toInt32] == 24);
&gt; &gt; 
&gt; &gt; UINT_MAX is good but I would also have a test for the exact boundary. Such tests avoid off-by-1 bugs.
&gt; 
&gt; Also, the path that this is meant to be testing should test an index above UINT_MAX anyways.

Not quite. The max length of an Array in JS is UINT_MAX, so the max index is UINT_MAX - 1. But you&apos;re right that I should add something right below the max just to make sure things are working properly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>820251</commentid>
    <comment_count>8</comment_count>
      <attachid>185370</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-01-30 09:10:14 -0800</bug_when>
    <thetext>Comment on attachment 185370
Patch

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

&gt; Source/JavaScriptCore/API/JSValue.mm:278
&gt; +    // Properties that are higher than the max index allowed by the spec (2^32 - 1) are converted to normal double properties.
&gt;      if (index != (unsigned)index)

UINT_MAX will pass this test, even though it’s not a valid array index. That’s a bug. Not sure why the test case does not catch this.

&gt; Source/JavaScriptCore/API/JSValue.mm:-871
&gt; -        if ([object isKindOfClass:[NSArray class]])
&gt; -            return (ObjcContainerConvertor::Task){ object, JSObjectMakeArray(contextRef, 0, NULL, 0), ContainerArray };
&gt; -
&gt; -        if ([object isKindOfClass:[NSDictionary class]])
&gt; -            return (ObjcContainerConvertor::Task){ object, JSObjectMake(contextRef, 0, 0), ContainerDictionary };

No comment in change log explaining why this code was removed.

&gt;&gt;&gt;&gt; Source/JavaScriptCore/API/tests/testapi.mm:272
&gt;&gt;&gt;&gt; +        checkResult(@&quot;valueAtIndex:highIndex&quot;, [[array valueAtIndex:highIndex] toInt32] == 24);
&gt;&gt;&gt; 
&gt;&gt;&gt; UINT_MAX is good but I would also have a test for the exact boundary. Such tests avoid off-by-1 bugs.
&gt;&gt; 
&gt;&gt; Also, the path that this is meant to be testing should test an index above UINT_MAX anyways.
&gt; 
&gt; Not quite. The max length of an Array in JS is UINT_MAX, so the max index is UINT_MAX - 1. But you&apos;re right that I should add something right below the max just to make sure things are working properly.

For clarity I think we should be testing at least UINT_MAX - 1, a valid array index, UINT_MAX, one invalid one, and UINT_MAX + 1, another invalid one that doesn’t happen to fit into a 32-bit integer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>820509</commentid>
    <comment_count>9</comment_count>
      <attachid>185555</attachid>
    <who name="Mark Hahnenberg">mhahnenberg</who>
    <bug_when>2013-01-30 13:51:00 -0800</bug_when>
    <thetext>Created attachment 185555
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>821678</commentid>
    <comment_count>10</comment_count>
      <attachid>185555</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-01-31 10:56:31 -0800</bug_when>
    <thetext>Comment on attachment 185555
Patch

Clearing flags on attachment: 185555

Committed r141443: &lt;http://trac.webkit.org/changeset/141443&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>821680</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-01-31 10:56:35 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>185370</attachid>
            <date>2013-01-29 18:33:49 -0800</date>
            <delta_ts>2013-01-30 13:50:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-108264-20130129183035.patch</filename>
            <type>text/plain</type>
            <size>4423</size>
            <attacher name="Mark Hahnenberg">mhahnenberg</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTQxMjAxKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE4IEBA
CisyMDEzLTAxLTI5ICBNYXJrIEhhaG5lbmJlcmcgIDxtaGFobmVuYmVyZ0BhcHBsZS5jb20+CisK
KyAgICAgICAgT2JqZWN0aXZlLUMgQVBJOiBGaXggaW5zZXJ0aW9uIG9mIHZhbHVlcyBncmVhdGVy
IHRoYW4gdGhlIG1heCBpbmRleCBhbGxvd2VkIGJ5IHRoZSBzcGVjCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDgyNjQKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGaXhlZCBhIGJ1ZywgYWRkZWQgYSB0ZXN0
IHRvIHRoZSBBUEkgdGVzdHMsIGNsZWFuZWQgdXAgc29tZSBjb2RlLgorCisgICAgICAgICogQVBJ
L0pTVmFsdWUubW06CisgICAgICAgICgtW0pTVmFsdWUgdmFsdWVBdEluZGV4Ol0pOgorICAgICAg
ICAoLVtKU1ZhbHVlIHNldFZhbHVlOmF0SW5kZXg6XSk6IFdlIHdlcmVuJ3QgcmV0dXJuaW5nIHdo
ZW4gd2Ugc2hvdWxkIGhhdmUgYmVlbi4KKyAgICAgICAgKG9iamVjdFRvVmFsdWVXaXRob3V0Q29w
eSk6CisgICAgICAgICogQVBJL3Rlc3RzL3Rlc3RhcGkubW06CisKIDIwMTMtMDEtMjkgIE1hcmsg
SGFobmVuYmVyZyAgPG1oYWhuZW5iZXJnQGFwcGxlLmNvbT4KIAogICAgICAgICBPYmplY3RpdmUt
QyBBUEk6IEpTT2JqQ0NsYXNzSW5mbyBjcmVhdGVzIHJlZmVyZW5jZSBjeWNsZSB3aXRoIEpTQ29u
dGV4dApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1ZhbHVlLm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNWYWx1ZS5tbQkocmV2aXNpb24gMTQx
MTk0KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9KU1ZhbHVlLm1tCSh3b3JraW5nIGNv
cHkpCkBAIC0yNzQsOCArMjc0LDkgQEAgLSAodm9pZClkZWZpbmVQcm9wZXJ0eTooTlNTdHJpbmcg
Kilwcm9wZQogCiAtIChKU1ZhbHVlICopdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4CiB7
CisgICAgLy8gUHJvcGVydGllcyB0aGF0IGFyZSBoaWdoZXIgdGhhbiB0aGUgbWF4IGluZGV4IGFs
bG93ZWQgYnkgdGhlIHNwZWMgKDJeMzIgLSAxKSBhcmUgY29udmVydGVkIHRvIG5vcm1hbCBkb3Vi
bGUgcHJvcGVydGllcy4KICAgICBpZiAoaW5kZXggIT0gKHVuc2lnbmVkKWluZGV4KQotICAgICAg
ICBbc2VsZiB2YWx1ZUZvclByb3BlcnR5OltbSlNWYWx1ZSB2YWx1ZVdpdGhEb3VibGU6aW5kZXgg
aW5Db250ZXh0Ol9jb250ZXh0XSB0b1N0cmluZ11dOworICAgICAgICByZXR1cm4gW3NlbGYgdmFs
dWVGb3JQcm9wZXJ0eTpbW0pTVmFsdWUgdmFsdWVXaXRoRG91YmxlOmluZGV4IGluQ29udGV4dDpf
Y29udGV4dF0gdG9TdHJpbmddXTsKIAogICAgIEpTVmFsdWVSZWYgZXhjZXB0aW9uID0gMDsKICAg
ICBKU09iamVjdFJlZiBvYmplY3QgPSBKU1ZhbHVlVG9PYmplY3QoY29udGV4dEludGVybmFsQ29u
dGV4dChfY29udGV4dCksIG1fdmFsdWUsICZleGNlcHRpb24pOwpAQCAtMjkxLDYgKzI5Miw3IEBA
IC0gKEpTVmFsdWUgKil2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW4KIAogLSAodm9pZClzZXRW
YWx1ZTooaWQpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleAogeworICAgIC8vIFByb3Bl
cnRpZXMgdGhhdCBhcmUgaGlnaGVyIHRoYW4gdGhlIG1heCBpbmRleCBhbGxvd2VkIGJ5IHRoZSBz
cGVjICgyXjMyIC0gMSkgYXJlIGNvbnZlcnRlZCB0byBub3JtYWwgZG91YmxlIHByb3BlcnRpZXMu
CiAgICAgaWYgKGluZGV4ICE9ICh1bnNpZ25lZClpbmRleCkKICAgICAgICAgcmV0dXJuIFtzZWxm
IHNldFZhbHVlOnZhbHVlIGZvclByb3BlcnR5OltbSlNWYWx1ZSB2YWx1ZVdpdGhEb3VibGU6aW5k
ZXggaW5Db250ZXh0Ol9jb250ZXh0XSB0b1N0cmluZ11dOwogCkBAIC04NjQsMTIgKzg2Niw2IEBA
IHN0YXRpYyBPYmpjQ29udGFpbmVyQ29udmVydG9yOjpUYXNrIG9iamUKICAgICAgICAgaWYgKFtv
YmplY3QgaXNLaW5kT2ZDbGFzczpbSlNWYWx1ZSBjbGFzc11dKQogICAgICAgICAgICAgcmV0dXJu
IChPYmpjQ29udGFpbmVyQ29udmVydG9yOjpUYXNrKXsgb2JqZWN0LCAoKEpTVmFsdWUgKilvYmpl
Y3QpLT5tX3ZhbHVlLCBDb250YWluZXJOb25lIH07CiAKLSAgICAgICAgaWYgKFtvYmplY3QgaXNL
aW5kT2ZDbGFzczpbTlNBcnJheSBjbGFzc11dKQotICAgICAgICAgICAgcmV0dXJuIChPYmpjQ29u
dGFpbmVyQ29udmVydG9yOjpUYXNrKXsgb2JqZWN0LCBKU09iamVjdE1ha2VBcnJheShjb250ZXh0
UmVmLCAwLCBOVUxMLCAwKSwgQ29udGFpbmVyQXJyYXkgfTsKLQotICAgICAgICBpZiAoW29iamVj
dCBpc0tpbmRPZkNsYXNzOltOU0RpY3Rpb25hcnkgY2xhc3NdXSkKLSAgICAgICAgICAgIHJldHVy
biAoT2JqY0NvbnRhaW5lckNvbnZlcnRvcjo6VGFzayl7IG9iamVjdCwgSlNPYmplY3RNYWtlKGNv
bnRleHRSZWYsIDAsIDApLCBDb250YWluZXJEaWN0aW9uYXJ5IH07Ci0KICAgICAgICAgaWYgKFtv
YmplY3QgaXNLaW5kT2ZDbGFzczpbTlNTdHJpbmcgY2xhc3NdXSkgewogICAgICAgICAgICAgSlNT
dHJpbmdSZWYgc3RyaW5nID0gSlNTdHJpbmdDcmVhdGVXaXRoQ0ZTdHJpbmcoKENGU3RyaW5nUmVm
KW9iamVjdCk7CiAgICAgICAgICAgICBKU1ZhbHVlUmVmIGpzID0gSlNWYWx1ZU1ha2VTdHJpbmco
Y29udGV4dFJlZiwgc3RyaW5nKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvdGVz
dHMvdGVzdGFwaS5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL3Rl
c3RzL3Rlc3RhcGkubW0JKHJldmlzaW9uIDE0MTE5NCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9BUEkvdGVzdHMvdGVzdGFwaS5tbQkod29ya2luZyBjb3B5KQpAQCAtMjU3LDYgKzI1NywyMiBA
QCB2b2lkIHRlc3RPYmplY3RpdmVDQVBJKCkKICAgICB9CiAKICAgICBAYXV0b3JlbGVhc2Vwb29s
IHsKKyAgICAgICAgSlNDb250ZXh0ICpjb250ZXh0ID0gW1tbSlNDb250ZXh0IGFsbG9jXSBpbml0
XSBhdXRvcmVsZWFzZV07ICAgICAgICAKKyAgICAgICAgSlNWYWx1ZSAqYXJyYXkgPSBbSlNWYWx1
ZSB2YWx1ZVdpdGhOZXdBcnJheUluQ29udGV4dDpjb250ZXh0XTsKKyAgICAgICAgY2hlY2tSZXN1
bHQoQCJhcnJheUxlbmd0aEVtcHR5IiwgW1thcnJheVtAImxlbmd0aCJdIHRvTnVtYmVyXSB1bnNp
Z25lZEludGVnZXJWYWx1ZV0gPT0gMCk7CisgICAgICAgIEpTVmFsdWUgKnZhbHVlMSA9IFtKU1Zh
bHVlIHZhbHVlV2l0aEludDMyOjQyIGluQ29udGV4dDpjb250ZXh0XTsKKyAgICAgICAgSlNWYWx1
ZSAqdmFsdWUyID0gW0pTVmFsdWUgdmFsdWVXaXRoSW50MzI6MjQgaW5Db250ZXh0OmNvbnRleHRd
OworICAgICAgICBOU1VJbnRlZ2VyIGxvd0luZGV4ID0gNTsKKyAgICAgICAgTlNVSW50ZWdlciBo
aWdoSW5kZXggPSBVSU5UX01BWDsKKyAgICAgICAgW2FycmF5IHNldFZhbHVlOnZhbHVlMSBhdElu
ZGV4Omxvd0luZGV4XTsKKyAgICAgICAgY2hlY2tSZXN1bHQoQCJhcnJheUxlbmd0aExvdyIsIFtb
YXJyYXlbQCJsZW5ndGgiXSB0b051bWJlcl0gdW5zaWduZWRJbnRlZ2VyVmFsdWVdID09IChsb3dJ
bmRleCArIDEpKTsKKyAgICAgICAgW2FycmF5IHNldFZhbHVlOnZhbHVlMiBhdEluZGV4OmhpZ2hJ
bmRleF07CisgICAgICAgIGNoZWNrUmVzdWx0KEAiYXJyYXlMZW5ndGhIaWdoIiwgW1thcnJheVtA
Imxlbmd0aCJdIHRvTnVtYmVyXSB1bnNpZ25lZEludGVnZXJWYWx1ZV0gPT0gKGxvd0luZGV4ICsg
MSkpOworICAgICAgICBjaGVja1Jlc3VsdChAInZhbHVlQXRJbmRleDpsb3dJbmRleCIsIFtbYXJy
YXkgdmFsdWVBdEluZGV4Omxvd0luZGV4XSB0b0ludDMyXSA9PSA0Mik7CisgICAgICAgIGNoZWNr
UmVzdWx0KEAidmFsdWVBdEluZGV4OmhpZ2hJbmRleCIsIFtbYXJyYXkgdmFsdWVBdEluZGV4Omhp
Z2hJbmRleF0gdG9JbnQzMl0gPT0gMjQpOworICAgIH0KKworICAgIEBhdXRvcmVsZWFzZXBvb2wg
ewogICAgICAgICBKU0NvbnRleHQgKmNvbnRleHQgPSBbW1tKU0NvbnRleHQgYWxsb2NdIGluaXRd
IGF1dG9yZWxlYXNlXTsKICAgICAgICAgSlNWYWx1ZSAqb2JqZWN0ID0gW0pTVmFsdWUgdmFsdWVX
aXRoTmV3T2JqZWN0SW5Db250ZXh0OmNvbnRleHRdOwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>185555</attachid>
            <date>2013-01-30 13:51:00 -0800</date>
            <delta_ts>2013-01-31 10:56:31 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-108264-20130130134745.patch</filename>
            <type>text/plain</type>
            <size>6671</size>
            <attacher name="Mark Hahnenberg">mhahnenberg</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTQxMzAzKQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIwIEBA
CisyMDEzLTAxLTMwICBNYXJrIEhhaG5lbmJlcmcgIDxtaGFobmVuYmVyZ0BhcHBsZS5jb20+CisK
KyAgICAgICAgT2JqZWN0aXZlLUMgQVBJOiBGaXggaW5zZXJ0aW9uIG9mIHZhbHVlcyBncmVhdGVy
IHRoYW4gdGhlIG1heCBpbmRleCBhbGxvd2VkIGJ5IHRoZSBzcGVjCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDgyNjQKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBGaXhlZCBhIGJ1ZywgYWRkZWQgYSB0ZXN0
IHRvIHRoZSBBUEkgdGVzdHMsIGNsZWFuZWQgdXAgc29tZSBjb2RlLgorCisgICAgICAgICogQVBJ
L0pTVmFsdWUuaDogQ2hhbmdlZCBzb21lIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9uIHNldFZhbHVl
OmF0SW5kZXg6IHRvIGluZGljYXRlIHRoYXQgCisgICAgICAgIHNldHRpbmcgdmFsdWVzIGF0IGlu
ZGljZXMgZ3JlYXRlciB0aGFuIFVJTlRfTUFYIC0gMSB3b250JyBhZmZlY3QgdGhlIGxlbmd0aCBv
ZiBKUyBhcnJheXMuCisgICAgICAgICogQVBJL0pTVmFsdWUubW06CisgICAgICAgICgtW0pTVmFs
dWUgdmFsdWVBdEluZGV4Ol0pOiBXZSB3ZXJlbid0IHJldHVybmluZyB3aGVuIHdlIHNob3VsZCBo
YXZlIGJlZW4uCisgICAgICAgICgtW0pTVmFsdWUgc2V0VmFsdWU6YXRJbmRleDpdKTogQWRkZWQg
YSBjb21tZW50IGFib3V0IHdoeSB3ZSBkbyB0aGUgZWFybHkgY2hlY2sgZm9yIGJlaW5nIGxhcmdl
ciB0aGFuIFVJTlRfTUFYLgorICAgICAgICAob2JqZWN0VG9WYWx1ZVdpdGhvdXRDb3B5KTogUmVt
b3ZlZCB0d28gcmVkdW5kYW50IGNhc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGNoZWNrZWQgcHJldmlv
dXNseS4KKyAgICAgICAgKiBBUEkvdGVzdHMvdGVzdGFwaS5tbToKKwogMjAxMy0wMS0zMCAgRmls
aXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgogCiAgICAgICAgIFJFR1JFU1NJT04oMTQwNTA0
KTogcHVyZSBDU0Ugbm8gbG9uZ2VyIG1hdGNoZXMgdGhpbmdzLCAxMCUgcmVncmVzc2lvbiBvbiBL
cmFrZW4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNWYWx1ZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNWYWx1ZS5oCShyZXZpc2lvbiAxNDEz
MDMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL0pTVmFsdWUuaAkod29ya2luZyBjb3B5
KQpAQCAtMTU5LDkgKzE1OSwxMCBAQCBOU19DTEFTU19BVkFJTEFCTEUoMTBfOSwgTkEpCiAtICh2
b2lkKWRlZmluZVByb3BlcnR5OihOU1N0cmluZyAqKXByb3BlcnR5IGRlc2NyaXB0b3I6KGlkKWRl
c2NyaXB0b3I7CiAKIC8vIEFjY2VzcyBhbiBpbmRleGVkIHByb3BlcnR5IGZyb20gdGhlIHZhbHVl
LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUKLS8vIEphdmFTY3JpcHQgdmFsdWUgJ3VuZGVm
aW5lZCcgaWYgbm8gcHJvcGVydHkgZXhpc3RzIGF0IHRoYXQgaW5kZXguCisvLyBKYXZhU2NyaXB0
IHZhbHVlICd1bmRlZmluZWQnIGlmIG5vIHByb3BlcnR5IGV4aXN0cyBhdCB0aGF0IGluZGV4LiAK
IC0gKEpTVmFsdWUgKil2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0vLyBTZXQgYW4g
aW5kZXhlZCBwcm9wZXJ0eSBvbiB0aGUgdmFsdWUuCisvLyBTZXQgYW4gaW5kZXhlZCBwcm9wZXJ0
eSBvbiB0aGUgdmFsdWUuIEZvciBKU1ZhbHVlcyB0aGF0IGFyZSBKYXZhU2NyaXB0IGFycmF5cywg
CisvLyBpbmRpY2VzIGdyZWF0ZXIgdGhhbiBVSU5UX01BWCAtIDEgd2lsbCBub3QgYWZmZWN0IHRo
ZSBsZW5ndGggb2YgdGhlIGFycmF5LgogLSAodm9pZClzZXRWYWx1ZTooaWQpdmFsdWUgYXRJbmRl
eDooTlNVSW50ZWdlcilpbmRleDsKIAogLy8gQWxsIEphdmFTY3JpcHQgdmFsdWVzIGFyZSBwcmVj
aXNlbHkgb25lIG9mIHRoZXNlIHR5cGVzLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0FQ
SS9KU1ZhbHVlLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvSlNW
YWx1ZS5tbQkocmV2aXNpb24gMTQxMzAzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FQSS9K
U1ZhbHVlLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yNzQsOCArMjc0LDEwIEBAIC0gKHZvaWQpZGVm
aW5lUHJvcGVydHk6KE5TU3RyaW5nICopcHJvcGUKIAogLSAoSlNWYWx1ZSAqKXZhbHVlQXRJbmRl
eDooTlNVSW50ZWdlcilpbmRleAogeworICAgIC8vIFByb3BlcnRpZXMgdGhhdCBhcmUgaGlnaGVy
IHRoYW4gYW4gdW5zaWduZWQgdmFsdWUgY2FuIGhvbGQgYXJlIGNvbnZlcnRlZCB0byBhIGRvdWJs
ZSB0aGVuIGluc2VydGVkIGFzIGEgbm9ybWFsIHByb3BlcnR5LgorICAgIC8vIEluZGljZXMgdGhh
dCBhcmUgYmlnZ2VyIHRoYW4gdGhlIG1heCBhbGxvd2VkIGluZGV4IHNpemUgKFVJTlRfTUFYIC0g
MSkgd2lsbCBiZSBoYW5kbGVkIGludGVybmFsbHkgaW4gZ2V0KCkuCiAgICAgaWYgKGluZGV4ICE9
ICh1bnNpZ25lZClpbmRleCkKLSAgICAgICAgW3NlbGYgdmFsdWVGb3JQcm9wZXJ0eTpbW0pTVmFs
dWUgdmFsdWVXaXRoRG91YmxlOmluZGV4IGluQ29udGV4dDpfY29udGV4dF0gdG9TdHJpbmddXTsK
KyAgICAgICAgcmV0dXJuIFtzZWxmIHZhbHVlRm9yUHJvcGVydHk6W1tKU1ZhbHVlIHZhbHVlV2l0
aERvdWJsZTppbmRleCBpbkNvbnRleHQ6X2NvbnRleHRdIHRvU3RyaW5nXV07CiAKICAgICBKU1Zh
bHVlUmVmIGV4Y2VwdGlvbiA9IDA7CiAgICAgSlNPYmplY3RSZWYgb2JqZWN0ID0gSlNWYWx1ZVRv
T2JqZWN0KGNvbnRleHRJbnRlcm5hbENvbnRleHQoX2NvbnRleHQpLCBtX3ZhbHVlLCAmZXhjZXB0
aW9uKTsKQEAgLTI5MSw2ICsyOTMsOCBAQCAtIChKU1ZhbHVlICopdmFsdWVBdEluZGV4OihOU1VJ
bnRlZ2VyKWluCiAKIC0gKHZvaWQpc2V0VmFsdWU6KGlkKXZhbHVlIGF0SW5kZXg6KE5TVUludGVn
ZXIpaW5kZXgKIHsKKyAgICAvLyBQcm9wZXJ0aWVzIHRoYXQgYXJlIGhpZ2hlciB0aGFuIGFuIHVu
c2lnbmVkIHZhbHVlIGNhbiBob2xkIGFyZSBjb252ZXJ0ZWQgdG8gYSBkb3VibGUsIHRoZW4gaW5z
ZXJ0ZWQgYXMgYSBub3JtYWwgcHJvcGVydHkuCisgICAgLy8gSW5kaWNlcyB0aGF0IGFyZSBiaWdn
ZXIgdGhhbiB0aGUgbWF4IGFsbG93ZWQgaW5kZXggc2l6ZSAoVUlOVF9NQVggLSAxKSB3aWxsIGJl
IGhhbmRsZWQgaW50ZXJuYWxseSBpbiBwdXRCeUluZGV4KCkuCiAgICAgaWYgKGluZGV4ICE9ICh1
bnNpZ25lZClpbmRleCkKICAgICAgICAgcmV0dXJuIFtzZWxmIHNldFZhbHVlOnZhbHVlIGZvclBy
b3BlcnR5OltbSlNWYWx1ZSB2YWx1ZVdpdGhEb3VibGU6aW5kZXggaW5Db250ZXh0Ol9jb250ZXh0
XSB0b1N0cmluZ11dOwogCkBAIC04NjQsMTIgKzg2OCw2IEBAIHN0YXRpYyBPYmpjQ29udGFpbmVy
Q29udmVydG9yOjpUYXNrIG9iamUKICAgICAgICAgaWYgKFtvYmplY3QgaXNLaW5kT2ZDbGFzczpb
SlNWYWx1ZSBjbGFzc11dKQogICAgICAgICAgICAgcmV0dXJuIChPYmpjQ29udGFpbmVyQ29udmVy
dG9yOjpUYXNrKXsgb2JqZWN0LCAoKEpTVmFsdWUgKilvYmplY3QpLT5tX3ZhbHVlLCBDb250YWlu
ZXJOb25lIH07CiAKLSAgICAgICAgaWYgKFtvYmplY3QgaXNLaW5kT2ZDbGFzczpbTlNBcnJheSBj
bGFzc11dKQotICAgICAgICAgICAgcmV0dXJuIChPYmpjQ29udGFpbmVyQ29udmVydG9yOjpUYXNr
KXsgb2JqZWN0LCBKU09iamVjdE1ha2VBcnJheShjb250ZXh0UmVmLCAwLCBOVUxMLCAwKSwgQ29u
dGFpbmVyQXJyYXkgfTsKLQotICAgICAgICBpZiAoW29iamVjdCBpc0tpbmRPZkNsYXNzOltOU0Rp
Y3Rpb25hcnkgY2xhc3NdXSkKLSAgICAgICAgICAgIHJldHVybiAoT2JqY0NvbnRhaW5lckNvbnZl
cnRvcjo6VGFzayl7IG9iamVjdCwgSlNPYmplY3RNYWtlKGNvbnRleHRSZWYsIDAsIDApLCBDb250
YWluZXJEaWN0aW9uYXJ5IH07Ci0KICAgICAgICAgaWYgKFtvYmplY3QgaXNLaW5kT2ZDbGFzczpb
TlNTdHJpbmcgY2xhc3NdXSkgewogICAgICAgICAgICAgSlNTdHJpbmdSZWYgc3RyaW5nID0gSlNT
dHJpbmdDcmVhdGVXaXRoQ0ZTdHJpbmcoKENGU3RyaW5nUmVmKW9iamVjdCk7CiAgICAgICAgICAg
ICBKU1ZhbHVlUmVmIGpzID0gSlNWYWx1ZU1ha2VTdHJpbmcoY29udGV4dFJlZiwgc3RyaW5nKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvdGVzdHMvdGVzdGFwaS5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvQVBJL3Rlc3RzL3Rlc3RhcGkubW0JKHJldmlz
aW9uIDE0MTMwMykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvdGVzdHMvdGVzdGFwaS5t
bQkod29ya2luZyBjb3B5KQpAQCAtMjU3LDYgKzI1NywzNCBAQCB2b2lkIHRlc3RPYmplY3RpdmVD
QVBJKCkKICAgICB9CiAKICAgICBAYXV0b3JlbGVhc2Vwb29sIHsKKyAgICAgICAgSlNDb250ZXh0
ICpjb250ZXh0ID0gW1tbSlNDb250ZXh0IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07ICAgICAg
ICAKKyAgICAgICAgSlNWYWx1ZSAqYXJyYXkgPSBbSlNWYWx1ZSB2YWx1ZVdpdGhOZXdBcnJheUlu
Q29udGV4dDpjb250ZXh0XTsKKyAgICAgICAgY2hlY2tSZXN1bHQoQCJhcnJheUxlbmd0aEVtcHR5
IiwgW1thcnJheVtAImxlbmd0aCJdIHRvTnVtYmVyXSB1bnNpZ25lZEludGVnZXJWYWx1ZV0gPT0g
MCk7CisgICAgICAgIEpTVmFsdWUgKnZhbHVlMSA9IFtKU1ZhbHVlIHZhbHVlV2l0aEludDMyOjQy
IGluQ29udGV4dDpjb250ZXh0XTsKKyAgICAgICAgSlNWYWx1ZSAqdmFsdWUyID0gW0pTVmFsdWUg
dmFsdWVXaXRoSW50MzI6MjQgaW5Db250ZXh0OmNvbnRleHRdOworICAgICAgICBOU1VJbnRlZ2Vy
IGxvd0luZGV4ID0gNTsKKyAgICAgICAgTlNVSW50ZWdlciBtYXhMZW5ndGggPSBVSU5UX01BWDsK
KworICAgICAgICBbYXJyYXkgc2V0VmFsdWU6dmFsdWUxIGF0SW5kZXg6bG93SW5kZXhdOworICAg
ICAgICBjaGVja1Jlc3VsdChAImFycmF5Lmxlbmd0aCBhZnRlciBwdXQgdG8gbG93IGluZGV4Iiwg
W1thcnJheVtAImxlbmd0aCJdIHRvTnVtYmVyXSB1bnNpZ25lZEludGVnZXJWYWx1ZV0gPT0gKGxv
d0luZGV4ICsgMSkpOworCisgICAgICAgIFthcnJheSBzZXRWYWx1ZTp2YWx1ZTEgYXRJbmRleDoo
bWF4TGVuZ3RoIC0gMSldOworICAgICAgICBjaGVja1Jlc3VsdChAImFycmF5Lmxlbmd0aCBhZnRl
ciBwdXQgdG8gbWF4TGVuZ3RoIC0gMSIsIFtbYXJyYXlbQCJsZW5ndGgiXSB0b051bWJlcl0gdW5z
aWduZWRJbnRlZ2VyVmFsdWVdID09IG1heExlbmd0aCk7CisKKyAgICAgICAgW2FycmF5IHNldFZh
bHVlOnZhbHVlMiBhdEluZGV4Om1heExlbmd0aF07CisgICAgICAgIGNoZWNrUmVzdWx0KEAiYXJy
YXkubGVuZ3RoIGFmdGVyIHB1dCB0byBtYXhMZW5ndGgiLCBbW2FycmF5W0AibGVuZ3RoIl0gdG9O
dW1iZXJdIHVuc2lnbmVkSW50ZWdlclZhbHVlXSA9PSBtYXhMZW5ndGgpOworCisgICAgICAgIFth
cnJheSBzZXRWYWx1ZTp2YWx1ZTIgYXRJbmRleDoobWF4TGVuZ3RoICsgMSldOworICAgICAgICBj
aGVja1Jlc3VsdChAImFycmF5Lmxlbmd0aCBhZnRlciBwdXQgdG8gbWF4TGVuZ3RoICsgMSIsIFtb
YXJyYXlbQCJsZW5ndGgiXSB0b051bWJlcl0gdW5zaWduZWRJbnRlZ2VyVmFsdWVdID09IG1heExl
bmd0aCk7CisKKyAgICAgICAgY2hlY2tSZXN1bHQoQCJ2YWx1ZUF0SW5kZXg6MCBpcyB1bmRlZmlu
ZWQiLCBbW2FycmF5IHZhbHVlQXRJbmRleDowXSBpc1VuZGVmaW5lZF0pOworICAgICAgICBjaGVj
a1Jlc3VsdChAInZhbHVlQXRJbmRleDpsb3dJbmRleCIsIFtbYXJyYXkgdmFsdWVBdEluZGV4Omxv
d0luZGV4XSB0b0ludDMyXSA9PSA0Mik7CisgICAgICAgIGNoZWNrUmVzdWx0KEAidmFsdWVBdElu
ZGV4Om1heExlbmd0aCAtIDEiLCBbW2FycmF5IHZhbHVlQXRJbmRleDoobWF4TGVuZ3RoIC0gMSld
IHRvSW50MzJdID09IDQyKTsKKyAgICAgICAgY2hlY2tSZXN1bHQoQCJ2YWx1ZUF0SW5kZXg6bWF4
TGVuZ3RoIiwgW1thcnJheSB2YWx1ZUF0SW5kZXg6bWF4TGVuZ3RoXSB0b0ludDMyXSA9PSAyNCk7
CisgICAgICAgIGNoZWNrUmVzdWx0KEAidmFsdWVBdEluZGV4Om1heExlbmd0aCArIDEiLCBbW2Fy
cmF5IHZhbHVlQXRJbmRleDoobWF4TGVuZ3RoICsgMSldIHRvSW50MzJdID09IDI0KTsKKyAgICB9
CisKKyAgICBAYXV0b3JlbGVhc2Vwb29sIHsKICAgICAgICAgSlNDb250ZXh0ICpjb250ZXh0ID0g
W1tbSlNDb250ZXh0IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07CiAgICAgICAgIEpTVmFsdWUg
Km9iamVjdCA9IFtKU1ZhbHVlIHZhbHVlV2l0aE5ld09iamVjdEluQ29udGV4dDpjb250ZXh0XTsK
IAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>