Return-Path: Delivered-To: apmail-apr-dev-archive@www.apache.org Received: (qmail 90795 invoked from network); 26 Sep 2007 14:25:29 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 26 Sep 2007 14:25:29 -0000 Received: (qmail 15636 invoked by uid 500); 26 Sep 2007 14:25:18 -0000 Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 15581 invoked by uid 500); 26 Sep 2007 14:25:17 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Id: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 15570 invoked by uid 99); 26 Sep 2007 14:25:17 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Sep 2007 07:25:17 -0700 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of oscaremma@gmail.com designates 209.85.146.182 as permitted sender) Received: from [209.85.146.182] (HELO wa-out-1112.google.com) (209.85.146.182) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 26 Sep 2007 14:25:18 +0000 Received: by wa-out-1112.google.com with SMTP id k40so3953360wah for ; Wed, 26 Sep 2007 07:24:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; bh=EXCJiJT/KKcny7xHB+C5Hfp5GJRZ2TFhJXnUP+6+GT8=; b=tZWyUqQoJEJJ/f5N8tLiIcI/SpSLeneNxUNZGHEhjrcbURNOjJymiXQcOrQL3VBeelkpA0Vax1rYdLR6nbHhiU7WXvvdsR34/Pt/4Iv1JeuMqXJL/GBZtAE1VzNbyB4YGyvQCzMWcPPe//PFauSzUeAV6tZ9QOPQzNb5rLxfy2w= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=sjVC6fLcxZJ9NK71T7nDvkGx6tmyd6YfuMiPyuuSLILCyGtkepsCeP2K7FfpjGOhHVrYgy3qBvhYzNjG8BOUkbRjiBQP801x1XUixXNsqVF9eEKuNLzL9W8hMh82sR+9ld8ZSQF8OWZ5TCdCv4CxN5CT854a7nSRvYrCNanpzpo= Received: by 10.115.108.1 with SMTP id k1mr1016800wam.1190816695771; Wed, 26 Sep 2007 07:24:55 -0700 (PDT) Received: by 10.114.67.19 with HTTP; Wed, 26 Sep 2007 07:24:55 -0700 (PDT) Message-ID: <3ce0569d0709260724g329cd59bj15d3d0ad37630acb@mail.gmail.com> Date: Wed, 26 Sep 2007 10:24:55 -0400 From: "David Jones" To: dev@apr.apache.org Subject: Re: PATCH: md5 hash files not portable between EBCDIC and ASCII In-Reply-To: <46E166AE.3050206@rowe-clan.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_6818_4808878.1190816695756" References: <3ce0569d0709061641r52457509h25ba63d48ef55de8@mail.gmail.com> <46E09461.6070706@rowe-clan.net> <200709070754.45773@news.perlig.de> <46E0EBB5.8000408@rowe-clan.net> <20070907082715.GA14044@deejai2.mch.fsc.net> <46E166AE.3050206@rowe-clan.net> X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_6818_4808878.1190816695756 Content-Type: multipart/alternative; boundary="----=_Part_6819_3970960.1190816695757" ------=_Part_6819_3970960.1190816695757 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline final patch for commit which has a tweak to non-EBCDIC #ifdef logic Index: apr_md5.c =================================================================== --- apr_md5.c (revision 579232) +++ apr_md5.c (working copy) @@ -112,6 +112,8 @@ #if APR_CHARSET_EBCDIC static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md5_encode() */ #endif +#define DO_XLATE 0 +#define SKIP_XLATE 1 /* F, G, H and I are basic MD5 functions. */ @@ -195,9 +197,10 @@ * operation, processing another message block, and updating the * context. */ -APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context, - const void *_input, - apr_size_t inputLen) +static apr_status_t md5_update_buffer(apr_md5_ctx_t *context, + const void *_input, + apr_size_t inputLen, + int xlate_buffer) { const unsigned char *input = _input; unsigned int i, idx, partLen; @@ -234,7 +237,7 @@ memcpy(&context->buffer[idx], &input[i], inputLen - i); #else /*APR_HAS_XLATE*/ if (inputLen >= partLen) { - if (context->xlate) { + if (context->xlate && (xlate_buffer == DO_XLATE)) { inbytes_left = outbytes_left = partLen; apr_xlate_conv_buffer(context->xlate, (const char *)input, &inbytes_left, @@ -247,7 +250,7 @@ MD5Transform(context->state, context->buffer); for (i = partLen; i + 63 < inputLen; i += 64) { - if (context->xlate) { + if (context->xlate && (xlate_buffer == DO_XLATE)) { unsigned char inp_tmp[64]; inbytes_left = outbytes_left = 64; apr_xlate_conv_buffer(context->xlate, (const char *)&input[i], @@ -266,7 +269,7 @@ i = 0; /* Buffer remaining input */ - if (context->xlate) { + if (context->xlate && (xlate_buffer == DO_XLATE)) { inbytes_left = outbytes_left = inputLen - i; apr_xlate_conv_buffer(context->xlate, (const char *)&input[i], &inbytes_left, (char *)&context->buffer[idx], @@ -279,6 +282,16 @@ return APR_SUCCESS; } +/* MD5 block update operation. API with the default setting + * for EBCDIC translations + */ +APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context, + const void *_input, + apr_size_t inputLen) +{ + md5_update_buffer( context, _input, inputLen, DO_XLATE); +} + /* MD5 finalization. Ends an MD5 message-digest operation, writing the * the message digest and zeroizing the context. */ @@ -553,13 +566,16 @@ * Then just as many characters of the MD5(pw, salt, pw) */ apr_md5_init(&ctx1); +#if APR_CHARSET_EBCDIC + apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii); +#endif apr_md5_update(&ctx1, pw, strlen(pw)); apr_md5_update(&ctx1, sp, sl); apr_md5_update(&ctx1, pw, strlen(pw)); apr_md5_final(final, &ctx1); for (pl = strlen(pw); pl > 0; pl -= APR_MD5_DIGESTSIZE) { - apr_md5_update(&ctx, final, - (pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl); + md5_update_buffer(&ctx, final, + (pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl, SKIP_XLATE); } /* @@ -572,7 +588,7 @@ */ for (i = strlen(pw); i != 0; i >>= 1) { if (i & 1) { - apr_md5_update(&ctx, final, 1); + md5_update_buffer(&ctx, final, 1, SKIP_XLATE); } else { apr_md5_update(&ctx, pw, 1); @@ -596,11 +612,18 @@ */ for (i = 0; i < 1000; i++) { apr_md5_init(&ctx1); + /* + * apr_md5_final clears out ctx1.xlate at the end of each loop, + * so need to to set it each time through + */ +#if APR_CHARSET_EBCDIC + apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii); +#endif if (i & 1) { apr_md5_update(&ctx1, pw, strlen(pw)); } else { - apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE); + md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE); } if (i % 3) { apr_md5_update(&ctx1, sp, sl); @@ -611,7 +634,7 @@ } if (i & 1) { - apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE); + md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE); } else { apr_md5_update(&ctx1, pw, strlen(pw)); On 9/7/07, William A. Rowe, Jr. wrote: > > Jeff Trawick wrote: > > On 9/7/07, Martin Kraemer wrote: > >> > >> So, from my POV, I'm leaning towards fixing it in an "ASCII compatible" > > >> way, rather than maintaining the incompatible format for eternity. > > > > +1 here as well > > > > A "--disable-portable-md5" option could probably be provided, but I > > don't think there are enough (possibly *any*) theoretical users of > > that to justify cluttering the code for eternity. > > Then the proposal has my +1 as well, make it so :) > ------=_Part_6819_3970960.1190816695757 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline final patch for commit which has a tweak to non-EBCDIC #ifdef logic



Index: apr_md5.c
===================================================================
--- apr_md5.c    (revision 579232)
+++ apr_md5.c    (working copy)
@@ -112,6 +112,8 @@
 #if APR_CHARSET_EBCDIC
 static apr_xlate_t *xlate_ebcdic_to_ascii; /* used in apr_md5_encode() */
 #endif
+#define DO_XLATE 0
+#define SKIP_XLATE 1
 
 /* F, G, H and I are basic MD5 functions.
  */
@@ -195,9 +197,10 @@
  * operation, processing another message block, and updating the
  * context.
  */
-APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
-                                         const void *_input,
-                                         apr_size_t inputLen)
+static apr_status_t md5_update_buffer(apr_md5_ctx_t *context,
+                               const void *_input,
+                               apr_size_t inputLen,
+                               int xlate_buffer)
 {
     const unsigned char *input = _input;
     unsigned int i, idx, partLen;
@@ -234,7 +237,7 @@
     memcpy(&context->buffer[idx], &input[i], inputLen - i);
 #else /*APR_HAS_XLATE*/
     if (inputLen >= partLen) {
-        if (context->xlate) {
+        if (context->xlate && (xlate_buffer == DO_XLATE)) {
             inbytes_left = outbytes_left = partLen;
             apr_xlate_conv_buffer(context->xlate, (const char *)input,
                                   &inbytes_left,
@@ -247,7 +250,7 @@
         MD5Transform(context->state, context->buffer);
 
         for (i = partLen; i + 63 < inputLen; i += 64) {
-            if (context->xlate) {
+            if (context->xlate && (xlate_buffer == DO_XLATE)) {
                 unsigned char inp_tmp[64];
                 inbytes_left = outbytes_left = 64;
                 apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
@@ -266,7 +269,7 @@
         i = 0;
 
     /* Buffer remaining input */
-    if (context->xlate) {
+    if (context->xlate && (xlate_buffer == DO_XLATE)) {
         inbytes_left = outbytes_left = inputLen - i;
         apr_xlate_conv_buffer(context->xlate, (const char *)&input[i],
                               &inbytes_left, (char *)&context->buffer[idx],
@@ -279,6 +282,16 @@
     return APR_SUCCESS;
 }
 
+/* MD5 block update operation. API with the default setting
+ * for EBCDIC translations
+ */ 
+APU_DECLARE(apr_status_t) apr_md5_update(apr_md5_ctx_t *context,
+                                         const void *_input,
+                                         apr_size_t inputLen)
+{
+    md5_update_buffer( context, _input, inputLen, DO_XLATE);
+}
+
 /* MD5 finalization. Ends an MD5 message-digest operation, writing the
  * the message digest and zeroizing the context.
  */
@@ -553,13 +566,16 @@
      * Then just as many characters of the MD5(pw, salt, pw)
      */
     apr_md5_init(&ctx1);
+#if APR_CHARSET_EBCDIC
+    apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii);
+#endif
     apr_md5_update(&ctx1, pw, strlen(pw));
     apr_md5_update(&ctx1, sp, sl);
     apr_md5_update(&ctx1, pw, strlen(pw));
     apr_md5_final(final, &ctx1);
     for (pl = strlen(pw); pl > 0; pl -= APR_MD5_DIGESTSIZE) {
-        apr_md5_update(&ctx, final,
-                      (pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl);
+        md5_update_buffer(&ctx, final,
+                      (pl > APR_MD5_DIGESTSIZE) ? APR_MD5_DIGESTSIZE : pl, SKIP_XLATE);
     }
 
     /*
@@ -572,7 +588,7 @@
      */
     for (i = strlen(pw); i != 0; i >>= 1) {
         if (i & 1) {
-            apr_md5_update(&ctx, final, 1);
+            md5_update_buffer(&ctx, final, 1, SKIP_XLATE);
         }
         else {
             apr_md5_update(&ctx, pw, 1);
@@ -596,11 +612,18 @@
      */
     for (i = 0; i < 1000; i++) {
         apr_md5_init(&ctx1);
+         /*
+          * apr_md5_final clears out ctx1.xlate at the end of each loop,
+          * so need to to set it each time through
+          */
+#if APR_CHARSET_EBCDIC
+        apr_md5_set_xlate(&ctx1, xlate_ebcdic_to_ascii);
+#endif
         if (i & 1) {
             apr_md5_update(&ctx1, pw, strlen(pw));
         }
         else {
-            apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE);
+            md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE);
         }
         if (i % 3) {
             apr_md5_update(&ctx1, sp, sl);
@@ -611,7 +634,7 @@
         }
 
         if (i & 1) {
-            apr_md5_update(&ctx1, final, APR_MD5_DIGESTSIZE);
+            md5_update_buffer(&ctx1, final, APR_MD5_DIGESTSIZE, SKIP_XLATE);
         }
         else {
             apr_md5_update(&ctx1, pw, strlen(pw));





On 9/7/07, William A. Rowe, Jr. <wrowe@rowe-clan.net> wrote:
Jeff Trawick wrote:
> On 9/7/07, Martin Kraemer <martin@apache.org> wrote:
>>
>> So, from my POV, I'm leaning towards fixing it in an "ASCII compatible"
>> way, rather than maintaining the incompatible format for eternity.
>
> +1 here as well
>
> A "--disable-portable-md5" option could probably be provided, but I
> don't think there are enough (possibly *any*) theoretical users of
> that to justify cluttering the code for eternity.

Then the proposal has my +1 as well, make it so :)

------=_Part_6819_3970960.1190816695757-- ------=_Part_6818_4808878.1190816695756 Content-Type: application/octet-stream; name="md5ebc.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="md5ebc.patch"; filename="md5ebc.patch"; filename="md5ebc.patch" X-Attachment-Id: f_f70sp8s8 SW5kZXg6IGFwcl9tZDUuYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIGFwcl9tZDUuYwkocmV2aXNpb24gNTc5 MjMyKQ0KKysrIGFwcl9tZDUuYwkod29ya2luZyBjb3B5KQ0KQEAgLTExMiw2ICsxMTIsOCBAQA0K ICNpZiBBUFJfQ0hBUlNFVF9FQkNESUMNCiBzdGF0aWMgYXByX3hsYXRlX3QgKnhsYXRlX2ViY2Rp Y190b19hc2NpaTsgLyogdXNlZCBpbiBhcHJfbWQ1X2VuY29kZSgpICovDQogI2VuZGlmDQorI2Rl ZmluZSBET19YTEFURSAwDQorI2RlZmluZSBTS0lQX1hMQVRFIDENCiANCiAvKiBGLCBHLCBIIGFu ZCBJIGFyZSBiYXNpYyBNRDUgZnVuY3Rpb25zLg0KICAqLw0KQEAgLTE5NSw5ICsxOTcsMTAgQEAN CiAgKiBvcGVyYXRpb24sIHByb2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlIGJsb2NrLCBhbmQgdXBk YXRpbmcgdGhlDQogICogY29udGV4dC4NCiAgKi8NCi1BUFVfREVDTEFSRShhcHJfc3RhdHVzX3Qp IGFwcl9tZDVfdXBkYXRlKGFwcl9tZDVfY3R4X3QgKmNvbnRleHQsDQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpfaW5wdXQsDQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfc2l6ZV90IGlucHV0TGVuKQ0KK3N0 YXRpYyBhcHJfc3RhdHVzX3QgbWQ1X3VwZGF0ZV9idWZmZXIoYXByX21kNV9jdHhfdCAqY29udGV4 dCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqX2lucHV0LA0K KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHJfc2l6ZV90IGlucHV0TGVuLA0KKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGxhdGVfYnVmZmVyKQ0KIHsNCiAgICAg Y29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQgPSBfaW5wdXQ7DQogICAgIHVuc2lnbmVkIGludCBp LCBpZHgsIHBhcnRMZW47DQpAQCAtMjM0LDcgKzIzNyw3IEBADQogICAgIG1lbWNweSgmY29udGV4 dC0+YnVmZmVyW2lkeF0sICZpbnB1dFtpXSwgaW5wdXRMZW4gLSBpKTsNCiAjZWxzZSAvKkFQUl9I QVNfWExBVEUqLw0KICAgICBpZiAoaW5wdXRMZW4gPj0gcGFydExlbikgew0KLSAgICAgICAgaWYg KGNvbnRleHQtPnhsYXRlKSB7DQorICAgICAgICBpZiAoY29udGV4dC0+eGxhdGUgJiYgKHhsYXRl X2J1ZmZlciA9PSBET19YTEFURSkpIHsNCiAgICAgICAgICAgICBpbmJ5dGVzX2xlZnQgPSBvdXRi eXRlc19sZWZ0ID0gcGFydExlbjsNCiAgICAgICAgICAgICBhcHJfeGxhdGVfY29udl9idWZmZXIo Y29udGV4dC0+eGxhdGUsIChjb25zdCBjaGFyICopaW5wdXQsIA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmaW5ieXRlc19sZWZ0LA0KQEAgLTI0Nyw3ICsyNTAsNyBAQA0KICAg ICAgICAgTUQ1VHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOw0KIA0K ICAgICAgICAgZm9yIChpID0gcGFydExlbjsgaSArIDYzIDwgaW5wdXRMZW47IGkgKz0gNjQpIHsN Ci0gICAgICAgICAgICBpZiAoY29udGV4dC0+eGxhdGUpIHsNCisgICAgICAgICAgICBpZiAoY29u dGV4dC0+eGxhdGUgJiYgKHhsYXRlX2J1ZmZlciA9PSBET19YTEFURSkpIHsNCiAgICAgICAgICAg ICAgICAgdW5zaWduZWQgY2hhciBpbnBfdG1wWzY0XTsNCiAgICAgICAgICAgICAgICAgaW5ieXRl c19sZWZ0ID0gb3V0Ynl0ZXNfbGVmdCA9IDY0Ow0KICAgICAgICAgICAgICAgICBhcHJfeGxhdGVf Y29udl9idWZmZXIoY29udGV4dC0+eGxhdGUsIChjb25zdCBjaGFyICopJmlucHV0W2ldLCANCkBA IC0yNjYsNyArMjY5LDcgQEANCiAgICAgICAgIGkgPSAwOw0KIA0KICAgICAvKiBCdWZmZXIgcmVt YWluaW5nIGlucHV0ICovDQotICAgIGlmIChjb250ZXh0LT54bGF0ZSkgew0KKyAgICBpZiAoY29u dGV4dC0+eGxhdGUgJiYgKHhsYXRlX2J1ZmZlciA9PSBET19YTEFURSkpIHsNCiAgICAgICAgIGlu Ynl0ZXNfbGVmdCA9IG91dGJ5dGVzX2xlZnQgPSBpbnB1dExlbiAtIGk7DQogICAgICAgICBhcHJf eGxhdGVfY29udl9idWZmZXIoY29udGV4dC0+eGxhdGUsIChjb25zdCBjaGFyICopJmlucHV0W2ld LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5ieXRlc19sZWZ0LCAoY2hhciAq KSZjb250ZXh0LT5idWZmZXJbaWR4XSwgDQpAQCAtMjc5LDYgKzI4MiwxNiBAQA0KICAgICByZXR1 cm4gQVBSX1NVQ0NFU1M7DQogfQ0KIA0KKy8qIE1ENSBibG9jayB1cGRhdGUgb3BlcmF0aW9uLiBB UEkgd2l0aCB0aGUgZGVmYXVsdCBzZXR0aW5nIA0KKyAqIGZvciBFQkNESUMgdHJhbnNsYXRpb25z DQorICovICANCitBUFVfREVDTEFSRShhcHJfc3RhdHVzX3QpIGFwcl9tZDVfdXBkYXRlKGFwcl9t ZDVfY3R4X3QgKmNvbnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCB2b2lkICpfaW5wdXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBhcHJfc2l6ZV90IGlucHV0TGVuKQ0KK3sNCisgICAgbWQ1X3VwZGF0ZV9idWZm ZXIoIGNvbnRleHQsIF9pbnB1dCwgaW5wdXRMZW4sIERPX1hMQVRFKTsNCit9DQorDQogLyogTUQ1 IGZpbmFsaXphdGlvbi4gRW5kcyBhbiBNRDUgbWVzc2FnZS1kaWdlc3Qgb3BlcmF0aW9uLCB3cml0 aW5nIHRoZQ0KICAqIHRoZSBtZXNzYWdlIGRpZ2VzdCBhbmQgemVyb2l6aW5nIHRoZSBjb250ZXh0 Lg0KICAqLw0KQEAgLTU1MywxMyArNTY2LDE2IEBADQogICAgICAqIFRoZW4ganVzdCBhcyBtYW55 IGNoYXJhY3RlcnMgb2YgdGhlIE1ENShwdywgc2FsdCwgcHcpDQogICAgICAqLw0KICAgICBhcHJf bWQ1X2luaXQoJmN0eDEpOw0KKyNpZiBBUFJfQ0hBUlNFVF9FQkNESUMNCisgICAgYXByX21kNV9z ZXRfeGxhdGUoJmN0eDEsIHhsYXRlX2ViY2RpY190b19hc2NpaSk7DQorI2VuZGlmDQogICAgIGFw cl9tZDVfdXBkYXRlKCZjdHgxLCBwdywgc3RybGVuKHB3KSk7DQogICAgIGFwcl9tZDVfdXBkYXRl KCZjdHgxLCBzcCwgc2wpOw0KICAgICBhcHJfbWQ1X3VwZGF0ZSgmY3R4MSwgcHcsIHN0cmxlbihw dykpOw0KICAgICBhcHJfbWQ1X2ZpbmFsKGZpbmFsLCAmY3R4MSk7DQogICAgIGZvciAocGwgPSBz dHJsZW4ocHcpOyBwbCA+IDA7IHBsIC09IEFQUl9NRDVfRElHRVNUU0laRSkgew0KLSAgICAgICAg YXByX21kNV91cGRhdGUoJmN0eCwgZmluYWwsIA0KLSAgICAgICAgICAgICAgICAgICAgICAocGwg PiBBUFJfTUQ1X0RJR0VTVFNJWkUpID8gQVBSX01ENV9ESUdFU1RTSVpFIDogcGwpOw0KKyAgICAg ICAgbWQ1X3VwZGF0ZV9idWZmZXIoJmN0eCwgZmluYWwsDQorICAgICAgICAgICAgICAgICAgICAg IChwbCA+IEFQUl9NRDVfRElHRVNUU0laRSkgPyBBUFJfTUQ1X0RJR0VTVFNJWkUgOiBwbCwgU0tJ UF9YTEFURSk7DQogICAgIH0NCiANCiAgICAgLyoNCkBAIC01NzIsNyArNTg4LDcgQEANCiAgICAg ICovDQogICAgIGZvciAoaSA9IHN0cmxlbihwdyk7IGkgIT0gMDsgaSA+Pj0gMSkgew0KICAgICAg ICAgaWYgKGkgJiAxKSB7DQotICAgICAgICAgICAgYXByX21kNV91cGRhdGUoJmN0eCwgZmluYWws IDEpOw0KKyAgICAgICAgICAgIG1kNV91cGRhdGVfYnVmZmVyKCZjdHgsIGZpbmFsLCAxLCBTS0lQ X1hMQVRFKTsNCiAgICAgICAgIH0NCiAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgIGFwcl9t ZDVfdXBkYXRlKCZjdHgsIHB3LCAxKTsNCkBAIC01OTYsMTEgKzYxMiwxOCBAQA0KICAgICAgKi8N CiAgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgew0KICAgICAgICAgYXByX21kNV9pbml0 KCZjdHgxKTsNCisgICAgICAgICAvKg0KKyAgICAgICAgICAqIGFwcl9tZDVfZmluYWwgY2xlYXJz IG91dCBjdHgxLnhsYXRlIGF0IHRoZSBlbmQgb2YgZWFjaCBsb29wLA0KKyAgICAgICAgICAqIHNv IG5lZWQgdG8gdG8gc2V0IGl0IGVhY2ggdGltZSB0aHJvdWdoDQorICAgICAgICAgICovDQorI2lm IEFQUl9DSEFSU0VUX0VCQ0RJQw0KKyAgICAgICAgYXByX21kNV9zZXRfeGxhdGUoJmN0eDEsIHhs YXRlX2ViY2RpY190b19hc2NpaSk7DQorI2VuZGlmDQogICAgICAgICBpZiAoaSAmIDEpIHsNCiAg ICAgICAgICAgICBhcHJfbWQ1X3VwZGF0ZSgmY3R4MSwgcHcsIHN0cmxlbihwdykpOw0KICAgICAg ICAgfQ0KICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgYXByX21kNV91cGRhdGUoJmN0eDEs IGZpbmFsLCBBUFJfTUQ1X0RJR0VTVFNJWkUpOw0KKyAgICAgICAgICAgIG1kNV91cGRhdGVfYnVm ZmVyKCZjdHgxLCBmaW5hbCwgQVBSX01ENV9ESUdFU1RTSVpFLCBTS0lQX1hMQVRFKTsNCiAgICAg ICAgIH0NCiAgICAgICAgIGlmIChpICUgMykgew0KICAgICAgICAgICAgIGFwcl9tZDVfdXBkYXRl KCZjdHgxLCBzcCwgc2wpOw0KQEAgLTYxMSw3ICs2MzQsNyBAQA0KICAgICAgICAgfQ0KIA0KICAg ICAgICAgaWYgKGkgJiAxKSB7DQotICAgICAgICAgICAgYXByX21kNV91cGRhdGUoJmN0eDEsIGZp bmFsLCBBUFJfTUQ1X0RJR0VTVFNJWkUpOw0KKyAgICAgICAgICAgIG1kNV91cGRhdGVfYnVmZmVy KCZjdHgxLCBmaW5hbCwgQVBSX01ENV9ESUdFU1RTSVpFLCBTS0lQX1hMQVRFKTsNCiAgICAgICAg IH0NCiAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgIGFwcl9tZDVfdXBkYXRlKCZjdHgxLCBw dywgc3RybGVuKHB3KSk7DQo= ------=_Part_6818_4808878.1190816695756--