From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 54287 invoked by alias); 30 Nov 2017 11:38:41 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 54273 invoked by uid 89); 30 Nov 2017 11:38:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.7 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,KB_WAM_FROM_NAME_SINGLEWORD,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=cooked X-HELO: mailout1.w1.samsung.com Received: from mailout1.w1.samsung.com (HELO mailout1.w1.samsung.com) (210.118.77.11) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 30 Nov 2017 11:38:36 +0000 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20171130113832euoutp01f09a42f3779f146a2b0a5f3978ca38c2~72hu8LrcJ2173921739euoutp01a; Thu, 30 Nov 2017 11:38:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20171130113832euoutp01f09a42f3779f146a2b0a5f3978ca38c2~72hu8LrcJ2173921739euoutp01a Received: from eusmges1.samsung.com (unknown [203.254.199.239]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171130113831eucas1p2e263cda3913d66cc94687381443aeb1f~72huX9CLA0131101311eucas1p2B; Thu, 30 Nov 2017 11:38:31 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1.samsung.com (EUCPMTA) with SMTP id 33.D4.12576.7BDEF1A5; Thu, 30 Nov 2017 11:38:31 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20171130113831eucas1p2e96cb8cd7910cf4452c35fb925a0b671~72hto0arg2221522215eucas1p2q; Thu, 30 Nov 2017 11:38:31 +0000 (GMT) Received: from eusync4.samsung.com ( [203.254.199.214]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id DB.5F.20118.7BDEF1A5; Thu, 30 Nov 2017 11:38:31 +0000 (GMT) Received: from [106.109.129.18] by eusync4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P0800B04B06TO10@eusync4.samsung.com>; Thu, 30 Nov 2017 11:38:31 +0000 (GMT) Subject: Re: [Ping][PATCH v3] Fix Incorrect ASan global variables alignment on arm (PR sanitizer/81697) To: Jakub Jelinek Cc: GCC Patches , Ramana Radhakrishnan From: Maxim Ostapenko Message-id: <5A1FEDB1.9040408@samsung.com> Date: Thu, 30 Nov 2017 11:55:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-version: 1.0 In-reply-to: <20171129101012.GA2353@tucnak> Content-type: multipart/mixed; boundary="------------050702070309070008090100" X-CMS-MailID: 20171130113831eucas1p2e96cb8cd7910cf4452c35fb925a0b671 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20171128070454eucas1p2ecf098de3fc9ced1e4e283b5e24f4c6f X-RootMTR: 20171128070454eucas1p2ecf098de3fc9ced1e4e283b5e24f4c6f References: <5A13E72B.3030906@samsung.com> <5A1D0A93.4080004@samsung.com> <20171129101012.GA2353@tucnak> X-IsSubscribed: yes X-SW-Source: 2017-11/txt/msg02551.txt.bz2 This is a multi-part message in MIME format. --------------050702070309070008090100 Content-Type: text/plain; charset="windows-1252"; format="flowed" Content-Transfer-Encoding: 7bit Content-length: 6018 Hi Jakub, thanks for review. I've fixed the issues you've pointed in review. Regarding a testcase -- I've cooked a runtime test, but it shows FP on unpatched GCC version only when linking with Gold (because it strips redzones more aggressively). This patch passes tests on arm-linux and x86_64-linux, bootstrap is in progress. Thanks, -Maxim On 29/11/17 13:10, Jakub Jelinek wrote: > On Tue, Nov 28, 2017 at 10:04:51AM +0300, Maxim Ostapenko wrote: >> (CC'ing Jakub and Ramana) >> >> I would like to ping the following patch: >> https://gcc.gnu.org/ml/gcc-patches/2017-10/msg02288.html >> Fix Incorrect ASan global variables alignment on arm (PR sanitizer/81697) >> >> -Maxim >> gcc/ChangeLog: >> >> 2017-11-28 Maxim Ostapenko >> >> PR sanitizer/81697 >> * asan.c (asan_protect_global): Add new ignore_decl_rtl_set_p >> parameter. Return true if ignore_decl_rtl_set_p is true and other >> conditions are satisfied. >> * asan.h (asan_protect_global): Add new parameter. >> * varasm.c (categorize_decl_for_section): Pass true as second parameter >> to asan_protect_global calls. >> >> gcc/testsuite/ChangeLog: >> >> 2017-11-28 Maxim Ostapenko >> >> PR sanitizer/81697 >> * g++.dg/asan/global-alignment.C: New test. >> >> diff --git a/gcc/asan.c b/gcc/asan.c >> index d5128aa..78c3b60 100644 >> --- a/gcc/asan.c >> +++ b/gcc/asan.c >> @@ -1605,7 +1605,7 @@ is_odr_indicator (tree decl) >> ASAN_RED_ZONE_SIZE bytes. */ >> >> bool >> -asan_protect_global (tree decl) >> +asan_protect_global (tree decl, bool ignore_decl_rtl_set_p) >> { >> if (!ASAN_GLOBALS) >> return false; >> @@ -1627,7 +1627,13 @@ asan_protect_global (tree decl) >> || DECL_THREAD_LOCAL_P (decl) >> /* Externs will be protected elsewhere. */ >> || DECL_EXTERNAL (decl) >> - || !DECL_RTL_SET_P (decl) >> + /* PR sanitizer/81697: For architectures that use section anchors first >> + call to asan_protect_global may occur before DECL_RTL (decl) is set. >> + We should ignore DECL_RTL_SET_P then, because otherwise the first call >> + to asan_protect_global will return FALSE and the following calls on the >> + same decl after setting DECL_RTL (decl) will return TRUE and we'll end >> + up with inconsistency at runtime. */ >> + || (!DECL_RTL_SET_P (decl) && !ignore_decl_rtl_set_p) > This part is fine. > >> /* Comdat vars pose an ABI problem, we can't know if >> the var that is selected by the linker will have >> padding or not. */ >> @@ -1651,6 +1657,9 @@ asan_protect_global (tree decl) >> || is_odr_indicator (decl)) >> return false; >> >> + if (ignore_decl_rtl_set_p) >> + return true; > This isn't, because then you bypass checks that really don't care > about RTL, like: > if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) > return false; > > if (!TARGET_SUPPORTS_ALIASES && asan_needs_local_alias (decl)) > return false; > > So, IMHO just wrap only the DECL_RTL/symbol related stuff in if > (!ignore_decl_rtl_set_p). Perhaps even better in > if (!ignore_decl_rtl_set_p || DECL_RTL_SET_P (decl)) > so that if the rtl is already set, you do the check anyway. > >> --- /dev/null >> +++ b/gcc/testsuite/g++.dg/asan/global-alignment.C >> @@ -0,0 +1,18 @@ >> +/* { dg-options "-fmerge-all-constants" } */ >> +/* { dg-do compile } */ >> +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ >> + >> +#include >> +#include >> + >> +const char kRecoveryInstallString[] = "NEW"; >> +const char kRecoveryUpdateString[] = "UPDATE"; >> +const char kRecoveryUninstallationString[] = "UNINSTALL"; >> + >> +const std::map kStringToRequestMap = { >> + {kRecoveryInstallString, 0}, >> + {kRecoveryUpdateString, 0}, >> + {kRecoveryUninstallationString, 0}, >> +}; >> + >> +/* { dg-final { scan-assembler-times {\.section\s+\.rodata\n(?:(?!\.section).)*\.\w+\s+"NEW} 1 } } */ > I don't really like the testcase. The scaning for .rodata section is too > fragile, e.g. darwin will need something completely different, doesn't e.g. > powerpc use .sdata section instead, etc. > > And, isn't std::map and std::string completely unnecessary? > I'd prefer a runtime test that shows the false positive without the patch, > preferrably in C, just with those const char arrays used by some C code > without any headers. > >> diff --git a/gcc/varasm.c b/gcc/varasm.c >> index a139151..849eae0 100644 >> --- a/gcc/varasm.c >> +++ b/gcc/varasm.c >> @@ -6508,7 +6508,7 @@ categorize_decl_for_section (const_tree decl, int reloc) >> else if (TREE_CODE (decl) == STRING_CST) >> { >> if ((flag_sanitize & SANITIZE_ADDRESS) >> - && asan_protect_global (CONST_CAST_TREE (decl))) >> + && asan_protect_global (CONST_CAST_TREE (decl), true)) > This doesn't make sense to me. asan_protect_global for STRING_CST doesn't > care about any RTL, nor -fsection-anchors puts them into any kind of > block. > >> /* or !flag_merge_constants */ >> return SECCAT_RODATA; >> else >> @@ -6536,7 +6536,7 @@ categorize_decl_for_section (const_tree decl, int reloc) >> ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO; >> else if (reloc || flag_merge_constants < 2 >> || ((flag_sanitize & SANITIZE_ADDRESS) >> - && asan_protect_global (CONST_CAST_TREE (decl)))) >> + && asan_protect_global (CONST_CAST_TREE (decl), true))) > I don't like this, there is no reason to change behavior for > targets without section anchors, or when it is disabled, or when decl > is not going to be put into any. > So, perhaps > && asan_protect_global (CONST_CAST_TREE (decl), > use_object_blocks_p () > && use_blocks_for_decl_p (decl)))) > instead, with a comment why? > >> /* C and C++ don't allow different variables to share the same >> location. -fmerge-all-constants allows even that (at the >> expense of not conforming). */ > > Jakub > > > --------------050702070309070008090100 Content-Type: text/x-diff; name="pr81697-3.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pr81697-3.diff" Content-length: 7215 Z2NjL0NoYW5nZUxvZzoNCg0KMjAxNy0xMS0zMCAgTWF4aW0gT3N0YXBlbmtv ICA8bS5vc3RhcGVua29Ac2Ftc3VuZy5jb20+DQoNCglQUiBzYW5pdGl6ZXIv ODE2OTcNCgkqIGFzYW4uYyAoYXNhbl9wcm90ZWN0X2dsb2JhbCk6IEFkZCBu ZXcgaWdub3JlX2RlY2xfcnRsX3NldF9wDQoJcGFyYW1ldGVyLiBSZXR1cm4g dHJ1ZSBpZiBpZ25vcmVfZGVjbF9ydGxfc2V0X3AgaXMgdHJ1ZSBhbmQgb3Ro ZXINCgljb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQuDQoJKiBhc2FuLmggKGFz YW5fcHJvdGVjdF9nbG9iYWwpOiBBZGQgbmV3IHBhcmFtZXRlci4NCgkqIHZh cmFzbS5jIChjYXRlZ29yaXplX2RlY2xfZm9yX3NlY3Rpb24pOiBQYXNzIHRy dWUgYXMgc2Vjb25kIHBhcmFtZXRlcg0KCXRvIGFzYW5fcHJvdGVjdF9nbG9i YWwgY2FsbHMuDQoNCmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOg0KDQoyMDE3 LTExLTMwICBNYXhpbSBPc3RhcGVua28gIDxtLm9zdGFwZW5rb0BzYW1zdW5n LmNvbT4NCg0KCVBSIHNhbml0aXplci84MTY5Nw0KCSogYy1jKystY29tbW9u L2FzYW4vcHI4MTY5Ny5jOiBOZXcgdGVzdC4NCg0KZGlmZiAtLWdpdCBhL2dj Yy9hc2FuLmMgYi9nY2MvYXNhbi5jDQppbmRleCBjYTVmY2VlZC4uODczNjg3 ZiAxMDA2NDQNCi0tLSBhL2djYy9hc2FuLmMNCisrKyBiL2djYy9hc2FuLmMN CkBAIC0xNjA1LDcgKzE2MDUsNyBAQCBpc19vZHJfaW5kaWNhdG9yICh0cmVl IGRlY2wpDQogICAgQVNBTl9SRURfWk9ORV9TSVpFIGJ5dGVzLiAgKi8NCiAN CiBib29sDQotYXNhbl9wcm90ZWN0X2dsb2JhbCAodHJlZSBkZWNsKQ0KK2Fz YW5fcHJvdGVjdF9nbG9iYWwgKHRyZWUgZGVjbCwgYm9vbCBpZ25vcmVfZGVj bF9ydGxfc2V0X3ApDQogew0KICAgaWYgKCFBU0FOX0dMT0JBTFMpDQogICAg IHJldHVybiBmYWxzZTsNCkBAIC0xNjI3LDcgKzE2MjcsMTMgQEAgYXNhbl9w cm90ZWN0X2dsb2JhbCAodHJlZSBkZWNsKQ0KICAgICAgIHx8IERFQ0xfVEhS RUFEX0xPQ0FMX1AgKGRlY2wpDQogICAgICAgLyogRXh0ZXJucyB3aWxsIGJl IHByb3RlY3RlZCBlbHNld2hlcmUuICAqLw0KICAgICAgIHx8IERFQ0xfRVhU RVJOQUwgKGRlY2wpDQotICAgICAgfHwgIURFQ0xfUlRMX1NFVF9QIChkZWNs KQ0KKyAgICAgIC8qIFBSIHNhbml0aXplci84MTY5NzogRm9yIGFyY2hpdGVj dHVyZXMgdGhhdCB1c2Ugc2VjdGlvbiBhbmNob3JzIGZpcnN0DQorCSBjYWxs IHRvIGFzYW5fcHJvdGVjdF9nbG9iYWwgbWF5IG9jY3VyIGJlZm9yZSBERUNM X1JUTCAoZGVjbCkgaXMgc2V0Lg0KKwkgV2Ugc2hvdWxkIGlnbm9yZSBERUNM X1JUTF9TRVRfUCB0aGVuLCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgZmlyc3Qg Y2FsbA0KKwkgdG8gYXNhbl9wcm90ZWN0X2dsb2JhbCB3aWxsIHJldHVybiBG QUxTRSBhbmQgdGhlIGZvbGxvd2luZyBjYWxscyBvbiB0aGUNCisJIHNhbWUg ZGVjbCBhZnRlciBzZXR0aW5nIERFQ0xfUlRMIChkZWNsKSB3aWxsIHJldHVy biBUUlVFIGFuZCB3ZSdsbCBlbmQNCisJIHVwIHdpdGggaW5jb25zaXN0ZW5j eSBhdCBydW50aW1lLiAgKi8NCisgICAgICB8fCAoIURFQ0xfUlRMX1NFVF9Q IChkZWNsKSAmJiAhaWdub3JlX2RlY2xfcnRsX3NldF9wKQ0KICAgICAgIC8q IENvbWRhdCB2YXJzIHBvc2UgYW4gQUJJIHByb2JsZW0sIHdlIGNhbid0IGtu b3cgaWYNCiAJIHRoZSB2YXIgdGhhdCBpcyBzZWxlY3RlZCBieSB0aGUgbGlu a2VyIHdpbGwgaGF2ZQ0KIAkgcGFkZGluZyBvciBub3QuICAqLw0KQEAgLTE2 NTEsMTQgKzE2NTcsMTggQEAgYXNhbl9wcm90ZWN0X2dsb2JhbCAodHJlZSBk ZWNsKQ0KICAgICAgIHx8IGlzX29kcl9pbmRpY2F0b3IgKGRlY2wpKQ0KICAg ICByZXR1cm4gZmFsc2U7DQogDQotICBydGwgPSBERUNMX1JUTCAoZGVjbCk7 DQotICBpZiAoIU1FTV9QIChydGwpIHx8IEdFVF9DT0RFIChYRVhQIChydGws IDApKSAhPSBTWU1CT0xfUkVGKQ0KLSAgICByZXR1cm4gZmFsc2U7DQotICBz eW1ib2wgPSBYRVhQIChydGwsIDApOw0KKyAgaWYgKCFpZ25vcmVfZGVjbF9y dGxfc2V0X3AgfHwgREVDTF9SVExfU0VUX1AgKGRlY2wpKQ0KKyAgICB7DQog DQotICBpZiAoQ09OU1RBTlRfUE9PTF9BRERSRVNTX1AgKHN5bWJvbCkNCi0g ICAgICB8fCBUUkVFX0NPTlNUQU5UX1BPT0xfQUREUkVTU19QIChzeW1ib2wp KQ0KLSAgICByZXR1cm4gZmFsc2U7DQorICAgICAgcnRsID0gREVDTF9SVEwg KGRlY2wpOw0KKyAgICAgIGlmICghTUVNX1AgKHJ0bCkgfHwgR0VUX0NPREUg KFhFWFAgKHJ0bCwgMCkpICE9IFNZTUJPTF9SRUYpDQorCXJldHVybiBmYWxz ZTsNCisgICAgICBzeW1ib2wgPSBYRVhQIChydGwsIDApOw0KKw0KKyAgICAg IGlmIChDT05TVEFOVF9QT09MX0FERFJFU1NfUCAoc3ltYm9sKQ0KKwkgIHx8 IFRSRUVfQ09OU1RBTlRfUE9PTF9BRERSRVNTX1AgKHN5bWJvbCkpDQorCXJl dHVybiBmYWxzZTsNCisgICAgfQ0KIA0KICAgaWYgKGxvb2t1cF9hdHRyaWJ1 dGUgKCJ3ZWFrcmVmIiwgREVDTF9BVFRSSUJVVEVTIChkZWNsKSkpDQogICAg IHJldHVybiBmYWxzZTsNCmRpZmYgLS1naXQgYS9nY2MvYXNhbi5oIGIvZ2Nj L2FzYW4uaA0KaW5kZXggYzgyZDRkOS4uODg1YjQ3ZSAxMDA2NDQNCi0tLSBh L2djYy9hc2FuLmgNCisrKyBiL2djYy9hc2FuLmgNCkBAIC0yNiw3ICsyNiw3 IEBAIGV4dGVybiB2b2lkIGFzYW5fZmluaXNoX2ZpbGUgKHZvaWQpOw0KIGV4 dGVybiBydHhfaW5zbiAqYXNhbl9lbWl0X3N0YWNrX3Byb3RlY3Rpb24gKHJ0 eCwgcnR4LCB1bnNpZ25lZCBpbnQsDQogCQkJCQkgICAgIEhPU1RfV0lERV9J TlQgKiwgdHJlZSAqLCBpbnQpOw0KIGV4dGVybiBydHhfaW5zbiAqYXNhbl9l bWl0X2FsbG9jYXNfdW5wb2lzb24gKHJ0eCwgcnR4LCBydHhfaW5zbiAqKTsN Ci1leHRlcm4gYm9vbCBhc2FuX3Byb3RlY3RfZ2xvYmFsICh0cmVlKTsNCitl eHRlcm4gYm9vbCBhc2FuX3Byb3RlY3RfZ2xvYmFsICh0cmVlLCBib29sIGln bm9yZV9kZWNsX3J0bF9zZXRfcCA9IGZhbHNlKTsNCiBleHRlcm4gdm9pZCBp bml0aWFsaXplX3Nhbml0aXplcl9idWlsdGlucyAodm9pZCk7DQogZXh0ZXJu IHRyZWUgYXNhbl9keW5hbWljX2luaXRfY2FsbCAoYm9vbCk7DQogZXh0ZXJu IGJvb2wgYXNhbl9leHBhbmRfY2hlY2tfaWZuIChnaW1wbGVfc3RtdF9pdGVy YXRvciAqLCBib29sKTsNCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2Mt YysrLWNvbW1vbi9hc2FuL3ByODE2OTcuYyBiL2djYy90ZXN0c3VpdGUvYy1j KystY29tbW9uL2FzYW4vcHI4MTY5Ny5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0 NA0KaW5kZXggMDAwMDAwMC4uM2E4NTgxMw0KLS0tIC9kZXYvbnVsbA0KKysr IGIvZ2NjL3Rlc3RzdWl0ZS9jLWMrKy1jb21tb24vYXNhbi9wcjgxNjk3LmMN CkBAIC0wLDAgKzEsMjAgQEANCisvKiB7IGRnLW9wdGlvbnMgIi1mbWVyZ2Ut YWxsLWNvbnN0YW50cyIgfSAqLw0KKy8qIHsgZGctZG8gcnVuIH0gKi8NCisv KiB7IGRnLXNraXAtaWYgIiIgeyAqLSotKiB9IHsgIi1PMCIgfSB7ICIiIH0g fSAqLw0KKw0KK2NvbnN0IGNoYXIga1JlY292ZXJ5SW5zdGFsbFN0cmluZ1td ID0gIk5FVyI7DQorY29uc3QgY2hhciBrUmVjb3ZlcnlVcGRhdGVTdHJpbmdb XSA9ICJVUERBVEUiOw0KK2NvbnN0IGNoYXIga1JlY292ZXJ5VW5pbnN0YWxs YXRpb25TdHJpbmcxW10gPSAiSU5TVEFMTCI7DQorY29uc3QgY2hhciBrUmVj b3ZlcnlVbmluc3RhbGxhdGlvblN0cmluZzJbXSA9ICJVTklOU1RBTEwiOw0K Kw0KK3ZvbGF0aWxlIGNvbnN0IGludCB6ZXJvID0gMDsNCisNCitpbnQNCitt YWluKCkNCit7DQorICBjaGFyIHgxID0ga1JlY292ZXJ5SW5zdGFsbFN0cmlu Z1t6ZXJvXTsNCisgIGNoYXIgeDIgPSBrUmVjb3ZlcnlVcGRhdGVTdHJpbmdb emVyb107DQorICBjaGFyIHgzID0ga1JlY292ZXJ5VW5pbnN0YWxsYXRpb25T dHJpbmcxW3plcm9dOw0KKyAgY2hhciB4NCA9IGtSZWNvdmVyeVVuaW5zdGFs bGF0aW9uU3RyaW5nMlt6ZXJvXTsNCisgIHJldHVybiAoeDEgKyB4MiArIHgz ICsgeDQpID09IDA7DQorfQ0KZGlmZiAtLWdpdCBhL2djYy92YXJhc20uYyBi L2djYy92YXJhc20uYw0KaW5kZXggMGM3YjI2ZS4uYmFjMDJkNSAxMDA2NDQN Ci0tLSBhL2djYy92YXJhc20uYw0KKysrIGIvZ2NjL3ZhcmFzbS5jDQpAQCAt NjU1MCw3ICs2NTUwLDE5IEBAIGNhdGVnb3JpemVfZGVjbF9mb3Jfc2VjdGlv biAoY29uc3RfdHJlZSBkZWNsLCBpbnQgcmVsb2MpDQogCXJldCA9IHJlbG9j ID09IDEgPyBTRUNDQVRfREFUQV9SRUxfUk9fTE9DQUwgOiBTRUNDQVRfREFU QV9SRUxfUk87DQogICAgICAgZWxzZSBpZiAocmVsb2MgfHwgZmxhZ19tZXJn ZV9jb25zdGFudHMgPCAyDQogCSAgICAgICB8fCAoKGZsYWdfc2FuaXRpemUg JiBTQU5JVElaRV9BRERSRVNTKQ0KLQkJICAgJiYgYXNhbl9wcm90ZWN0X2ds b2JhbCAoQ09OU1RfQ0FTVF9UUkVFIChkZWNsKSkpKQ0KKwkJICAgLyogUFIg ODE2OTc6IGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgdXNlIHNlY3Rpb24gYW5j aG9ycyB3ZQ0KKwkJICAgICAgbmVlZCB0byBpZ25vcmUgREVDTF9SVExfU0VU X1AgKGRlY2wpIGZvciBzdHJpbmcgY29uc3RhbnRzDQorCQkgICAgICBpbnNp ZGUgdGhpcyBhc2FuX3Byb3RlY3RfZ2xvYmFsIGNhbGwgYmVjYXVzZSBvdGhl cndpc2UNCisJCSAgICAgIHdlJ2xsIHdyb25nbHkgcHV0IHRoZW0gaW50byBT RUNDQVRfUk9EQVRBX01FUkdFX0NPTlNUDQorCQkgICAgICBzZWN0aW9uLCBz ZXQgREVDTF9SVEwgKGRlY2wpIGxhdGVyIG9uIGFuZCBhZGQgREVDTCB0bw0K KwkJICAgICAgcHJvdGVjdGVkIGdsb2JhbHMgdmlhIHN1Y2Nlc3NpdmUgYXNh bl9wcm90ZWN0X2dsb2JhbA0KKwkJICAgICAgY2FsbHMuICBJbiB0aGlzIHNj ZW5hcmlvIHdlJ2xsIGVuZCB1cCB3aXRoIHdyb25nDQorCQkgICAgICBhbGln bm1lbnQgb2YgdGhlc2Ugc3RyaW5ncyBhdCBydW50aW1lIGFuZCBwb3NzaWJs ZSBBU2FuDQorCQkgICAgICBmYWxzZSBwb3NpdGl2ZXMuICAqLw0KKwkJICAg JiYgYXNhbl9wcm90ZWN0X2dsb2JhbCAoQ09OU1RfQ0FTVF9UUkVFIChkZWNs KSwNCisJCQkJCSAgIHVzZV9vYmplY3RfYmxvY2tzX3AgKCkNCisJCQkJCSAg ICAgJiYgdXNlX2Jsb2Nrc19mb3JfZGVjbF9wICgNCisJCQkJCQkgIENPTlNU X0NBU1RfVFJFRSAoZGVjbCkpKSkpDQogCS8qIEMgYW5kIEMrKyBkb24ndCBh bGxvdyBkaWZmZXJlbnQgdmFyaWFibGVzIHRvIHNoYXJlIHRoZSBzYW1lDQog CSAgIGxvY2F0aW9uLiAgLWZtZXJnZS1hbGwtY29uc3RhbnRzIGFsbG93cyBl dmVuIHRoYXQgKGF0IHRoZQ0KIAkgICBleHBlbnNlIG9mIG5vdCBjb25mb3Jt aW5nKS4gICovDQo= --------------050702070309070008090100--