From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 58814 invoked by alias); 6 Sep 2019 14:46:43 -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 58701 invoked by uid 89); 6 Sep 2019 14:46:42 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 spammy=son X-HELO: EUR01-HE1-obe.outbound.protection.outlook.com Received: from mail-eopbgr130041.outbound.protection.outlook.com (HELO EUR01-HE1-obe.outbound.protection.outlook.com) (40.107.13.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 06 Sep 2019 14:46:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EDwAq3rjY1mzg+BeQNTIC9g74kEYhtFbVYcF7Ofaf0w=; b=nw+5kIpsTrFgcrAWztGdNtmOuaEN2j9Z83+88mCPFF8OylImgVIMxGmKzJgbL9ADueskCeHzzyMfBH57bmOgiikbVPvH10wTCA01cJZUZX9ASqOWdPPQpz5nFwCM3niLytzBrDSZr9XnI5ewAmRzJivwsYu848o5DCKoGI8ssno= Received: from VI1PR08CA0139.eurprd08.prod.outlook.com (2603:10a6:800:d5::17) by VI1PR08MB2639.eurprd08.prod.outlook.com (2603:10a6:802:25::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2241.15; Fri, 6 Sep 2019 14:46:29 +0000 Received: from DB5EUR03FT046.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e0a::200) by VI1PR08CA0139.outlook.office365.com (2603:10a6:800:d5::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2241.13 via Frontend Transport; Fri, 6 Sep 2019 14:46:29 +0000 Authentication-Results: spf=temperror (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; gcc.gnu.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;gcc.gnu.org; dmarc=temperror action=none header.from=arm.com; Received-SPF: TempError (protection.outlook.com: error in processing during lookup of arm.com: DNS Timeout) Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT046.mail.protection.outlook.com (10.152.21.230) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.2241.14 via Frontend Transport; Fri, 6 Sep 2019 14:46:28 +0000 Received: ("Tessian outbound d33df262a6a7:v27"); Fri, 06 Sep 2019 14:46:28 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 860418fdcf45b9f9 X-CR-MTA-TID: 64aa7808 Received: from 403e12ed4335.1 (cr-mta-lb-1.cr-mta-net [104.47.9.53]) by 64aa7808-outbound-1.mta.getcheckrecipient.com id 6FF6E6C8-B834-449F-910A-DD1271F4F9C7.1; Fri, 06 Sep 2019 14:46:23 +0000 Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-ve1eur03lp2053.outbound.protection.outlook.com [104.47.9.53]) by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 403e12ed4335.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384); Fri, 06 Sep 2019 14:46:23 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Unskj3yFwwMcnR70G/lVH8N1V3qAsMJL5DuN+9rYVo9dpJC9rI9rLy1kafu59u/NAMgD42+PwLYFdyJBPEQojF5s0ZL8oS3uzPZP21aRmHesUAqolSZCD9375FStnjw3a9OnrrtNd0LESlflI3j1zQXoeykX7Yi2X4ViOo0fAe2EM22SoL77wNZz74OPwEB2x0lrh/LomlxOuhTXkY25hRa5250WEPo9haezYHwrV70Hknxls4Cunyg1xyCQrOZGniT/IlbED64LpZPxyBfTMJVPNs7Lz5QZWK7r+2DAkLLLJ03fqFUhlV5IT5mVjIqKfShXlh0VdkzFLRdtOhY6dQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EDwAq3rjY1mzg+BeQNTIC9g74kEYhtFbVYcF7Ofaf0w=; b=e2OwLFBMzrpAAUBJ1DiQuaUwb+LJNuM5W33sv6U4/WvCxPkEtNyuylbqi6fQfrzTVtbvfgg7Z/cPUfN9Ze4lltFnOzSOmewe4lkvX6TDV97MSK5l/3elZtY9BoaZ6nVcxVEVb02K6+YxTnxU+73AhmeTf7eUIKceC7ziuYIYYIseH5DOAsVsuEenl+CeDM+qlN2BaDe2czQPTEfY8021QHNhaCPNG6kdo+A4z0rOVoCZ8UWKpKFtJzP4ggOo3w1qJakZ+LnuRnEGTQxk2aV+ow2bBq/dIDPMi27aYe1LHsL6oiBnzJxMf1AcwQewI7YufoAJGH9zJChvNMq1ZSl/rQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EDwAq3rjY1mzg+BeQNTIC9g74kEYhtFbVYcF7Ofaf0w=; b=nw+5kIpsTrFgcrAWztGdNtmOuaEN2j9Z83+88mCPFF8OylImgVIMxGmKzJgbL9ADueskCeHzzyMfBH57bmOgiikbVPvH10wTCA01cJZUZX9ASqOWdPPQpz5nFwCM3niLytzBrDSZr9XnI5ewAmRzJivwsYu848o5DCKoGI8ssno= Received: from VI1PR08MB5471.eurprd08.prod.outlook.com (52.133.246.83) by VI1PR08MB3488.eurprd08.prod.outlook.com (20.177.59.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2241.14; Fri, 6 Sep 2019 14:46:20 +0000 Received: from VI1PR08MB5471.eurprd08.prod.outlook.com ([fe80::206a:65bd:e6a9:536b]) by VI1PR08MB5471.eurprd08.prod.outlook.com ([fe80::206a:65bd:e6a9:536b%2]) with mapi id 15.20.2241.018; Fri, 6 Sep 2019 14:46:20 +0000 From: Matthew Malcomson To: "gcc-patches@gcc.gnu.org" CC: "mliska@suse.cz" , "dodji@redhat.com" , nd , "kcc@google.com" , "jakub@redhat.com" , "dvyukov@google.com" Subject: [RFC][PATCH 12/X][libsanitizer] Check pointer tags match address tags Date: Fri, 06 Sep 2019 14:47:00 -0000 Message-ID: References: <156778058239.16148.17480879484406897649.scripted-patch-series@arm.com> In-Reply-To: <156778058239.16148.17480879484406897649.scripted-patch-series@arm.com> Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Matthew.Malcomson@arm.com; X-Microsoft-Antispam-Untrusted: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(711020)(4605104)(1401327)(4618075)(2017052603328)(49563074)(7193020);SRVR:VI1PR08MB3488; x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:6790;OLM:6790; X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4636009)(39860400002)(396003)(346002)(376002)(136003)(366004)(54534003)(189003)(199004)(3846002)(6436002)(54906003)(53936002)(52536014)(6916009)(6116002)(5660300002)(71200400001)(8936002)(71190400001)(14454004)(14444005)(81166006)(2351001)(81156014)(256004)(446003)(8676002)(30864003)(5640700003)(52116002)(5024004)(53946003)(66446008)(44832011)(25786009)(9686003)(2501003)(86362001)(186003)(305945005)(486006)(476003)(6506007)(102836004)(11346002)(26005)(7696005)(74316002)(99286004)(7736002)(386003)(33656002)(316002)(55016002)(2906002)(66556008)(99936001)(478600001)(4326008)(76176011)(66946007)(64756008)(66616009)(66476007)(66066001);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR08MB3488;H:VI1PR08MB5471.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info-Original: Y+0O9YkPu0lNdiCzasI7kDjOzYo6Gr6NdJ/MM9szsr6n6eJFwYSrxdg37+IiTbTHtbaR2DzMTVS4QFTKpvUIGVUAXU12vzAiiCG+rXpTcnbkBGhZJsg0frqiW8ZNEldNqYfQx0urCeVgrhE8czpKV6IPv0yrBFuUKbfhmFFGdwXVqXDBH4/fo4AkvHBdFuyTmbZ6D62u398/XwhrMITCXiXsIGIqVyn8umMlN0FPY1sWutMjdZTCDb0WBvkiiPbuJ5Qv53W2FgFL5Er6lUtWe5bhIsm2+Z/LslbpJpZHoxQrbxnZLqZSZ2wuIni4uCtHpu4SJ9LUr7lAFOLQ0QML4IiyHdJdbWMErkP6/wIRrCuz9+GIuSu1Jnk7OAYY6B23whi3E9x+7otuia84+LImXNuRXD1qXh4snKE/9mWnBi8= x-ms-exchange-transport-forked: True Content-Type: multipart/mixed; boundary="_002_VI1PR08MB54715A58DC26A5601AAD7C6AE0BA0VI1PR08MB5471eurp_" MIME-Version: 1.0 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Matthew.Malcomson@arm.com; Return-Path: Matthew.Malcomson@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT046.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: fa7c40bb-2b39-4cd0-bb8b-08d732d8fb35 X-IsSubscribed: yes X-SW-Source: 2019-09/txt/msg00402.txt.bz2 --_002_VI1PR08MB54715A58DC26A5601AAD7C6AE0BA0VI1PR08MB5471eurp_ Content-Type: text/plain; charset="us-ascii" Content-ID: Content-Transfer-Encoding: quoted-printable Content-length: 18264 This adds the `hwasan` pass that puts HWASAN_CHECK internal functions around memory accesses to check that tags in the pointer being used match the tag stored in shadow memory for the memory region being used. These internal functions are expanded into actual checks in the sanopt pass that happens just before expansion into RTL. We use the same mechanism that currently inserts ASAN_CHECK internal functions to insert the new HWASAN_CHECK functions. Instrumenting builtin function calls is not yet handled and will be in a later patch in this series. As yet we always terminate the program on a tag mismatch, and always check tags via a library call to libhwasan. Allowing a program to continue from tag mismatch, and implementing inline checks are intended for a later revision. gcc/ChangeLog: 2019-09-06 Matthew Malcomson * asan.c (build_check_stmt): Generate HWASAN_CHECK for HWASAN. (instrument_derefs): Avoid checking global variables for HWASAN. (maybe_instrument_call): Temporarily avoid for HWASAN. (hwasan_instrument): New. (hwasan_expand_check_ifn): New. (gate_hwasan): New. (class pass_hwasan): New. (make_pass_hwasan): New. (class pass_hwasan_O0): New. (make_pass_hwasan_O0): New. * asan.h (hwasan_expand_check_ifn): New. (gate_hwasan): New. (asan_intercepted_p): No memory function is intercepted by libhwasan. (asan_sanitize_use_after_scope): True for memory tagging. * internal-fn.c (expand_HWASAN_CHECK): New. * internal-fn.def (HWASAN_CHECK): New. * passes.def (hwasan): New pass. * sanitizer.def (BUILT_IN_HWASAN_LOADN): New builtin. (BUILT_IN_HWASAN_STOREN): New builtin. * sanopt.c (sanopt_optimize_walker): Account for HWASAN_CHECK. (pass_sanopt::execute): Account for HWASAN_CHECK. * tree-pass.h (make_pass_hwasan, make_pass_hwasan_O0): New decl. ############### Attachment also inlined for ease of reply ##########= ##### diff --git a/gcc/asan.h b/gcc/asan.h index c5492ce35980d0b26d4707f96482b69dc76a525a..68ea1b4afaf9195553251a987df= 33788421fa142 100644 --- a/gcc/asan.h +++ b/gcc/asan.h @@ -32,7 +32,9 @@ extern void hwasan_tag_init (); extern rtx hwasan_create_untagged_base (rtx); extern void hwasan_emit_prologue (rtx *, rtx *, poly_int64 *, uint8_t *, s= ize_t); extern rtx_insn *hwasan_emit_uncolour_frame (rtx, rtx, rtx_insn *); +extern bool hwasan_expand_check_ifn (gimple_stmt_iterator *, bool); extern bool memory_tagging_p (void); +extern bool gate_hwasan (void); extern rtx_insn *asan_emit_stack_protection (rtx, rtx, unsigned int, HOST_WIDE_INT *, tree *, int); extern rtx_insn *asan_emit_allocas_unpoison (rtx, rtx, rtx_insn *); @@ -188,6 +190,9 @@ extern hash_set *asan_handled_variables; static inline bool asan_intercepted_p (enum built_in_function fcode) { + if (memory_tagging_p ()) + return false; + return fcode =3D=3D BUILT_IN_INDEX || fcode =3D=3D BUILT_IN_MEMCHR || fcode =3D=3D BUILT_IN_MEMCMP @@ -216,7 +221,8 @@ asan_intercepted_p (enum built_in_function fcode) static inline bool asan_sanitize_use_after_scope (void) { - return (flag_sanitize_address_use_after_scope && asan_sanitize_stack_p (= )); + return (flag_sanitize_address_use_after_scope && + (asan_sanitize_stack_p () || memory_tagging_p ())); } =20 /* Return true if DECL should be guarded on the stack. */ diff --git a/gcc/asan.c b/gcc/asan.c index 0e74e32ae6ca4e130b3f13abe110364b119def46..ae1f8a0d28e911c2ff30be8ea9f= 4001923983cb1 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -2177,7 +2177,13 @@ build_check_stmt (location_t loc, tree base, tree le= n, if (is_scalar_access) flags |=3D ASAN_CHECK_SCALAR_ACCESS; =20 - g =3D gimple_build_call_internal (IFN_ASAN_CHECK, 4, + enum internal_fn fn; + if (memory_tagging_p ()) + fn =3D IFN_HWASAN_CHECK; + else + fn =3D IFN_ASAN_CHECK; + + g =3D gimple_build_call_internal (fn, 4, build_int_cst (integer_type_node, flags), base, len, build_int_cst (integer_type_node, @@ -2201,10 +2207,13 @@ static void instrument_derefs (gimple_stmt_iterator *iter, tree t, location_t location, bool is_store) { - if (is_store && !ASAN_INSTRUMENT_WRITES) - return; - if (!is_store && !ASAN_INSTRUMENT_READS) - return; + if (! memory_tagging_p ()) + { + if (is_store && !ASAN_INSTRUMENT_WRITES) + return; + if (!is_store && !ASAN_INSTRUMENT_READS) + return; + } =20 tree type, base; HOST_WIDE_INT size_in_bytes; @@ -2248,10 +2257,21 @@ instrument_derefs (gimple_stmt_iterator *iter, tree= t, return; } =20 + /* TODO Understand when this can happen. + What's the point of ignoring these parts? + I guess non-byte sizes would be awkward to instrument? + When would this occur? */ if (!multiple_p (bitpos, BITS_PER_UNIT) || maybe_ne (bitsize, size_in_bytes * BITS_PER_UNIT)) return; =20 + /* TODO What are we checking, and why are we not instrumenting that? + If the "object" is stored in a register then do nothing? + If the "object" is a register then do nothing? + + The second one makes a lot of sense, but I can"t just assume that"s + what"s being checked. + */ if (VAR_P (inner) && DECL_HARD_REGISTER (inner)) return; =20 @@ -2264,7 +2284,8 @@ instrument_derefs (gimple_stmt_iterator *iter, tree t, { if (DECL_THREAD_LOCAL_P (inner)) return; - if (!ASAN_GLOBALS && is_global_var (inner)) + if ((memory_tagging_p () || !ASAN_GLOBALS) + && is_global_var (inner)) return; if (!TREE_STATIC (inner)) { @@ -2472,6 +2493,8 @@ maybe_instrument_assignment (gimple_stmt_iterator *it= er) static bool maybe_instrument_call (gimple_stmt_iterator *iter) { + if (memory_tagging_p ()) + return false; gimple *stmt =3D gsi_stmt (*iter); bool is_builtin =3D gimple_call_builtin_p (stmt, BUILT_IN_NORMAL); =20 @@ -3702,6 +3725,17 @@ make_pass_asan_O0 (gcc::context *ctxt) return new pass_asan_O0 (ctxt); } =20 +/* HWASAN */ +static unsigned int +hwasan_instrument (void) +{ + if (shadow_ptr_types[0] =3D=3D NULL_TREE) + asan_init_shadow_ptr_types (); + transform_statements (); + last_alloca_addr =3D NULL_TREE; + return 0; +} + void hwasan_record_base (rtx base) { @@ -3909,4 +3943,176 @@ hwasan_finish_file (void) flag_sanitize |=3D SANITIZE_HWADDRESS; } =20 +bool +hwasan_expand_check_ifn (gimple_stmt_iterator *iter, bool) +{ + // TODO For now only implementing the function when using calls. + // This is a little easier, and means I can rely on the library + // implementation while checking my instrumentation code for now. + + gimple *g =3D gsi_stmt (*iter); + location_t loc =3D gimple_location (g); + bool recover_p =3D false; + (void)recover_p; // UNUSED for now (will be used to determine action) + + HOST_WIDE_INT flags =3D tree_to_shwi (gimple_call_arg (g, 0)); + gcc_assert (flags < ASAN_CHECK_LAST); + bool is_scalar_access =3D (flags & ASAN_CHECK_SCALAR_ACCESS) !=3D 0; + bool is_store =3D (flags & ASAN_CHECK_STORE) !=3D 0; + bool is_non_zero_len =3D (flags & ASAN_CHECK_NON_ZERO_LEN) !=3D 0; + + tree base =3D gimple_call_arg (g, 1); + tree len =3D gimple_call_arg (g, 2); + + /* TODO align is unused for HWASAN_CHECK, but I pass the argument anyway + * because that way I need to write less code. */ + /* HOST_WIDE_INT align =3D tree_to_shwi (gimple_call_arg (g, 3)); */ + + unsigned HOST_WIDE_INT size_in_bytes + =3D is_scalar_access && tree_fits_shwi_p (len) ? tree_to_shwi (len) : = -1; + (void)size_in_bytes; // UNUSED for now (will be used to determine action) + + gimple_stmt_iterator gsi =3D *iter; + + if (!is_non_zero_len) + { + /* So, the length of the memory area to hwasan-protect is + non-constant. Let's guard the generated instrumentation code + like: + + if (len !=3D 0) + { + // hwasan instrumentation code goes here. + } + // falltrough instructions, starting with *ITER. */ + + g =3D gimple_build_cond (NE_EXPR, + len, + build_int_cst (TREE_TYPE (len), 0), + NULL_TREE, NULL_TREE); + gimple_set_location (g, loc); + + basic_block then_bb, fallthrough_bb; + insert_if_then_before_iter (as_a (g), iter, + /*then_more_likely_p=3D*/true, + &then_bb, &fallthrough_bb); + /* Note that fallthrough_bb starts with the statement that was + pointed to by ITER. */ + + /* The 'then block' of the 'if (len !=3D 0) condition is where + we'll generate the hwasan instrumentation code now. */ + gsi =3D gsi_last_bb (then_bb); + } + + /* Instrument using callbacks. */ + g =3D gimple_build_assign (make_ssa_name (pointer_sized_int_node), + NOP_EXPR, base); + gimple_set_location (g, loc); + gsi_insert_after (&gsi, g, GSI_NEW_STMT); + tree base_addr =3D gimple_assign_lhs (g); + + /* TODO Here we only ever use the LOADN/STOREN functions for checking. + This means we always terminate the program on tag mismatch, always use + a function call instead of an inline check, and never have the nicer = error + messages that come from size-specific checking. + + This is much quicker to code for now, all other options will be + implemented later. */ + enum built_in_function fun_enum =3D + is_store ? BUILT_IN_HWASAN_STOREN : BUILT_IN_HWASAN_LOADN; + tree fun =3D builtin_decl_implicit (fun_enum); + g =3D gimple_build_assign (make_ssa_name (pointer_sized_int_node), + NOP_EXPR, len); + gimple_set_location (g, loc); + gsi_insert_after (&gsi, g, GSI_NEW_STMT); + tree sz_arg =3D gimple_assign_lhs (g); + g =3D gimple_build_call (fun, 2, base_addr, sz_arg); + gimple_set_location (g, loc); + gsi_insert_after (&gsi, g, GSI_NEW_STMT); + + gsi_remove (iter, true); + *iter =3D gsi; + return false; +} + +bool +gate_hwasan () +{ + return memory_tagging_p (); +} + +namespace { + +const pass_data pass_data_hwasan =3D +{ + GIMPLE_PASS, /* type */ + "hwasan", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_NONE, /* tv_id */ + ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_update_ssa, /* todo_flags_finish */ +}; + +class pass_hwasan : public gimple_opt_pass +{ +public: + pass_hwasan (gcc::context *ctxt) + : gimple_opt_pass (pass_data_hwasan, ctxt) + {} + + /* opt_pass methods: */ + opt_pass * clone () { return new pass_hwasan (m_ctxt); } + virtual bool gate (function *) { return gate_hwasan (); } + virtual unsigned int execute (function *) { return hwasan_instrument ();= } + +}; // class pass_asan + +} // anon namespace + +gimple_opt_pass * +make_pass_hwasan (gcc::context *ctxt) +{ + return new pass_hwasan (ctxt); +} + +namespace { + +const pass_data pass_data_hwasan_O0 =3D +{ + GIMPLE_PASS, /* type */ + "hwasan_O0", /* name */ + OPTGROUP_NONE, /* optinfo_flags */ + TV_NONE, /* tv_id */ + ( PROP_ssa | PROP_cfg | PROP_gimple_leh ), /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_update_ssa, /* todo_flags_finish */ +}; + +class pass_hwasan_O0 : public gimple_opt_pass +{ +public: + pass_hwasan_O0 (gcc::context *ctxt) + : gimple_opt_pass (pass_data_hwasan_O0, ctxt) + {} + + /* opt_pass methods: */ + opt_pass * clone () { return new pass_hwasan_O0 (m_ctxt); } + virtual bool gate (function *) { return !optimize && gate_hwasan (); } + virtual unsigned int execute (function *) { return hwasan_instrument ();= } + +}; // class pass_asan + +} // anon namespace + +gimple_opt_pass * +make_pass_hwasan_O0 (gcc::context *ctxt) +{ + return new pass_hwasan_O0 (ctxt); +} + #include "gt-asan.h" diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index 04081f36c4d31ecfba4099e50412345c67e1f58f..80f94f141bfd92e9f6af13a6df7= 6f0c9ac053fdc 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -456,6 +456,12 @@ expand_UBSAN_OBJECT_SIZE (internal_fn, gcall *) /* This should get expanded in the sanopt pass. */ =20 static void +expand_HWASAN_CHECK (internal_fn, gcall *) +{ + gcc_unreachable (); +} + +static void expand_ASAN_CHECK (internal_fn, gcall *) { gcc_unreachable (); diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def index 016301a58d83d7128817824d7c7ef92825c7e03e..c683e5d8e5c607f18909bda4d97= b58421cb7c2a4 100644 --- a/gcc/internal-fn.def +++ b/gcc/internal-fn.def @@ -288,6 +288,7 @@ DEF_INTERNAL_FN (UBSAN_PTR, ECF_LEAF | ECF_NOTHROW, ".R= .") DEF_INTERNAL_FN (UBSAN_OBJECT_SIZE, ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (ABNORMAL_DISPATCHER, ECF_NORETURN, NULL) DEF_INTERNAL_FN (BUILTIN_EXPECT, ECF_CONST | ECF_LEAF | ECF_NOTHROW, NULL) +DEF_INTERNAL_FN (HWASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, "..R.= .") DEF_INTERNAL_FN (ASAN_CHECK, ECF_TM_PURE | ECF_LEAF | ECF_NOTHROW, "..R..") DEF_INTERNAL_FN (ASAN_MARK, ECF_LEAF | ECF_NOTHROW, NULL) DEF_INTERNAL_FN (ASAN_POISON, ECF_LEAF | ECF_NOTHROW | ECF_NOVOPS, NULL) diff --git a/gcc/passes.def b/gcc/passes.def index ad2efabd3853d8d20562f66f4c5bb34694ec80f2..11c9fb20b042d55a7d52da4feda= 633dc5cd3052a 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -246,6 +246,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_sink_code); NEXT_PASS (pass_sancov); NEXT_PASS (pass_asan); + NEXT_PASS (pass_hwasan); NEXT_PASS (pass_tsan); NEXT_PASS (pass_dce); /* Pass group that runs when 1) enabled, 2) there are loops @@ -362,6 +363,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_dce); NEXT_PASS (pass_sancov); NEXT_PASS (pass_asan); + NEXT_PASS (pass_hwasan); NEXT_PASS (pass_tsan); /* ??? We do want some kind of loop invariant motion, but we possib= ly need to adjust LIM to be more friendly towards preserving accurate @@ -387,6 +389,7 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_sancov_O0); NEXT_PASS (pass_lower_switch_O0); NEXT_PASS (pass_asan_O0); + NEXT_PASS (pass_hwasan_O0); NEXT_PASS (pass_tsan_O0); NEXT_PASS (pass_sanopt); NEXT_PASS (pass_cleanup_eh); diff --git a/gcc/sanitizer.def b/gcc/sanitizer.def index 7bd50715f24a2cb154b578e2abdea4e8fcdb2107..0edf349cc23e846608b89d54a10= 24b9d99de9c4d 100644 --- a/gcc/sanitizer.def +++ b/gcc/sanitizer.def @@ -183,6 +183,10 @@ DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_POINTER_SUBTRACT, = "__sanitizer_ptr_sub", /* Hardware Address Sanitizer. */ DEF_SANITIZER_BUILTIN(BUILT_IN_HWASAN_INIT, "__hwasan_init", BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST) +DEF_SANITIZER_BUILTIN(BUILT_IN_HWASAN_LOADN, "__hwasan_loadN", + BT_FN_VOID_PTR_PTRMODE, ATTR_TMPURE_NOTHROW_LEAF_LIST) +DEF_SANITIZER_BUILTIN(BUILT_IN_HWASAN_STOREN, "__hwasan_storeN", + BT_FN_VOID_PTR_PTRMODE, ATTR_TMPURE_NOTHROW_LEAF_LIST) DEF_SANITIZER_BUILTIN(BUILT_IN_HWASAN_TAG_MEM, "__hwasan_tag_memory", BT_FN_VOID_PTR_UINT8_SIZE, ATTR_NOTHROW_LIST) =20 diff --git a/gcc/sanopt.c b/gcc/sanopt.c index 5cb98e1b50e4e1644072bd18d74797c3cac43c3f..31270153f3cf56bfbad593830de= 1b9334e7f65d1 100644 --- a/gcc/sanopt.c +++ b/gcc/sanopt.c @@ -772,7 +772,8 @@ sanopt_optimize_walker (basic_block bb, struct sanopt_c= tx *ctx) basic_block son; gimple_stmt_iterator gsi; sanopt_info *info =3D (sanopt_info *) bb->aux; - bool asan_check_optimize =3D (flag_sanitize & SANITIZE_ADDRESS) !=3D 0; + bool asan_check_optimize =3D + ((flag_sanitize & SANITIZE_ADDRESS) !=3D 0) || memory_tagging_p (); =20 for (gsi =3D gsi_start_bb (bb); !gsi_end_p (gsi);) { @@ -802,6 +803,7 @@ sanopt_optimize_walker (basic_block bb, struct sanopt_c= tx *ctx) if (asan_check_optimize && gimple_call_builtin_p (stmt, BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT)) { + gcc_assert (!memory_tagging_p ()); use_operand_p use; gimple *use_stmt; if (single_imm_use (gimple_vdef (stmt), &use, &use_stmt)) @@ -830,6 +832,7 @@ sanopt_optimize_walker (basic_block bb, struct sanopt_c= tx *ctx) case IFN_UBSAN_PTR: remove =3D maybe_optimize_ubsan_ptr_ifn (ctx, stmt); break; + case IFN_HWASAN_CHECK: case IFN_ASAN_CHECK: if (asan_check_optimize) remove =3D maybe_optimize_asan_check_ifn (ctx, stmt); @@ -1262,10 +1265,11 @@ pass_sanopt::execute (function *fun) /* Try to remove redundant checks. */ if (optimize && (flag_sanitize - & (SANITIZE_NULL | SANITIZE_ALIGNMENT + & (SANITIZE_NULL | SANITIZE_ALIGNMENT | SANITIZE_HWADDRESS | SANITIZE_ADDRESS | SANITIZE_VPTR | SANITIZE_POINTER_OVERFLOW))) asan_num_accesses =3D sanopt_optimize (fun, &contains_asan_mark); - else if (flag_sanitize & SANITIZE_ADDRESS) + else if (flag_sanitize & SANITIZE_ADDRESS + || memory_tagging_p ()) { gimple_stmt_iterator gsi; FOR_EACH_BB_FN (bb, fun) @@ -1285,7 +1289,7 @@ pass_sanopt::execute (function *fun) sanitize_asan_mark_poison (); } =20 - if (asan_sanitize_stack_p ()) + if (asan_sanitize_stack_p () || memory_tagging_p ()) sanitize_rewrite_addressable_params (fun); =20 bool use_calls =3D ASAN_INSTRUMENTATION_WITH_CALL_THRESHOLD < INT_MAX @@ -1327,6 +1331,9 @@ pass_sanopt::execute (function *fun) case IFN_UBSAN_VPTR: no_next =3D ubsan_expand_vptr_ifn (&gsi); break; + case IFN_HWASAN_CHECK: + no_next =3D hwasan_expand_check_ifn (&gsi, use_calls); + break; case IFN_ASAN_CHECK: no_next =3D asan_expand_check_ifn (&gsi, use_calls); break; diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 3a0b3805d24dbd50141d4145563861e4ae3768f3..01ebd03205e57ee3a63d3344da8= 098160c081002 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -341,6 +341,8 @@ extern void register_pass (opt_pass* pass, pass_positio= ning_ops pos, =20 extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt); extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt); +extern gimple_opt_pass *make_pass_hwasan (gcc::context *ctxt); +extern gimple_opt_pass *make_pass_hwasan_O0 (gcc::context *ctxt); extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt); extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt); extern gimple_opt_pass *make_pass_sancov (gcc::context *ctxt); --_002_VI1PR08MB54715A58DC26A5601AAD7C6AE0BA0VI1PR08MB5471eurp_ Content-Type: text/plain; name="hwasan-implementation11.patch" Content-Description: hwasan-implementation11.patch Content-Disposition: attachment; filename="hwasan-implementation11.patch"; size=16144; creation-date="Fri, 06 Sep 2019 14:46:20 GMT"; modification-date="Fri, 06 Sep 2019 14:46:20 GMT" Content-ID: <6E97C774B04CF14AAEBDFCF4248F34CF@eurprd08.prod.outlook.com> Content-Transfer-Encoding: base64 Content-length: 21887 ZGlmZiAtLWdpdCBhL2djYy9hc2FuLmggYi9nY2MvYXNhbi5oCmluZGV4IGM1 NDkyY2UzNTk4MGQwYjI2ZDQ3MDdmOTY0ODJiNjlkYzc2YTUyNWEuLjY4ZWEx YjRhZmFmOTE5NTU1MzI1MWE5ODdkZjMzNzg4NDIxZmExNDIgMTAwNjQ0Ci0t LSBhL2djYy9hc2FuLmgKKysrIGIvZ2NjL2FzYW4uaApAQCAtMzIsNyArMzIs OSBAQCBleHRlcm4gdm9pZCBod2FzYW5fdGFnX2luaXQgKCk7CiBleHRlcm4g cnR4IGh3YXNhbl9jcmVhdGVfdW50YWdnZWRfYmFzZSAocnR4KTsKIGV4dGVy biB2b2lkIGh3YXNhbl9lbWl0X3Byb2xvZ3VlIChydHggKiwgcnR4ICosIHBv bHlfaW50NjQgKiwgdWludDhfdCAqLCBzaXplX3QpOwogZXh0ZXJuIHJ0eF9p bnNuICpod2FzYW5fZW1pdF91bmNvbG91cl9mcmFtZSAocnR4LCBydHgsIHJ0 eF9pbnNuICopOworZXh0ZXJuIGJvb2wgaHdhc2FuX2V4cGFuZF9jaGVja19p Zm4gKGdpbXBsZV9zdG10X2l0ZXJhdG9yICosIGJvb2wpOwogZXh0ZXJuIGJv b2wgbWVtb3J5X3RhZ2dpbmdfcCAodm9pZCk7CitleHRlcm4gYm9vbCBnYXRl X2h3YXNhbiAodm9pZCk7CiBleHRlcm4gcnR4X2luc24gKmFzYW5fZW1pdF9z dGFja19wcm90ZWN0aW9uIChydHgsIHJ0eCwgdW5zaWduZWQgaW50LAogCQkJ CQkgICAgIEhPU1RfV0lERV9JTlQgKiwgdHJlZSAqLCBpbnQpOwogZXh0ZXJu IHJ0eF9pbnNuICphc2FuX2VtaXRfYWxsb2Nhc191bnBvaXNvbiAocnR4LCBy dHgsIHJ0eF9pbnNuICopOwpAQCAtMTg4LDYgKzE5MCw5IEBAIGV4dGVybiBo YXNoX3NldDx0cmVlPiAqYXNhbl9oYW5kbGVkX3ZhcmlhYmxlczsKIHN0YXRp YyBpbmxpbmUgYm9vbAogYXNhbl9pbnRlcmNlcHRlZF9wIChlbnVtIGJ1aWx0 X2luX2Z1bmN0aW9uIGZjb2RlKQogeworICBpZiAobWVtb3J5X3RhZ2dpbmdf cCAoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgcmV0dXJuIGZjb2RlID09 IEJVSUxUX0lOX0lOREVYCiAJIHx8IGZjb2RlID09IEJVSUxUX0lOX01FTUNI UgogCSB8fCBmY29kZSA9PSBCVUlMVF9JTl9NRU1DTVAKQEAgLTIxNiw3ICsy MjEsOCBAQCBhc2FuX2ludGVyY2VwdGVkX3AgKGVudW0gYnVpbHRfaW5fZnVu Y3Rpb24gZmNvZGUpCiBzdGF0aWMgaW5saW5lIGJvb2wKIGFzYW5fc2FuaXRp emVfdXNlX2FmdGVyX3Njb3BlICh2b2lkKQogewotICByZXR1cm4gKGZsYWdf c2FuaXRpemVfYWRkcmVzc191c2VfYWZ0ZXJfc2NvcGUgJiYgYXNhbl9zYW5p dGl6ZV9zdGFja19wICgpKTsKKyAgcmV0dXJuIChmbGFnX3Nhbml0aXplX2Fk ZHJlc3NfdXNlX2FmdGVyX3Njb3BlICYmCisJICAoYXNhbl9zYW5pdGl6ZV9z dGFja19wICgpIHx8IG1lbW9yeV90YWdnaW5nX3AgKCkpKTsKIH0KIAogLyog UmV0dXJuIHRydWUgaWYgREVDTCBzaG91bGQgYmUgZ3VhcmRlZCBvbiB0aGUg c3RhY2suICAqLwpkaWZmIC0tZ2l0IGEvZ2NjL2FzYW4uYyBiL2djYy9hc2Fu LmMKaW5kZXggMGU3NGUzMmFlNmNhNGUxMzBiM2YxM2FiZTExMDM2NGIxMTlk ZWY0Ni4uYWUxZjhhMGQyOGU5MTFjMmZmMzBiZThlYTlmNDAwMTkyMzk4M2Ni MSAxMDA2NDQKLS0tIGEvZ2NjL2FzYW4uYworKysgYi9nY2MvYXNhbi5jCkBA IC0yMTc3LDcgKzIxNzcsMTMgQEAgYnVpbGRfY2hlY2tfc3RtdCAobG9jYXRp b25fdCBsb2MsIHRyZWUgYmFzZSwgdHJlZSBsZW4sCiAgIGlmIChpc19zY2Fs YXJfYWNjZXNzKQogICAgIGZsYWdzIHw9IEFTQU5fQ0hFQ0tfU0NBTEFSX0FD Q0VTUzsKIAotICBnID0gZ2ltcGxlX2J1aWxkX2NhbGxfaW50ZXJuYWwgKElG Tl9BU0FOX0NIRUNLLCA0LAorICBlbnVtIGludGVybmFsX2ZuIGZuOworICBp ZiAobWVtb3J5X3RhZ2dpbmdfcCAoKSkKKyAgICBmbiA9IElGTl9IV0FTQU5f Q0hFQ0s7CisgIGVsc2UKKyAgICBmbiA9IElGTl9BU0FOX0NIRUNLOworCisg IGcgPSBnaW1wbGVfYnVpbGRfY2FsbF9pbnRlcm5hbCAoZm4sIDQsCiAJCQkJ ICBidWlsZF9pbnRfY3N0IChpbnRlZ2VyX3R5cGVfbm9kZSwgZmxhZ3MpLAog CQkJCSAgYmFzZSwgbGVuLAogCQkJCSAgYnVpbGRfaW50X2NzdCAoaW50ZWdl cl90eXBlX25vZGUsCkBAIC0yMjAxLDEwICsyMjA3LDEzIEBAIHN0YXRpYyB2 b2lkCiBpbnN0cnVtZW50X2RlcmVmcyAoZ2ltcGxlX3N0bXRfaXRlcmF0b3Ig Kml0ZXIsIHRyZWUgdCwKIAkJICAgbG9jYXRpb25fdCBsb2NhdGlvbiwgYm9v bCBpc19zdG9yZSkKIHsKLSAgaWYgKGlzX3N0b3JlICYmICFBU0FOX0lOU1RS VU1FTlRfV1JJVEVTKQotICAgIHJldHVybjsKLSAgaWYgKCFpc19zdG9yZSAm JiAhQVNBTl9JTlNUUlVNRU5UX1JFQURTKQotICAgIHJldHVybjsKKyAgaWYg KCEgbWVtb3J5X3RhZ2dpbmdfcCAoKSkKKyAgICB7CisgICAgaWYgKGlzX3N0 b3JlICYmICFBU0FOX0lOU1RSVU1FTlRfV1JJVEVTKQorICAgICAgcmV0dXJu OworICAgIGlmICghaXNfc3RvcmUgJiYgIUFTQU5fSU5TVFJVTUVOVF9SRUFE UykKKyAgICAgIHJldHVybjsKKyAgICB9CiAKICAgdHJlZSB0eXBlLCBiYXNl OwogICBIT1NUX1dJREVfSU5UIHNpemVfaW5fYnl0ZXM7CkBAIC0yMjQ4LDEw ICsyMjU3LDIxIEBAIGluc3RydW1lbnRfZGVyZWZzIChnaW1wbGVfc3RtdF9p dGVyYXRvciAqaXRlciwgdHJlZSB0LAogICAgICAgcmV0dXJuOwogICAgIH0K IAorICAvKiBUT0RPIFVuZGVyc3RhbmQgd2hlbiB0aGlzIGNhbiBoYXBwZW4u CisgICAgICBXaGF0J3MgdGhlIHBvaW50IG9mIGlnbm9yaW5nIHRoZXNlIHBh cnRzPworICAgICAgSSBndWVzcyBub24tYnl0ZSBzaXplcyB3b3VsZCBiZSBh d2t3YXJkIHRvIGluc3RydW1lbnQ/CisgICAgICBXaGVuIHdvdWxkIHRoaXMg b2NjdXI/ICAqLwogICBpZiAoIW11bHRpcGxlX3AgKGJpdHBvcywgQklUU19Q RVJfVU5JVCkKICAgICAgIHx8IG1heWJlX25lIChiaXRzaXplLCBzaXplX2lu X2J5dGVzICogQklUU19QRVJfVU5JVCkpCiAgICAgcmV0dXJuOwogCisgIC8q IFRPRE8gV2hhdCBhcmUgd2UgY2hlY2tpbmcsIGFuZCB3aHkgYXJlIHdlIG5v dCBpbnN0cnVtZW50aW5nIHRoYXQ/CisgICAgICBJZiB0aGUgIm9iamVjdCIg aXMgc3RvcmVkIGluIGEgcmVnaXN0ZXIgdGhlbiBkbyBub3RoaW5nPworICAg ICAgSWYgdGhlICJvYmplY3QiIGlzIGEgcmVnaXN0ZXIgdGhlbiBkbyBub3Ro aW5nPworCisgICAgICBUaGUgc2Vjb25kIG9uZSBtYWtlcyBhIGxvdCBvZiBz ZW5zZSwgYnV0IEkgY2FuInQganVzdCBhc3N1bWUgdGhhdCJzCisgICAgICB3 aGF0InMgYmVpbmcgY2hlY2tlZC4KKyAgICAqLwogICBpZiAoVkFSX1AgKGlu bmVyKSAmJiBERUNMX0hBUkRfUkVHSVNURVIgKGlubmVyKSkKICAgICByZXR1 cm47CiAKQEAgLTIyNjQsNyArMjI4NCw4IEBAIGluc3RydW1lbnRfZGVyZWZz IChnaW1wbGVfc3RtdF9pdGVyYXRvciAqaXRlciwgdHJlZSB0LAogICAgIHsK ICAgICAgIGlmIChERUNMX1RIUkVBRF9MT0NBTF9QIChpbm5lcikpCiAJcmV0 dXJuOwotICAgICAgaWYgKCFBU0FOX0dMT0JBTFMgJiYgaXNfZ2xvYmFsX3Zh ciAoaW5uZXIpKQorICAgICAgaWYgKChtZW1vcnlfdGFnZ2luZ19wICgpIHx8 ICFBU0FOX0dMT0JBTFMpCisJICAmJiBpc19nbG9iYWxfdmFyIChpbm5lcikp CiAgICAgICAgIHJldHVybjsKICAgICAgIGlmICghVFJFRV9TVEFUSUMgKGlu bmVyKSkKIAl7CkBAIC0yNDcyLDYgKzI0OTMsOCBAQCBtYXliZV9pbnN0cnVt ZW50X2Fzc2lnbm1lbnQgKGdpbXBsZV9zdG10X2l0ZXJhdG9yICppdGVyKQog c3RhdGljIGJvb2wKIG1heWJlX2luc3RydW1lbnRfY2FsbCAoZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgKml0ZXIpCiB7CisgIGlmIChtZW1vcnlfdGFnZ2luZ19w ICgpKQorICAgIHJldHVybiBmYWxzZTsKICAgZ2ltcGxlICpzdG10ID0gZ3Np X3N0bXQgKCppdGVyKTsKICAgYm9vbCBpc19idWlsdGluID0gZ2ltcGxlX2Nh bGxfYnVpbHRpbl9wIChzdG10LCBCVUlMVF9JTl9OT1JNQUwpOwogCkBAIC0z NzAyLDYgKzM3MjUsMTcgQEAgbWFrZV9wYXNzX2FzYW5fTzAgKGdjYzo6Y29u dGV4dCAqY3R4dCkKICAgcmV0dXJuIG5ldyBwYXNzX2FzYW5fTzAgKGN0eHQp OwogfQogCisvKiAgSFdBU0FOICAqLworc3RhdGljIHVuc2lnbmVkIGludAor aHdhc2FuX2luc3RydW1lbnQgKHZvaWQpCit7CisgIGlmIChzaGFkb3dfcHRy X3R5cGVzWzBdID09IE5VTExfVFJFRSkKKyAgICBhc2FuX2luaXRfc2hhZG93 X3B0cl90eXBlcyAoKTsKKyAgdHJhbnNmb3JtX3N0YXRlbWVudHMgKCk7Cisg IGxhc3RfYWxsb2NhX2FkZHIgPSBOVUxMX1RSRUU7CisgIHJldHVybiAwOwor fQorCiB2b2lkCiBod2FzYW5fcmVjb3JkX2Jhc2UgKHJ0eCBiYXNlKQogewpA QCAtMzkwOSw0ICszOTQzLDE3NiBAQCBod2FzYW5fZmluaXNoX2ZpbGUgKHZv aWQpCiAgIGZsYWdfc2FuaXRpemUgfD0gU0FOSVRJWkVfSFdBRERSRVNTOwog fQogCitib29sCitod2FzYW5fZXhwYW5kX2NoZWNrX2lmbiAoZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgKml0ZXIsIGJvb2wpCit7CisgIC8vIFRPRE8gRm9yIG5v dyBvbmx5IGltcGxlbWVudGluZyB0aGUgZnVuY3Rpb24gd2hlbiB1c2luZyBj YWxscy4KKyAgLy8gVGhpcyBpcyBhIGxpdHRsZSBlYXNpZXIsIGFuZCBtZWFu cyBJIGNhbiByZWx5IG9uIHRoZSBsaWJyYXJ5CisgIC8vIGltcGxlbWVudGF0 aW9uIHdoaWxlIGNoZWNraW5nIG15IGluc3RydW1lbnRhdGlvbiBjb2RlIGZv ciBub3cuCisKKyAgZ2ltcGxlICpnID0gZ3NpX3N0bXQgKCppdGVyKTsKKyAg bG9jYXRpb25fdCBsb2MgPSBnaW1wbGVfbG9jYXRpb24gKGcpOworICBib29s IHJlY292ZXJfcCA9IGZhbHNlOworICAodm9pZClyZWNvdmVyX3A7IC8vIFVO VVNFRCBmb3Igbm93ICh3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFjdGlv bikKKworICBIT1NUX1dJREVfSU5UIGZsYWdzID0gdHJlZV90b19zaHdpIChn aW1wbGVfY2FsbF9hcmcgKGcsIDApKTsKKyAgZ2NjX2Fzc2VydCAoZmxhZ3Mg PCBBU0FOX0NIRUNLX0xBU1QpOworICBib29sIGlzX3NjYWxhcl9hY2Nlc3Mg PSAoZmxhZ3MgJiBBU0FOX0NIRUNLX1NDQUxBUl9BQ0NFU1MpICE9IDA7Cisg IGJvb2wgaXNfc3RvcmUgPSAoZmxhZ3MgJiBBU0FOX0NIRUNLX1NUT1JFKSAh PSAwOworICBib29sIGlzX25vbl96ZXJvX2xlbiA9IChmbGFncyAmIEFTQU5f Q0hFQ0tfTk9OX1pFUk9fTEVOKSAhPSAwOworCisgIHRyZWUgYmFzZSA9IGdp bXBsZV9jYWxsX2FyZyAoZywgMSk7CisgIHRyZWUgbGVuID0gZ2ltcGxlX2Nh bGxfYXJnIChnLCAyKTsKKworICAvKiBUT0RPIGFsaWduIGlzIHVudXNlZCBm b3IgSFdBU0FOX0NIRUNLLCBidXQgSSBwYXNzIHRoZSBhcmd1bWVudCBhbnl3 YXkKKyAgICogYmVjYXVzZSB0aGF0IHdheSBJIG5lZWQgdG8gd3JpdGUgbGVz cyBjb2RlLiAgKi8KKyAgLyogSE9TVF9XSURFX0lOVCBhbGlnbiA9IHRyZWVf dG9fc2h3aSAoZ2ltcGxlX2NhbGxfYXJnIChnLCAzKSk7ICAqLworCisgIHVu c2lnbmVkIEhPU1RfV0lERV9JTlQgc2l6ZV9pbl9ieXRlcworICAgID0gaXNf c2NhbGFyX2FjY2VzcyAmJiB0cmVlX2ZpdHNfc2h3aV9wIChsZW4pID8gdHJl ZV90b19zaHdpIChsZW4pIDogLTE7CisgICh2b2lkKXNpemVfaW5fYnl0ZXM7 IC8vIFVOVVNFRCBmb3Igbm93ICh3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5l IGFjdGlvbikKKworICBnaW1wbGVfc3RtdF9pdGVyYXRvciBnc2kgPSAqaXRl cjsKKworICBpZiAoIWlzX25vbl96ZXJvX2xlbikKKyAgICB7CisgICAgICAv KiBTbywgdGhlIGxlbmd0aCBvZiB0aGUgbWVtb3J5IGFyZWEgdG8gaHdhc2Fu LXByb3RlY3QgaXMKKwkgbm9uLWNvbnN0YW50LiAgTGV0J3MgZ3VhcmQgdGhl IGdlbmVyYXRlZCBpbnN0cnVtZW50YXRpb24gY29kZQorCSBsaWtlOgorCisJ IGlmIChsZW4gIT0gMCkKKwkgICB7CisJICAgICAvLyBod2FzYW4gaW5zdHJ1 bWVudGF0aW9uIGNvZGUgZ29lcyBoZXJlLgorCSAgIH0KKwkgLy8gZmFsbHRy b3VnaCBpbnN0cnVjdGlvbnMsIHN0YXJ0aW5nIHdpdGggKklURVIuICAqLwor CisgICAgICBnID0gZ2ltcGxlX2J1aWxkX2NvbmQgKE5FX0VYUFIsCisJCQkg ICAgbGVuLAorCQkJICAgIGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAobGVu KSwgMCksCisJCQkgICAgTlVMTF9UUkVFLCBOVUxMX1RSRUUpOworICAgICAg Z2ltcGxlX3NldF9sb2NhdGlvbiAoZywgbG9jKTsKKworICAgICAgYmFzaWNf YmxvY2sgdGhlbl9iYiwgZmFsbHRocm91Z2hfYmI7CisgICAgICBpbnNlcnRf aWZfdGhlbl9iZWZvcmVfaXRlciAoYXNfYSA8Z2NvbmQgKj4gKGcpLCBpdGVy LAorCQkJCSAgLyp0aGVuX21vcmVfbGlrZWx5X3A9Ki90cnVlLAorCQkJCSAg JnRoZW5fYmIsICZmYWxsdGhyb3VnaF9iYik7CisgICAgICAvKiBOb3RlIHRo YXQgZmFsbHRocm91Z2hfYmIgc3RhcnRzIHdpdGggdGhlIHN0YXRlbWVudCB0 aGF0IHdhcworCXBvaW50ZWQgdG8gYnkgSVRFUi4gICovCisKKyAgICAgIC8q IFRoZSAndGhlbiBibG9jaycgb2YgdGhlICdpZiAobGVuICE9IDApIGNvbmRp dGlvbiBpcyB3aGVyZQorCXdlJ2xsIGdlbmVyYXRlIHRoZSBod2FzYW4gaW5z dHJ1bWVudGF0aW9uIGNvZGUgbm93LiAgKi8KKyAgICAgIGdzaSA9IGdzaV9s YXN0X2JiICh0aGVuX2JiKTsKKyAgICB9CisKKyAgLyogSW5zdHJ1bWVudCB1 c2luZyBjYWxsYmFja3MuICAqLworICBnID0gZ2ltcGxlX2J1aWxkX2Fzc2ln biAobWFrZV9zc2FfbmFtZSAocG9pbnRlcl9zaXplZF9pbnRfbm9kZSksCisJ CQkgICBOT1BfRVhQUiwgYmFzZSk7CisgIGdpbXBsZV9zZXRfbG9jYXRpb24g KGcsIGxvYyk7CisgIGdzaV9pbnNlcnRfYWZ0ZXIgKCZnc2ksIGcsIEdTSV9O RVdfU1RNVCk7CisgIHRyZWUgYmFzZV9hZGRyID0gZ2ltcGxlX2Fzc2lnbl9s aHMgKGcpOworCisgIC8qIFRPRE8gSGVyZSB3ZSBvbmx5IGV2ZXIgdXNlIHRo ZSBMT0FETi9TVE9SRU4gZnVuY3Rpb25zIGZvciBjaGVja2luZy4KKyAgICAg VGhpcyBtZWFucyB3ZSBhbHdheXMgdGVybWluYXRlIHRoZSBwcm9ncmFtIG9u IHRhZyBtaXNtYXRjaCwgYWx3YXlzIHVzZQorICAgICBhIGZ1bmN0aW9uIGNh bGwgaW5zdGVhZCBvZiBhbiBpbmxpbmUgY2hlY2ssIGFuZCBuZXZlciBoYXZl IHRoZSBuaWNlciBlcnJvcgorICAgICBtZXNzYWdlcyB0aGF0IGNvbWUgZnJv bSBzaXplLXNwZWNpZmljIGNoZWNraW5nLgorCisgICAgIFRoaXMgaXMgbXVj aCBxdWlja2VyIHRvIGNvZGUgZm9yIG5vdywgYWxsIG90aGVyIG9wdGlvbnMg d2lsbCBiZQorICAgICBpbXBsZW1lbnRlZCBsYXRlci4gICovCisgIGVudW0g YnVpbHRfaW5fZnVuY3Rpb24gZnVuX2VudW0gPQorICAgIGlzX3N0b3JlID8g QlVJTFRfSU5fSFdBU0FOX1NUT1JFTiA6IEJVSUxUX0lOX0hXQVNBTl9MT0FE TjsKKyAgdHJlZSBmdW4gPSBidWlsdGluX2RlY2xfaW1wbGljaXQgKGZ1bl9l bnVtKTsKKyAgZyA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKG1ha2Vfc3NhX25h bWUgKHBvaW50ZXJfc2l6ZWRfaW50X25vZGUpLAorCQkJICAgTk9QX0VYUFIs IGxlbik7CisgIGdpbXBsZV9zZXRfbG9jYXRpb24gKGcsIGxvYyk7CisgIGdz aV9pbnNlcnRfYWZ0ZXIgKCZnc2ksIGcsIEdTSV9ORVdfU1RNVCk7CisgIHRy ZWUgc3pfYXJnID0gZ2ltcGxlX2Fzc2lnbl9saHMgKGcpOworICBnID0gZ2lt cGxlX2J1aWxkX2NhbGwgKGZ1biwgMiwgYmFzZV9hZGRyLCBzel9hcmcpOwor ICBnaW1wbGVfc2V0X2xvY2F0aW9uIChnLCBsb2MpOworICBnc2lfaW5zZXJ0 X2FmdGVyICgmZ3NpLCBnLCBHU0lfTkVXX1NUTVQpOworCisgIGdzaV9yZW1v dmUgKGl0ZXIsIHRydWUpOworICAqaXRlciA9IGdzaTsKKyAgcmV0dXJuIGZh bHNlOworfQorCitib29sCitnYXRlX2h3YXNhbiAoKQoreworICByZXR1cm4g bWVtb3J5X3RhZ2dpbmdfcCAoKTsKK30KKworbmFtZXNwYWNlIHsKKworY29u c3QgcGFzc19kYXRhIHBhc3NfZGF0YV9od2FzYW4gPQoreworICBHSU1QTEVf UEFTUywgLyogdHlwZSAqLworICAiaHdhc2FuIiwgLyogbmFtZSAqLworICBP UFRHUk9VUF9OT05FLCAvKiBvcHRpbmZvX2ZsYWdzICovCisgIFRWX05PTkUs IC8qIHR2X2lkICovCisgICggUFJPUF9zc2EgfCBQUk9QX2NmZyB8IFBST1Bf Z2ltcGxlX2xlaCApLCAvKiBwcm9wZXJ0aWVzX3JlcXVpcmVkICovCisgIDAs IC8qIHByb3BlcnRpZXNfcHJvdmlkZWQgKi8KKyAgMCwgLyogcHJvcGVydGll c19kZXN0cm95ZWQgKi8KKyAgMCwgLyogdG9kb19mbGFnc19zdGFydCAqLwor ICBUT0RPX3VwZGF0ZV9zc2EsIC8qIHRvZG9fZmxhZ3NfZmluaXNoICovCit9 OworCitjbGFzcyBwYXNzX2h3YXNhbiA6IHB1YmxpYyBnaW1wbGVfb3B0X3Bh c3MKK3sKK3B1YmxpYzoKKyAgcGFzc19od2FzYW4gKGdjYzo6Y29udGV4dCAq Y3R4dCkKKyAgICA6IGdpbXBsZV9vcHRfcGFzcyAocGFzc19kYXRhX2h3YXNh biwgY3R4dCkKKyAge30KKworICAvKiBvcHRfcGFzcyBtZXRob2RzOiAqLwor ICBvcHRfcGFzcyAqIGNsb25lICgpIHsgcmV0dXJuIG5ldyBwYXNzX2h3YXNh biAobV9jdHh0KTsgfQorICB2aXJ0dWFsIGJvb2wgZ2F0ZSAoZnVuY3Rpb24g KikgeyByZXR1cm4gZ2F0ZV9od2FzYW4gKCk7IH0KKyAgdmlydHVhbCB1bnNp Z25lZCBpbnQgZXhlY3V0ZSAoZnVuY3Rpb24gKikgeyByZXR1cm4gaHdhc2Fu X2luc3RydW1lbnQgKCk7IH0KKworfTsgLy8gY2xhc3MgcGFzc19hc2FuCisK K30gLy8gYW5vbiBuYW1lc3BhY2UKKworZ2ltcGxlX29wdF9wYXNzICoKK21h a2VfcGFzc19od2FzYW4gKGdjYzo6Y29udGV4dCAqY3R4dCkKK3sKKyAgcmV0 dXJuIG5ldyBwYXNzX2h3YXNhbiAoY3R4dCk7Cit9CisKK25hbWVzcGFjZSB7 CisKK2NvbnN0IHBhc3NfZGF0YSBwYXNzX2RhdGFfaHdhc2FuX08wID0KK3sK KyAgR0lNUExFX1BBU1MsIC8qIHR5cGUgKi8KKyAgImh3YXNhbl9PMCIsIC8q IG5hbWUgKi8KKyAgT1BUR1JPVVBfTk9ORSwgLyogb3B0aW5mb19mbGFncyAq LworICBUVl9OT05FLCAvKiB0dl9pZCAqLworICAoIFBST1Bfc3NhIHwgUFJP UF9jZmcgfCBQUk9QX2dpbXBsZV9sZWggKSwgLyogcHJvcGVydGllc19yZXF1 aXJlZCAqLworICAwLCAvKiBwcm9wZXJ0aWVzX3Byb3ZpZGVkICovCisgIDAs IC8qIHByb3BlcnRpZXNfZGVzdHJveWVkICovCisgIDAsIC8qIHRvZG9fZmxh Z3Nfc3RhcnQgKi8KKyAgVE9ET191cGRhdGVfc3NhLCAvKiB0b2RvX2ZsYWdz X2ZpbmlzaCAqLworfTsKKworY2xhc3MgcGFzc19od2FzYW5fTzAgOiBwdWJs aWMgZ2ltcGxlX29wdF9wYXNzCit7CitwdWJsaWM6CisgIHBhc3NfaHdhc2Fu X08wIChnY2M6OmNvbnRleHQgKmN0eHQpCisgICAgOiBnaW1wbGVfb3B0X3Bh c3MgKHBhc3NfZGF0YV9od2FzYW5fTzAsIGN0eHQpCisgIHt9CisKKyAgLyog b3B0X3Bhc3MgbWV0aG9kczogKi8KKyAgb3B0X3Bhc3MgKiBjbG9uZSAoKSB7 IHJldHVybiBuZXcgcGFzc19od2FzYW5fTzAgKG1fY3R4dCk7IH0KKyAgdmly dHVhbCBib29sIGdhdGUgKGZ1bmN0aW9uICopIHsgcmV0dXJuICFvcHRpbWl6 ZSAmJiBnYXRlX2h3YXNhbiAoKTsgfQorICB2aXJ0dWFsIHVuc2lnbmVkIGlu dCBleGVjdXRlIChmdW5jdGlvbiAqKSB7IHJldHVybiBod2FzYW5faW5zdHJ1 bWVudCAoKTsgfQorCit9OyAvLyBjbGFzcyBwYXNzX2FzYW4KKworfSAvLyBh bm9uIG5hbWVzcGFjZQorCitnaW1wbGVfb3B0X3Bhc3MgKgorbWFrZV9wYXNz X2h3YXNhbl9PMCAoZ2NjOjpjb250ZXh0ICpjdHh0KQoreworICByZXR1cm4g bmV3IHBhc3NfaHdhc2FuX08wIChjdHh0KTsKK30KKwogI2luY2x1ZGUgImd0 LWFzYW4uaCIKZGlmZiAtLWdpdCBhL2djYy9pbnRlcm5hbC1mbi5jIGIvZ2Nj L2ludGVybmFsLWZuLmMKaW5kZXggMDQwODFmMzZjNGQzMWVjZmJhNDA5OWU1 MDQxMjM0NWM2N2UxZjU4Zi4uODBmOTRmMTQxYmZkOTJlOWY2YWYxM2E2ZGY3 NmYwYzlhYzA1M2ZkYyAxMDA2NDQKLS0tIGEvZ2NjL2ludGVybmFsLWZuLmMK KysrIGIvZ2NjL2ludGVybmFsLWZuLmMKQEAgLTQ1Niw2ICs0NTYsMTIgQEAg ZXhwYW5kX1VCU0FOX09CSkVDVF9TSVpFIChpbnRlcm5hbF9mbiwgZ2NhbGwg KikKIC8qIFRoaXMgc2hvdWxkIGdldCBleHBhbmRlZCBpbiB0aGUgc2Fub3B0 IHBhc3MuICAqLwogCiBzdGF0aWMgdm9pZAorZXhwYW5kX0hXQVNBTl9DSEVD SyAoaW50ZXJuYWxfZm4sIGdjYWxsICopCit7CisgIGdjY191bnJlYWNoYWJs ZSAoKTsKK30KKworc3RhdGljIHZvaWQKIGV4cGFuZF9BU0FOX0NIRUNLIChp bnRlcm5hbF9mbiwgZ2NhbGwgKikKIHsKICAgZ2NjX3VucmVhY2hhYmxlICgp OwpkaWZmIC0tZ2l0IGEvZ2NjL2ludGVybmFsLWZuLmRlZiBiL2djYy9pbnRl cm5hbC1mbi5kZWYKaW5kZXggMDE2MzAxYTU4ZDgzZDcxMjg4MTc4MjRkN2M3 ZWY5MjgyNWM3ZTAzZS4uYzY4M2U1ZDhlNWM2MDdmMTg5MDliZGE0ZDk3YjU4 NDIxY2I3YzJhNCAxMDA2NDQKLS0tIGEvZ2NjL2ludGVybmFsLWZuLmRlZgor KysgYi9nY2MvaW50ZXJuYWwtZm4uZGVmCkBAIC0yODgsNiArMjg4LDcgQEAg REVGX0lOVEVSTkFMX0ZOIChVQlNBTl9QVFIsIEVDRl9MRUFGIHwgRUNGX05P VEhST1csICIuUi4iKQogREVGX0lOVEVSTkFMX0ZOIChVQlNBTl9PQkpFQ1Rf U0laRSwgRUNGX0xFQUYgfCBFQ0ZfTk9USFJPVywgTlVMTCkKIERFRl9JTlRF Uk5BTF9GTiAoQUJOT1JNQUxfRElTUEFUQ0hFUiwgRUNGX05PUkVUVVJOLCBO VUxMKQogREVGX0lOVEVSTkFMX0ZOIChCVUlMVElOX0VYUEVDVCwgRUNGX0NP TlNUIHwgRUNGX0xFQUYgfCBFQ0ZfTk9USFJPVywgTlVMTCkKK0RFRl9JTlRF Uk5BTF9GTiAoSFdBU0FOX0NIRUNLLCBFQ0ZfVE1fUFVSRSB8IEVDRl9MRUFG IHwgRUNGX05PVEhST1csICIuLlIuLiIpCiBERUZfSU5URVJOQUxfRk4gKEFT QU5fQ0hFQ0ssIEVDRl9UTV9QVVJFIHwgRUNGX0xFQUYgfCBFQ0ZfTk9USFJP VywgIi4uUi4uIikKIERFRl9JTlRFUk5BTF9GTiAoQVNBTl9NQVJLLCBFQ0Zf TEVBRiB8IEVDRl9OT1RIUk9XLCBOVUxMKQogREVGX0lOVEVSTkFMX0ZOIChB U0FOX1BPSVNPTiwgRUNGX0xFQUYgfCBFQ0ZfTk9USFJPVyB8IEVDRl9OT1ZP UFMsIE5VTEwpCmRpZmYgLS1naXQgYS9nY2MvcGFzc2VzLmRlZiBiL2djYy9w YXNzZXMuZGVmCmluZGV4IGFkMmVmYWJkMzg1M2Q4ZDIwNTYyZjY2ZjRjNWJi MzQ2OTRlYzgwZjIuLjExYzlmYjIwYjA0MmQ1NWE3ZDUyZGE0ZmVkYTYzM2Rj NWNkMzA1MmEgMTAwNjQ0Ci0tLSBhL2djYy9wYXNzZXMuZGVmCisrKyBiL2dj Yy9wYXNzZXMuZGVmCkBAIC0yNDYsNiArMjQ2LDcgQEAgYWxvbmcgd2l0aCBH Q0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICAgICAg IE5FWFRfUEFTUyAocGFzc19zaW5rX2NvZGUpOwogICAgICAgTkVYVF9QQVNT IChwYXNzX3NhbmNvdik7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfYXNhbik7 CisgICAgICBORVhUX1BBU1MgKHBhc3NfaHdhc2FuKTsKICAgICAgIE5FWFRf UEFTUyAocGFzc190c2FuKTsKICAgICAgIE5FWFRfUEFTUyAocGFzc19kY2Up OwogICAgICAgLyogUGFzcyBncm91cCB0aGF0IHJ1bnMgd2hlbiAxKSBlbmFi bGVkLCAyKSB0aGVyZSBhcmUgbG9vcHMKQEAgLTM2Miw2ICszNjMsNyBAQCBh bG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAgSWYgbm90 IHNlZQogICAgICAgTkVYVF9QQVNTIChwYXNzX2RjZSk7CiAgICAgICBORVhU X1BBU1MgKHBhc3Nfc2FuY292KTsKICAgICAgIE5FWFRfUEFTUyAocGFzc19h c2FuKTsKKyAgICAgIE5FWFRfUEFTUyAocGFzc19od2FzYW4pOwogICAgICAg TkVYVF9QQVNTIChwYXNzX3RzYW4pOwogICAgICAgLyogPz8/ICBXZSBkbyB3 YW50IHNvbWUga2luZCBvZiBsb29wIGludmFyaWFudCBtb3Rpb24sIGJ1dCB3 ZSBwb3NzaWJseQogICAgICAgICAgbmVlZCB0byBhZGp1c3QgTElNIHRvIGJl IG1vcmUgZnJpZW5kbHkgdG93YXJkcyBwcmVzZXJ2aW5nIGFjY3VyYXRlCkBA IC0zODcsNiArMzg5LDcgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmls ZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKICAgTkVYVF9QQVNTIChwYXNzX3Nh bmNvdl9PMCk7CiAgIE5FWFRfUEFTUyAocGFzc19sb3dlcl9zd2l0Y2hfTzAp OwogICBORVhUX1BBU1MgKHBhc3NfYXNhbl9PMCk7CisgIE5FWFRfUEFTUyAo cGFzc19od2FzYW5fTzApOwogICBORVhUX1BBU1MgKHBhc3NfdHNhbl9PMCk7 CiAgIE5FWFRfUEFTUyAocGFzc19zYW5vcHQpOwogICBORVhUX1BBU1MgKHBh c3NfY2xlYW51cF9laCk7CmRpZmYgLS1naXQgYS9nY2Mvc2FuaXRpemVyLmRl ZiBiL2djYy9zYW5pdGl6ZXIuZGVmCmluZGV4IDdiZDUwNzE1ZjI0YTJjYjE1 NGI1NzhlMmFiZGVhNGU4ZmNkYjIxMDcuLjBlZGYzNDljYzIzZTg0NjYwOGI4 OWQ1NGExMDI0YjlkOTlkZTljNGQgMTAwNjQ0Ci0tLSBhL2djYy9zYW5pdGl6 ZXIuZGVmCisrKyBiL2djYy9zYW5pdGl6ZXIuZGVmCkBAIC0xODMsNiArMTgz LDEwIEBAIERFRl9TQU5JVElaRVJfQlVJTFRJTihCVUlMVF9JTl9BU0FOX1BP SU5URVJfU1VCVFJBQ1QsICJfX3Nhbml0aXplcl9wdHJfc3ViIiwKIC8qIEhh cmR3YXJlIEFkZHJlc3MgU2FuaXRpemVyLiAgKi8KIERFRl9TQU5JVElaRVJf QlVJTFRJTihCVUlMVF9JTl9IV0FTQU5fSU5JVCwgIl9faHdhc2FuX2luaXQi LAogCQkgICAgICBCVF9GTl9WT0lELCBBVFRSX05PVEhST1dfTEVBRl9MSVNU KQorREVGX1NBTklUSVpFUl9CVUlMVElOKEJVSUxUX0lOX0hXQVNBTl9MT0FE TiwgIl9faHdhc2FuX2xvYWROIiwKKwkJICAgICAgQlRfRk5fVk9JRF9QVFJf UFRSTU9ERSwgQVRUUl9UTVBVUkVfTk9USFJPV19MRUFGX0xJU1QpCitERUZf U0FOSVRJWkVSX0JVSUxUSU4oQlVJTFRfSU5fSFdBU0FOX1NUT1JFTiwgIl9f aHdhc2FuX3N0b3JlTiIsCisJCSAgICAgIEJUX0ZOX1ZPSURfUFRSX1BUUk1P REUsIEFUVFJfVE1QVVJFX05PVEhST1dfTEVBRl9MSVNUKQogREVGX1NBTklU SVpFUl9CVUlMVElOKEJVSUxUX0lOX0hXQVNBTl9UQUdfTUVNLCAiX19od2Fz YW5fdGFnX21lbW9yeSIsCiAJCSAgICAgIEJUX0ZOX1ZPSURfUFRSX1VJTlQ4 X1NJWkUsIEFUVFJfTk9USFJPV19MSVNUKQogCmRpZmYgLS1naXQgYS9nY2Mv c2Fub3B0LmMgYi9nY2Mvc2Fub3B0LmMKaW5kZXggNWNiOThlMWI1MGU0ZTE2 NDQwNzJiZDE4ZDc0Nzk3YzNjYWM0M2MzZi4uMzEyNzAxNTNmM2NmNTZiZmJh ZDU5MzgzMGRlMWI5MzM0ZTdmNjVkMSAxMDA2NDQKLS0tIGEvZ2NjL3Nhbm9w dC5jCisrKyBiL2djYy9zYW5vcHQuYwpAQCAtNzcyLDcgKzc3Miw4IEBAIHNh bm9wdF9vcHRpbWl6ZV93YWxrZXIgKGJhc2ljX2Jsb2NrIGJiLCBzdHJ1Y3Qg c2Fub3B0X2N0eCAqY3R4KQogICBiYXNpY19ibG9jayBzb247CiAgIGdpbXBs ZV9zdG10X2l0ZXJhdG9yIGdzaTsKICAgc2Fub3B0X2luZm8gKmluZm8gPSAo c2Fub3B0X2luZm8gKikgYmItPmF1eDsKLSAgYm9vbCBhc2FuX2NoZWNrX29w dGltaXplID0gKGZsYWdfc2FuaXRpemUgJiBTQU5JVElaRV9BRERSRVNTKSAh PSAwOworICBib29sIGFzYW5fY2hlY2tfb3B0aW1pemUgPQorICAgICgoZmxh Z19zYW5pdGl6ZSAmIFNBTklUSVpFX0FERFJFU1MpICE9IDApIHx8IG1lbW9y eV90YWdnaW5nX3AgKCk7CiAKICAgZm9yIChnc2kgPSBnc2lfc3RhcnRfYmIg KGJiKTsgIWdzaV9lbmRfcCAoZ3NpKTspCiAgICAgewpAQCAtODAyLDYgKzgw Myw3IEBAIHNhbm9wdF9vcHRpbWl6ZV93YWxrZXIgKGJhc2ljX2Jsb2NrIGJi LCBzdHJ1Y3Qgc2Fub3B0X2N0eCAqY3R4KQogICAgICAgaWYgKGFzYW5fY2hl Y2tfb3B0aW1pemUKIAkgICYmIGdpbXBsZV9jYWxsX2J1aWx0aW5fcCAoc3Rt dCwgQlVJTFRfSU5fQVNBTl9CRUZPUkVfRFlOQU1JQ19JTklUKSkKIAl7CisJ ICBnY2NfYXNzZXJ0ICghbWVtb3J5X3RhZ2dpbmdfcCAoKSk7CiAJICB1c2Vf b3BlcmFuZF9wIHVzZTsKIAkgIGdpbXBsZSAqdXNlX3N0bXQ7CiAJICBpZiAo c2luZ2xlX2ltbV91c2UgKGdpbXBsZV92ZGVmIChzdG10KSwgJnVzZSwgJnVz ZV9zdG10KSkKQEAgLTgzMCw2ICs4MzIsNyBAQCBzYW5vcHRfb3B0aW1pemVf d2Fsa2VyIChiYXNpY19ibG9jayBiYiwgc3RydWN0IHNhbm9wdF9jdHggKmN0 eCkKIAkgIGNhc2UgSUZOX1VCU0FOX1BUUjoKIAkgICAgcmVtb3ZlID0gbWF5 YmVfb3B0aW1pemVfdWJzYW5fcHRyX2lmbiAoY3R4LCBzdG10KTsKIAkgICAg YnJlYWs7CisJICBjYXNlIElGTl9IV0FTQU5fQ0hFQ0s6CiAJICBjYXNlIElG Tl9BU0FOX0NIRUNLOgogCSAgICBpZiAoYXNhbl9jaGVja19vcHRpbWl6ZSkK IAkgICAgICByZW1vdmUgPSBtYXliZV9vcHRpbWl6ZV9hc2FuX2NoZWNrX2lm biAoY3R4LCBzdG10KTsKQEAgLTEyNjIsMTAgKzEyNjUsMTEgQEAgcGFzc19z YW5vcHQ6OmV4ZWN1dGUgKGZ1bmN0aW9uICpmdW4pCiAgIC8qIFRyeSB0byBy ZW1vdmUgcmVkdW5kYW50IGNoZWNrcy4gICovCiAgIGlmIChvcHRpbWl6ZQog ICAgICAgJiYgKGZsYWdfc2FuaXRpemUKLQkgICYgKFNBTklUSVpFX05VTEwg fCBTQU5JVElaRV9BTElHTk1FTlQKKwkgICYgKFNBTklUSVpFX05VTEwgfCBT QU5JVElaRV9BTElHTk1FTlQgfCBTQU5JVElaRV9IV0FERFJFU1MKIAkgICAg IHwgU0FOSVRJWkVfQUREUkVTUyB8IFNBTklUSVpFX1ZQVFIgfCBTQU5JVEla RV9QT0lOVEVSX09WRVJGTE9XKSkpCiAgICAgYXNhbl9udW1fYWNjZXNzZXMg PSBzYW5vcHRfb3B0aW1pemUgKGZ1biwgJmNvbnRhaW5zX2FzYW5fbWFyayk7 Ci0gIGVsc2UgaWYgKGZsYWdfc2FuaXRpemUgJiBTQU5JVElaRV9BRERSRVNT KQorICBlbHNlIGlmIChmbGFnX3Nhbml0aXplICYgU0FOSVRJWkVfQUREUkVT UworCSAgIHx8IG1lbW9yeV90YWdnaW5nX3AgKCkpCiAgICAgewogICAgICAg Z2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpOwogICAgICAgRk9SX0VBQ0hfQkJf Rk4gKGJiLCBmdW4pCkBAIC0xMjg1LDcgKzEyODksNyBAQCBwYXNzX3Nhbm9w dDo6ZXhlY3V0ZSAoZnVuY3Rpb24gKmZ1bikKICAgICAgIHNhbml0aXplX2Fz YW5fbWFya19wb2lzb24gKCk7CiAgICAgfQogCi0gIGlmIChhc2FuX3Nhbml0 aXplX3N0YWNrX3AgKCkpCisgIGlmIChhc2FuX3Nhbml0aXplX3N0YWNrX3Ag KCkgfHwgbWVtb3J5X3RhZ2dpbmdfcCAoKSkKICAgICBzYW5pdGl6ZV9yZXdy aXRlX2FkZHJlc3NhYmxlX3BhcmFtcyAoZnVuKTsKIAogICBib29sIHVzZV9j YWxscyA9IEFTQU5fSU5TVFJVTUVOVEFUSU9OX1dJVEhfQ0FMTF9USFJFU0hP TEQgPCBJTlRfTUFYCkBAIC0xMzI3LDYgKzEzMzEsOSBAQCBwYXNzX3Nhbm9w dDo6ZXhlY3V0ZSAoZnVuY3Rpb24gKmZ1bikKIAkJY2FzZSBJRk5fVUJTQU5f VlBUUjoKIAkJICBub19uZXh0ID0gdWJzYW5fZXhwYW5kX3ZwdHJfaWZuICgm Z3NpKTsKIAkJICBicmVhazsKKwkJY2FzZSBJRk5fSFdBU0FOX0NIRUNLOgor CQkgIG5vX25leHQgPSBod2FzYW5fZXhwYW5kX2NoZWNrX2lmbiAoJmdzaSwg dXNlX2NhbGxzKTsKKwkJICBicmVhazsKIAkJY2FzZSBJRk5fQVNBTl9DSEVD SzoKIAkJICBub19uZXh0ID0gYXNhbl9leHBhbmRfY2hlY2tfaWZuICgmZ3Np LCB1c2VfY2FsbHMpOwogCQkgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvZ2NjL3Ry ZWUtcGFzcy5oIGIvZ2NjL3RyZWUtcGFzcy5oCmluZGV4IDNhMGIzODA1ZDI0 ZGJkNTAxNDFkNDE0NTU2Mzg2MWU0YWUzNzY4ZjMuLjAxZWJkMDMyMDVlNTdl ZTNhNjNkMzM0NGRhODA5ODE2MGMwODEwMDIgMTAwNjQ0Ci0tLSBhL2djYy90 cmVlLXBhc3MuaAorKysgYi9nY2MvdHJlZS1wYXNzLmgKQEAgLTM0MSw2ICsz NDEsOCBAQCBleHRlcm4gdm9pZCByZWdpc3Rlcl9wYXNzIChvcHRfcGFzcyog cGFzcywgcGFzc19wb3NpdGlvbmluZ19vcHMgcG9zLAogCiBleHRlcm4gZ2lt cGxlX29wdF9wYXNzICptYWtlX3Bhc3NfYXNhbiAoZ2NjOjpjb250ZXh0ICpj dHh0KTsKIGV4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc19hc2Fu X08wIChnY2M6OmNvbnRleHQgKmN0eHQpOworZXh0ZXJuIGdpbXBsZV9vcHRf cGFzcyAqbWFrZV9wYXNzX2h3YXNhbiAoZ2NjOjpjb250ZXh0ICpjdHh0KTsK K2V4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc19od2FzYW5fTzAg KGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gZ2ltcGxlX29wdF9wYXNz ICptYWtlX3Bhc3NfdHNhbiAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVy biBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc190c2FuX08wIChnY2M6OmNv bnRleHQgKmN0eHQpOwogZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9w YXNzX3NhbmNvdiAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKCg== --_002_VI1PR08MB54715A58DC26A5601AAD7C6AE0BA0VI1PR08MB5471eurp_--