From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-il1-x12f.google.com (mail-il1-x12f.google.com [IPv6:2607:f8b0:4864:20::12f]) by sourceware.org (Postfix) with ESMTPS id AC9A63858C50 for ; Wed, 6 Apr 2022 21:11:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AC9A63858C50 Received: by mail-il1-x12f.google.com with SMTP id r5so575184ilo.5 for ; Wed, 06 Apr 2022 14:11:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=Yauz0+oz20G6OvxqZJSivEx+VDUGbi6XEW7ZI/T5wUc=; b=eqtmlTZTUSz+DrN8mTkXAXxzXv4wrCS9TuWnBwQUyK82OK51FkNjstjXs2afnBoGGA aRwJLQzWPjCAmdO+4/R0UNuVfYjtHBB8F6cPmPhu+o9qxzqn0hq1kkIZw2s/m1RhKVtK TmLDAQqHFBQXUlRX6k/djJP1rndYaKHsVVXSrNu+LQroyBdmZR9vzx90wfarc6uVjAvw AznkvBnXw1NpRZevVvmR6t3qSwwNtErYhnTqbJzRRzLzaHSEXFLzo1An+BuJXvtPIYIJ PNvp2ee1iPgraCxQdatctq94D4ZAW4u2UOaV8KiCe+xp06goLHUOOB9hThh9JXyptUgT i+bg== X-Gm-Message-State: AOAM530tMdyLKSCRILWKuwknqEmYcXWAEwlDF4cpshFiRZLc/dUcw3Xx 71rl8Rvmsi8luYwg+EWNApGp6Ep5ocpzhyYFohIkSwt5D58n0Q== X-Google-Smtp-Source: ABdhPJxFjj7ArZ1ZYfn62bcNq2icTzfucfjh8s74ABT/l0D9Abk1mvw2cU6EgUyZFJOJbGELwFPRiJ99JMh7s/jogwQ= X-Received: by 2002:a92:6c0c:0:b0:2c7:ace3:7ecc with SMTP id h12-20020a926c0c000000b002c7ace37eccmr4858250ilc.124.1649279459615; Wed, 06 Apr 2022 14:10:59 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Frolov Daniil Date: Thu, 7 Apr 2022 02:10:48 +0500 Message-ID: Subject: Re: -Wformat-overflow handling for %b and %B directives in C2X standard To: Marek Polacek Cc: gcc-patches@gcc.gnu.org Content-Type: multipart/mixed; boundary="00000000000053ee3905dc02cc6e" X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Apr 2022 21:11:04 -0000 --00000000000053ee3905dc02cc6e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello! Thanks for your feedback. I've tried to take into account your comments. New patch applied to the letter. The only thing I have not removed is the check_std_c2x () function. From my point of view -Wformat-overflow shouldn't be thrown if the standard < C2X. So it's protection for false triggering. =D1=81=D0=B1, 2 =D0=B0=D0=BF=D1=80. 2022 =D0=B3. =D0=B2 01:15, Marek Polace= k : > On Sat, Apr 02, 2022 at 12:19:47AM +0500, Frolov Daniil via Gcc-patches > wrote: > > Hello, I've noticed that -Wformat-overflow doesn't handle %b and %B > > directives in the sprintf function. I've added a relevant issue in > bugzilla > > (bug #105129). > > I attach a patch with a possible solution to the letter. > > Thanks for the patch. Support for C2X %b, %B formats is relatively new > (Oct 2021) so it looks like gimple-ssa-sprintf.cc hasn't caught up. > > This is not a regression, so should probably wait till GCC 13. Anyway... > > > From 2051344e9500651f6e94c44cbc7820715382b957 Mon Sep 17 00:00:00 2001 > > From: Frolov Daniil > > Date: Fri, 1 Apr 2022 00:47:03 +0500 > > Subject: [PATCH] Support %b, %B for -Wformat-overflow (sprintf, snprint= f) > > > > testsuite: add tests to check -Wformat-overflow on %b. > > Wformat-overflow1.c is compiled using -std=3Dc2x so warning has to > > be throwed > > > > Wformat-overflow2.c doesn't throw warnings cause c2x std isn't > > used > > > > gcc/ChangeLog: > > > > * gimple-ssa-sprintf.cc > > (check_std_c2x): New function > > (fmtresult::type_max_digits): add base =3D=3D 2 handling > > (tree_digits): add handle for base =3D=3D 2 > > (format_integer): now handle %b and %B using base =3D 2 > > (parse_directive): add cases to handle %b and %B directives > > (compute_format_length): add handling for base =3D 2 > > The descriptions should start with a capital letter and end with a period= , > like "Handle base =3D=3D 2." > > > gcc/testsuite/ChangeLog: > > > > * gcc.dg/Wformat-overflow1.c: New test. (using -std=3Dc2x) > > * gcc.dg/Wformat-overflow2.c: New test. (-std=3Dc11 no warning) > > You can just say "New test." > > > --- > > gcc/gimple-ssa-sprintf.cc | 42 ++++++++++++++++++++---- > > gcc/testsuite/gcc.dg/Wformat-overflow1.c | 28 ++++++++++++++++ > > gcc/testsuite/gcc.dg/Wformat-overflow2.c | 16 +++++++++ > > 3 files changed, 79 insertions(+), 7 deletions(-) > > create mode 100644 gcc/testsuite/gcc.dg/Wformat-overflow1.c > > create mode 100644 gcc/testsuite/gcc.dg/Wformat-overflow2.c > > > > diff --git a/gcc/gimple-ssa-sprintf.cc b/gcc/gimple-ssa-sprintf.cc > > index c93f12f90b5..7f68c2b6e51 100644 > > --- a/gcc/gimple-ssa-sprintf.cc > > +++ b/gcc/gimple-ssa-sprintf.cc > > @@ -107,6 +107,15 @@ namespace { > > > > static int warn_level; > > > > +/* b_overflow_flag depends on the current standart when using gcc */ > > "standard" > > /* Comments should be formatted like this. */ > > > +static bool b_overflow_flag; > > + > > +/* check is current standart version equals C2X*/ > > +static bool check_std_c2x () > > +{ > > + return !strcmp (lang_hooks.name, "GNU C2X"); > > +} > > Is this really needed? ISTM that this new checking shouldn't depend on > -std=3Dc2x. If not using C2X, you only get a warning if -Wpedantic. So > I think you should remove b_overflow_flag. > > > /* The minimum, maximum, likely, and unlikely maximum number of bytes > > of output either a formatting function or an individual directive > > can result in. */ > > @@ -535,6 +544,8 @@ fmtresult::type_max_digits (tree type, int base) > > unsigned prec =3D TYPE_PRECISION (type); > > switch (base) > > { > > + case 2: > > + return prec; > > case 8: > > return (prec + 2) / 3; > > case 10: > > @@ -857,11 +868,11 @@ tree_digits (tree x, int base, HOST_WIDE_INT prec= , > bool plus, bool prefix) > > > > /* Adjust a non-zero value for the base prefix, either hexadecimal, > > or, unless precision has resulted in a leading zero, also octal. > */ > > - if (prefix && absval && (base =3D=3D 16 || prec <=3D ndigs)) > > + if (prefix && absval && (base =3D=3D 2 || base =3D=3D 16 || prec <= =3D ndigs)) > > { > > if (base =3D=3D 8) > > res +=3D 1; > > - else if (base =3D=3D 16) > > + else if (base =3D=3D 16 || base =3D=3D 2) /*0x...(0X...) and > 0b...(0B...)*/ > > res +=3D 2; > > } > > > > @@ -1229,6 +1240,10 @@ format_integer (const directive &dir, tree arg, > pointer_query &ptr_qry) > > case 'u': > > base =3D 10; > > break; > > + case 'b': > > + case 'B': > > + base =3D 2; > > + break; > > case 'o': > > base =3D 8; > > break; > > @@ -1351,10 +1366,10 @@ format_integer (const directive &dir, tree arg, > pointer_query &ptr_qry) > > > > /* Bump up the counters if WIDTH is greater than LEN. */ > > res.adjust_for_width_or_precision (dir.width, dirtype, base, > > - (sign | maybebase) + (base =3D= =3D > 16)); > > + (sign | maybebase) + (base =3D= =3D 2 > || base =3D=3D 16)); > > /* Bump up the counters again if PRECision is greater still. */ > > res.adjust_for_width_or_precision (dir.prec, dirtype, base, > > - (sign | maybebase) + (base =3D= =3D > 16)); > > + (sign | maybebase) + (base =3D= =3D 2 > || base =3D=3D 16)); > > > > return res; > > } > > @@ -1503,7 +1518,7 @@ format_integer (const directive &dir, tree arg, > pointer_query &ptr_qry) > > if (res.range.min =3D=3D 1) > > res.range.likely +=3D base =3D=3D 8 ? 1 : 2; > > else if (res.range.min =3D=3D 2 > > - && base =3D=3D 16 > > + && (base =3D=3D 16 || base =3D=3D 2) > > && (dir.width[0] =3D=3D 2 || dir.prec[0] =3D=3D 2)) > > ++res.range.likely; > > } > > @@ -1511,9 +1526,9 @@ format_integer (const directive &dir, tree arg, > pointer_query &ptr_qry) > > > > res.range.unlikely =3D res.range.max; > > res.adjust_for_width_or_precision (dir.width, dirtype, base, > > - (sign | maybebase) + (base =3D=3D 16= )); > > + (sign | maybebase) + (base =3D=3D 2 = || > base =3D=3D 16)); > > res.adjust_for_width_or_precision (dir.prec, dirtype, base, > > - (sign | maybebase) + (base =3D=3D 16= )); > > + (sign | maybebase) + (base =3D=3D 2 = || > base =3D=3D 16)); > > > > return res; > > } > > @@ -3680,6 +3695,8 @@ parse_directive (call_info &info, > > ++pf; > > break; > > } > > + > > + > > Drop this spurious change. > > > switch (target_to_host (*pf)) > > { > > @@ -3713,6 +3730,14 @@ parse_directive (call_info &info, > > case 'X': > > dir.fmtfunc =3D format_integer; > > break; > > + > > + case 'b': > > + case 'B': > > + if (b_overflow_flag) { > > + dir.fmtfunc =3D format_integer; > > + break; > > + } > > + return 0; > > > > case 'p': > > /* The %p output is implementation-defined. It's possible > > @@ -4038,6 +4063,9 @@ compute_format_length (call_info &info, > format_result *res, > > > > bool success =3D true; > > > > + /* Check for GNU C2X standart */ > > + b_overflow_flag =3D check_std_c2x (); > > + > > for (const char *pf =3D info.fmtstr; ; ++dirno) > > { > > directive dir (&info, dirno); > > diff --git a/gcc/testsuite/gcc.dg/Wformat-overflow1.c > b/gcc/testsuite/gcc.dg/Wformat-overflow1.c > > new file mode 100644 > > index 00000000000..cf9766fae14 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/Wformat-overflow1.c > > @@ -0,0 +1,28 @@ > > +/* > > + { dg-do compile } > > + { dg-options "-Wformat-overflow -std=3Dc2x" } > > +*/ > > + > > +extern int sprintf (char* restrict, const char* restrict, ...); > > + > > +void test_warn () { > > + > > + int n =3D __INT_MAX__; > > + char dst [5] =3D {0}; > > + sprintf (dst, "%b", n); /* { dg-warning "-Wformat-overflow" } */ > > + > > + sprintf (dst, "%#b", n); /* { dg-warning "-Wformat-overflow" } */ > > + > > +} > > + > > +void test_no_warn () { > > + > > + char dst [5] =3D {0}; > > + int n =3D 8; > > + sprintf (dst, "%b", n); > > + > > + char another_dst [34] =3D {0}; > > + n =3D __INT_MAX__; > > + sprintf (another_dst, "%#b", n); > > + > > +} > > diff --git a/gcc/testsuite/gcc.dg/Wformat-overflow2.c > b/gcc/testsuite/gcc.dg/Wformat-overflow2.c > > new file mode 100644 > > index 00000000000..c6b1d9062a6 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/Wformat-overflow2.c > > @@ -0,0 +1,16 @@ > > +/* > > + { dg-do compile } > > + { dg-options "-Wformat-overflow -std=3Dc11" } > > +*/ > > + > > +extern int sprintf (char* restrict, const char* restrict, ...); > > + > > +void test_no_warn () { > > + > > + /*There is no reason to throw warning if std < c2x*/ > > + > > + char dst [5] =3D {0}; > > + int n =3D 32; > > + sprintf (dst, "%b", n); > > + > > +} > > -- > > 2.25.1 > > > > > Marek > > --00000000000053ee3905dc02cc6e Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Support-b-B-for-Wformat-overflow-sprintf-snprintf.patch" Content-Disposition: attachment; filename="0001-Support-b-B-for-Wformat-overflow-sprintf-snprintf.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l1o2cz5w0 RnJvbSA3YjE0YTJhYTkwOTE5NDg0MWZhOTE2ZjJkYjVkOGFhMWU0YTYzNjdlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGcm9sb3YgRGFuaWlsIDxmcm9sb3YuZGFAcGh5c3RlY2guZWR1 PgpEYXRlOiBUaHUsIDcgQXByIDIwMjIgMDI6MDU6NTggKzA1MDAKU3ViamVjdDogW1BBVENIXSBT dXBwb3J0ICViLCAlQiBmb3IgLVdmb3JtYXQtb3ZlcmZsb3cgKHNwcmludGYsIHNucHJpbnRmKQoK Z2NjL0NoYW5nZUxvZzoKCgkqIGdpbXBsZS1zc2Etc3ByaW50Zi5jYyAoY2hlY2tfc3RkX2MyeCk6 IEhhbmRsZSBiYXNlID09IDIuCgkoZm10cmVzdWx0Ojp0eXBlX21heF9kaWdpdHMpOiBIYW5kbGUg YmFzZSA9PSAyLgoJKHRyZWVfZGlnaXRzKTogSGFuZGxlIGJhc2UgPT0gMi4KCShmb3JtYXRfaW50 ZWdlcik6IEhhbmRsZSBiYXNlID09IDIuCgkocGFyc2VfZGlyZWN0aXZlKTogQWRkIGNhc2VzIGZv ciAlYiBhbmQgJUIgZGlyZWN0aXZlcy4KCShjb21wdXRlX2Zvcm1hdF9sZW5ndGgpOiBIYW5kbGUg YmFzZSA9PSAyLgoKZ2NjL3Rlc3RzdWl0ZS9DaGFuZ2VMb2c6CgoJKiBnY2MuZGcvV2Zvcm1hdC1v dmVyZmxvdzEuYzogTmV3IHRlc3QuCgkqIGdjYy5kZy9XZm9ybWF0LW92ZXJmbG93Mi5jOiBOZXcg dGVzdC4KLS0tCiBnY2MvZ2ltcGxlLXNzYS1zcHJpbnRmLmNjICAgICAgICAgICAgICAgIHwgNDAg KysrKysrKysrKysrKysrKysrKy0tLS0tCiBnY2MvdGVzdHN1aXRlL2djYy5kZy9XZm9ybWF0LW92 ZXJmbG93MS5jIHwgMjggKysrKysrKysrKysrKysrKysKIGdjYy90ZXN0c3VpdGUvZ2NjLmRnL1dm b3JtYXQtb3ZlcmZsb3cyLmMgfCAxNiArKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDc3IGlu c2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3Rz dWl0ZS9nY2MuZGcvV2Zvcm1hdC1vdmVyZmxvdzEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90 ZXN0c3VpdGUvZ2NjLmRnL1dmb3JtYXQtb3ZlcmZsb3cyLmMKCmRpZmYgLS1naXQgYS9nY2MvZ2lt cGxlLXNzYS1zcHJpbnRmLmNjIGIvZ2NjL2dpbXBsZS1zc2Etc3ByaW50Zi5jYwppbmRleCBjOTNm MTJmOTBiNS4uNmExNGEwMDQ0ODMgMTAwNjQ0Ci0tLSBhL2djYy9naW1wbGUtc3NhLXNwcmludGYu Y2MKKysrIGIvZ2NjL2dpbXBsZS1zc2Etc3ByaW50Zi5jYwpAQCAtMTA3LDYgKzEwNywxNSBAQCBu YW1lc3BhY2UgewogCiBzdGF0aWMgaW50IHdhcm5fbGV2ZWw7CiAKKy8qIFRoZSBiX292ZXJmbG93 X2ZsYWcgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBzdGFuZGFyZCB3aGVuIHVzaW5nIGdjYy4gKi8K K3N0YXRpYyBib29sIGJfb3ZlcmZsb3dfZmxhZzsKKworLyogQ2hlY2sgaXMgY3VycmVudCBzdGFu ZGFyZCB2ZXJzaW9uIGVxdWFscyBDMlguICovCitzdGF0aWMgYm9vbCBjaGVja19zdGRfYzJ4ICgp IAoreworICByZXR1cm4gIXN0cmNtcCAobGFuZ19ob29rcy5uYW1lLCAiR05VIEMyWCIpOworfQor CiAvKiBUaGUgbWluaW11bSwgbWF4aW11bSwgbGlrZWx5LCBhbmQgdW5saWtlbHkgbWF4aW11bSBu dW1iZXIgb2YgYnl0ZXMKICAgIG9mIG91dHB1dCBlaXRoZXIgYSBmb3JtYXR0aW5nIGZ1bmN0aW9u IG9yIGFuIGluZGl2aWR1YWwgZGlyZWN0aXZlCiAgICBjYW4gcmVzdWx0IGluLiAgKi8KQEAgLTUz NSw2ICs1NDQsOCBAQCBmbXRyZXN1bHQ6OnR5cGVfbWF4X2RpZ2l0cyAodHJlZSB0eXBlLCBpbnQg YmFzZSkKICAgdW5zaWduZWQgcHJlYyA9IFRZUEVfUFJFQ0lTSU9OICh0eXBlKTsKICAgc3dpdGNo IChiYXNlKQogICAgIHsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gcHJlYzsKICAgICBjYXNl IDg6CiAgICAgICByZXR1cm4gKHByZWMgKyAyKSAvIDM7CiAgICAgY2FzZSAxMDoKQEAgLTg1Nywx MSArODY4LDExIEBAIHRyZWVfZGlnaXRzICh0cmVlIHgsIGludCBiYXNlLCBIT1NUX1dJREVfSU5U IHByZWMsIGJvb2wgcGx1cywgYm9vbCBwcmVmaXgpCiAKICAgLyogQWRqdXN0IGEgbm9uLXplcm8g dmFsdWUgZm9yIHRoZSBiYXNlIHByZWZpeCwgZWl0aGVyIGhleGFkZWNpbWFsLAogICAgICBvciwg dW5sZXNzIHByZWNpc2lvbiBoYXMgcmVzdWx0ZWQgaW4gYSBsZWFkaW5nIHplcm8sIGFsc28gb2N0 YWwuICAqLwotICBpZiAocHJlZml4ICYmIGFic3ZhbCAmJiAoYmFzZSA9PSAxNiB8fCBwcmVjIDw9 IG5kaWdzKSkKKyAgaWYgKHByZWZpeCAmJiBhYnN2YWwgJiYgKGJhc2UgPT0gMiB8fCBiYXNlID09 IDE2IHx8IHByZWMgPD0gbmRpZ3MpKQogICAgIHsKICAgICAgIGlmIChiYXNlID09IDgpCiAJcmVz ICs9IDE7Ci0gICAgICBlbHNlIGlmIChiYXNlID09IDE2KQorICAgICAgZWxzZSBpZiAoYmFzZSA9 PSAxNiB8fCBiYXNlID09IDIpIC8qIDB4Li4uKDBYLi4uKSBhbmQgMGIuLi4oMEIuLi4pICovCiAJ cmVzICs9IDI7CiAgICAgfQogCkBAIC0xMjI5LDYgKzEyNDAsMTAgQEAgZm9ybWF0X2ludGVnZXIg KGNvbnN0IGRpcmVjdGl2ZSAmZGlyLCB0cmVlIGFyZywgcG9pbnRlcl9xdWVyeSAmcHRyX3FyeSkK ICAgICBjYXNlICd1JzoKICAgICAgIGJhc2UgPSAxMDsKICAgICAgIGJyZWFrOworICAgIGNhc2Ug J2InOgorICAgIGNhc2UgJ0InOgorICAgICAgYmFzZSA9IDI7CisgICAgICBicmVhazsKICAgICBj YXNlICdvJzoKICAgICAgIGJhc2UgPSA4OwogICAgICAgYnJlYWs7CkBAIC0xMzUxLDEwICsxMzY2 LDEwIEBAIGZvcm1hdF9pbnRlZ2VyIChjb25zdCBkaXJlY3RpdmUgJmRpciwgdHJlZSBhcmcsIHBv aW50ZXJfcXVlcnkgJnB0cl9xcnkpCiAKICAgICAgIC8qIEJ1bXAgdXAgdGhlIGNvdW50ZXJzIGlm IFdJRFRIIGlzIGdyZWF0ZXIgdGhhbiBMRU4uICAqLwogICAgICAgcmVzLmFkanVzdF9mb3Jfd2lk dGhfb3JfcHJlY2lzaW9uIChkaXIud2lkdGgsIGRpcnR5cGUsIGJhc2UsCi0JCQkJCSAoc2lnbiB8 IG1heWJlYmFzZSkgKyAoYmFzZSA9PSAxNikpOworCQkJCQkgKHNpZ24gfCBtYXliZWJhc2UpICsg KGJhc2UgPT0gMiB8fCBiYXNlID09IDE2KSk7CiAgICAgICAvKiBCdW1wIHVwIHRoZSBjb3VudGVy cyBhZ2FpbiBpZiBQUkVDaXNpb24gaXMgZ3JlYXRlciBzdGlsbC4gICovCiAgICAgICByZXMuYWRq dXN0X2Zvcl93aWR0aF9vcl9wcmVjaXNpb24gKGRpci5wcmVjLCBkaXJ0eXBlLCBiYXNlLAotCQkJ CQkgKHNpZ24gfCBtYXliZWJhc2UpICsgKGJhc2UgPT0gMTYpKTsKKwkJCQkJIChzaWduIHwgbWF5 YmViYXNlKSArIChiYXNlID09IDIgfHwgYmFzZSA9PSAxNikpOwogCiAgICAgICByZXR1cm4gcmVz OwogICAgIH0KQEAgLTE1MDMsNyArMTUxOCw3IEBAIGZvcm1hdF9pbnRlZ2VyIChjb25zdCBkaXJl Y3RpdmUgJmRpciwgdHJlZSBhcmcsIHBvaW50ZXJfcXVlcnkgJnB0cl9xcnkpCiAJICBpZiAocmVz LnJhbmdlLm1pbiA9PSAxKQogCSAgICByZXMucmFuZ2UubGlrZWx5ICs9IGJhc2UgPT0gOCA/IDEg OiAyOwogCSAgZWxzZSBpZiAocmVzLnJhbmdlLm1pbiA9PSAyCi0JCSAgICYmIGJhc2UgPT0gMTYK KwkJICAgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSAyKQogCQkgICAmJiAoZGlyLndpZHRoWzBd ID09IDIgfHwgZGlyLnByZWNbMF0gPT0gMikpCiAJICAgICsrcmVzLnJhbmdlLmxpa2VseTsKIAl9 CkBAIC0xNTExLDkgKzE1MjYsOSBAQCBmb3JtYXRfaW50ZWdlciAoY29uc3QgZGlyZWN0aXZlICZk aXIsIHRyZWUgYXJnLCBwb2ludGVyX3F1ZXJ5ICZwdHJfcXJ5KQogCiAgIHJlcy5yYW5nZS51bmxp a2VseSA9IHJlcy5yYW5nZS5tYXg7CiAgIHJlcy5hZGp1c3RfZm9yX3dpZHRoX29yX3ByZWNpc2lv biAoZGlyLndpZHRoLCBkaXJ0eXBlLCBiYXNlLAotCQkJCSAgICAgKHNpZ24gfCBtYXliZWJhc2Up ICsgKGJhc2UgPT0gMTYpKTsKKwkJCQkgICAgIChzaWduIHwgbWF5YmViYXNlKSArIChiYXNlID09 IDIgfHwgYmFzZSA9PSAxNikpOwogICByZXMuYWRqdXN0X2Zvcl93aWR0aF9vcl9wcmVjaXNpb24g KGRpci5wcmVjLCBkaXJ0eXBlLCBiYXNlLAotCQkJCSAgICAgKHNpZ24gfCBtYXliZWJhc2UpICsg KGJhc2UgPT0gMTYpKTsKKwkJCQkgICAgIChzaWduIHwgbWF5YmViYXNlKSArIChiYXNlID09IDIg fHwgYmFzZSA9PSAxNikpOwogCiAgIHJldHVybiByZXM7CiB9CkBAIC0zNzEzLDYgKzM3MjgsMTQg QEAgcGFyc2VfZGlyZWN0aXZlIChjYWxsX2luZm8gJmluZm8sCiAgICAgY2FzZSAnWCc6CiAgICAg ICBkaXIuZm10ZnVuYyA9IGZvcm1hdF9pbnRlZ2VyOwogICAgICAgYnJlYWs7CisgICAgCisgICAg Y2FzZSAnYic6CisgICAgY2FzZSAnQic6CisgICAgICBpZiAoYl9vdmVyZmxvd19mbGFnKSB7Cisg ICAgICAgIGRpci5mbXRmdW5jID0gZm9ybWF0X2ludGVnZXI7CisgICAgICAgIGJyZWFrOworICAg ICAgfQorICAgICAgcmV0dXJuIDA7CiAKICAgICBjYXNlICdwJzoKICAgICAgIC8qIFRoZSAlcCBv dXRwdXQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIEl0J3MgcG9zc2libGUKQEAgLTQwMzgs NiArNDA2MSw5IEBAIGNvbXB1dGVfZm9ybWF0X2xlbmd0aCAoY2FsbF9pbmZvICZpbmZvLCBmb3Jt YXRfcmVzdWx0ICpyZXMsCiAKICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKIAorICAvKiBDaGVjayBm b3IgR05VIEMyWCBzdGFuZGFyZCAqLworICBiX292ZXJmbG93X2ZsYWcgPSBjaGVja19zdGRfYzJ4 ICgpOworCiAgIGZvciAoY29uc3QgY2hhciAqcGYgPSBpbmZvLmZtdHN0cjsgOyArK2Rpcm5vKQog ICAgIHsKICAgICAgIGRpcmVjdGl2ZSBkaXIgKCZpbmZvLCBkaXJubyk7CmRpZmYgLS1naXQgYS9n Y2MvdGVzdHN1aXRlL2djYy5kZy9XZm9ybWF0LW92ZXJmbG93MS5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvV2Zvcm1hdC1vdmVyZmxvdzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMC4uY2Y5NzY2ZmFlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy9XZm9ybWF0LW92ZXJmbG93MS5jCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgICAgeyBkZy1k byBjb21waWxlIH0KKyAgICB7IGRnLW9wdGlvbnMgIi1XZm9ybWF0LW92ZXJmbG93IC1zdGQ9YzJ4 IiB9CisqLworCitleHRlcm4gaW50IHNwcmludGYgKGNoYXIqIHJlc3RyaWN0LCBjb25zdCBjaGFy KiByZXN0cmljdCwgLi4uKTsKKwordm9pZCB0ZXN0X3dhcm4gKCkgeworCisgICAgaW50IG4gPSBf X0lOVF9NQVhfXzsKKyAgICBjaGFyIGRzdCBbNV0gPSB7MH07CisgICAgc3ByaW50ZiAoZHN0LCAi JWIiLCBuKTsgIC8qIHsgZGctd2FybmluZyAiLVdmb3JtYXQtb3ZlcmZsb3ciIH0gKi8KKworICAg IHNwcmludGYgKGRzdCwgIiUjYiIsIG4pOyAvKiB7IGRnLXdhcm5pbmcgIi1XZm9ybWF0LW92ZXJm bG93IiB9ICovCisKK30KKwordm9pZCB0ZXN0X25vX3dhcm4gKCkgeworCisgICAgY2hhciBkc3Qg WzVdID0gezB9OworICAgIGludCBuID0gODsKKyAgICBzcHJpbnRmIChkc3QsICIlYiIsIG4pOwor CisgICAgY2hhciBhbm90aGVyX2RzdCBbMzRdID0gezB9OworICAgIG4gPSBfX0lOVF9NQVhfXzsK KyAgICBzcHJpbnRmIChhbm90aGVyX2RzdCwgIiUjYiIsIG4pOworCit9CmRpZmYgLS1naXQgYS9n Y2MvdGVzdHN1aXRlL2djYy5kZy9XZm9ybWF0LW92ZXJmbG93Mi5jIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvV2Zvcm1hdC1vdmVyZmxvdzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMC4uYzZiMWQ5MDYyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2dj Yy5kZy9XZm9ybWF0LW92ZXJmbG93Mi5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgICAgeyBkZy1k byBjb21waWxlIH0KKyAgICB7IGRnLW9wdGlvbnMgIi1XZm9ybWF0LW92ZXJmbG93IC1zdGQ9YzEx IiB9CisqLworCitleHRlcm4gaW50IHNwcmludGYgKGNoYXIqIHJlc3RyaWN0LCBjb25zdCBjaGFy KiByZXN0cmljdCwgLi4uKTsKKwordm9pZCB0ZXN0X25vX3dhcm4gKCkgeworCisgICAgLypUaGVy ZSBpcyBubyByZWFzb24gdG8gdGhyb3cgd2FybmluZyBpZiBzdGQgPCBjMngqLworCisgICAgY2hh ciBkc3QgWzVdID0gezB9OworICAgIGludCBuID0gMzI7CisgICAgc3ByaW50ZiAoZHN0LCAiJWIi LCBuKTsKKworfQotLSAKMi4yNS4xCgo= --00000000000053ee3905dc02cc6e--