From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1373C10DCE for ; Fri, 6 Mar 2020 13:01:48 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 935FC2084E for ; Fri, 6 Mar 2020 13:01:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="d+jiOdmO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 935FC2084E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=virtuozzo.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:36464 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jACbr-0007SO-OC for qemu-devel@archiver.kernel.org; Fri, 06 Mar 2020 08:01:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:38910) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jACaQ-0006OP-9i for qemu-devel@nongnu.org; Fri, 06 Mar 2020 08:00:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jACaN-0000Ix-RL for qemu-devel@nongnu.org; Fri, 06 Mar 2020 08:00:18 -0500 Received: from mail-db8eur05on2109.outbound.protection.outlook.com ([40.107.20.109]:15777 helo=EUR05-DB8-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jACaH-0007kf-24; Fri, 06 Mar 2020 08:00:09 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hIQB3wgvpGFFtpQVITPUnfo+LdaBmCJD6l/5cvN7Wzc2ayVL8ijTmCkpnzkyDGrCo4MUGZH62ri+PCylHEpuimQSyEgeB2M+ugFxnjdO56b5C/7ry2vVyk5R8EgtllwIIJghWka5Ewh5b3iZ2+n9JA8WOMmGe0sY9eRkWrOKusV2TkM7dljSA72hsbhxw8otVpbJrYUJTj0BYIvd62J91lTeb+aQ9T8ayHUPLSYGFDfVW9s3fC7/WcmaYFWpC7bqVKHsvf/pERSM+vcLAE+H5lfyqbyP+jt3bQsGbUJ+0F15pPHmThEdWOgOFZg4483pvgynKG1pYbCBZDLArwVZCQ== 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=fYOTHtdyZJV+CMittP/gilw+4vDoPxL2uF1MWj6sgfI=; b=hPRYGv2fQTY/ZS+5+mYcHd1ZqWmGfQMyNHnItivlVJ4MjqGtJoF4RjyH81Cu2r+XFg7ElU0W3YnTAxNhL5tSkwXM8nKomTeFJ/TIdjW6/5tWDY+4szvubPCGSUmUfgT9P7lkFfcB696M4H2Lg0hhO+mbsy0bMh94K3yEdwEcpzoIkqFI7nG1NeCoeQaP4YAqA6rMW7NrBqx4uYgGV+tBVtgqt35dtUxv0IBul6JGYAaZiYfJ87DgNIjYCbcpLW7QReyE6QdbgpDid8WcmA/VQmrD1nO67UEfuBIhpmrdgf+6wVQXQdaTUt9+4o1IKG3GcNenKu8p4VpbKYZ/LxXOZg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fYOTHtdyZJV+CMittP/gilw+4vDoPxL2uF1MWj6sgfI=; b=d+jiOdmODS+odAbsRExvQ/Q2oeqXQLpRbN6JUmm/Ktfo5vv6l6t2LlXGQTil1yMxPUPOERMjk4IFNsMdaV5iNYGorTpsvqHigVL9UcfP3Sf9nK2OhdKmFi4sQPMwRjb35DUyfznjFx9zuUyCgzSKgACF8sTCHPqAv7EK8wQWx1g= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=vsementsov@virtuozzo.com; Received: from AM6PR08MB4423.eurprd08.prod.outlook.com (20.179.7.140) by AM6PR08MB3224.eurprd08.prod.outlook.com (52.135.164.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2750.22; Fri, 6 Mar 2020 13:00:03 +0000 Received: from AM6PR08MB4423.eurprd08.prod.outlook.com ([fe80::e05a:63af:818c:b664]) by AM6PR08MB4423.eurprd08.prod.outlook.com ([fe80::e05a:63af:818c:b664%4]) with mapi id 15.20.2793.013; Fri, 6 Mar 2020 13:00:03 +0000 Subject: Re: [PATCH v8 01/10] error: auto propagated local_err To: Eric Blake , qemu-devel@nongnu.org References: <20200306051536.27803-1-vsementsov@virtuozzo.com> <20200306051536.27803-2-vsementsov@virtuozzo.com> <41229b66-eedb-1c30-4849-a8076080117e@redhat.com> From: Vladimir Sementsov-Ogievskiy X-Tagtoolbar-Keys: D20200306160000157 Message-ID: Date: Fri, 6 Mar 2020 16:00:00 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 In-Reply-To: <41229b66-eedb-1c30-4849-a8076080117e@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: HE1PR05CA0275.eurprd05.prod.outlook.com (2603:10a6:3:fc::27) To AM6PR08MB4423.eurprd08.prod.outlook.com (2603:10a6:20b:bf::12) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [172.16.24.200] (185.231.240.5) by HE1PR05CA0275.eurprd05.prod.outlook.com (2603:10a6:3:fc::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2793.16 via Frontend Transport; Fri, 6 Mar 2020 13:00:01 +0000 X-Tagtoolbar-Keys: D20200306160000157 X-Originating-IP: [185.231.240.5] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e5ac340f-f01a-4ee2-2979-08d7c1ce490f X-MS-TrafficTypeDiagnostic: AM6PR08MB3224: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 0334223192 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(376002)(346002)(39850400004)(136003)(366004)(396003)(199004)(189003)(7416002)(6486002)(30864003)(36756003)(16576012)(478600001)(2906002)(316002)(86362001)(5660300002)(26005)(186003)(54906003)(31696002)(4326008)(8676002)(16526019)(956004)(66946007)(2616005)(81166006)(31686004)(53546011)(8936002)(66556008)(52116002)(66476007)(81156014); DIR:OUT; SFP:1102; SCL:1; SRVR:AM6PR08MB3224; H:AM6PR08MB4423.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZxARpEjWVuJyMP0SlU6+3eAEUz+S26X/QZI4gZaNc4eBaFBUfq4PcP7v/2pSqCdCQ38o9dY7DTjY+NKqa4Ps1JI+FGd4vDo0cyILoGcMd60edkdgd8A6Gc0CinlX9GQjHdZx6bmXRqEK77rxKw3Cj2X6AcLFbkDH/sN9OZa+nkOFPF0B0qiJe7FH5oCSUxiuJEXyBU/dUM1ToFEL3Yp+IkftS2XEsiKj+jZJQktnSWvSeyMwD7LOa+P88a49PTcEwLpC8oNb8JOleFO24lY37Bps/yf+1LRuyTYGy/odFZ8ev8EFSWaKdDzgVSv2px8ecPdeKE5x0Aj93XiHFsgzaf2cEKz8T6Apr6Zagpn5qvFjx2YuYldqUX5eRKILfDY2qKOg+gpgsyPn535GAwh02gidnKL0kuiMufbeJab3Jh7eK7kfnX61A3wemxRyFdCb X-MS-Exchange-AntiSpam-MessageData: R5aoPRSYdrObEamexYe06f0k/m0afCEpEZmEkytUhCX01Zf/fUnNxBM+jzYJ28iNoOXpbPUbpbzF0/V20TEWc7ZCjZwdMGmZFXB2q73c7S2P6f5D84Qf8O/GNPU6RdT/F3uJaD0p3MZ8DlFXzEfpXA== X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: e5ac340f-f01a-4ee2-2979-08d7c1ce490f X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2020 13:00:03.1547 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UPGtJyrspTHANjgED7CzmBIbMt23pRDW/ybhmtGEnMTjhva+OzDZ9zRlBDJ51/KrMLi0VWz/KJbZVbjbEETayCE2HkTlVN+0EmwHWUZTCK0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB3224 X-detected-operating-system: by eggs.gnu.org: Windows NT kernel [generic] [fuzzy] X-Received-From: 40.107.20.109 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Stefano Stabellini , Michael Roth , qemu-block@nongnu.org, Paul Durrant , Laszlo Ersek , Christian Schoenebeck , Greg Kurz , armbru@redhat.com, Gerd Hoffmann , Stefan Hajnoczi , Anthony Perard , xen-devel@lists.xenproject.org, Max Reitz , =?UTF-8?Q?Philippe_Mathieu-Daud=c3=a9?= , Stefan Berger Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" 06.03.2020 15:37, Eric Blake wrote: > On 3/5/20 11:15 PM, Vladimir Sementsov-Ogievskiy wrote: >> Here is introduced ERRP_AUTO_PROPAGATE macro, to be used at start of >> functions with an errp OUT parameter. >=20 > As an aid to writing imperative-style commit messages, I like to prepend = an implicit "Apply this patch to..." before the user's text, to see if thin= gs still make sense.=C2=A0 By that construct, this paragraph might read bet= ter as: >=20 > Introduce a new ERRP_AUTO_PROPAGATE macro, ... >=20 >> >> It has three goals: >> >> 1. Fix issue with error_fatal and error_prepend/error_append_hint: user >> can't see this additional information, because exit() happens in >> error_setg earlier than information is added. [Reported by Greg Kurz] >> >> 2. Fix issue with error_abort and error_propagate: when we wrap >> error_abort by local_err+error_propagate, the resulting coredump will >> refer to error_propagate and not to the place where error happened. >> (the macro itself doesn't fix the issue, but it allows us to [3.] drop >> the local_err+error_propagate pattern, which will definitely fix the >> issue) [Reported by Kevin Wolf] >> >> 3. Drop local_err+error_propagate pattern, which is used to workaround >> void functions with errp parameter, when caller wants to know resulting >> status. (Note: actually these functions could be merely updated to >> return int error code). >> >> To achieve these goals, later patches will add invocations >> of this macro at the start of functions with either use >> error_prepend/error_append_hint (solving 1) or which use >> local_err+error_propagate to check errors, switching those >> functions to use *errp instead (solving 2 and 3). >> >> Signed-off-by: Vladimir Sementsov-Ogievskiy >> --- >=20 > I have lots of grammar suggestions for the comments (and I know Markus is= generally okay doing wording tweaks, so it may still end up different than= my suggestions): >=20 >> +++ b/include/qapi/error.h >> @@ -15,6 +15,8 @@ >> =C2=A0 /* >> =C2=A0=C2=A0 * Error reporting system loosely patterned after Glib's GEr= ror. >> =C2=A0=C2=A0 * >> + * =3D Deal with Error object =3D >> + * >> =C2=A0=C2=A0 * Create an error: >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 error_setg(&err, "situation norma= l, all fouled up"); >> =C2=A0=C2=A0 * >> @@ -47,28 +49,88 @@ >> =C2=A0=C2=A0 * reporting it (primarily useful in testsuites): >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 error_free_or_abort(&err); >> =C2=A0=C2=A0 * >> - * Pass an existing error to the caller: >> - *=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate(errp, err); >> - * where Error **errp is a parameter, by convention the last one. >> + * =3D Deal with Error ** function parameter =3D >> =C2=A0=C2=A0 * >> - * Pass an existing error to the caller with the message modified: >> - *=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate_prepend(errp, err); >> + * Function may use error system to return errors. In this case functio= n >> + * defines Error **errp parameter, which should be the last one (except= for >> + * functions which varidic argument list), which has the following API: >=20 > A function may use the error system to return errors.=C2=A0 In this case,= the function defines an Error **errp parameter, by convention the last one= (with exceptions for functions using ... or va_list). >=20 >> =C2=A0=C2=A0 * >> - * Avoid >> - *=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate(errp, err); >> - *=C2=A0=C2=A0=C2=A0=C2=A0 error_prepend(errp, "Could not frobnicate '%= s': ", name); >> - * because this fails to prepend when @errp is &error_fatal. >> + * Caller may pass as errp: >=20 > The caller may then pass in the following errp values: >=20 >> + * 1. &error_abort >> + *=C2=A0=C2=A0=C2=A0 This means abort on any error >=20 > Any error will result in abort() >=20 >> + * 2. &error_fatal >> + *=C2=A0=C2=A0=C2=A0 Exit with non-zero return code on error >=20 > Any error will result in exit() with a non-zero status >=20 >> + * 3. NULL >> + *=C2=A0=C2=A0=C2=A0 Ignore errors >=20 > Any error will be ignored >=20 >> + * 4. Another value >=20 > 4. The address of a NULL-initialized Error *err >=20 >> + *=C2=A0=C2=A0=C2=A0 On error allocate error object and set errp >=20 > Any error will populate errp with an error object >=20 >> =C2=A0=C2=A0 * >> - * Create a new error and pass it to the caller: >> - *=C2=A0=C2=A0=C2=A0=C2=A0 error_setg(errp, "situation normal, all foul= ed up"); >> + * Error API functions with Error ** (like error_setg) argument support= s these >> + * rules, so user functions just need to use them appropriately (read b= elow). >=20 > The following rules then implement the correct semantics desired by the c= aller. >=20 >> =C2=A0=C2=A0 * >> - * Call a function and receive an error from it: >> + * Simple pass error to the caller: >=20 > Create a new error to pass to the caller: >=20 >> + *=C2=A0=C2=A0=C2=A0=C2=A0 error_setg(errp, "Some error"); >=20 > You lost the fun wording in Markus' earlier example ("situation normal, a= ll fouled up"). >=20 >> + * >> + * Subcall of another errp-based function, passing the error to the cal= ler >> + *=C2=A0=C2=A0=C2=A0=C2=A0 f(..., errp); >=20 > Calling another errp-based function: >=20 >> + * >> + * =3D=3D Checking success of subcall =3D=3D >> + * >> + * If function returns error code in addition to errp (which is recomme= nded), >=20 > If a function returns a value indicating an error in addition to setting = errp (which is recommended), then >=20 >> + * you don't need any additional code, just do: >> + *=C2=A0=C2=A0=C2=A0=C2=A0 int ret =3D f(..., errp); >> + *=C2=A0=C2=A0=C2=A0=C2=A0 if (ret < 0) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... handle error ... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return ret; >> + *=C2=A0=C2=A0=C2=A0=C2=A0 } >> + * >> + * If function returns nothing (which is not recommended API) and the o= nly way >> + * to check success is checking errp, we must care about cases [1-3] ab= ove. We >> + * need to use macro ERRP_AUTO_PROPAGATE (see below for details) like t= his: >=20 > If a function returns nothing (not recommended for new code), the only wa= y to check success is by consulting errp; doing this safely requires the us= e of the ERRP_AUTO_PROPAGATE macro, like this: >=20 >=20 >> + * >> + *=C2=A0=C2=A0=C2=A0=C2=A0 int our_func(..., Error **errp) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ERRP_AUTO_PROPAGATE(= ); >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 subcall(..., errp); >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (*errp) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 ... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 return -ERRNO; >=20 > do we want ERRNO capitalized here? I wrote it capitalized to not conflict with errno variable, to make it obvi= ous that this is just a pseudo-code. But yes, it looks weird anyway. We can write -errno here, or just -EINVAL (I hope, nobady will thing, that = EINVAL should always be used :) >=20 >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... >> + *=C2=A0=C2=A0=C2=A0=C2=A0 } >> + * >> + * ERRP_AUTO_PROPAGATE cares about Error ** API, wraps original errp if= needed, >> + * so that it can be safely used (including dereferencing), and auto-pr= opagates >> + * error to original errp on function end. >=20 > ERRP_AUTO_PROPAGATE takes care of wrapping the original errp as needed, s= o that the rest of the function can directly use errp (including dereferenc= ing), where any errors will then be propagated on to the original errp when= leaving the function. >=20 >> + * >> + * In some cases, we need to check result of subcall, but do not want t= o >> + * propagate the Error object to our caller. In such cases we don't nee= d >> + * ERRP_AUTO_PROPAGATE, but just a local Error object: >> + * >> + * Receive an error and not pass it: >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 Error *err =3D NULL; >> - *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, &err); >> + *=C2=A0=C2=A0=C2=A0=C2=A0 subcall(arg, &err); >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 if (err) { >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 handle th= e error... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 error_free(err); >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 } >> =C2=A0=C2=A0 * >> + * Note, that before ERRP_AUTO_PROPAGATE introduction the pattern above= (with >> + * error_propagate() instead of error_free()) was used to check and pas= s error >> + * to the caller. Now this is DEPRECATED* (see below). >=20 > Hmm - if we bulk-convert the entire tree, then there won't be any depreca= ted uses to be worth documenting. Yes, I think we'll drop it after everything is converted. >=C2=A0 But if we do keep this paragraph: >=20 > Note that older code that did not use ERRP_AUTO_PROPAGATE would instead n= eed a local Err variable and the use of error_propagate() to properly handl= e all possible caller values of errp. >=20 >> + * >> + * Note also, that if you want to use error_append_hint/error_prepend o= r their >> + * variants, you must use ERRP_AUTO_PROPAGATE too. Otherwise, in case o= f >> + * error_fatal, you'll miss the chance to insert your additional inform= ation >> + * into Error object. >=20 > Note that any function that wants to modify an error object, such as by c= alling error_append_hint or error_prepend, must use ERRP_AUTO_PROPAGATE, in= order for a caller's use of &error_fatal to see the additional information= . >=20 >> + * >> + * In rare cases, we need to pass existing Error object to the caller b= y hand: >> + *=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate(errp, err); >> + * >> + * Pass an existing error to the caller with the message modified: >> + *=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate_prepend(errp, err); >> + * >> + * >> =C2=A0=C2=A0 * Call a function ignoring errors: >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, NULL); >> =C2=A0=C2=A0 * >> @@ -78,26 +140,6 @@ >> =C2=A0=C2=A0 * Call a function treating errors as fatal: >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, &error_fatal); >> =C2=A0=C2=A0 * >> - * Receive an error and pass it on to the caller: >> - *=C2=A0=C2=A0=C2=A0=C2=A0 Error *err =3D NULL; >> - *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, &err); >> - *=C2=A0=C2=A0=C2=A0=C2=A0 if (err) { >> - *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 handle the error... >> - *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate(errp= , err); >> - *=C2=A0=C2=A0=C2=A0=C2=A0 } >> - * where Error **errp is a parameter, by convention the last one. >> - * >> - * Do *not* "optimize" this to >> - *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, errp); >> - *=C2=A0=C2=A0=C2=A0=C2=A0 if (*errp) { // WRONG! >> - *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 handle the error... >> - *=C2=A0=C2=A0=C2=A0=C2=A0 } >> - * because errp may be NULL! >> - * >> - * But when all you do with the error is pass it on, please use >> - *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, errp); >> - * for readability. >> - * >> =C2=A0=C2=A0 * Receive and accumulate multiple errors (first one wins): >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 Error *err =3D NULL, *local_err = =3D NULL; >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, &err); >> @@ -114,6 +156,61 @@ >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 handle th= e error... >> =C2=A0=C2=A0 *=C2=A0=C2=A0=C2=A0=C2=A0 } >> =C2=A0=C2=A0 * because this may pass a non-null err to bar(). >> + * >> + * DEPRECATED* >> + * >=20 > Again, I'm not sure we need this section in the codebase if we do a bulk = conversion.=C2=A0 But moving it to the commit message is still useful. Conversion can't be atomic anyway, there would be several series. But I'm n= ot against dropping the paragraph, so, it's up to Markus. >=20 >> + * The following pattern of receiving checking and passing the caller o= f the >> + * error by hand is deprecated now: >=20 > The following pattern of receiving, checking, and then forwarding an erro= r to the caller by hand is now deprecated: >=20 >> + * >> + *=C2=A0=C2=A0=C2=A0=C2=A0 Error *err =3D NULL; >> + *=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, &err); >> + *=C2=A0=C2=A0=C2=A0=C2=A0 if (err) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 handle the error... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 error_propagate(errp= , err); >> + *=C2=A0=C2=A0=C2=A0=C2=A0 } >> + * >> + * Instead, use ERRP_AUTO_PROPAGATE macro (defined below). >=20 > Drop "(defined below)". >=20 >> + * >> + * The old pattern is deprecated because of two things: >> + * >> + * 1. Issue with error_abort and error_propagate: when we wrap error_ab= ort by >> + * local_err+error_propagate, the resulting coredump will refer to >> + * error_propagate and not to the place where error happened. >> + * >> + * 2. A lot of extra code of the same pattern >> + * >> + * How to update old code to use ERRP_AUTO_PROPAGATE? >> + * >> + * All you need is to add ERRP_AUTO_PROPAGATE() invocation at function = start, >> + * than you may safely dereference errp to check errors and do not need= any >> + * additional local Error variables or calls to error_propagate(). >> + * >> + * Example: >> + * >> + * old code >> + * >> + *=C2=A0=C2=A0=C2=A0=C2=A0 void fn(..., Error **errp) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Error *err =3D NULL; >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, &err); >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (err) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 handle the error... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 error_propagate(errp, err); >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 return; >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... >> + *=C2=A0=C2=A0=C2=A0=C2=A0 } >> + * >> + * updated code >> + * >> + *=C2=A0=C2=A0=C2=A0=C2=A0 void fn(..., Error **errp) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ERRP_AUTO_PROPAGATE(= ); >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 foo(arg, errp); >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (*errp) { >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 handle the error... >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 return; >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >> + *=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ... >> + *=C2=A0=C2=A0=C2=A0=C2=A0 } >=20 > Again, I'm thinking the above example is more useful in the commit messag= e instead of permanently in the .h file. >=20 >> =C2=A0=C2=A0 */ >> =C2=A0 #ifndef ERROR_H >> @@ -322,6 +419,46 @@ void error_set_internal(Error **errp, >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 ErrorClass err_class, const char *fmt, ...) >> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 GCC_FMT_ATTR(6, 7); >> +typedef struct ErrorPropagator { >> +=C2=A0=C2=A0=C2=A0 Error *local_err; >> +=C2=A0=C2=A0=C2=A0 Error **errp; >> +} ErrorPropagator; >> + >> +static inline void error_propagator_cleanup(ErrorPropagator *prop) >> +{ >> +=C2=A0=C2=A0=C2=A0 error_propagate(prop->errp, prop->local_err); >> +} >> + >> +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(ErrorPropagator, error_propagator_clea= nup); >> + >> +/* >> + * ERRP_AUTO_PROPAGATE >> + * >> + * This macro is created to be the first line of a function which use >> + * Error **errp parameter to report error. It's needed only in cases wh= ere we >> + * want to use error_prepend, error_append_hint or dereference *errp. I= t's >> + * still safe (but useless) in other cases. >=20 > This macro exists to assist with proper error handling in a function whic= h uses an Error **errp parameter.=C2=A0 It must be used as the first line o= f a function which modifies an error (with error_prepend, error_append_hint= , or similar) or which wants to dereference *errp.=C2=A0 It is still safe (= but useless) to use in other functions. >=20 >> + * >> + * If errp is NULL or points to error_fatal, it is rewritten to point t= o a >> + * local Error object, which will be automatically propagated to the or= iginal >> + * errp on function exit (see error_propagator_cleanup). >> + * >> + * After invocation of this macro it is always safe to dereference errp >> + * (as it's not NULL anymore) and to add information by error_prepend o= r >> + * error_append_hint (as, if it was error_fatal, we swapped it with a >> + * local_error to be propagated on cleanup). >> + * >> + * Note: we don't wrap the error_abort case, as we want resulting cored= ump >> + * to point to the place where the error happened, not to error_propaga= te. >> + */ >> +#define ERRP_AUTO_PROPAGATE() \ >> +=C2=A0=C2=A0=C2=A0 g_auto(ErrorPropagator) _auto_errp_prop =3D {.errp = =3D errp}; \ >> +=C2=A0=C2=A0=C2=A0 do { \ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!errp || errp =3D=3D &er= ror_fatal) { \ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 errp= =3D &_auto_errp_prop.local_err; \ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } \ >> +=C2=A0=C2=A0=C2=A0 } while (0) >> + >> =C2=A0 /* >> =C2=A0=C2=A0 * Special error destination to abort on error. >> =C2=A0=C2=A0 * See error_setg() and error_propagate() for details. >> >=20 > The macro itself looks correct. I'll leave it up to Markus how to handle = the comment text, but you can add: >=20 > Reviewed-by: Eric Blake >=20 Thanks for reviewing and wording suggestions, all looks good, as always. --=20 Best regards, Vladimir From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D977C10DCE for ; Fri, 6 Mar 2020 13:00:27 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C863C21D56 for ; Fri, 6 Mar 2020 13:00:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="d+jiOdmO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C863C21D56 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=virtuozzo.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1jACaJ-0000Oh-RP; Fri, 06 Mar 2020 13:00:11 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1jACaI-0000Ob-Ex for xen-devel@lists.xenproject.org; Fri, 06 Mar 2020 13:00:10 +0000 X-Inumbo-ID: 675fe0f8-5faa-11ea-90c4-bc764e2007e4 Received: from EUR02-AM5-obe.outbound.protection.outlook.com (unknown [40.107.0.126]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 675fe0f8-5faa-11ea-90c4-bc764e2007e4; Fri, 06 Mar 2020 13:00:07 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hIQB3wgvpGFFtpQVITPUnfo+LdaBmCJD6l/5cvN7Wzc2ayVL8ijTmCkpnzkyDGrCo4MUGZH62ri+PCylHEpuimQSyEgeB2M+ugFxnjdO56b5C/7ry2vVyk5R8EgtllwIIJghWka5Ewh5b3iZ2+n9JA8WOMmGe0sY9eRkWrOKusV2TkM7dljSA72hsbhxw8otVpbJrYUJTj0BYIvd62J91lTeb+aQ9T8ayHUPLSYGFDfVW9s3fC7/WcmaYFWpC7bqVKHsvf/pERSM+vcLAE+H5lfyqbyP+jt3bQsGbUJ+0F15pPHmThEdWOgOFZg4483pvgynKG1pYbCBZDLArwVZCQ== 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=fYOTHtdyZJV+CMittP/gilw+4vDoPxL2uF1MWj6sgfI=; b=hPRYGv2fQTY/ZS+5+mYcHd1ZqWmGfQMyNHnItivlVJ4MjqGtJoF4RjyH81Cu2r+XFg7ElU0W3YnTAxNhL5tSkwXM8nKomTeFJ/TIdjW6/5tWDY+4szvubPCGSUmUfgT9P7lkFfcB696M4H2Lg0hhO+mbsy0bMh94K3yEdwEcpzoIkqFI7nG1NeCoeQaP4YAqA6rMW7NrBqx4uYgGV+tBVtgqt35dtUxv0IBul6JGYAaZiYfJ87DgNIjYCbcpLW7QReyE6QdbgpDid8WcmA/VQmrD1nO67UEfuBIhpmrdgf+6wVQXQdaTUt9+4o1IKG3GcNenKu8p4VpbKYZ/LxXOZg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fYOTHtdyZJV+CMittP/gilw+4vDoPxL2uF1MWj6sgfI=; b=d+jiOdmODS+odAbsRExvQ/Q2oeqXQLpRbN6JUmm/Ktfo5vv6l6t2LlXGQTil1yMxPUPOERMjk4IFNsMdaV5iNYGorTpsvqHigVL9UcfP3Sf9nK2OhdKmFi4sQPMwRjb35DUyfznjFx9zuUyCgzSKgACF8sTCHPqAv7EK8wQWx1g= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=vsementsov@virtuozzo.com; Received: from AM6PR08MB4423.eurprd08.prod.outlook.com (20.179.7.140) by AM6PR08MB3224.eurprd08.prod.outlook.com (52.135.164.141) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2750.22; Fri, 6 Mar 2020 13:00:03 +0000 Received: from AM6PR08MB4423.eurprd08.prod.outlook.com ([fe80::e05a:63af:818c:b664]) by AM6PR08MB4423.eurprd08.prod.outlook.com ([fe80::e05a:63af:818c:b664%4]) with mapi id 15.20.2793.013; Fri, 6 Mar 2020 13:00:03 +0000 To: Eric Blake , qemu-devel@nongnu.org References: <20200306051536.27803-1-vsementsov@virtuozzo.com> <20200306051536.27803-2-vsementsov@virtuozzo.com> <41229b66-eedb-1c30-4849-a8076080117e@redhat.com> From: Vladimir Sementsov-Ogievskiy X-Tagtoolbar-Keys: D20200306160000157 Message-ID: Date: Fri, 6 Mar 2020 16:00:00 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 In-Reply-To: <41229b66-eedb-1c30-4849-a8076080117e@redhat.com> Content-Language: en-US X-ClientProxiedBy: HE1PR05CA0275.eurprd05.prod.outlook.com (2603:10a6:3:fc::27) To AM6PR08MB4423.eurprd08.prod.outlook.com (2603:10a6:20b:bf::12) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [172.16.24.200] (185.231.240.5) by HE1PR05CA0275.eurprd05.prod.outlook.com (2603:10a6:3:fc::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2793.16 via Frontend Transport; Fri, 6 Mar 2020 13:00:01 +0000 X-Tagtoolbar-Keys: D20200306160000157 X-Originating-IP: [185.231.240.5] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e5ac340f-f01a-4ee2-2979-08d7c1ce490f X-MS-TrafficTypeDiagnostic: AM6PR08MB3224: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 0334223192 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(376002)(346002)(39850400004)(136003)(366004)(396003)(199004)(189003)(7416002)(6486002)(30864003)(36756003)(16576012)(478600001)(2906002)(316002)(86362001)(5660300002)(26005)(186003)(54906003)(31696002)(4326008)(8676002)(16526019)(956004)(66946007)(2616005)(81166006)(31686004)(53546011)(8936002)(66556008)(52116002)(66476007)(81156014); DIR:OUT; SFP:1102; SCL:1; SRVR:AM6PR08MB3224; H:AM6PR08MB4423.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZxARpEjWVuJyMP0SlU6+3eAEUz+S26X/QZI4gZaNc4eBaFBUfq4PcP7v/2pSqCdCQ38o9dY7DTjY+NKqa4Ps1JI+FGd4vDo0cyILoGcMd60edkdgd8A6Gc0CinlX9GQjHdZx6bmXRqEK77rxKw3Cj2X6AcLFbkDH/sN9OZa+nkOFPF0B0qiJe7FH5oCSUxiuJEXyBU/dUM1ToFEL3Yp+IkftS2XEsiKj+jZJQktnSWvSeyMwD7LOa+P88a49PTcEwLpC8oNb8JOleFO24lY37Bps/yf+1LRuyTYGy/odFZ8ev8EFSWaKdDzgVSv2px8ecPdeKE5x0Aj93XiHFsgzaf2cEKz8T6Apr6Zagpn5qvFjx2YuYldqUX5eRKILfDY2qKOg+gpgsyPn535GAwh02gidnKL0kuiMufbeJab3Jh7eK7kfnX61A3wemxRyFdCb X-MS-Exchange-AntiSpam-MessageData: R5aoPRSYdrObEamexYe06f0k/m0afCEpEZmEkytUhCX01Zf/fUnNxBM+jzYJ28iNoOXpbPUbpbzF0/V20TEWc7ZCjZwdMGmZFXB2q73c7S2P6f5D84Qf8O/GNPU6RdT/F3uJaD0p3MZ8DlFXzEfpXA== X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: e5ac340f-f01a-4ee2-2979-08d7c1ce490f X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2020 13:00:03.1547 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UPGtJyrspTHANjgED7CzmBIbMt23pRDW/ybhmtGEnMTjhva+OzDZ9zRlBDJ51/KrMLi0VWz/KJbZVbjbEETayCE2HkTlVN+0EmwHWUZTCK0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB3224 Subject: Re: [Xen-devel] [PATCH v8 01/10] error: auto propagated local_err X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Stefano Stabellini , Michael Roth , qemu-block@nongnu.org, Paul Durrant , Laszlo Ersek , Christian Schoenebeck , Greg Kurz , armbru@redhat.com, Gerd Hoffmann , Stefan Hajnoczi , Anthony Perard , xen-devel@lists.xenproject.org, Max Reitz , =?UTF-8?Q?Philippe_Mathieu-Daud=c3=a9?= , Stefan Berger Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" MDYuMDMuMjAyMCAxNTozNywgRXJpYyBCbGFrZSB3cm90ZToKPiBPbiAzLzUvMjAgMTE6MTUgUE0s IFZsYWRpbWlyIFNlbWVudHNvdi1PZ2lldnNraXkgd3JvdGU6Cj4+IEhlcmUgaXMgaW50cm9kdWNl ZCBFUlJQX0FVVE9fUFJPUEFHQVRFIG1hY3JvLCB0byBiZSB1c2VkIGF0IHN0YXJ0IG9mCj4+IGZ1 bmN0aW9ucyB3aXRoIGFuIGVycnAgT1VUIHBhcmFtZXRlci4KPiAKPiBBcyBhbiBhaWQgdG8gd3Jp dGluZyBpbXBlcmF0aXZlLXN0eWxlIGNvbW1pdCBtZXNzYWdlcywgSSBsaWtlIHRvIHByZXBlbmQg YW4gaW1wbGljaXQgIkFwcGx5IHRoaXMgcGF0Y2ggdG8uLi4iIGJlZm9yZSB0aGUgdXNlcidzIHRl eHQsIHRvIHNlZSBpZiB0aGluZ3Mgc3RpbGwgbWFrZSBzZW5zZS7CoCBCeSB0aGF0IGNvbnN0cnVj dCwgdGhpcyBwYXJhZ3JhcGggbWlnaHQgcmVhZCBiZXR0ZXIgYXM6Cj4gCj4gSW50cm9kdWNlIGEg bmV3IEVSUlBfQVVUT19QUk9QQUdBVEUgbWFjcm8sIC4uLgo+IAo+Pgo+PiBJdCBoYXMgdGhyZWUg Z29hbHM6Cj4+Cj4+IDEuIEZpeCBpc3N1ZSB3aXRoIGVycm9yX2ZhdGFsIGFuZCBlcnJvcl9wcmVw ZW5kL2Vycm9yX2FwcGVuZF9oaW50OiB1c2VyCj4+IGNhbid0IHNlZSB0aGlzIGFkZGl0aW9uYWwg aW5mb3JtYXRpb24sIGJlY2F1c2UgZXhpdCgpIGhhcHBlbnMgaW4KPj4gZXJyb3Jfc2V0ZyBlYXJs aWVyIHRoYW4gaW5mb3JtYXRpb24gaXMgYWRkZWQuIFtSZXBvcnRlZCBieSBHcmVnIEt1cnpdCj4+ Cj4+IDIuIEZpeCBpc3N1ZSB3aXRoIGVycm9yX2Fib3J0IGFuZCBlcnJvcl9wcm9wYWdhdGU6IHdo ZW4gd2Ugd3JhcAo+PiBlcnJvcl9hYm9ydCBieSBsb2NhbF9lcnIrZXJyb3JfcHJvcGFnYXRlLCB0 aGUgcmVzdWx0aW5nIGNvcmVkdW1wIHdpbGwKPj4gcmVmZXIgdG8gZXJyb3JfcHJvcGFnYXRlIGFu ZCBub3QgdG8gdGhlIHBsYWNlIHdoZXJlIGVycm9yIGhhcHBlbmVkLgo+PiAodGhlIG1hY3JvIGl0 c2VsZiBkb2Vzbid0IGZpeCB0aGUgaXNzdWUsIGJ1dCBpdCBhbGxvd3MgdXMgdG8gWzMuXSBkcm9w Cj4+IHRoZSBsb2NhbF9lcnIrZXJyb3JfcHJvcGFnYXRlIHBhdHRlcm4sIHdoaWNoIHdpbGwgZGVm aW5pdGVseSBmaXggdGhlCj4+IGlzc3VlKSBbUmVwb3J0ZWQgYnkgS2V2aW4gV29sZl0KPj4KPj4g My4gRHJvcCBsb2NhbF9lcnIrZXJyb3JfcHJvcGFnYXRlIHBhdHRlcm4sIHdoaWNoIGlzIHVzZWQg dG8gd29ya2Fyb3VuZAo+PiB2b2lkIGZ1bmN0aW9ucyB3aXRoIGVycnAgcGFyYW1ldGVyLCB3aGVu IGNhbGxlciB3YW50cyB0byBrbm93IHJlc3VsdGluZwo+PiBzdGF0dXMuIChOb3RlOiBhY3R1YWxs eSB0aGVzZSBmdW5jdGlvbnMgY291bGQgYmUgbWVyZWx5IHVwZGF0ZWQgdG8KPj4gcmV0dXJuIGlu dCBlcnJvciBjb2RlKS4KPj4KPj4gVG8gYWNoaWV2ZSB0aGVzZSBnb2FscywgbGF0ZXIgcGF0Y2hl cyB3aWxsIGFkZCBpbnZvY2F0aW9ucwo+PiBvZiB0aGlzIG1hY3JvIGF0IHRoZSBzdGFydCBvZiBm dW5jdGlvbnMgd2l0aCBlaXRoZXIgdXNlCj4+IGVycm9yX3ByZXBlbmQvZXJyb3JfYXBwZW5kX2hp bnQgKHNvbHZpbmcgMSkgb3Igd2hpY2ggdXNlCj4+IGxvY2FsX2VycitlcnJvcl9wcm9wYWdhdGUg dG8gY2hlY2sgZXJyb3JzLCBzd2l0Y2hpbmcgdGhvc2UKPj4gZnVuY3Rpb25zIHRvIHVzZSAqZXJy cCBpbnN0ZWFkIChzb2x2aW5nIDIgYW5kIDMpLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBWbGFkaW1p ciBTZW1lbnRzb3YtT2dpZXZza2l5IDx2c2VtZW50c292QHZpcnR1b3p6by5jb20+Cj4+IC0tLQo+ IAo+IEkgaGF2ZSBsb3RzIG9mIGdyYW1tYXIgc3VnZ2VzdGlvbnMgZm9yIHRoZSBjb21tZW50cyAo YW5kIEkga25vdyBNYXJrdXMgaXMgZ2VuZXJhbGx5IG9rYXkgZG9pbmcgd29yZGluZyB0d2Vha3Ms IHNvIGl0IG1heSBzdGlsbCBlbmQgdXAgZGlmZmVyZW50IHRoYW4gbXkgc3VnZ2VzdGlvbnMpOgo+ IAo+PiArKysgYi9pbmNsdWRlL3FhcGkvZXJyb3IuaAo+PiBAQCAtMTUsNiArMTUsOCBAQAo+PiDC oCAvKgo+PiDCoMKgICogRXJyb3IgcmVwb3J0aW5nIHN5c3RlbSBsb29zZWx5IHBhdHRlcm5lZCBh ZnRlciBHbGliJ3MgR0Vycm9yLgo+PiDCoMKgICoKPj4gKyAqID0gRGVhbCB3aXRoIEVycm9yIG9i amVjdCA9Cj4+ICsgKgo+PiDCoMKgICogQ3JlYXRlIGFuIGVycm9yOgo+PiDCoMKgICrCoMKgwqDC oCBlcnJvcl9zZXRnKCZlcnIsICJzaXR1YXRpb24gbm9ybWFsLCBhbGwgZm91bGVkIHVwIik7Cj4+ IMKgwqAgKgo+PiBAQCAtNDcsMjggKzQ5LDg4IEBACj4+IMKgwqAgKiByZXBvcnRpbmcgaXQgKHBy aW1hcmlseSB1c2VmdWwgaW4gdGVzdHN1aXRlcyk6Cj4+IMKgwqAgKsKgwqDCoMKgIGVycm9yX2Zy ZWVfb3JfYWJvcnQoJmVycik7Cj4+IMKgwqAgKgo+PiAtICogUGFzcyBhbiBleGlzdGluZyBlcnJv ciB0byB0aGUgY2FsbGVyOgo+PiAtICrCoMKgwqDCoCBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJy KTsKPj4gLSAqIHdoZXJlIEVycm9yICoqZXJycCBpcyBhIHBhcmFtZXRlciwgYnkgY29udmVudGlv biB0aGUgbGFzdCBvbmUuCj4+ICsgKiA9IERlYWwgd2l0aCBFcnJvciAqKiBmdW5jdGlvbiBwYXJh bWV0ZXIgPQo+PiDCoMKgICoKPj4gLSAqIFBhc3MgYW4gZXhpc3RpbmcgZXJyb3IgdG8gdGhlIGNh bGxlciB3aXRoIHRoZSBtZXNzYWdlIG1vZGlmaWVkOgo+PiAtICrCoMKgwqDCoCBlcnJvcl9wcm9w YWdhdGVfcHJlcGVuZChlcnJwLCBlcnIpOwo+PiArICogRnVuY3Rpb24gbWF5IHVzZSBlcnJvciBz eXN0ZW0gdG8gcmV0dXJuIGVycm9ycy4gSW4gdGhpcyBjYXNlIGZ1bmN0aW9uCj4+ICsgKiBkZWZp bmVzIEVycm9yICoqZXJycCBwYXJhbWV0ZXIsIHdoaWNoIHNob3VsZCBiZSB0aGUgbGFzdCBvbmUg KGV4Y2VwdCBmb3IKPj4gKyAqIGZ1bmN0aW9ucyB3aGljaCB2YXJpZGljIGFyZ3VtZW50IGxpc3Qp LCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZyBBUEk6Cj4gCj4gQSBmdW5jdGlvbiBtYXkgdXNlIHRo ZSBlcnJvciBzeXN0ZW0gdG8gcmV0dXJuIGVycm9ycy7CoCBJbiB0aGlzIGNhc2UsIHRoZSBmdW5j dGlvbiBkZWZpbmVzIGFuIEVycm9yICoqZXJycCBwYXJhbWV0ZXIsIGJ5IGNvbnZlbnRpb24gdGhl IGxhc3Qgb25lICh3aXRoIGV4Y2VwdGlvbnMgZm9yIGZ1bmN0aW9ucyB1c2luZyAuLi4gb3IgdmFf bGlzdCkuCj4gCj4+IMKgwqAgKgo+PiAtICogQXZvaWQKPj4gLSAqwqDCoMKgwqAgZXJyb3JfcHJv cGFnYXRlKGVycnAsIGVycik7Cj4+IC0gKsKgwqDCoMKgIGVycm9yX3ByZXBlbmQoZXJycCwgIkNv dWxkIG5vdCBmcm9ibmljYXRlICclcyc6ICIsIG5hbWUpOwo+PiAtICogYmVjYXVzZSB0aGlzIGZh aWxzIHRvIHByZXBlbmQgd2hlbiBAZXJycCBpcyAmZXJyb3JfZmF0YWwuCj4+ICsgKiBDYWxsZXIg bWF5IHBhc3MgYXMgZXJycDoKPiAKPiBUaGUgY2FsbGVyIG1heSB0aGVuIHBhc3MgaW4gdGhlIGZv bGxvd2luZyBlcnJwIHZhbHVlczoKPiAKPj4gKyAqIDEuICZlcnJvcl9hYm9ydAo+PiArICrCoMKg wqAgVGhpcyBtZWFucyBhYm9ydCBvbiBhbnkgZXJyb3IKPiAKPiBBbnkgZXJyb3Igd2lsbCByZXN1 bHQgaW4gYWJvcnQoKQo+IAo+PiArICogMi4gJmVycm9yX2ZhdGFsCj4+ICsgKsKgwqDCoCBFeGl0 IHdpdGggbm9uLXplcm8gcmV0dXJuIGNvZGUgb24gZXJyb3IKPiAKPiBBbnkgZXJyb3Igd2lsbCBy ZXN1bHQgaW4gZXhpdCgpIHdpdGggYSBub24temVybyBzdGF0dXMKPiAKPj4gKyAqIDMuIE5VTEwK Pj4gKyAqwqDCoMKgIElnbm9yZSBlcnJvcnMKPiAKPiBBbnkgZXJyb3Igd2lsbCBiZSBpZ25vcmVk Cj4gCj4+ICsgKiA0LiBBbm90aGVyIHZhbHVlCj4gCj4gNC4gVGhlIGFkZHJlc3Mgb2YgYSBOVUxM LWluaXRpYWxpemVkIEVycm9yICplcnIKPiAKPj4gKyAqwqDCoMKgIE9uIGVycm9yIGFsbG9jYXRl IGVycm9yIG9iamVjdCBhbmQgc2V0IGVycnAKPiAKPiBBbnkgZXJyb3Igd2lsbCBwb3B1bGF0ZSBl cnJwIHdpdGggYW4gZXJyb3Igb2JqZWN0Cj4gCj4+IMKgwqAgKgo+PiAtICogQ3JlYXRlIGEgbmV3 IGVycm9yIGFuZCBwYXNzIGl0IHRvIHRoZSBjYWxsZXI6Cj4+IC0gKsKgwqDCoMKgIGVycm9yX3Nl dGcoZXJycCwgInNpdHVhdGlvbiBub3JtYWwsIGFsbCBmb3VsZWQgdXAiKTsKPj4gKyAqIEVycm9y IEFQSSBmdW5jdGlvbnMgd2l0aCBFcnJvciAqKiAobGlrZSBlcnJvcl9zZXRnKSBhcmd1bWVudCBz dXBwb3J0cyB0aGVzZQo+PiArICogcnVsZXMsIHNvIHVzZXIgZnVuY3Rpb25zIGp1c3QgbmVlZCB0 byB1c2UgdGhlbSBhcHByb3ByaWF0ZWx5IChyZWFkIGJlbG93KS4KPiAKPiBUaGUgZm9sbG93aW5n IHJ1bGVzIHRoZW4gaW1wbGVtZW50IHRoZSBjb3JyZWN0IHNlbWFudGljcyBkZXNpcmVkIGJ5IHRo ZSBjYWxsZXIuCj4gCj4+IMKgwqAgKgo+PiAtICogQ2FsbCBhIGZ1bmN0aW9uIGFuZCByZWNlaXZl IGFuIGVycm9yIGZyb20gaXQ6Cj4+ICsgKiBTaW1wbGUgcGFzcyBlcnJvciB0byB0aGUgY2FsbGVy Ogo+IAo+IENyZWF0ZSBhIG5ldyBlcnJvciB0byBwYXNzIHRvIHRoZSBjYWxsZXI6Cj4gCj4+ICsg KsKgwqDCoMKgIGVycm9yX3NldGcoZXJycCwgIlNvbWUgZXJyb3IiKTsKPiAKPiBZb3UgbG9zdCB0 aGUgZnVuIHdvcmRpbmcgaW4gTWFya3VzJyBlYXJsaWVyIGV4YW1wbGUgKCJzaXR1YXRpb24gbm9y bWFsLCBhbGwgZm91bGVkIHVwIikuCj4gCj4+ICsgKgo+PiArICogU3ViY2FsbCBvZiBhbm90aGVy IGVycnAtYmFzZWQgZnVuY3Rpb24sIHBhc3NpbmcgdGhlIGVycm9yIHRvIHRoZSBjYWxsZXIKPj4g KyAqwqDCoMKgwqAgZiguLi4sIGVycnApOwo+IAo+IENhbGxpbmcgYW5vdGhlciBlcnJwLWJhc2Vk IGZ1bmN0aW9uOgo+IAo+PiArICoKPj4gKyAqID09IENoZWNraW5nIHN1Y2Nlc3Mgb2Ygc3ViY2Fs bCA9PQo+PiArICoKPj4gKyAqIElmIGZ1bmN0aW9uIHJldHVybnMgZXJyb3IgY29kZSBpbiBhZGRp dGlvbiB0byBlcnJwICh3aGljaCBpcyByZWNvbW1lbmRlZCksCj4gCj4gSWYgYSBmdW5jdGlvbiBy ZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyBhbiBlcnJvciBpbiBhZGRpdGlvbiB0byBzZXR0aW5n IGVycnAgKHdoaWNoIGlzIHJlY29tbWVuZGVkKSwgdGhlbgo+IAo+PiArICogeW91IGRvbid0IG5l ZWQgYW55IGFkZGl0aW9uYWwgY29kZSwganVzdCBkbzoKPj4gKyAqwqDCoMKgwqAgaW50IHJldCA9 IGYoLi4uLCBlcnJwKTsKPj4gKyAqwqDCoMKgwqAgaWYgKHJldCA8IDApIHsKPj4gKyAqwqDCoMKg wqDCoMKgwqDCoCAuLi4gaGFuZGxlIGVycm9yIC4uLgo+PiArICrCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiByZXQ7Cj4+ICsgKsKgwqDCoMKgIH0KPj4gKyAqCj4+ICsgKiBJZiBmdW5jdGlvbiByZXR1 cm5zIG5vdGhpbmcgKHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCBBUEkpIGFuZCB0aGUgb25seSB3 YXkKPj4gKyAqIHRvIGNoZWNrIHN1Y2Nlc3MgaXMgY2hlY2tpbmcgZXJycCwgd2UgbXVzdCBjYXJl IGFib3V0IGNhc2VzIFsxLTNdIGFib3ZlLiBXZQo+PiArICogbmVlZCB0byB1c2UgbWFjcm8gRVJS UF9BVVRPX1BST1BBR0FURSAoc2VlIGJlbG93IGZvciBkZXRhaWxzKSBsaWtlIHRoaXM6Cj4gCj4g SWYgYSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcgKG5vdCByZWNvbW1lbmRlZCBmb3IgbmV3IGNv ZGUpLCB0aGUgb25seSB3YXkgdG8gY2hlY2sgc3VjY2VzcyBpcyBieSBjb25zdWx0aW5nIGVycnA7 IGRvaW5nIHRoaXMgc2FmZWx5IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIEVSUlBfQVVUT19QUk9Q QUdBVEUgbWFjcm8sIGxpa2UgdGhpczoKPiAKPiAKPj4gKyAqCj4+ICsgKsKgwqDCoMKgIGludCBv dXJfZnVuYyguLi4sIEVycm9yICoqZXJycCkgewo+PiArICrCoMKgwqDCoMKgwqDCoMKgIEVSUlBf QVVUT19QUk9QQUdBVEUoKTsKPj4gKyAqwqDCoMKgwqDCoMKgwqDCoCAuLi4KPj4gKyAqwqDCoMKg wqDCoMKgwqDCoCBzdWJjYWxsKC4uLiwgZXJycCk7Cj4+ICsgKsKgwqDCoMKgwqDCoMKgwqAgaWYg KCplcnJwKSB7Cj4+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAuLi4KPj4gKyAqwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRVJSTk87Cj4gCj4gZG8gd2Ugd2FudCBFUlJOTyBj YXBpdGFsaXplZCBoZXJlPwoKSSB3cm90ZSBpdCBjYXBpdGFsaXplZCB0byBub3QgY29uZmxpY3Qg d2l0aCBlcnJubyB2YXJpYWJsZSwgdG8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgdGhpcyBpcyBqdXN0 IGEgcHNldWRvLWNvZGUuIEJ1dCB5ZXMsIGl0IGxvb2tzIHdlaXJkIGFueXdheS4KCldlIGNhbiB3 cml0ZSAtZXJybm8gaGVyZSwgb3IganVzdCAtRUlOVkFMIChJIGhvcGUsIG5vYmFkeSB3aWxsIHRo aW5nLCB0aGF0IEVJTlZBTCBzaG91bGQgYWx3YXlzIGJlIHVzZWQgOikKCj4gCj4+ICsgKsKgwqDC oMKgwqDCoMKgwqAgfQo+PiArICrCoMKgwqDCoMKgwqDCoMKgIC4uLgo+PiArICrCoMKgwqDCoCB9 Cj4+ICsgKgo+PiArICogRVJSUF9BVVRPX1BST1BBR0FURSBjYXJlcyBhYm91dCBFcnJvciAqKiBB UEksIHdyYXBzIG9yaWdpbmFsIGVycnAgaWYgbmVlZGVkLAo+PiArICogc28gdGhhdCBpdCBjYW4g YmUgc2FmZWx5IHVzZWQgKGluY2x1ZGluZyBkZXJlZmVyZW5jaW5nKSwgYW5kIGF1dG8tcHJvcGFn YXRlcwo+PiArICogZXJyb3IgdG8gb3JpZ2luYWwgZXJycCBvbiBmdW5jdGlvbiBlbmQuCj4gCj4g RVJSUF9BVVRPX1BST1BBR0FURSB0YWtlcyBjYXJlIG9mIHdyYXBwaW5nIHRoZSBvcmlnaW5hbCBl cnJwIGFzIG5lZWRlZCwgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgZnVuY3Rpb24gY2FuIGRpcmVj dGx5IHVzZSBlcnJwIChpbmNsdWRpbmcgZGVyZWZlcmVuY2luZyksIHdoZXJlIGFueSBlcnJvcnMg d2lsbCB0aGVuIGJlIHByb3BhZ2F0ZWQgb24gdG8gdGhlIG9yaWdpbmFsIGVycnAgd2hlbiBsZWF2 aW5nIHRoZSBmdW5jdGlvbi4KPiAKPj4gKyAqCj4+ICsgKiBJbiBzb21lIGNhc2VzLCB3ZSBuZWVk IHRvIGNoZWNrIHJlc3VsdCBvZiBzdWJjYWxsLCBidXQgZG8gbm90IHdhbnQgdG8KPj4gKyAqIHBy b3BhZ2F0ZSB0aGUgRXJyb3Igb2JqZWN0IHRvIG91ciBjYWxsZXIuIEluIHN1Y2ggY2FzZXMgd2Ug ZG9uJ3QgbmVlZAo+PiArICogRVJSUF9BVVRPX1BST1BBR0FURSwgYnV0IGp1c3QgYSBsb2NhbCBF cnJvciBvYmplY3Q6Cj4+ICsgKgo+PiArICogUmVjZWl2ZSBhbiBlcnJvciBhbmQgbm90IHBhc3Mg aXQ6Cj4+IMKgwqAgKsKgwqDCoMKgIEVycm9yICplcnIgPSBOVUxMOwo+PiAtICrCoMKgwqDCoCBm b28oYXJnLCAmZXJyKTsKPj4gKyAqwqDCoMKgwqAgc3ViY2FsbChhcmcsICZlcnIpOwo+PiDCoMKg ICrCoMKgwqDCoCBpZiAoZXJyKSB7Cj4+IMKgwqAgKsKgwqDCoMKgwqDCoMKgwqAgaGFuZGxlIHRo ZSBlcnJvci4uLgo+PiArICrCoMKgwqDCoMKgwqDCoMKgIGVycm9yX2ZyZWUoZXJyKTsKPj4gwqDC oCAqwqDCoMKgwqAgfQo+PiDCoMKgICoKPj4gKyAqIE5vdGUsIHRoYXQgYmVmb3JlIEVSUlBfQVVU T19QUk9QQUdBVEUgaW50cm9kdWN0aW9uIHRoZSBwYXR0ZXJuIGFib3ZlICh3aXRoCj4+ICsgKiBl cnJvcl9wcm9wYWdhdGUoKSBpbnN0ZWFkIG9mIGVycm9yX2ZyZWUoKSkgd2FzIHVzZWQgdG8gY2hl Y2sgYW5kIHBhc3MgZXJyb3IKPj4gKyAqIHRvIHRoZSBjYWxsZXIuIE5vdyB0aGlzIGlzIERFUFJF Q0FURUQqIChzZWUgYmVsb3cpLgo+IAo+IEhtbSAtIGlmIHdlIGJ1bGstY29udmVydCB0aGUgZW50 aXJlIHRyZWUsIHRoZW4gdGhlcmUgd29uJ3QgYmUgYW55IGRlcHJlY2F0ZWQgdXNlcyB0byBiZSB3 b3J0aCBkb2N1bWVudGluZy4KClllcywgSSB0aGluayB3ZSdsbCBkcm9wIGl0IGFmdGVyIGV2ZXJ5 dGhpbmcgaXMgY29udmVydGVkLgoKPsKgIEJ1dCBpZiB3ZSBkbyBrZWVwIHRoaXMgcGFyYWdyYXBo Ogo+IAo+IE5vdGUgdGhhdCBvbGRlciBjb2RlIHRoYXQgZGlkIG5vdCB1c2UgRVJSUF9BVVRPX1BS T1BBR0FURSB3b3VsZCBpbnN0ZWFkIG5lZWQgYSBsb2NhbCBFcnIgdmFyaWFibGUgYW5kIHRoZSB1 c2Ugb2YgZXJyb3JfcHJvcGFnYXRlKCkgdG8gcHJvcGVybHkgaGFuZGxlIGFsbCBwb3NzaWJsZSBj YWxsZXIgdmFsdWVzIG9mIGVycnAuCj4gCj4+ICsgKgo+PiArICogTm90ZSBhbHNvLCB0aGF0IGlm IHlvdSB3YW50IHRvIHVzZSBlcnJvcl9hcHBlbmRfaGludC9lcnJvcl9wcmVwZW5kIG9yIHRoZWly Cj4+ICsgKiB2YXJpYW50cywgeW91IG11c3QgdXNlIEVSUlBfQVVUT19QUk9QQUdBVEUgdG9vLiBP dGhlcndpc2UsIGluIGNhc2Ugb2YKPj4gKyAqIGVycm9yX2ZhdGFsLCB5b3UnbGwgbWlzcyB0aGUg Y2hhbmNlIHRvIGluc2VydCB5b3VyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KPj4gKyAqIGludG8g RXJyb3Igb2JqZWN0Lgo+IAo+IE5vdGUgdGhhdCBhbnkgZnVuY3Rpb24gdGhhdCB3YW50cyB0byBt b2RpZnkgYW4gZXJyb3Igb2JqZWN0LCBzdWNoIGFzIGJ5IGNhbGxpbmcgZXJyb3JfYXBwZW5kX2hp bnQgb3IgZXJyb3JfcHJlcGVuZCwgbXVzdCB1c2UgRVJSUF9BVVRPX1BST1BBR0FURSwgaW4gb3Jk ZXIgZm9yIGEgY2FsbGVyJ3MgdXNlIG9mICZlcnJvcl9mYXRhbCB0byBzZWUgdGhlIGFkZGl0aW9u YWwgaW5mb3JtYXRpb24uCj4gCj4+ICsgKgo+PiArICogSW4gcmFyZSBjYXNlcywgd2UgbmVlZCB0 byBwYXNzIGV4aXN0aW5nIEVycm9yIG9iamVjdCB0byB0aGUgY2FsbGVyIGJ5IGhhbmQ6Cj4+ICsg KsKgwqDCoMKgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBlcnIpOwo+PiArICoKPj4gKyAqIFBhc3Mg YW4gZXhpc3RpbmcgZXJyb3IgdG8gdGhlIGNhbGxlciB3aXRoIHRoZSBtZXNzYWdlIG1vZGlmaWVk Ogo+PiArICrCoMKgwqDCoCBlcnJvcl9wcm9wYWdhdGVfcHJlcGVuZChlcnJwLCBlcnIpOwo+PiAr ICoKPj4gKyAqCj4+IMKgwqAgKiBDYWxsIGEgZnVuY3Rpb24gaWdub3JpbmcgZXJyb3JzOgo+PiDC oMKgICrCoMKgwqDCoCBmb28oYXJnLCBOVUxMKTsKPj4gwqDCoCAqCj4+IEBAIC03OCwyNiArMTQw LDYgQEAKPj4gwqDCoCAqIENhbGwgYSBmdW5jdGlvbiB0cmVhdGluZyBlcnJvcnMgYXMgZmF0YWw6 Cj4+IMKgwqAgKsKgwqDCoMKgIGZvbyhhcmcsICZlcnJvcl9mYXRhbCk7Cj4+IMKgwqAgKgo+PiAt ICogUmVjZWl2ZSBhbiBlcnJvciBhbmQgcGFzcyBpdCBvbiB0byB0aGUgY2FsbGVyOgo+PiAtICrC oMKgwqDCoCBFcnJvciAqZXJyID0gTlVMTDsKPj4gLSAqwqDCoMKgwqAgZm9vKGFyZywgJmVycik7 Cj4+IC0gKsKgwqDCoMKgIGlmIChlcnIpIHsKPj4gLSAqwqDCoMKgwqDCoMKgwqDCoCBoYW5kbGUg dGhlIGVycm9yLi4uCj4+IC0gKsKgwqDCoMKgwqDCoMKgwqAgZXJyb3JfcHJvcGFnYXRlKGVycnAs IGVycik7Cj4+IC0gKsKgwqDCoMKgIH0KPj4gLSAqIHdoZXJlIEVycm9yICoqZXJycCBpcyBhIHBh cmFtZXRlciwgYnkgY29udmVudGlvbiB0aGUgbGFzdCBvbmUuCj4+IC0gKgo+PiAtICogRG8gKm5v dCogIm9wdGltaXplIiB0aGlzIHRvCj4+IC0gKsKgwqDCoMKgIGZvbyhhcmcsIGVycnApOwo+PiAt ICrCoMKgwqDCoCBpZiAoKmVycnApIHsgLy8gV1JPTkchCj4+IC0gKsKgwqDCoMKgwqDCoMKgwqAg aGFuZGxlIHRoZSBlcnJvci4uLgo+PiAtICrCoMKgwqDCoCB9Cj4+IC0gKiBiZWNhdXNlIGVycnAg bWF5IGJlIE5VTEwhCj4+IC0gKgo+PiAtICogQnV0IHdoZW4gYWxsIHlvdSBkbyB3aXRoIHRoZSBl cnJvciBpcyBwYXNzIGl0IG9uLCBwbGVhc2UgdXNlCj4+IC0gKsKgwqDCoMKgIGZvbyhhcmcsIGVy cnApOwo+PiAtICogZm9yIHJlYWRhYmlsaXR5Lgo+PiAtICoKPj4gwqDCoCAqIFJlY2VpdmUgYW5k IGFjY3VtdWxhdGUgbXVsdGlwbGUgZXJyb3JzIChmaXJzdCBvbmUgd2lucyk6Cj4+IMKgwqAgKsKg wqDCoMKgIEVycm9yICplcnIgPSBOVUxMLCAqbG9jYWxfZXJyID0gTlVMTDsKPj4gwqDCoCAqwqDC oMKgwqAgZm9vKGFyZywgJmVycik7Cj4+IEBAIC0xMTQsNiArMTU2LDYxIEBACj4+IMKgwqAgKsKg wqDCoMKgwqDCoMKgwqAgaGFuZGxlIHRoZSBlcnJvci4uLgo+PiDCoMKgICrCoMKgwqDCoCB9Cj4+ IMKgwqAgKiBiZWNhdXNlIHRoaXMgbWF5IHBhc3MgYSBub24tbnVsbCBlcnIgdG8gYmFyKCkuCj4+ ICsgKgo+PiArICogREVQUkVDQVRFRCoKPj4gKyAqCj4gCj4gQWdhaW4sIEknbSBub3Qgc3VyZSB3 ZSBuZWVkIHRoaXMgc2VjdGlvbiBpbiB0aGUgY29kZWJhc2UgaWYgd2UgZG8gYSBidWxrIGNvbnZl cnNpb24uwqAgQnV0IG1vdmluZyBpdCB0byB0aGUgY29tbWl0IG1lc3NhZ2UgaXMgc3RpbGwgdXNl ZnVsLgoKQ29udmVyc2lvbiBjYW4ndCBiZSBhdG9taWMgYW55d2F5LCB0aGVyZSB3b3VsZCBiZSBz ZXZlcmFsIHNlcmllcy4gQnV0IEknbSBub3QgYWdhaW5zdCBkcm9wcGluZyB0aGUgcGFyYWdyYXBo LCBzbywgaXQncyB1cCB0byBNYXJrdXMuCgo+IAo+PiArICogVGhlIGZvbGxvd2luZyBwYXR0ZXJu IG9mIHJlY2VpdmluZyBjaGVja2luZyBhbmQgcGFzc2luZyB0aGUgY2FsbGVyIG9mIHRoZQo+PiAr ICogZXJyb3IgYnkgaGFuZCBpcyBkZXByZWNhdGVkIG5vdzoKPiAKPiBUaGUgZm9sbG93aW5nIHBh dHRlcm4gb2YgcmVjZWl2aW5nLCBjaGVja2luZywgYW5kIHRoZW4gZm9yd2FyZGluZyBhbiBlcnJv ciB0byB0aGUgY2FsbGVyIGJ5IGhhbmQgaXMgbm93IGRlcHJlY2F0ZWQ6Cj4gCj4+ICsgKgo+PiAr ICrCoMKgwqDCoCBFcnJvciAqZXJyID0gTlVMTDsKPj4gKyAqwqDCoMKgwqAgZm9vKGFyZywgJmVy cik7Cj4+ICsgKsKgwqDCoMKgIGlmIChlcnIpIHsKPj4gKyAqwqDCoMKgwqDCoMKgwqDCoCBoYW5k bGUgdGhlIGVycm9yLi4uCj4+ICsgKsKgwqDCoMKgwqDCoMKgwqAgZXJyb3JfcHJvcGFnYXRlKGVy cnAsIGVycik7Cj4+ICsgKsKgwqDCoMKgIH0KPj4gKyAqCj4+ICsgKiBJbnN0ZWFkLCB1c2UgRVJS UF9BVVRPX1BST1BBR0FURSBtYWNybyAoZGVmaW5lZCBiZWxvdykuCj4gCj4gRHJvcCAiKGRlZmlu ZWQgYmVsb3cpIi4KPiAKPj4gKyAqCj4+ICsgKiBUaGUgb2xkIHBhdHRlcm4gaXMgZGVwcmVjYXRl ZCBiZWNhdXNlIG9mIHR3byB0aGluZ3M6Cj4+ICsgKgo+PiArICogMS4gSXNzdWUgd2l0aCBlcnJv cl9hYm9ydCBhbmQgZXJyb3JfcHJvcGFnYXRlOiB3aGVuIHdlIHdyYXAgZXJyb3JfYWJvcnQgYnkK Pj4gKyAqIGxvY2FsX2VycitlcnJvcl9wcm9wYWdhdGUsIHRoZSByZXN1bHRpbmcgY29yZWR1bXAg d2lsbCByZWZlciB0bwo+PiArICogZXJyb3JfcHJvcGFnYXRlIGFuZCBub3QgdG8gdGhlIHBsYWNl IHdoZXJlIGVycm9yIGhhcHBlbmVkLgo+PiArICoKPj4gKyAqIDIuIEEgbG90IG9mIGV4dHJhIGNv ZGUgb2YgdGhlIHNhbWUgcGF0dGVybgo+PiArICoKPj4gKyAqIEhvdyB0byB1cGRhdGUgb2xkIGNv ZGUgdG8gdXNlIEVSUlBfQVVUT19QUk9QQUdBVEU/Cj4+ICsgKgo+PiArICogQWxsIHlvdSBuZWVk IGlzIHRvIGFkZCBFUlJQX0FVVE9fUFJPUEFHQVRFKCkgaW52b2NhdGlvbiBhdCBmdW5jdGlvbiBz dGFydCwKPj4gKyAqIHRoYW4geW91IG1heSBzYWZlbHkgZGVyZWZlcmVuY2UgZXJycCB0byBjaGVj ayBlcnJvcnMgYW5kIGRvIG5vdCBuZWVkIGFueQo+PiArICogYWRkaXRpb25hbCBsb2NhbCBFcnJv ciB2YXJpYWJsZXMgb3IgY2FsbHMgdG8gZXJyb3JfcHJvcGFnYXRlKCkuCj4+ICsgKgo+PiArICog RXhhbXBsZToKPj4gKyAqCj4+ICsgKiBvbGQgY29kZQo+PiArICoKPj4gKyAqwqDCoMKgwqAgdm9p ZCBmbiguLi4sIEVycm9yICoqZXJycCkgewo+PiArICrCoMKgwqDCoMKgwqDCoMKgIEVycm9yICpl cnIgPSBOVUxMOwo+PiArICrCoMKgwqDCoMKgwqDCoMKgIGZvbyhhcmcsICZlcnIpOwo+PiArICrC oMKgwqDCoMKgwqDCoMKgIGlmIChlcnIpIHsKPj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGhhbmRsZSB0aGUgZXJyb3IuLi4KPj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVycm9y X3Byb3BhZ2F0ZShlcnJwLCBlcnIpOwo+PiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuOwo+PiArICrCoMKgwqDCoMKgwqDCoMKgIH0KPj4gKyAqwqDCoMKgwqDCoMKgwqDCoCAuLi4K Pj4gKyAqwqDCoMKgwqAgfQo+PiArICoKPj4gKyAqIHVwZGF0ZWQgY29kZQo+PiArICoKPj4gKyAq wqDCoMKgwqAgdm9pZCBmbiguLi4sIEVycm9yICoqZXJycCkgewo+PiArICrCoMKgwqDCoMKgwqDC oMKgIEVSUlBfQVVUT19QUk9QQUdBVEUoKTsKPj4gKyAqwqDCoMKgwqDCoMKgwqDCoCBmb28oYXJn LCBlcnJwKTsKPj4gKyAqwqDCoMKgwqDCoMKgwqDCoCBpZiAoKmVycnApIHsKPj4gKyAqwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGhhbmRsZSB0aGUgZXJyb3IuLi4KPj4gKyAqwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybjsKPj4gKyAqwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICsgKsKgwqDC oMKgwqDCoMKgwqAgLi4uCj4+ICsgKsKgwqDCoMKgIH0KPiAKPiBBZ2FpbiwgSSdtIHRoaW5raW5n IHRoZSBhYm92ZSBleGFtcGxlIGlzIG1vcmUgdXNlZnVsIGluIHRoZSBjb21taXQgbWVzc2FnZSBp bnN0ZWFkIG9mIHBlcm1hbmVudGx5IGluIHRoZSAuaCBmaWxlLgo+IAo+PiDCoMKgICovCj4+IMKg ICNpZm5kZWYgRVJST1JfSAo+PiBAQCAtMzIyLDYgKzQxOSw0NiBAQCB2b2lkIGVycm9yX3NldF9p bnRlcm5hbChFcnJvciAqKmVycnAsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIEVycm9yQ2xhc3MgZXJyX2NsYXNzLCBjb25zdCBjaGFyICpmbXQs IC4uLikKPj4gwqDCoMKgwqDCoCBHQ0NfRk1UX0FUVFIoNiwgNyk7Cj4+ICt0eXBlZGVmIHN0cnVj dCBFcnJvclByb3BhZ2F0b3Igewo+PiArwqDCoMKgIEVycm9yICpsb2NhbF9lcnI7Cj4+ICvCoMKg wqAgRXJyb3IgKiplcnJwOwo+PiArfSBFcnJvclByb3BhZ2F0b3I7Cj4+ICsKPj4gK3N0YXRpYyBp bmxpbmUgdm9pZCBlcnJvcl9wcm9wYWdhdG9yX2NsZWFudXAoRXJyb3JQcm9wYWdhdG9yICpwcm9w KQo+PiArewo+PiArwqDCoMKgIGVycm9yX3Byb3BhZ2F0ZShwcm9wLT5lcnJwLCBwcm9wLT5sb2Nh bF9lcnIpOwo+PiArfQo+PiArCj4+ICtHX0RFRklORV9BVVRPX0NMRUFOVVBfQ0xFQVJfRlVOQyhF cnJvclByb3BhZ2F0b3IsIGVycm9yX3Byb3BhZ2F0b3JfY2xlYW51cCk7Cj4+ICsKPj4gKy8qCj4+ ICsgKiBFUlJQX0FVVE9fUFJPUEFHQVRFCj4+ICsgKgo+PiArICogVGhpcyBtYWNybyBpcyBjcmVh dGVkIHRvIGJlIHRoZSBmaXJzdCBsaW5lIG9mIGEgZnVuY3Rpb24gd2hpY2ggdXNlCj4+ICsgKiBF cnJvciAqKmVycnAgcGFyYW1ldGVyIHRvIHJlcG9ydCBlcnJvci4gSXQncyBuZWVkZWQgb25seSBp biBjYXNlcyB3aGVyZSB3ZQo+PiArICogd2FudCB0byB1c2UgZXJyb3JfcHJlcGVuZCwgZXJyb3Jf YXBwZW5kX2hpbnQgb3IgZGVyZWZlcmVuY2UgKmVycnAuIEl0J3MKPj4gKyAqIHN0aWxsIHNhZmUg KGJ1dCB1c2VsZXNzKSBpbiBvdGhlciBjYXNlcy4KPiAKPiBUaGlzIG1hY3JvIGV4aXN0cyB0byBh c3Npc3Qgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgaW4gYSBmdW5jdGlvbiB3aGljaCB1c2Vz IGFuIEVycm9yICoqZXJycCBwYXJhbWV0ZXIuwqAgSXQgbXVzdCBiZSB1c2VkIGFzIHRoZSBmaXJz dCBsaW5lIG9mIGEgZnVuY3Rpb24gd2hpY2ggbW9kaWZpZXMgYW4gZXJyb3IgKHdpdGggZXJyb3Jf cHJlcGVuZCwgZXJyb3JfYXBwZW5kX2hpbnQsIG9yIHNpbWlsYXIpIG9yIHdoaWNoIHdhbnRzIHRv IGRlcmVmZXJlbmNlICplcnJwLsKgIEl0IGlzIHN0aWxsIHNhZmUgKGJ1dCB1c2VsZXNzKSB0byB1 c2UgaW4gb3RoZXIgZnVuY3Rpb25zLgo+IAo+PiArICoKPj4gKyAqIElmIGVycnAgaXMgTlVMTCBv ciBwb2ludHMgdG8gZXJyb3JfZmF0YWwsIGl0IGlzIHJld3JpdHRlbiB0byBwb2ludCB0byBhCj4+ ICsgKiBsb2NhbCBFcnJvciBvYmplY3QsIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSBwcm9w YWdhdGVkIHRvIHRoZSBvcmlnaW5hbAo+PiArICogZXJycCBvbiBmdW5jdGlvbiBleGl0IChzZWUg ZXJyb3JfcHJvcGFnYXRvcl9jbGVhbnVwKS4KPj4gKyAqCj4+ICsgKiBBZnRlciBpbnZvY2F0aW9u IG9mIHRoaXMgbWFjcm8gaXQgaXMgYWx3YXlzIHNhZmUgdG8gZGVyZWZlcmVuY2UgZXJycAo+PiAr ICogKGFzIGl0J3Mgbm90IE5VTEwgYW55bW9yZSkgYW5kIHRvIGFkZCBpbmZvcm1hdGlvbiBieSBl cnJvcl9wcmVwZW5kIG9yCj4+ICsgKiBlcnJvcl9hcHBlbmRfaGludCAoYXMsIGlmIGl0IHdhcyBl cnJvcl9mYXRhbCwgd2Ugc3dhcHBlZCBpdCB3aXRoIGEKPj4gKyAqIGxvY2FsX2Vycm9yIHRvIGJl IHByb3BhZ2F0ZWQgb24gY2xlYW51cCkuCj4+ICsgKgo+PiArICogTm90ZTogd2UgZG9uJ3Qgd3Jh cCB0aGUgZXJyb3JfYWJvcnQgY2FzZSwgYXMgd2Ugd2FudCByZXN1bHRpbmcgY29yZWR1bXAKPj4g KyAqIHRvIHBvaW50IHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgZXJyb3IgaGFwcGVuZWQsIG5vdCB0 byBlcnJvcl9wcm9wYWdhdGUuCj4+ICsgKi8KPj4gKyNkZWZpbmUgRVJSUF9BVVRPX1BST1BBR0FU RSgpIFwKPj4gK8KgwqDCoCBnX2F1dG8oRXJyb3JQcm9wYWdhdG9yKSBfYXV0b19lcnJwX3Byb3Ag PSB7LmVycnAgPSBlcnJwfTsgXAo+PiArwqDCoMKgIGRvIHsgXAo+PiArwqDCoMKgwqDCoMKgwqAg aWYgKCFlcnJwIHx8IGVycnAgPT0gJmVycm9yX2ZhdGFsKSB7IFwKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZXJycCA9ICZfYXV0b19lcnJwX3Byb3AubG9jYWxfZXJyOyBcCj4+ICvCoMKgwqDC oMKgwqDCoCB9IFwKPj4gK8KgwqDCoCB9IHdoaWxlICgwKQo+PiArCj4+IMKgIC8qCj4+IMKgwqAg KiBTcGVjaWFsIGVycm9yIGRlc3RpbmF0aW9uIHRvIGFib3J0IG9uIGVycm9yLgo+PiDCoMKgICog U2VlIGVycm9yX3NldGcoKSBhbmQgZXJyb3JfcHJvcGFnYXRlKCkgZm9yIGRldGFpbHMuCj4+Cj4g Cj4gVGhlIG1hY3JvIGl0c2VsZiBsb29rcyBjb3JyZWN0LiBJJ2xsIGxlYXZlIGl0IHVwIHRvIE1h cmt1cyBob3cgdG8gaGFuZGxlIHRoZSBjb21tZW50IHRleHQsIGJ1dCB5b3UgY2FuIGFkZDoKPiAK PiBSZXZpZXdlZC1ieTogRXJpYyBCbGFrZSA8ZWJsYWtlQHJlZGhhdC5jb20+Cj4gCgpUaGFua3Mg Zm9yIHJldmlld2luZyBhbmQgd29yZGluZyBzdWdnZXN0aW9ucywgYWxsIGxvb2tzIGdvb2QsIGFz IGFsd2F5cy4KCi0tIApCZXN0IHJlZ2FyZHMsClZsYWRpbWlyCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1k ZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21h aWxtYW4vbGlzdGluZm8veGVuLWRldmVs