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=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 CDF0BC10DCE for ; Fri, 13 Mar 2020 15:43:06 +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 901B1206E2 for ; Fri, 13 Mar 2020 15:43:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="NeEocphR" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 901B1206E2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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 1jCmSA-00073x-Ti; Fri, 13 Mar 2020 15:42:26 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1jCmS9-00073s-L5 for xen-devel@lists.xenproject.org; Fri, 13 Mar 2020 15:42:25 +0000 X-Inumbo-ID: 3bf8e56c-6541-11ea-b336-12813bfff9fa Received: from us-smtp-delivery-1.mimecast.com (unknown [207.211.31.120]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTP id 3bf8e56c-6541-11ea-b336-12813bfff9fa; Fri, 13 Mar 2020 15:42:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1584114144; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=94Sycfl330r1aCfTuhQe7zg0tmAQmY4ElXgjmDS9Yak=; b=NeEocphR1snKVPC7uLNBt+4G6GfhbbAjeHYHESXc51vtlHi1f+RSqopHaAnv+hNaOuzYhd saF8YGn1m51uNrZQ93tKiMjhv1qtyKdwEt40ekmkZp9A249+taZuqSH7wEXBjbxyTS5gnL dWB+Jb4UE3cIPHfUNLOOKc5Kedfz1g8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-421-3V_n4mVFPwaTBIlmXG0C7A-1; Fri, 13 Mar 2020 11:42:20 -0400 X-MC-Unique: 3V_n4mVFPwaTBIlmXG0C7A-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 26C198018A2; Fri, 13 Mar 2020 15:42:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-34.ams2.redhat.com [10.36.116.34]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0D61B388; Fri, 13 Mar 2020 15:42:11 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8E6C411386A6; Fri, 13 Mar 2020 16:42:09 +0100 (CET) From: Markus Armbruster To: Vladimir Sementsov-Ogievskiy References: <20200312085936.9552-1-vsementsov@virtuozzo.com> <20200312085936.9552-3-vsementsov@virtuozzo.com> <874kuto7hq.fsf@dusky.pond.sub.org> <4a70c6ee-10a2-fdc3-f8df-88c05340398b@virtuozzo.com> Date: Fri, 13 Mar 2020 16:42:09 +0100 In-Reply-To: <4a70c6ee-10a2-fdc3-f8df-88c05340398b@virtuozzo.com> (Vladimir Sementsov-Ogievskiy's message of "Fri, 13 Mar 2020 09:38:21 +0300") Message-ID: <875zf8gt2m.fsf@dusky.pond.sub.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: Re: [Xen-devel] [PATCH v9 02/10] scripts: Coccinelle script to use ERRP_AUTO_PROPAGATE() 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 , qemu-block@nongnu.org, Paul Durrant , Philippe =?utf-8?Q?Mathieu-Daud=C3=A9?= , Christian Schoenebeck , Michael Roth , qemu-devel@nongnu.org, Greg Kurz , Gerd Hoffmann , Stefan Hajnoczi , Anthony Perard , xen-devel@lists.xenproject.org, Max Reitz , Laszlo Ersek , Stefan Berger Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" VmxhZGltaXIgU2VtZW50c292LU9naWV2c2tpeSA8dnNlbWVudHNvdkB2aXJ0dW96em8uY29tPiB3 cml0ZXM6Cgo+IDEyLjAzLjIwMjAgMTk6MzYsIE1hcmt1cyBBcm1icnVzdGVyIHdyb3RlOgo+PiBJ IG1heSBoYXZlIGEgc2Vjb25kIGxvb2sgdG9tb3Jyb3cgd2l0aCBmcmVzaGVyIGV5ZXMsIGJ1dCBs ZXQncyBnZXQgdGhpcwo+PiBvdXQgbm93IGFzIGlzLgo+Pgo+PiBWbGFkaW1pciBTZW1lbnRzb3Yt T2dpZXZza2l5IDx2c2VtZW50c292QHZpcnR1b3p6by5jb20+IHdyaXRlczoKPj4KPj4+IFNjcmlw dCBhZGRzIEVSUlBfQVVUT19QUk9QQUdBVEUgbWFjcm8gaW52b2NhdGlvbiB3aGVyZSBhcHByb3By aWF0ZSBhbmQKPj4+IGRvZXMgY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluIGNvZGUgKGxvb2sgZm9y IGRldGFpbHMgaW4KPj4+IGluY2x1ZGUvcWFwaS9lcnJvci5oKQo+Pj4KPj4+IFVzYWdlIGV4YW1w bGU6Cj4+PiBzcGF0Y2ggLS1zcC1maWxlIHNjcmlwdHMvY29jY2luZWxsZS9hdXRvLXByb3BhZ2F0 ZWQtZXJycC5jb2NjaSBcCj4+PiAgIC0tbWFjcm8tZmlsZSBzY3JpcHRzL2NvY2NpLW1hY3JvLWZp bGUuaCAtLWluLXBsYWNlIC0tbm8tc2hvdy1kaWZmIFwKPj4+ICAgLS1tYXgtd2lkdGggODAgRklM RVMuLi4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBWbGFkaW1pciBTZW1lbnRzb3YtT2dpZXZza2l5 IDx2c2VtZW50c292QHZpcnR1b3p6by5jb20+Cj4+PiAtLS0KPj4+Cj4+PiBDYzogRXJpYyBCbGFr ZSA8ZWJsYWtlQHJlZGhhdC5jb20+Cj4+PiBDYzogS2V2aW4gV29sZiA8a3dvbGZAcmVkaGF0LmNv bT4KPj4+IENjOiBNYXggUmVpdHogPG1yZWl0ekByZWRoYXQuY29tPgo+Pj4gQ2M6IEdyZWcgS3Vy eiA8Z3JvdWdAa2FvZC5vcmc+Cj4+PiBDYzogQ2hyaXN0aWFuIFNjaG9lbmViZWNrIDxxZW11X29z c0BjcnVkZWJ5dGUuY29tPgo+Pj4gQ2M6IFN0ZWZhbm8gU3RhYmVsbGluaSA8c3N0YWJlbGxpbmlA a2VybmVsLm9yZz4KPj4+IENjOiBBbnRob255IFBlcmFyZCA8YW50aG9ueS5wZXJhcmRAY2l0cml4 LmNvbT4KPj4+IENjOiBQYXVsIER1cnJhbnQgPHBhdWxAeGVuLm9yZz4KPj4+IENjOiBTdGVmYW4g SGFqbm9jemkgPHN0ZWZhbmhhQHJlZGhhdC5jb20+Cj4+PiBDYzogIlBoaWxpcHBlIE1hdGhpZXUt RGF1ZMOpIiA8cGhpbG1kQHJlZGhhdC5jb20+Cj4+PiBDYzogTGFzemxvIEVyc2VrIDxsZXJzZWtA cmVkaGF0LmNvbT4KPj4+IENjOiBHZXJkIEhvZmZtYW5uIDxrcmF4ZWxAcmVkaGF0LmNvbT4KPj4+ IENjOiBTdGVmYW4gQmVyZ2VyIDxzdGVmYW5iQGxpbnV4LmlibS5jb20+Cj4+PiBDYzogTWFya3Vz IEFybWJydXN0ZXIgPGFybWJydUByZWRoYXQuY29tPgo+Pj4gQ2M6IE1pY2hhZWwgUm90aCA8bWRy b3RoQGxpbnV4LnZuZXQuaWJtLmNvbT4KPj4+IENjOiBxZW11LWRldmVsQG5vbmdudS5vcmcKPj4+ IENjOiBxZW11LWJsb2NrQG5vbmdudS5vcmcKPj4+IENjOiB4ZW4tZGV2ZWxAbGlzdHMueGVucHJv amVjdC5vcmcKPj4+Cj4+PiAgIHNjcmlwdHMvY29jY2luZWxsZS9hdXRvLXByb3BhZ2F0ZWQtZXJy cC5jb2NjaSB8IDMyNyArKysrKysrKysrKysrKysrKysKPj4+ICAgaW5jbHVkZS9xYXBpL2Vycm9y LmggICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAzICsKPj4+ICAgTUFJTlRBSU5FUlMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPj4+ICAgMyBmaWxlcyBjaGFu Z2VkLCAzMzEgaW5zZXJ0aW9ucygrKQo+Pj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgc2NyaXB0cy9j b2NjaW5lbGxlL2F1dG8tcHJvcGFnYXRlZC1lcnJwLmNvY2NpCj4+Pgo+Pj4gZGlmZiAtLWdpdCBh L3NjcmlwdHMvY29jY2luZWxsZS9hdXRvLXByb3BhZ2F0ZWQtZXJycC5jb2NjaSBiL3NjcmlwdHMv Y29jY2luZWxsZS9hdXRvLXByb3BhZ2F0ZWQtZXJycC5jb2NjaQo+Pj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPj4+IGluZGV4IDAwMDAwMDAwMDAuLjdkYWMyZGNmYTQKPj4+IC0tLSAvZGV2L251bGwK Pj4+ICsrKyBiL3NjcmlwdHMvY29jY2luZWxsZS9hdXRvLXByb3BhZ2F0ZWQtZXJycC5jb2NjaQo+ Pj4gQEAgLTAsMCArMSwzMjcgQEAKPj4+ICsvLyBVc2UgRVJSUF9BVVRPX1BST1BBR0FURSAoc2Vl IGluY2x1ZGUvcWFwaS9lcnJvci5oKQo+Pj4gKy8vCj4+PiArLy8gQ29weXJpZ2h0IChjKSAyMDIw IFZpcnR1b3p6byBJbnRlcm5hdGlvbmFsIEdtYkguCj4+PiArLy8KPj4+ICsvLyBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCj4+PiAr Ly8gbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMKPj4+ICsvLyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKPj4+ICsvLyBMaWNlbnNlLCBvciAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgo+Pj4gKy8vCj4+PiArLy8gVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+PiArLy8g YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKPj4+ICsvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCj4+PiArLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KPj4+ICsvLwo+Pj4gKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCj4+PiArLy8gYWxvbmcgd2l0 aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZQo+Pj4gKy8vIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4KPj4+ICsvLwo+Pj4gKy8vIFVzYWdlIGV4YW1wbGU6Cj4+PiArLy8gc3BhdGNo IC0tc3AtZmlsZSBzY3JpcHRzL2NvY2NpbmVsbGUvYXV0by1wcm9wYWdhdGVkLWVycnAuY29jY2kg XAo+Pj4gKy8vICAtLW1hY3JvLWZpbGUgc2NyaXB0cy9jb2NjaS1tYWNyby1maWxlLmggLS1pbi1w bGFjZSBcCj4+PiArLy8gIC0tbm8tc2hvdy1kaWZmIC0tbWF4LXdpZHRoIDgwIEZJTEVTLi4uCj4+ PiArLy8KPj4+ICsvLyBOb3RlOiAtLW1heC13aWR0aCA4MCBpcyBuZWVkZWQgYmVjYXVzZSBjb2Nj aW5lbGxlIGRlZmF1bHQgaXMgbGVzcwo+Pj4gKy8vIHRoYW4gODAsIGFuZCB3aXRob3V0IHRoaXMg cGFyYW1ldGVyIGNvY2NpbmVsbGUgbWF5IHJlaW5kZW50IHNvbWUKPj4+ICsvLyBsaW5lcyB3aGlj aCBmaXQgaW50byA4MCBjaGFyYWN0ZXJzIGJ1dCBub3QgdG8gY29jY2luZWxsZSBkZWZhdWx0LAo+ Pj4gKy8vIHdoaWNoIGluIHR1cm4gcHJvZHVjZXMgZXh0cmEgcGF0Y2ggaHVua3MgZm9yIG5vIHJl YXNvbi4KPj4KPj4gVGhpcyBpcyBhYm91dCB1bndhbnRlZCByZWZvcm1hdHRpbmcgb2YgcGFyYW1l dGVyIGxpc3RzIGR1ZSB0byB0aGUgX19fCj4+IGNoYWluaW5nIGhhY2suICAtLW1heC13aWR0aCA4 MCBtYWtlcyB0aGF0IGxlc3MgbGlrZWx5LCBidXQgbm90Cj4+IGltcG9zc2libGUuCj4+Cj4+IFdl IGNhbiBzZWFyY2ggZm9yIHVud2FudGVkIHJlZm9ybWF0dGluZyBvZiBwYXJhbWV0ZXIgbGlzdHMu ICBJIHRoaW5rCj4+IGdyZXBwaW5nIGRpZmZzIGZvciAnXlwrLipFcnJvciBcKlwqJyBzaG91bGQg ZG8gdGhlIHRyaWNrLiAgRm9yIHRoZSB3aG9sZQo+PiB0cmVlLCBJIGdldCBvbmUgZmFsc2UgcG9z aXRpdmUgKG5vdCBhIHBhcmFtZXRlciBsaXN0KSwgYW5kIG9uZSBoaXQ6Cj4+Cj4+ICAgICAgQEAg LTM4OCw4ICszODgsMTAgQEAgc3RhdGljIHZvaWQgb2JqZWN0X3Bvc3RfaW5pdF93aXRoX3R5cGUo Two+PiAgICAgICAgICAgfQo+PiAgICAgICB9Cj4+Cj4+ICAgICAgLXZvaWQgb2JqZWN0X2FwcGx5 X2dsb2JhbF9wcm9wcyhPYmplY3QgKm9iaiwgY29uc3QgR1B0ckFycmF5ICpwcm9wcywgRXJyb3Ig KiplcnJwKQo+PiAgICAgICt2b2lkIG9iamVjdF9hcHBseV9nbG9iYWxfcHJvcHMoT2JqZWN0ICpv YmosIGNvbnN0IEdQdHJBcnJheSAqcHJvcHMsCj4+ICAgICAgKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBFcnJvciAqKmVycnApCj4+ICAgICAgIHsKPj4gICAgICArICAgIEVSUlBfQVVU T19QUk9QQUdBVEUoKTsKPj4gICAgICAgICAgIGludCBpOwo+Pgo+PiAgICAgICAgICAgaWYgKCFw cm9wcykgewo+Pgo+PiBSZWZvcm1hdHRpbmcsIGJ1dCBub3QgdW53YW50ZWQuCj4KPiBZZXMsIEkg c2F3IGl0LiBUaGlzIGxpbmUgaXMgODEgY2hhcmFjdGVyIGxlbmd0aCwgc28gaXQncyBPSyB0byBm aXggaXQgaW4gb25lIGh1bmsgd2l0aAo+IEVSUlBfQVVUT19QUk9QQUdBVEUgYWRkaXRpb24gZXZl biBmb3Igbm9uLWF1dG9tYXRpYyBwYXRjaC4KCkFncmVlLgoKPj4KPj4gVGhlIC0tbWF4LXdpZHRo IDgwIGhhY2sgaXMgZ29vZCBlbm91Z2ggZm9yIG1lLgo+Pgo+PiBJdCBkb2VzIHJlc3VsdCBpbiBz bGlnaHRseSBsb25nIHRyYW5zZm9ybWVkIGxpbmVzLCBlLmcuIHRoaXMgb25lIGluCj4+IHJlcGxp Y2F0aW9uLmM6Cj4+Cj4+ICAgICAgQEAgLTExMyw3ICsxMTMsNyBAQCBzdGF0aWMgaW50IHJlcGxp Y2F0aW9uX29wZW4oQmxvY2tEcml2ZXJTCj4+ICAgICAgICAgICAgICAgcy0+bW9kZSA9IFJFUExJ Q0FUSU9OX01PREVfUFJJTUFSWTsKPj4gICAgICAgICAgICAgICB0b3BfaWQgPSBxZW11X29wdF9n ZXQob3B0cywgUkVQTElDQVRJT05fVE9QX0lEKTsKPj4gICAgICAgICAgICAgICBpZiAodG9wX2lk KSB7Cj4+ICAgICAgLSAgICAgICAgICAgIGVycm9yX3NldGcoJmxvY2FsX2VyciwgIlRoZSBwcmlt YXJ5IHNpZGUgZG9lcyBub3Qgc3VwcG9ydCBvcHRpb24gdG9wLWlkIik7Cj4+ICAgICAgKyAgICAg ICAgICAgIGVycm9yX3NldGcoZXJycCwgIlRoZSBwcmltYXJ5IHNpZGUgZG9lcyBub3Qgc3VwcG9y dCBvcHRpb24gdG9wLWlkIik7Cj4+ICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKPj4gICAg ICAgICAgICAgICB9Cj4+ICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgInNlY29u ZGFyeSIpKSB7Cj4+Cj4+IHY4IGRpZCBicmVhayB0aGlzIGxpbmUgKHRoYXQncyBob3cgSSBmb3Vu ZCBpdCkuICBIb3dldmVyLCB2OSBzdGlsbAo+PiBzaG9ydGVucyB0aGUgbGluZSwganVzdCBub3Qg YmVsb3cgdGhlIHRhcmdldC4gIEFsbCB5b3VyICsgbGluZXMgbG9vawo+PiBxdWl0ZSB1bmxpa2Vs eSB0byBsZW5ndGhlbiBsaW5lcy4gIExldCdzIG5vdCB3b3JyeSBhYm91dCB0aGlzLgo+Pgo+Pj4g Ky8vIFN3aXRjaCB1bnVzdWFsIEVycm9yICoqIHBhcmFtZXRlciBuYW1lcyB0byBlcnJwCj4+PiAr Ly8gKHRoaXMgaXMgbmVjZXNzYXJ5IHRvIHVzZSBFUlJQX0FVVE9fUFJPUEFHQVRFKS4KPj4+ICsv Lwo+Pj4gKy8vIERpc2FibGUgb3B0aW9uYWxfcXVhbGlmaWVyIHRvIHNraXAgZnVuY3Rpb25zIHdp dGgKPj4+ICsvLyAiRXJyb3IgKmNvbnN0ICplcnJwIiBwYXJhbWV0ZXIuCj4+PiArLy8KPj4+ICsv LyBTa2lwIGZ1bmN0aW9ucyB3aXRoICJhc3NlcnQoX2VycnAgJiYgKl9lcnJwKSIgc3RhdGVtZW50 LCBiZWNhdXNlCj4+PiArLy8gdGhhdCBzaWduYWxzIHVudXN1YWwgc2VtYW50aWNzLCBhbmQgdGhl IHBhcmFtZXRlciBuYW1lIG1heSB3ZWxsCj4+PiArLy8gc2VydmUgYSBwdXJwb3NlLiAobGlrZSBu YmRfaXRlcl9jaGFubmVsX2Vycm9yKCkpLgo+Pj4gKy8vCj4+PiArLy8gU2tpcCB1dGlsL2Vycm9y LmMgdG8gbm90IHRvdWNoLCBmb3IgZXhhbXBsZSwgZXJyb3JfcHJvcGFnYXRlKCkgYW5kCj4+PiAr Ly8gZXJyb3JfcHJvcGFnYXRlX3ByZXBlbmQoKS4KPj4+ICtAIGRlcGVuZHMgb24gIShmaWxlIGlu ICJ1dGlsL2Vycm9yLmMiKSBkaXNhYmxlIG9wdGlvbmFsX3F1YWxpZmllckAKPj4+ICtpZGVudGlm aWVyIGZuOwo+Pj4gK2lkZW50aWZpZXIgX2VycnAgIT0gZXJycDsKPj4+ICtAQAo+Pj4gKwo+Pj4g KyBmbiguLi4sCj4+PiArLSAgIEVycm9yICoqX2VycnAKPj4+ICsrICAgRXJyb3IgKiplcnJwCj4+ PiArICAgICwuLi4pCj4+PiArIHsKPj4+ICsoCj4+PiArICAgICAuLi4gd2hlbiAhPSBhc3NlcnQo X2VycnAgJiYgKl9lcnJwKQo+Pj4gKyYKPj4+ICsgICAgIDwuLi4KPj4+ICstICAgIF9lcnJwCj4+ PiArKyAgICBlcnJwCj4+PiArICAgICAuLi4+Cj4+PiArKQo+Pj4gKyB9Cj4+PiArCj4+PiArLy8g QWRkIGludm9jYXRpb24gb2YgRVJSUF9BVVRPX1BST1BBR0FURSB0byBlcnJwLWZ1bmN0aW9ucyB3 aGVyZQo+Pj4gKy8vIG5lY2Vzc2FyeQo+Pj4gKy8vCj4+PiArLy8gTm90ZSwgdGhhdCB3aXRob3V0 ICJ3aGVuIGFueSIgdGhlIGZpbmFsICIuLi4iIGRvZXMgbm90IG1hY2gKPj4+ICsvLyBzb21ldGhp bmcgbWF0Y2hlZCBieSBwcmV2aW91cyBwYXR0ZXJuLCBpLmUuIHRoZSBydWxlIHdpbGwgbm90IG1h dGNoCj4+PiArLy8gZG91YmxlIGVycm9yX3ByZXBlbmQgaW4gY29udHJvbCBmbG93IGxpa2UgaW4K Pj4+ICsvLyB2ZmlvX3NldF9pcnFfc2lnbmFsaW5nKCkuCj4+PiArLy8KPj4+ICsvLyBOb3RlLCAi ZXhpc3RzIiBzYXlzIHRoYXQgd2Ugd2FudCBhcHBseSBydWxlIGV2ZW4gaWYgaXQgbWF0Y2hlcyBu b3QKPj4+ICsvLyBvbiBhbGwgcG9zc2libGUgY29udHJvbCBmbG93cyAob3RoZXJ3aXNlLCBpdCB3 aWxsIG5vdCBtYXRjaAo+Pj4gKy8vIHN0YW5kYXJkIHBhdHRlcm4gd2hlbiBlcnJvcl9wcm9wYWdh dGUoKSBjYWxsIGlzIGluIGlmIGJyYW5jaCkuCj4+PiArQCBkaXNhYmxlIG9wdGlvbmFsX3F1YWxp ZmllciBleGlzdHNACj4+PiAraWRlbnRpZmllciBmbiwgbG9jYWxfZXJyOwo+Pj4gK3N5bWJvbCBl cnJwOwo+Pj4gK0BACj4+PiArCj4+PiArIGZuKC4uLiwgRXJyb3IgKiplcnJwLCAuLi4pCj4+PiAr IHsKPj4+ICsrICAgRVJSUF9BVVRPX1BST1BBR0FURSgpOwo+Pj4gKyAgICAuLi4gIHdoZW4gIT0g RVJSUF9BVVRPX1BST1BBR0FURSgpOwo+Pj4gKygKPj4+ICsoCj4+PiArICAgIGVycm9yX2FwcGVu ZF9oaW50KGVycnAsIC4uLik7Cj4+PiArfAo+Pj4gKyAgICBlcnJvcl9wcmVwZW5kKGVycnAsIC4u Lik7Cj4+PiArfAo+Pj4gKyAgICBlcnJvcl92cHJlcGVuZChlcnJwLCAuLi4pOwo+Pj4gKykKPj4+ ICsgICAgLi4uIHdoZW4gYW55Cj4+PiArfAo+Pj4gKyAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVM TDsKPj4+ICsgICAgLi4uCj4+PiArKAo+Pj4gKyAgICBlcnJvcl9wcm9wYWdhdGVfcHJlcGVuZChl cnJwLCBsb2NhbF9lcnIsIC4uLik7Cj4+PiArfAo+Pj4gKyAgICBlcnJvcl9wcm9wYWdhdGUoZXJy cCwgbG9jYWxfZXJyKTsKPj4+ICspCj4+PiArICAgIC4uLgo+Pj4gKykKPj4+ICsgfQo+Pj4gKwo+ Pj4gKwo+Pj4gKy8vIE1hdGNoIGZ1bmN0aW9ucyB3aXRoIHByb3BhZ2F0aW9uIG9mIGxvY2FsIGVy cm9yIHRvIGVycnAuCj4+PiArLy8gV2Ugd2FudCB0byByZWZlciB0aGVzZSBmdW5jdGlvbnMgaW4g c2V2ZXJhbCBmb2xsb3dpbmcgcnVsZXMsIGJ1dCBJCj4+PiArLy8gZG9uJ3Qga25vdyBhIHByb3Bl ciB3YXkgdG8gaW5oZXJpdCBhIGZ1bmN0aW9uLCBub3QganVzdCBpdHMgbmFtZQo+Pj4gKy8vICh0 byBub3QgbWF0Y2ggYW5vdGhlciBmdW5jdGlvbnMgd2l0aCBzYW1lIG5hbWUgaW4gZm9sbG93aW5n IHJ1bGVzKS4KPj4+ICsvLyBOb3QtcHJvcGVyIHdheSBpcyBhcyBmb2xsb3dzOiByZW5hbWUgZXJy cCBwYXJhbWV0ZXIgaW4gZnVuY3Rpb25zCj4+PiArLy8gaGVhZGVyIGFuZCBtYXRjaCBpdCBpbiBm b2xsb3dpbmcgcnVsZXMuIFJlbmFtZSBpdCBiYWNrIGFmdGVyIGFsbAo+Pj4gKy8vIHRyYW5zZm9y bWF0aW9ucy4KPj4+ICsvLwo+Pj4gKy8vIFRoZSBzaW1wbGVzdCBjYXNlIG9mIHByb3BhZ2F0aW9u IHNjaGVtZSBpcyBzaW5nbGUgZGVmaW5pdGlvbiBvZgo+Pj4gKy8vIGxvY2FsX2VyciB3aXRoIGF0 IG1vc3Qgb25lIGVycm9yX3Byb3BhZ2F0ZV9wcmVwZW5kIG9yCj4+PiArLy8gZXJyb3JfcHJvcGFn YXRlIG9uIGVhY2ggY29udHJvbC1mbG93LiBTdGlsbCwgd2Ugd2FudCB0byBtYXRjaCBtb3JlCj4+ PiArLy8gY29tcGxleCBzY2hlbWVzIHRvby4gV2UnbGwgd2FybiB0aGVtIHdpdGggaGVscCBvZiBm dXJ0aGVyIHJ1bGVzLgo+Pgo+PiBJIHRoaW5rIHdoYXQgd2UgYWN0dWFsbHkgd2FudCBpcyB0byBl eGFtaW5lIGluc3RhbmNlcyBvZiB0aGlzIHBhdHRlcm4gdG8KPj4gZmlndXJlIG91dCB3aGV0aGVy IGFuZCBob3cgd2Ugd2FudCB0byB0cmFuc2Zvcm0gdGhlbS4gIFBlcmhhcHM6Cj4+Cj4+ICAgICAg Ly8gVGhlIGNvbW1vbiBjYXNlIGlzIGEgc2luZ2xlIGRlZmluaXRpb24gb2YgbG9jYWxfZXJyIHdp dGggYXQgbW9zdCBvbmUKPj4gICAgICAvLyBlcnJvcl9wcm9wYWdhdGVfcHJlcGVuZCgpIG9yIGVy cm9yX3Byb3BhZ2F0ZSgpIG9uIGVhY2ggY29udHJvbC1mbG93Cj4+ICAgICAgLy8gcGF0aC4gSW5z dGFuY2VzIG9mIHRoaXMgY2FzZSB3ZSBjb252ZXJ0IHdpdGggdGhpcyBzY3JpcHQuIEZ1bmN0aW9u cwo+Cj4gRm9yIG1lLCBzb3VuZHMgYSBiaXQgbGlrZSAib3RoZXIgdGhpbmdzIHdlIGRvbid0IGNv bnZlcnQiLgo+IEFjdHVhbGx5IHdlIGNvbnZlcnQgb3RoZXIgdGhpbmdzIHRvby4KCldoYXQgb3Ro ZXIgcGF0dGVybnMgb2YgZXJyb3IgcHJvcGFnYXRpb24gZG8gd2UgY29udmVydD8KCj4+ICAgICAg Ly8gd2l0aCBtdWx0aXBsZSBkZWZpbml0aW9ucyBvciBwcm9wYWdhdGVzIHdlIHdhbnQgdG8gZXhh bWluZQo+PiAgICAgIC8vIG1hbnVhbGx5LiBMYXRlciBydWxlcyBlbWl0IHdhcm5pbmdzIHRvIGd1 aWRlIHVzIHRvIHRoZW0uCj4+Cj4+PiArQHJ1bGUxIGRpc2FibGUgb3B0aW9uYWxfcXVhbGlmaWVy IGV4aXN0c0AKPj4+ICtpZGVudGlmaWVyIGZuLCBsb2NhbF9lcnI7Cj4+PiArc3ltYm9sIGVycnA7 Cj4+PiArQEAKPj4+ICsKPj4+ICsgZm4oLi4uLCBFcnJvciAqKgo+Pj4gKy0gICAgZXJycAo+Pj4g KysgICAgX19fXwo+Pj4gKyAgICAsIC4uLikKPj4+ICsgewo+Pj4gKyAgICAgLi4uCj4+PiArICAg ICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDsKPj4+ICsgICAgIC4uLgo+Pj4gKygKPj4+ICsgICAg IGVycm9yX3Byb3BhZ2F0ZV9wcmVwZW5kKGVycnAsIGxvY2FsX2VyciwgLi4uKTsKPj4+ICt8Cj4+ PiArICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgbG9jYWxfZXJyKTsKPj4+ICspCj4+PiArICAg ICAuLi4KPj4+ICsgfQo+Pj4gKwo+Pj4gKwo+Pj4gKy8vIFdhcm4gc2V2ZXJhbCBFcnJvciAqIGRl ZmluaXRpb25zLgo+Pj4gK0BjaGVjazEgZGlzYWJsZSBvcHRpb25hbF9xdWFsaWZpZXIgZXhpc3Rz QAo+Pj4gK2lkZW50aWZpZXIgZm4gPSBydWxlMS5mbiwgbG9jYWxfZXJyLCBsb2NhbF9lcnIyOwo+ Pgo+PiBFbHNld2hlcmUsIHlvdSB1c2UganVzdCBydWxlLmZuIGluc3RlYWQgb2YgZm4gPSBydWxl MS5mbi4gIEFueQo+PiBwYXJ0aWN1bGFyIHJlYXNvbiBmb3IgdGhlIGRpZmZlcmVuY2U/Cj4KPiBJ IGRpZG4ndCBmaW5kIG90aGVyIHdheSB0byByZWYgY2hlY2sxLmZuIGluIG5leHQgcHl0aG9uIHJ1 bGUuIEl0IGp1c3QgZG9uJ3QKPiB3b3JrIGlmIEkgd3JpdGUgaGVyZSBqdXN0IHJ1bGUxLmZuLgo+ Cj4+Cj4+IFdpdGggdGhlIF9fXyBjaGFpbmluZyBoYWNrLCBJIGRvdWJ0IHdlIHN0aWxsIG5lZWQg Ij0gcnVsZTEuZm4iIG9yCj4+ICJydWxlMS5mbiIuICBJZiBJIHJlcGxhY2UgImZuID0gcnVsZTEu Zm4iIGFuZCAicnVsZS5mbiIgYnkganVzdCAiZm4iCj4+IGV2ZXJ5d2hlcmUsIHRoZW4gYXBwbHkg dGhlIHNjcmlwdCB0byB0aGUgY29tcGxldGUgdHJlZSwgSSBnZXQgdGhlIHNhbWUKPj4gcmVzdWx0 Lgo+Cj4gSSB0aGluaywgaXQncyBtb3JlIGVmZmljaWVudCB0byByZXVzZSBuYW1lcyBmcm9tIHBy ZXZpb3VzIHJ1bGVzLiBJIHRoaW5rIGl0IHNob3VsZAo+IHdvcmsgZmFzdGVyIChtb3JlIGluZm9y bWF0aW9uLCBsZXNzIGV4dHJhIG1hdGNoaW5nKS4KCk5vcGUuICBXaXRoIG15IGhhY2tlZCB1cCBz Y3JpcHQgKHBhdGNoIGFwcGVuZGVkKSBDb2NjaW5lbGxlIGlzIGFjdHVhbGx5CipmYXN0ZXIqIGZv ciB0aGUgLltjaF0gdG91Y2hlZCBieSB0aGlzIHNlcmllczogd2l0aCB5b3VyIHVubW9kaWZpZWQK c2NyaXB0LCBpdCB0YWtlcyBhIGJpdCBvdmVyIDEycyBvbiBteSBib3gsIHdpdGggbWluZSBhcm91 bmQgN3MuICBPdXRwdXQKaXMgaWRlbnRpY2FsLgoKTmV2ZXIgZ3Vlc3MgcGVyZm9ybWFuY2UsIGFs d2F5cyBtZWFzdXJlIGl0IDopCgpUd28gbm90ZXMgb24gbXkgc2NyaXB0OgoKKiBVbmxpa2UgeW91 cnMsIGl0IHJlY29nbml6ZXMgZG91YmxlLXByb3BhZ2F0aW9uIGluIG15IHRlc3QgY2FzZS4KICBE aXNjdXNzZWQgYmVsb3cuCgoqIEl0cyAic2V2ZXJhbCBkZWZpbml0aW9ucyBvZiIgd2FybmluZyBp bmNsdWRlcyBwb3NpdGlvbnMuICBUaGF0IHR1cm5lZAogIG91dCB0byBiZSB1c2VsZXNzLCBidXQg SSd2ZSBiZWVuIHRvbyBsYXp5IHRvIHRha2UgdGhhdCBvdXQgYWdhaW4uCgo+Pgo+Pj4gK0BACj4+ PiArCj4+PiArIGZuKC4uLiwgRXJyb3IgKiogX19fXywgLi4uKQo+Pj4gKyB7Cj4+PiArICAgICAu Li4KPj4+ICsgICAgIEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOwo+Pj4gKyAgICAgLi4uIHdoZW4g YW55Cj4+PiArICAgICBFcnJvciAqbG9jYWxfZXJyMiA9IE5VTEw7Cj4+PiArICAgICAuLi4gd2hl biBhbnkKPj4+ICsgfQo+Pj4gKwo+Pj4gK0Agc2NyaXB0OnB5dGhvbiBACj4+PiArZm4gPDwgY2hl Y2sxLmZuOwo+Pj4gK0BACj4+PiArCj4+PiArcHJpbnQoJ1dhcm5pbmc6IGZ1bmN0aW9uIHt9IGhh cyBzZXZlcmFsIGRlZmluaXRpb25zIG9mICcKPj4+ICsgICAgICAnRXJyb3IgKiBsb2NhbCB2YXJp YWJsZScuZm9ybWF0KGZuKSkKPj4+ICsKPj4+ICsvLyBXYXJuIHNldmVyYWwgcHJvcGFnYXRpb25z IGluIGNvbnRyb2wgZmxvdy4KPj4+ICtAY2hlY2syIGRpc2FibGUgb3B0aW9uYWxfcXVhbGlmaWVy IGV4aXN0c0AKPj4+ICtpZGVudGlmaWVyIGZuID0gcnVsZTEuZm47Cj4+PiArc3ltYm9sIGVycnA7 Cj4+PiArcG9zaXRpb24gcDEsIHAyOwo+Pj4gK0BACj4+PiArCj4+PiArIGZuKC4uLiwgRXJyb3Ig KiogX19fXywgLi4uKQo+Pj4gKyB7Cj4+PiArICAgICAuLi4KPj4+ICsoCj4+PiArICAgICBlcnJv cl9wcm9wYWdhdGVfcHJlcGVuZChlcnJwLCAuLi4pO0BwMQo+Pj4gK3wKPj4+ICsgICAgIGVycm9y X3Byb3BhZ2F0ZShlcnJwLCAuLi4pO0BwMQo+Pj4gKykKPj4+ICsgICAgIC4uLgo+Pj4gKygKPj4+ ICsgICAgIGVycm9yX3Byb3BhZ2F0ZV9wcmVwZW5kKGVycnAsIC4uLik7QHAyCj4+PiArfAo+Pj4g KyAgICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIC4uLik7QHAyCj4+PiArKQo+Pj4gKyAgICAgLi4u IHdoZW4gYW55Cj4+PiArIH0KPj4+ICsKPj4KPj4gSG1tLCB3ZSBkb24ndCBjYXRjaCB0aGUgZXhh bXBsZSBJIHVzZWQgaW4gcmV2aWV3IG9mIHY4Ogo+Pgo+PiAgICAgIGV4dGVybiBmb28oaW50LCBF cnJvciAqKik7Cj4+ICAgICAgZXh0ZXJuIGJhcihpbnQsIEVycm9yICoqKTsKPj4KPj4gICAgICB2 b2lkIGZyb2IoRXJyb3IgKiplcnJwKQo+PiAgICAgIHsKPj4gICAgICAgICAgRXJyb3IgKmxvY2Fs X2VyciA9IE5VTEw7Cj4+ICAgICAgICAgIGludCBhcmc7Cj4+Cj4+ICAgICAgICAgIGZvbyhhcmcs IGVycnApOwo+PiAgICAgICAgICBiYXIoYXJnLCAmbG9jYWxfZXJyKTsKPj4gICAgICAgICAgZXJy b3JfcHJvcGFnYXRlKGVycnAsIGxvY2FsX2Vycik7Cj4+ICAgICAgICAgIGJhcihhcmcgKyAxLCAm bG9jYWxfZXJyKTsKPj4gICAgICAgICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIGxvY2FsX2Vycik7 Cj4+ICAgICAgfQo+Pgo+PiBJIGJlbGlldmUgdGhpcyBpcyBiZWNhdXNlIHJ1bGUxIGRvZXMgbm90 IG1hdGNoIGhlcmUuCj4KPiBZZXMsIHJ1bGUxIHdhbnRzIGF0IGxlYXN0IG9uZSBjb2RlIGZsb3cg d2l0aCBub24tZG91YmxlZCBwcm9wYWdhdGlvbi4KPgo+Pgo+PiBJZiBJIGNoYW5nZSB0aGUgcnVs ZSBhcyBmb2xsb3dzLCBpdCBjYXRjaGVzIHRoZSBleGFtcGxlOgo+Pgo+PiAgICAgIEBAIC0xNTcs MjQgKzE1NywyMyBAQCBwcmludCgnV2FybmluZzogZnVuY3Rpb24ge30gaGFzIHNldmVyYWwgZGVm aW5pdGlvbnMgb2YgJwo+Pgo+PiAgICAgICAvLyBXYXJuIHNldmVyYWwgcHJvcGFnYXRpb25zIGlu IGNvbnRyb2wgZmxvdy4KPj4gICAgICAgQGNoZWNrMiBkaXNhYmxlIG9wdGlvbmFsX3F1YWxpZmll ciBleGlzdHNACj4+ICAgICAgLWlkZW50aWZpZXIgZm4gPSBydWxlMS5mbjsKPj4gICAgICAtc3lt Ym9sIGVycnA7Cj4+ICAgICAgK2lkZW50aWZpZXIgZm4sIF9lcnJwOwo+PiAgICAgICBwb3NpdGlv biBwMSwgcDI7Cj4+ICAgICAgIEBACj4+Cj4+ICAgICAgLSBmbiguLi4sIEVycm9yICoqIF9fX18s IC4uLikKPj4gICAgICArIGZuKC4uLiwgRXJyb3IgKipfZXJycCwgLi4uKQo+PiAgICAgICAgewo+ PiAgICAgICAgICAgIC4uLgo+PiAgICAgICAoCj4+ICAgICAgLSAgICAgZXJyb3JfcHJvcGFnYXRl X3ByZXBlbmQoZXJycCwgLi4uKTtAcDEKPj4gICAgICArICAgICBlcnJvcl9wcm9wYWdhdGVfcHJl cGVuZChfZXJycCwgLi4uKTtAcDEKPj4gICAgICAgfAo+PiAgICAgIC0gICAgIGVycm9yX3Byb3Bh Z2F0ZShlcnJwLCAuLi4pO0BwMQo+PiAgICAgICsgICAgIGVycm9yX3Byb3BhZ2F0ZShfZXJycCwg Li4uKTtAcDEKPj4gICAgICAgKQo+PiAgICAgICAgICAgIC4uLgo+PiAgICAgICAoCj4+ICAgICAg LSAgICAgZXJyb3JfcHJvcGFnYXRlX3ByZXBlbmQoZXJycCwgLi4uKTtAcDIKPj4gICAgICArICAg ICBlcnJvcl9wcm9wYWdhdGVfcHJlcGVuZChfZXJycCwgLi4uKTtAcDIKPj4gICAgICAgfAo+PiAg ICAgIC0gICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCAuLi4pO0BwMgo+PiAgICAgICsgICAgIGVy cm9yX3Byb3BhZ2F0ZShfZXJycCwgLi4uKTtAcDIKPj4gICAgICAgKQo+PiAgICAgICAgICAgIC4u LiB3aGVuIGFueQo+PiAgICAgICAgfQo+Pgo+PiBUbyBteSBtaWxkIHN1cnByaXNlLCBpdCBzdGls bCBkb2Vzbid0IGZpbmQgYW55dGhpbmcgaW4gb3VyIHRyZWUuCj4+Cj4+IFNob3VsZCB3ZSBkZWNv dXBsZSB0aGUgcHJldmlvdXMgcnVsZSBmcm9tIHJ1bGUxLCB0b28/ICBJIHRlc3RlZCB0aGUKPj4g Zm9sbG93aW5nIG9uIHRoZSB3aG9sZSB0cmVlOgo+Cj4gSSBkb24ndCB0aGluayBzby4gV2h5IHRv IGNoZWNrIHdoYXQgd2UgYXJlIG5vdCBnb2luZyB0byBjb252ZXJ0PyBJZiB3ZSB3YW50Cj4gdG8g Y2hlY2sgc2lkZSB0aGluZ3MsIGl0J3MgYmV0dGVyIHRvIGRvIGl0IGluIG90aGVyIGNvY2NpbmVs bGUgc2NyaXB0Li4KCk1pc3VuZGVyc3RhbmRpbmc/ICBUaGUgcnVsZXMgYXJlIHN0aWxsIGNoYWlu ZWQgdG9nZXRoZXIgdmlhIHRoZSBfX18KaGFjaywganVzdCBub3QgdmlhIGZ1bmN0aW9uIG5hbWUs IGJlY2F1c2UgdGhhdCdzIHVucmVsaWFibGUgYW5kCnJlZHVuZGFudC4KCj4+Cj4+ICAgICAgQEAg LTEzNiwxMCArMTM2LDEwIEBAIHN5bWJvbCBlcnJwOwo+Pgo+PiAgICAgICAvLyBXYXJuIHNldmVy YWwgRXJyb3IgKiBkZWZpbml0aW9ucy4KPj4gICAgICAgQGNoZWNrMSBkaXNhYmxlIG9wdGlvbmFs X3F1YWxpZmllciBleGlzdHNACj4+ICAgICAgLWlkZW50aWZpZXIgZm4gPSBydWxlMS5mbiwgbG9j YWxfZXJyLCBsb2NhbF9lcnIyOwo+PiAgICAgICtpZGVudGlmaWVyIGZuLCBfZXJycCwgbG9jYWxf ZXJyLCBsb2NhbF9lcnIyOwo+PiAgICAgICBAQAo+Pgo+PiAgICAgIC0gZm4oLi4uLCBFcnJvciAq KiBfX19fLCAuLi4pCj4+ICAgICAgKyBmbiguLi4sIEVycm9yICoqX2VycnAsIC4uLikKPj4gICAg ICAgIHsKPj4gICAgICAgICAgICAuLi4KPj4gICAgICAgICAgICBFcnJvciAqbG9jYWxfZXJyID0g TlVMTDsKPj4KPj4gV2FybmluZ3MgcmVtYWluIHVuY2hhbmdlZC4KPj4KPj4+ICtAIHNjcmlwdDpw eXRob24gQAo+Pj4gK2ZuIDw8IGNoZWNrMi5mbjsKPj4+ICtwMSA8PCBjaGVjazIucDE7Cj4+PiAr cDIgPDwgY2hlY2syLnAyOwo+Pj4gK0BACj4+PiArCj4+PiArcHJpbnQoJ1dhcm5pbmc6IGZ1bmN0 aW9uIHt9IHByb3BhZ2F0ZXMgdG8gZXJycCBzZXZlcmFsIHRpbWVzIGluICcKPj4+ICsgICAgICAn b25lIGNvbnRyb2wgZmxvdzogYXQge306e30gYW5kIHRoZW4gYXQge306e30nLmZvcm1hdCgKPj4+ ICsgICAgICAgICAgZm4sIHAxWzBdLmZpbGUsIHAxWzBdLmxpbmUsIHAyWzBdLmZpbGUsIHAyWzBd LmxpbmUpKQo+Pj4gKwo+Pj4gKy8vIENvbnZlcnQgc3BlY2lhbCBjYXNlIHdpdGggZ290byBzZXBh cmF0ZWx5Lgo+Pj4gKy8vIEkgdHJpZWQgbWVyZ2luZyB0aGlzIGludG8gdGhlIGZvbGxvd2luZyBy dWxlIHRoZSBvYnZpb3VzIHdheSwgYnV0Cj4+PiArLy8gaXQgbWFkZSBDb2NjaW5lbGxlIGhhbmcg b24gYmxvY2suYwo+Pj4gKy8vCj4+PiArLy8gTm90ZSBpbnRlcmVzdGluZyB0aGluZzogaWYgd2Ug ZG9uJ3QgZG8gaXQgaGVyZSwgYW5kIHRyeSB0byBmaXh1cAo+Pj4gKy8vICJvdXQ6IH0iIHRoaW5n cyBsYXRlciBhZnRlciBhbGwgdHJhbnNmb3JtYXRpb25zICh0aGUgcnVsZSB3aWxsIGJlCj4+PiAr Ly8gdGhlIHNhbWUsIGp1c3Qgd2l0aG91dCBlcnJvcl9wcm9wYWdhdGUoKSBjYWxsKSwgY29jY2lu ZWxsZSBmYWlscyB0bwo+Pj4gKy8vIG1hdGNoIHRoaXMgIm91dDogfSIuCj4+PiArQCBkaXNhYmxl IG9wdGlvbmFsX3F1YWxpZmllckAKPj4+ICtpZGVudGlmaWVyIHJ1bGUxLmZuLCBydWxlMS5sb2Nh bF9lcnIsIG91dDsKPj4KPj4gQXMgZXhwbGFpbmVkIGFib3ZlLCBJIGRvdWJ0IHRoZSBuZWVkIGZv ciBydWxlMS5mbi4gIFdlIGRvIG5lZWQKPj4gcnVsZTEubG9jYWxfZXJyIHRvIGF2b2lkIHVud2Fu dGVkIHRyYW5zZm9ybWF0aW9ucy4gIE1vcmUgb2YgdGhlIHNhbWUKPj4gYmVsb3cuCj4KPiBMb2dp Y2FsbHksIEkgd2FudCB0byBpbmhlcml0IGZyb20gcnVsZTEuIFNvIHdoeSBub3QgdG8gc3RyZXNz IGl0IGJ5IGluaGVyaXRpbmcKPiBmbiB2YXJpYWJsZT8gSXQncyBqdXN0IGEgY29ycmVjdCB0aGlu ZyB0byBkby4KPiBBbmQgSSBob3BlIGl0IGhlbHBzIGNvY2NpbmVsbGUgdG8gd29yayBtb3JlIGVm ZmljaWVudGx5Lgo+Cj4+Cj4+PiArc3ltYm9sIGVycnA7Cj4+PiArQEAKPj4+ICsKPj4+ICsgZm4o Li4uLCBFcnJvciAqKiBfX19fLCAuLi4pCj4+PiArIHsKPj4+ICsgICAgIDwuLi4KPj4+ICstICAg IGdvdG8gb3V0Owo+Pj4gKysgICAgcmV0dXJuOwo+Pj4gKyAgICAgLi4uPgo+Pj4gKy0gb3V0Ogo+ Pj4gKy0gICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIGxvY2FsX2Vycik7Cj4+PiArIH0KPj4+ICsK Pj4+ICsvLyBDb252ZXJ0IG1vc3Qgb2YgbG9jYWxfZXJyIHJlbGF0ZWQgc3R1ZmYuCj4+PiArLy8K Pj4+ICsvLyBOb3RlLCB0aGF0IHdlIHVwZGF0ZSBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gbWF0Y2hl ZCBieSBydWxlMQo+Pj4gKy8vIGZ1bmN0aW9uIG5hbWUgYW5kIGxvY2FsX2VyciBuYW1lLiBXZSBt YXkgbWF0Y2ggc29tZXRoaW5nIG5vdAo+Pj4gKy8vIHJlbGF0ZWQgdG8gdGhlIHBhdHRlcm4gbWF0 Y2hlZCBieSBydWxlMS4gRm9yIGV4YW1wbGUsIGxvY2FsX2VyciBtYXkKPj4+ICsvLyBiZSBkZWZp bmVkIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgYmxvY2tzIGluc2lkZSBvbmUKPj4+ ICsvLyBmdW5jdGlvbiwgYW5kIGluIG9uZSBibG9jayBmb2xsb3cgdGhlIHByb3BhZ2F0aW9uIHBh dHRlcm4gYW5kIGluCj4+PiArLy8gb3RoZXIgYmxvY2sgZG9lc24ndC4gT3Igd2UgbWF5IGhhdmUg c2V2ZXJhbCBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZQo+Pj4gKy8vIG5hbWUgKGZvciBkaWZmZXJl bnQgY29uZmlndXJhdGlvbnMpLgo+Pj4gKy8vCj4+PiArLy8gTm90ZSBhbHNvIHRoYXQgZXJycC1j bGVhbmluZyBmdW5jdGlvbnMKPj4+ICsvLyAgIGVycm9yX2ZyZWVfZXJycAo+Pj4gKy8vICAgZXJy b3JfcmVwb3J0X2VycnAKPj4+ICsvLyAgIGVycm9yX3JlcG9ydGZfZXJycAo+Pj4gKy8vICAgd2Fy bl9yZXBvcnRfZXJycAo+Pj4gKy8vICAgd2Fybl9yZXBvcnRmX2VycnAKPj4+ICsvLyBhcmUgbm90 IHlldCBpbXBsZW1lbnRlZC4gVGhleSBtdXN0IGNhbGwgY29ycmVzcG9uZGluZyBFcnJvciogLQo+ Pj4gKy8vIGZyZWVpbmcgZnVuY3Rpb24gYW5kIHRoZW4gc2V0ICplcnJwIHRvIE5VTEwsIHRvIGF2 b2lkIGZ1cnRoZXIKPj4+ICsvLyBwcm9wYWdhdGlvbiB0byBvcmlnaW5hbCBlcnJwIChjb25zaWRl ciBFUlJQX0FVVE9fUFJPUEFHQVRFIGluIHVzZSkuCj4+PiArLy8gRm9yIGV4YW1wbGUsIGVycm9y X2ZyZWVfZXJycCBtYXkgbG9vayBsaWtlIHRoaXM6Cj4+PiArLy8KPj4+ICsvLyAgICB2b2lkIGVy cm9yX2ZyZWVfZXJycChFcnJvciAqKmVycnApCj4+PiArLy8gICAgewo+Pj4gKy8vICAgICAgICBl cnJvcl9mcmVlKCplcnJwKTsKPj4+ICsvLyAgICAgICAgKmVycnAgPSBOVUxMOwo+Pj4gKy8vICAg IH0KPj4+ICtAIGRpc2FibGUgb3B0aW9uYWxfcXVhbGlmaWVyIGV4aXN0c0AKPj4+ICtpZGVudGlm aWVyIHJ1bGUxLmZuLCBydWxlMS5sb2NhbF9lcnI7Cj4+PiArZXhwcmVzc2lvbiBsaXN0IGFyZ3M7 Cj4+PiArc3ltYm9sIGVycnA7Cj4+PiArQEAKPj4+ICsKPj4+ICsgZm4oLi4uLCBFcnJvciAqKiBf X19fLCAuLi4pCj4+PiArIHsKPj4+ICsgICAgIDwuLi4KPj4+ICsoCj4+PiArLSAgICBFcnJvciAq bG9jYWxfZXJyID0gTlVMTDsKPj4+ICt8Cj4+PiArCj4+PiArLy8gQ29udmVydCBlcnJvciBjbGVh cmluZyBmdW5jdGlvbnMKPj4+ICsoCj4+PiArLSAgICBlcnJvcl9mcmVlKGxvY2FsX2Vycik7Cj4+ PiArKyAgICBlcnJvcl9mcmVlX2VycnAoZXJycCk7Cj4+PiArfAo+Pj4gKy0gICAgZXJyb3JfcmVw b3J0X2Vycihsb2NhbF9lcnIpOwo+Pj4gKysgICAgZXJyb3JfcmVwb3J0X2VycnAoZXJycCk7Cj4+ PiArfAo+Pj4gKy0gICAgZXJyb3JfcmVwb3J0Zl9lcnIobG9jYWxfZXJyLCBhcmdzKTsKPj4+ICsr ICAgIGVycm9yX3JlcG9ydGZfZXJycChlcnJwLCBhcmdzKTsKPj4+ICt8Cj4+PiArLSAgICB3YXJu X3JlcG9ydF9lcnIobG9jYWxfZXJyKTsKPj4+ICsrICAgIHdhcm5fcmVwb3J0X2VycnAoZXJycCk7 Cj4+PiArfAo+Pj4gKy0gICAgd2Fybl9yZXBvcnRmX2Vycihsb2NhbF9lcnIsIGFyZ3MpOwo+Pj4g KysgICAgd2Fybl9yZXBvcnRmX2VycnAoZXJycCwgYXJncyk7Cj4+PiArKQo+Pj4gKz8tICAgIGxv Y2FsX2VyciA9IE5VTEw7Cj4+PiArCj4+PiArfAo+Pj4gKy0gICAgZXJyb3JfcHJvcGFnYXRlX3By ZXBlbmQoZXJycCwgbG9jYWxfZXJyLCBhcmdzKTsKPj4+ICsrICAgIGVycm9yX3ByZXBlbmQoZXJy cCwgYXJncyk7Cj4+PiArfAo+Pj4gKy0gICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIGxvY2FsX2Vy cik7Cj4+PiArfAo+Pj4gKy0gICAgJmxvY2FsX2Vycgo+Pj4gKysgICAgZXJycAo+Pj4gKykKPj4+ ICsgICAgIC4uLj4KPj4+ICsgfQo+Pj4gKwo+Pj4gKy8vIENvbnZlcnQgcmVtYWluaW5nIGxvY2Fs X2VyciB1c2FnZS4gRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBraW5kcyBvZgo+Pj4gKy8vIGVycm9y IGNoZWNraW5nIGluIGlmIGNvbmRpdGlvbmFscy4gV2UgY2FuJ3QgbWVyZ2UgdGhpcyBpbnRvCj4+ PiArLy8gcHJldmlvdXMgaHVuaywgYXMgdGhpcyBjb25mbGljdHMgd2l0aCBvdGhlciBzdWJzdGl0 dXRpb25zIGluIGl0IChhdAo+Pj4gKy8vIGxlYXN0IHdpdGggIi0gbG9jYWxfZXJyID0gTlVMTCIp Lgo+Pj4gK0AgZGlzYWJsZSBvcHRpb25hbF9xdWFsaWZpZXJACj4+PiAraWRlbnRpZmllciBydWxl MS5mbiwgcnVsZTEubG9jYWxfZXJyOwo+Pj4gK3N5bWJvbCBlcnJwOwo+Pj4gK0BACj4+PiArCj4+ PiArIGZuKC4uLiwgRXJyb3IgKiogX19fXywgLi4uKQo+Pj4gKyB7Cj4+PiArICAgICA8Li4uCj4+ PiArLSAgICBsb2NhbF9lcnIKPj4+ICsrICAgICplcnJwCj4+PiArICAgICAuLi4+Cj4+PiArIH0K Pj4+ICsKPj4+ICsvLyBBbHdheXMgdXNlIHRoZSBzYW1lIHBhdHRlcm4gZm9yIGNoZWNraW5nIGVy cm9yCj4+PiArQCBkaXNhYmxlIG9wdGlvbmFsX3F1YWxpZmllckAKPj4+ICtpZGVudGlmaWVyIHJ1 bGUxLmZuOwo+Pj4gK3N5bWJvbCBlcnJwOwo+Pj4gK0BACj4+PiArCj4+PiArIGZuKC4uLiwgRXJy b3IgKiogX19fXywgLi4uKQo+Pj4gKyB7Cj4+PiArICAgICA8Li4uCj4+PiArLSAgICAqZXJycCAh PSBOVUxMCj4+PiArKyAgICAqZXJycAo+Pj4gKyAgICAgLi4uPgo+Pj4gKyB9Cj4+PiArCj4+PiAr Ly8gUmV2ZXJ0IHRlbXBvcmFyeSBfX18gaWRlbnRpZmllci4KPj4+ICtAIGRpc2FibGUgb3B0aW9u YWxfcXVhbGlmaWVyQAo+Pj4gK2lkZW50aWZpZXIgcnVsZTEuZm47Cj4+PiArQEAKPj4+ICsKPj4+ ICsgZm4oLi4uLCBFcnJvciAqKgo+Pj4gKy0gICBfX19fCj4+PiArKyAgIGVycnAKPj4+ICsgICAg LCAuLi4pCj4+PiArIHsKPj4+ICsgICAgIC4uLgo+Pj4gKyB9Cj4+PiBkaWZmIC0tZ2l0IGEvaW5j bHVkZS9xYXBpL2Vycm9yLmggYi9pbmNsdWRlL3FhcGkvZXJyb3IuaAo+Pj4gaW5kZXggMzAxNDBk OWJmZS4uNTZjMTMzNTIwZCAxMDA2NDQKPj4+IC0tLSBhL2luY2x1ZGUvcWFwaS9lcnJvci5oCj4+ PiArKysgYi9pbmNsdWRlL3FhcGkvZXJyb3IuaAo+Pj4gQEAgLTIxNCw2ICsyMTQsOSBAQAo+Pj4g ICAgKiAgICAgICAgIH0KPj4+ICAgICogICAgICAgICAuLi4KPj4+ICAgICogICAgIH0KPj4+ICsg Kgo+Pj4gKyAqIEZvciBtYXNzLWNvbnZlcnNpb24gdXNlIHNjcmlwdAo+Pj4gKyAqICAgc2NyaXB0 cy9jb2NjaW5lbGxlL2F1dG8tcHJvcGFnYXRlZC1lcnJwLmNvY2NpCj4+PiAgICAqLwo+Pj4gICAg ICNpZm5kZWYgRVJST1JfSAo+Pj4gZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5F UlMKPj4+IGluZGV4IDg1N2Y5NjlhYTEuLjA0N2YxYjk3MTQgMTAwNjQ0Cj4+PiAtLS0gYS9NQUlO VEFJTkVSUwo+Pj4gKysrIGIvTUFJTlRBSU5FUlMKPj4+IEBAIC0xOTk4LDYgKzE5OTgsNyBAQCBG OiBpbmNsdWRlL3FlbXUvZXJyb3ItcmVwb3J0LmgKPj4+ICAgRjogcWFwaS9lcnJvci5qc29uCj4+ PiAgIEY6IHV0aWwvZXJyb3IuYwo+Pj4gICBGOiB1dGlsL3FlbXUtZXJyb3IuYwo+Pj4gK0Y6IHNj cmlwdHMvY29jY2luZWxsZS8qZXJyKi5jb2NjaQo+Pj4gICAgIEdEQiBzdHViCj4+PiAgIE06IEFs ZXggQmVubsOpZSA8YWxleC5iZW5uZWVAbGluYXJvLm9yZz4KPj4KCgpGcm9tIDQyYTA4YzUyOTAy NDMzN2QxYjg1OTgzOWM5Y2U3Zjc5N2Y3ODQ1NTUgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCkZy b206IE1hcmt1cyBBcm1icnVzdGVyIDxhcm1icnVAcmVkaGF0LmNvbT4KRGF0ZTogRnJpLCAxMyBN YXIgMjAyMCAxNDoyNzo1NyArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIGZpeHVwISBzY3JpcHRzOiBD b2NjaW5lbGxlIHNjcmlwdCB0byB1c2UKIEVSUlBfQVVUT19QUk9QQUdBVEUoKQoKLS0tCiBzY3Jp cHRzL2NvY2NpbmVsbGUvYXV0by1wcm9wYWdhdGVkLWVycnAuY29jY2kgfCAzNyArKysrKysrKysr LS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjAgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb2NjaW5lbGxlL2F1dG8tcHJvcGFnYXRlZC1lcnJw LmNvY2NpIGIvc2NyaXB0cy9jb2NjaW5lbGxlL2F1dG8tcHJvcGFnYXRlZC1lcnJwLmNvY2NpCmlu ZGV4IDdkYWMyZGNmYTQuLjQzYjBiMGU2M2IgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvY29jY2luZWxs ZS9hdXRvLXByb3BhZ2F0ZWQtZXJycC5jb2NjaQorKysgYi9zY3JpcHRzL2NvY2NpbmVsbGUvYXV0 by1wcm9wYWdhdGVkLWVycnAuY29jY2kKQEAgLTEzNiw0NSArMTM2LDQ4IEBAIHN5bWJvbCBlcnJw OwogCiAvLyBXYXJuIHNldmVyYWwgRXJyb3IgKiBkZWZpbml0aW9ucy4KIEBjaGVjazEgZGlzYWJs ZSBvcHRpb25hbF9xdWFsaWZpZXIgZXhpc3RzQAotaWRlbnRpZmllciBmbiA9IHJ1bGUxLmZuLCBs b2NhbF9lcnIsIGxvY2FsX2VycjI7CitpZGVudGlmaWVyIGZuLCBfZXJycCwgbG9jYWxfZXJyLCBs b2NhbF9lcnIyOworcG9zaXRpb24gcDEsIHAyOwogQEAKIAotIGZuKC4uLiwgRXJyb3IgKiogX19f XywgLi4uKQorIGZuKC4uLiwgRXJyb3IgKipfZXJycCwgLi4uKQogIHsKICAgICAgLi4uCi0gICAg IEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOworICAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDtA cDEKICAgICAgLi4uIHdoZW4gYW55Ci0gICAgIEVycm9yICpsb2NhbF9lcnIyID0gTlVMTDsKKyAg ICAgRXJyb3IgKmxvY2FsX2VycjIgPSBOVUxMO0BwMgogICAgICAuLi4gd2hlbiBhbnkKICB9CiAK IEAgc2NyaXB0OnB5dGhvbiBACiBmbiA8PCBjaGVjazEuZm47CitwMSA8PCBjaGVjazEucDE7Citw MiA8PCBjaGVjazEucDI7CiBAQAogCiBwcmludCgnV2FybmluZzogZnVuY3Rpb24ge30gaGFzIHNl dmVyYWwgZGVmaW5pdGlvbnMgb2YgJwotICAgICAgJ0Vycm9yICogbG9jYWwgdmFyaWFibGUnLmZv cm1hdChmbikpCisgICAgICAnRXJyb3IgKiBsb2NhbCB2YXJpYWJsZTogYXQge306e30gYW5kIHRo ZW4gYXQge306e30nLmZvcm1hdCgKKyAgICAgICAgICBmbiwgcDFbMF0uZmlsZSwgcDFbMF0ubGlu ZSwgcDJbMF0uZmlsZSwgcDJbMF0ubGluZSkpCiAKIC8vIFdhcm4gc2V2ZXJhbCBwcm9wYWdhdGlv bnMgaW4gY29udHJvbCBmbG93LgogQGNoZWNrMiBkaXNhYmxlIG9wdGlvbmFsX3F1YWxpZmllciBl eGlzdHNACi1pZGVudGlmaWVyIGZuID0gcnVsZTEuZm47Ci1zeW1ib2wgZXJycDsKK2lkZW50aWZp ZXIgZm4sIF9lcnJwOwogcG9zaXRpb24gcDEsIHAyOwogQEAKIAotIGZuKC4uLiwgRXJyb3IgKiog X19fXywgLi4uKQorIGZuKC4uLiwgRXJyb3IgKipfZXJycCwgLi4uKQogIHsKICAgICAgLi4uCiAo Ci0gICAgIGVycm9yX3Byb3BhZ2F0ZV9wcmVwZW5kKGVycnAsIC4uLik7QHAxCisgICAgIGVycm9y X3Byb3BhZ2F0ZV9wcmVwZW5kKF9lcnJwLCAuLi4pO0BwMQogfAotICAgICBlcnJvcl9wcm9wYWdh dGUoZXJycCwgLi4uKTtAcDEKKyAgICAgZXJyb3JfcHJvcGFnYXRlKF9lcnJwLCAuLi4pO0BwMQog KQogICAgICAuLi4KICgKLSAgICAgZXJyb3JfcHJvcGFnYXRlX3ByZXBlbmQoZXJycCwgLi4uKTtA cDIKKyAgICAgZXJyb3JfcHJvcGFnYXRlX3ByZXBlbmQoX2VycnAsIC4uLik7QHAyCiB8Ci0gICAg IGVycm9yX3Byb3BhZ2F0ZShlcnJwLCAuLi4pO0BwMgorICAgICBlcnJvcl9wcm9wYWdhdGUoX2Vy cnAsIC4uLik7QHAyCiApCiAgICAgIC4uLiB3aGVuIGFueQogIH0KQEAgLTE5OCw3ICsyMDEsNyBA QCBwcmludCgnV2FybmluZzogZnVuY3Rpb24ge30gcHJvcGFnYXRlcyB0byBlcnJwIHNldmVyYWwg dGltZXMgaW4gJwogLy8gdGhlIHNhbWUsIGp1c3Qgd2l0aG91dCBlcnJvcl9wcm9wYWdhdGUoKSBj YWxsKSwgY29jY2luZWxsZSBmYWlscyB0bwogLy8gbWF0Y2ggdGhpcyAib3V0OiB9Ii4KIEAgZGlz YWJsZSBvcHRpb25hbF9xdWFsaWZpZXJACi1pZGVudGlmaWVyIHJ1bGUxLmZuLCBydWxlMS5sb2Nh bF9lcnIsIG91dDsKK2lkZW50aWZpZXIgZm4sIHJ1bGUxLmxvY2FsX2Vyciwgb3V0Owogc3ltYm9s IGVycnA7CiBAQAogCkBAIC0yMzksNyArMjQyLDcgQEAgc3ltYm9sIGVycnA7CiAvLyAgICAgICAg KmVycnAgPSBOVUxMOwogLy8gICAgfQogQCBkaXNhYmxlIG9wdGlvbmFsX3F1YWxpZmllciBleGlz dHNACi1pZGVudGlmaWVyIHJ1bGUxLmZuLCBydWxlMS5sb2NhbF9lcnI7CitpZGVudGlmaWVyIGZu LCBydWxlMS5sb2NhbF9lcnI7CiBleHByZXNzaW9uIGxpc3QgYXJnczsKIHN5bWJvbCBlcnJwOwog QEAKQEAgLTI4Nyw3ICsyOTAsNyBAQCBzeW1ib2wgZXJycDsKIC8vIHByZXZpb3VzIGh1bmssIGFz IHRoaXMgY29uZmxpY3RzIHdpdGggb3RoZXIgc3Vic3RpdHV0aW9ucyBpbiBpdCAoYXQKIC8vIGxl YXN0IHdpdGggIi0gbG9jYWxfZXJyID0gTlVMTCIpLgogQCBkaXNhYmxlIG9wdGlvbmFsX3F1YWxp ZmllckAKLWlkZW50aWZpZXIgcnVsZTEuZm4sIHJ1bGUxLmxvY2FsX2VycjsKK2lkZW50aWZpZXIg Zm4sIHJ1bGUxLmxvY2FsX2VycjsKIHN5bWJvbCBlcnJwOwogQEAKIApAQCAtMzAxLDcgKzMwNCw3 IEBAIHN5bWJvbCBlcnJwOwogCiAvLyBBbHdheXMgdXNlIHRoZSBzYW1lIHBhdHRlcm4gZm9yIGNo ZWNraW5nIGVycm9yCiBAIGRpc2FibGUgb3B0aW9uYWxfcXVhbGlmaWVyQAotaWRlbnRpZmllciBy dWxlMS5mbjsKK2lkZW50aWZpZXIgZm47CiBzeW1ib2wgZXJycDsKIEBACiAKQEAgLTMxNSw3ICsz MTgsNyBAQCBzeW1ib2wgZXJycDsKIAogLy8gUmV2ZXJ0IHRlbXBvcmFyeSBfX18gaWRlbnRpZmll ci4KIEAgZGlzYWJsZSBvcHRpb25hbF9xdWFsaWZpZXJACi1pZGVudGlmaWVyIHJ1bGUxLmZuOwor aWRlbnRpZmllciBmbjsKIEBACiAKICBmbiguLi4sIEVycm9yICoqCi0tIAoyLjIxLjEKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFp bGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhl bnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRldmVs 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=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 71F7BC2BB1D for ; Fri, 13 Mar 2020 15:43:33 +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 2BDAD206E2 for ; Fri, 13 Mar 2020 15:43:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="d5WT5Tyg" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2BDAD206E2 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:33086 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jCmTE-0005er-8r for qemu-devel@archiver.kernel.org; Fri, 13 Mar 2020 11:43:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45904) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jCmSC-0004Z2-Eo for qemu-devel@nongnu.org; Fri, 13 Mar 2020 11:42:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jCmS8-0007V4-SO for qemu-devel@nongnu.org; Fri, 13 Mar 2020 11:42:27 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:44271 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jCmS8-0007Sh-Kg for qemu-devel@nongnu.org; Fri, 13 Mar 2020 11:42:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1584114143; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=94Sycfl330r1aCfTuhQe7zg0tmAQmY4ElXgjmDS9Yak=; b=d5WT5TygC+/zrmgEQSQXdaQkc2vuZ4AwOqTdpI/gvLLtOfdAxqJjGY6ZlhkdUZkH7iusrD LTDJHccwFFtPIVavBA0ggVKUTpWlhGXaTtt1SiR2XTk/R8TkDpMbTcqa2S8TCvQ9mqrdtR Hz9GvHaypFidLrBV2c9uLkWw7iEevNk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-421-3V_n4mVFPwaTBIlmXG0C7A-1; Fri, 13 Mar 2020 11:42:20 -0400 X-MC-Unique: 3V_n4mVFPwaTBIlmXG0C7A-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 26C198018A2; Fri, 13 Mar 2020 15:42:18 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-116-34.ams2.redhat.com [10.36.116.34]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0D61B388; Fri, 13 Mar 2020 15:42:11 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 8E6C411386A6; Fri, 13 Mar 2020 16:42:09 +0100 (CET) From: Markus Armbruster To: Vladimir Sementsov-Ogievskiy Subject: Re: [PATCH v9 02/10] scripts: Coccinelle script to use ERRP_AUTO_PROPAGATE() References: <20200312085936.9552-1-vsementsov@virtuozzo.com> <20200312085936.9552-3-vsementsov@virtuozzo.com> <874kuto7hq.fsf@dusky.pond.sub.org> <4a70c6ee-10a2-fdc3-f8df-88c05340398b@virtuozzo.com> Date: Fri, 13 Mar 2020 16:42:09 +0100 In-Reply-To: <4a70c6ee-10a2-fdc3-f8df-88c05340398b@virtuozzo.com> (Vladimir Sementsov-Ogievskiy's message of "Fri, 13 Mar 2020 09:38:21 +0300") Message-ID: <875zf8gt2m.fsf@dusky.pond.sub.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 207.211.31.120 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 , qemu-block@nongnu.org, Paul Durrant , Philippe =?utf-8?Q?Mathieu-Daud=C3=A9?= , Christian Schoenebeck , Michael Roth , qemu-devel@nongnu.org, Greg Kurz , Gerd Hoffmann , Stefan Hajnoczi , Anthony Perard , xen-devel@lists.xenproject.org, Max Reitz , Laszlo Ersek , Stefan Berger Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Vladimir Sementsov-Ogievskiy writes: > 12.03.2020 19:36, Markus Armbruster wrote: >> I may have a second look tomorrow with fresher eyes, but let's get this >> out now as is. >> >> Vladimir Sementsov-Ogievskiy writes: >> >>> Script adds ERRP_AUTO_PROPAGATE macro invocation where appropriate and >>> does corresponding changes in code (look for details in >>> include/qapi/error.h) >>> >>> Usage example: >>> spatch --sp-file scripts/coccinelle/auto-propagated-errp.cocci \ >>> --macro-file scripts/cocci-macro-file.h --in-place --no-show-diff \ >>> --max-width 80 FILES... >>> >>> Signed-off-by: Vladimir Sementsov-Ogievskiy >>> --- >>> >>> Cc: Eric Blake >>> Cc: Kevin Wolf >>> Cc: Max Reitz >>> Cc: Greg Kurz >>> Cc: Christian Schoenebeck >>> Cc: Stefano Stabellini >>> Cc: Anthony Perard >>> Cc: Paul Durrant >>> Cc: Stefan Hajnoczi >>> Cc: "Philippe Mathieu-Daud=C3=A9" >>> Cc: Laszlo Ersek >>> Cc: Gerd Hoffmann >>> Cc: Stefan Berger >>> Cc: Markus Armbruster >>> Cc: Michael Roth >>> Cc: qemu-devel@nongnu.org >>> Cc: qemu-block@nongnu.org >>> Cc: xen-devel@lists.xenproject.org >>> >>> scripts/coccinelle/auto-propagated-errp.cocci | 327 +++++++++++++++++= + >>> include/qapi/error.h | 3 + >>> MAINTAINERS | 1 + >>> 3 files changed, 331 insertions(+) >>> create mode 100644 scripts/coccinelle/auto-propagated-errp.cocci >>> >>> diff --git a/scripts/coccinelle/auto-propagated-errp.cocci b/scripts/co= ccinelle/auto-propagated-errp.cocci >>> new file mode 100644 >>> index 0000000000..7dac2dcfa4 >>> --- /dev/null >>> +++ b/scripts/coccinelle/auto-propagated-errp.cocci >>> @@ -0,0 +1,327 @@ >>> +// Use ERRP_AUTO_PROPAGATE (see include/qapi/error.h) >>> +// >>> +// Copyright (c) 2020 Virtuozzo International GmbH. >>> +// >>> +// This program is free software; you can redistribute it and/or >>> +// modify it under the terms of the GNU General Public License as >>> +// published by the Free Software Foundation; either version 2 of the >>> +// License, or (at your option) any later version. >>> +// >>> +// This program is distributed in the hope that it will be useful, >>> +// but WITHOUT ANY WARRANTY; without even the implied warranty of >>> +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >>> +// GNU General Public License for more details. >>> +// >>> +// You should have received a copy of the GNU General Public License >>> +// along with this program. If not, see >>> +// . >>> +// >>> +// Usage example: >>> +// spatch --sp-file scripts/coccinelle/auto-propagated-errp.cocci \ >>> +// --macro-file scripts/cocci-macro-file.h --in-place \ >>> +// --no-show-diff --max-width 80 FILES... >>> +// >>> +// Note: --max-width 80 is needed because coccinelle default is less >>> +// than 80, and without this parameter coccinelle may reindent some >>> +// lines which fit into 80 characters but not to coccinelle default, >>> +// which in turn produces extra patch hunks for no reason. >> >> This is about unwanted reformatting of parameter lists due to the ___ >> chaining hack. --max-width 80 makes that less likely, but not >> impossible. >> >> We can search for unwanted reformatting of parameter lists. I think >> grepping diffs for '^\+.*Error \*\*' should do the trick. For the whole >> tree, I get one false positive (not a parameter list), and one hit: >> >> @@ -388,8 +388,10 @@ static void object_post_init_with_type(O >> } >> } >> >> -void object_apply_global_props(Object *obj, const GPtrArray *props= , Error **errp) >> +void object_apply_global_props(Object *obj, const GPtrArray *props= , >> + Error **errp) >> { >> + ERRP_AUTO_PROPAGATE(); >> int i; >> >> if (!props) { >> >> Reformatting, but not unwanted. > > Yes, I saw it. This line is 81 character length, so it's OK to fix it in = one hunk with > ERRP_AUTO_PROPAGATE addition even for non-automatic patch. Agree. >> >> The --max-width 80 hack is good enough for me. >> >> It does result in slightly long transformed lines, e.g. this one in >> replication.c: >> >> @@ -113,7 +113,7 @@ static int replication_open(BlockDriverS >> s->mode =3D REPLICATION_MODE_PRIMARY; >> top_id =3D qemu_opt_get(opts, REPLICATION_TOP_ID); >> if (top_id) { >> - error_setg(&local_err, "The primary side does not supp= ort option top-id"); >> + error_setg(errp, "The primary side does not support op= tion top-id"); >> goto fail; >> } >> } else if (!strcmp(mode, "secondary")) { >> >> v8 did break this line (that's how I found it). However, v9 still >> shortens the line, just not below the target. All your + lines look >> quite unlikely to lengthen lines. Let's not worry about this. >> >>> +// Switch unusual Error ** parameter names to errp >>> +// (this is necessary to use ERRP_AUTO_PROPAGATE). >>> +// >>> +// Disable optional_qualifier to skip functions with >>> +// "Error *const *errp" parameter. >>> +// >>> +// Skip functions with "assert(_errp && *_errp)" statement, because >>> +// that signals unusual semantics, and the parameter name may well >>> +// serve a purpose. (like nbd_iter_channel_error()). >>> +// >>> +// Skip util/error.c to not touch, for example, error_propagate() and >>> +// error_propagate_prepend(). >>> +@ depends on !(file in "util/error.c") disable optional_qualifier@ >>> +identifier fn; >>> +identifier _errp !=3D errp; >>> +@@ >>> + >>> + fn(..., >>> +- Error **_errp >>> ++ Error **errp >>> + ,...) >>> + { >>> +( >>> + ... when !=3D assert(_errp && *_errp) >>> +& >>> + <... >>> +- _errp >>> ++ errp >>> + ...> >>> +) >>> + } >>> + >>> +// Add invocation of ERRP_AUTO_PROPAGATE to errp-functions where >>> +// necessary >>> +// >>> +// Note, that without "when any" the final "..." does not mach >>> +// something matched by previous pattern, i.e. the rule will not match >>> +// double error_prepend in control flow like in >>> +// vfio_set_irq_signaling(). >>> +// >>> +// Note, "exists" says that we want apply rule even if it matches not >>> +// on all possible control flows (otherwise, it will not match >>> +// standard pattern when error_propagate() call is in if branch). >>> +@ disable optional_qualifier exists@ >>> +identifier fn, local_err; >>> +symbol errp; >>> +@@ >>> + >>> + fn(..., Error **errp, ...) >>> + { >>> ++ ERRP_AUTO_PROPAGATE(); >>> + ... when !=3D ERRP_AUTO_PROPAGATE(); >>> +( >>> +( >>> + error_append_hint(errp, ...); >>> +| >>> + error_prepend(errp, ...); >>> +| >>> + error_vprepend(errp, ...); >>> +) >>> + ... when any >>> +| >>> + Error *local_err =3D NULL; >>> + ... >>> +( >>> + error_propagate_prepend(errp, local_err, ...); >>> +| >>> + error_propagate(errp, local_err); >>> +) >>> + ... >>> +) >>> + } >>> + >>> + >>> +// Match functions with propagation of local error to errp. >>> +// We want to refer these functions in several following rules, but I >>> +// don't know a proper way to inherit a function, not just its name >>> +// (to not match another functions with same name in following rules). >>> +// Not-proper way is as follows: rename errp parameter in functions >>> +// header and match it in following rules. Rename it back after all >>> +// transformations. >>> +// >>> +// The simplest case of propagation scheme is single definition of >>> +// local_err with at most one error_propagate_prepend or >>> +// error_propagate on each control-flow. Still, we want to match more >>> +// complex schemes too. We'll warn them with help of further rules. >> >> I think what we actually want is to examine instances of this pattern to >> figure out whether and how we want to transform them. Perhaps: >> >> // The common case is a single definition of local_err with at most= one >> // error_propagate_prepend() or error_propagate() on each control-f= low >> // path. Instances of this case we convert with this script. Functi= ons > > For me, sounds a bit like "other things we don't convert". > Actually we convert other things too. What other patterns of error propagation do we convert? >> // with multiple definitions or propagates we want to examine >> // manually. Later rules emit warnings to guide us to them. >> >>> +@rule1 disable optional_qualifier exists@ >>> +identifier fn, local_err; >>> +symbol errp; >>> +@@ >>> + >>> + fn(..., Error ** >>> +- errp >>> ++ ____ >>> + , ...) >>> + { >>> + ... >>> + Error *local_err =3D NULL; >>> + ... >>> +( >>> + error_propagate_prepend(errp, local_err, ...); >>> +| >>> + error_propagate(errp, local_err); >>> +) >>> + ... >>> + } >>> + >>> + >>> +// Warn several Error * definitions. >>> +@check1 disable optional_qualifier exists@ >>> +identifier fn =3D rule1.fn, local_err, local_err2; >> >> Elsewhere, you use just rule.fn instead of fn =3D rule1.fn. Any >> particular reason for the difference? > > I didn't find other way to ref check1.fn in next python rule. It just don= 't > work if I write here just rule1.fn. > >> >> With the ___ chaining hack, I doubt we still need "=3D rule1.fn" or >> "rule1.fn". If I replace "fn =3D rule1.fn" and "rule.fn" by just "fn" >> everywhere, then apply the script to the complete tree, I get the same >> result. > > I think, it's more efficient to reuse names from previous rules. I think = it should > work faster (more information, less extra matching). Nope. With my hacked up script (patch appended) Coccinelle is actually *faster* for the .[ch] touched by this series: with your unmodified script, it takes a bit over 12s on my box, with mine around 7s. Output is identical. Never guess performance, always measure it :) Two notes on my script: * Unlike yours, it recognizes double-propagation in my test case. Discussed below. * Its "several definitions of" warning includes positions. That turned out to be useless, but I've been too lazy to take that out again. >> >>> +@@ >>> + >>> + fn(..., Error ** ____, ...) >>> + { >>> + ... >>> + Error *local_err =3D NULL; >>> + ... when any >>> + Error *local_err2 =3D NULL; >>> + ... when any >>> + } >>> + >>> +@ script:python @ >>> +fn << check1.fn; >>> +@@ >>> + >>> +print('Warning: function {} has several definitions of ' >>> + 'Error * local variable'.format(fn)) >>> + >>> +// Warn several propagations in control flow. >>> +@check2 disable optional_qualifier exists@ >>> +identifier fn =3D rule1.fn; >>> +symbol errp; >>> +position p1, p2; >>> +@@ >>> + >>> + fn(..., Error ** ____, ...) >>> + { >>> + ... >>> +( >>> + error_propagate_prepend(errp, ...);@p1 >>> +| >>> + error_propagate(errp, ...);@p1 >>> +) >>> + ... >>> +( >>> + error_propagate_prepend(errp, ...);@p2 >>> +| >>> + error_propagate(errp, ...);@p2 >>> +) >>> + ... when any >>> + } >>> + >> >> Hmm, we don't catch the example I used in review of v8: >> >> extern foo(int, Error **); >> extern bar(int, Error **); >> >> void frob(Error **errp) >> { >> Error *local_err =3D NULL; >> int arg; >> >> foo(arg, errp); >> bar(arg, &local_err); >> error_propagate(errp, local_err); >> bar(arg + 1, &local_err); >> error_propagate(errp, local_err); >> } >> >> I believe this is because rule1 does not match here. > > Yes, rule1 wants at least one code flow with non-doubled propagation. > >> >> If I change the rule as follows, it catches the example: >> >> @@ -157,24 +157,23 @@ print('Warning: function {} has several defin= itions of ' >> >> // Warn several propagations in control flow. >> @check2 disable optional_qualifier exists@ >> -identifier fn =3D rule1.fn; >> -symbol errp; >> +identifier fn, _errp; >> position p1, p2; >> @@ >> >> - fn(..., Error ** ____, ...) >> + fn(..., Error **_errp, ...) >> { >> ... >> ( >> - error_propagate_prepend(errp, ...);@p1 >> + error_propagate_prepend(_errp, ...);@p1 >> | >> - error_propagate(errp, ...);@p1 >> + error_propagate(_errp, ...);@p1 >> ) >> ... >> ( >> - error_propagate_prepend(errp, ...);@p2 >> + error_propagate_prepend(_errp, ...);@p2 >> | >> - error_propagate(errp, ...);@p2 >> + error_propagate(_errp, ...);@p2 >> ) >> ... when any >> } >> >> To my mild surprise, it still doesn't find anything in our tree. >> >> Should we decouple the previous rule from rule1, too? I tested the >> following on the whole tree: > > I don't think so. Why to check what we are not going to convert? If we wa= nt > to check side things, it's better to do it in other coccinelle script.. Misunderstanding? The rules are still chained together via the ___ hack, just not via function name, because that's unreliable and redundant. >> >> @@ -136,10 +136,10 @@ symbol errp; >> >> // Warn several Error * definitions. >> @check1 disable optional_qualifier exists@ >> -identifier fn =3D rule1.fn, local_err, local_err2; >> +identifier fn, _errp, local_err, local_err2; >> @@ >> >> - fn(..., Error ** ____, ...) >> + fn(..., Error **_errp, ...) >> { >> ... >> Error *local_err =3D NULL; >> >> Warnings remain unchanged. >> >>> +@ script:python @ >>> +fn << check2.fn; >>> +p1 << check2.p1; >>> +p2 << check2.p2; >>> +@@ >>> + >>> +print('Warning: function {} propagates to errp several times in ' >>> + 'one control flow: at {}:{} and then at {}:{}'.format( >>> + fn, p1[0].file, p1[0].line, p2[0].file, p2[0].line)) >>> + >>> +// Convert special case with goto separately. >>> +// I tried merging this into the following rule the obvious way, but >>> +// it made Coccinelle hang on block.c >>> +// >>> +// Note interesting thing: if we don't do it here, and try to fixup >>> +// "out: }" things later after all transformations (the rule will be >>> +// the same, just without error_propagate() call), coccinelle fails to >>> +// match this "out: }". >>> +@ disable optional_qualifier@ >>> +identifier rule1.fn, rule1.local_err, out; >> >> As explained above, I doubt the need for rule1.fn. We do need >> rule1.local_err to avoid unwanted transformations. More of the same >> below. > > Logically, I want to inherit from rule1. So why not to stress it by inher= iting > fn variable? It's just a correct thing to do. > And I hope it helps coccinelle to work more efficiently. > >> >>> +symbol errp; >>> +@@ >>> + >>> + fn(..., Error ** ____, ...) >>> + { >>> + <... >>> +- goto out; >>> ++ return; >>> + ...> >>> +- out: >>> +- error_propagate(errp, local_err); >>> + } >>> + >>> +// Convert most of local_err related stuff. >>> +// >>> +// Note, that we update everything related to matched by rule1 >>> +// function name and local_err name. We may match something not >>> +// related to the pattern matched by rule1. For example, local_err may >>> +// be defined with the same name in different blocks inside one >>> +// function, and in one block follow the propagation pattern and in >>> +// other block doesn't. Or we may have several functions with the same >>> +// name (for different configurations). >>> +// >>> +// Note also that errp-cleaning functions >>> +// error_free_errp >>> +// error_report_errp >>> +// error_reportf_errp >>> +// warn_report_errp >>> +// warn_reportf_errp >>> +// are not yet implemented. They must call corresponding Error* - >>> +// freeing function and then set *errp to NULL, to avoid further >>> +// propagation to original errp (consider ERRP_AUTO_PROPAGATE in use). >>> +// For example, error_free_errp may look like this: >>> +// >>> +// void error_free_errp(Error **errp) >>> +// { >>> +// error_free(*errp); >>> +// *errp =3D NULL; >>> +// } >>> +@ disable optional_qualifier exists@ >>> +identifier rule1.fn, rule1.local_err; >>> +expression list args; >>> +symbol errp; >>> +@@ >>> + >>> + fn(..., Error ** ____, ...) >>> + { >>> + <... >>> +( >>> +- Error *local_err =3D NULL; >>> +| >>> + >>> +// Convert error clearing functions >>> +( >>> +- error_free(local_err); >>> ++ error_free_errp(errp); >>> +| >>> +- error_report_err(local_err); >>> ++ error_report_errp(errp); >>> +| >>> +- error_reportf_err(local_err, args); >>> ++ error_reportf_errp(errp, args); >>> +| >>> +- warn_report_err(local_err); >>> ++ warn_report_errp(errp); >>> +| >>> +- warn_reportf_err(local_err, args); >>> ++ warn_reportf_errp(errp, args); >>> +) >>> +?- local_err =3D NULL; >>> + >>> +| >>> +- error_propagate_prepend(errp, local_err, args); >>> ++ error_prepend(errp, args); >>> +| >>> +- error_propagate(errp, local_err); >>> +| >>> +- &local_err >>> ++ errp >>> +) >>> + ...> >>> + } >>> + >>> +// Convert remaining local_err usage. For example, different kinds of >>> +// error checking in if conditionals. We can't merge this into >>> +// previous hunk, as this conflicts with other substitutions in it (at >>> +// least with "- local_err =3D NULL"). >>> +@ disable optional_qualifier@ >>> +identifier rule1.fn, rule1.local_err; >>> +symbol errp; >>> +@@ >>> + >>> + fn(..., Error ** ____, ...) >>> + { >>> + <... >>> +- local_err >>> ++ *errp >>> + ...> >>> + } >>> + >>> +// Always use the same pattern for checking error >>> +@ disable optional_qualifier@ >>> +identifier rule1.fn; >>> +symbol errp; >>> +@@ >>> + >>> + fn(..., Error ** ____, ...) >>> + { >>> + <... >>> +- *errp !=3D NULL >>> ++ *errp >>> + ...> >>> + } >>> + >>> +// Revert temporary ___ identifier. >>> +@ disable optional_qualifier@ >>> +identifier rule1.fn; >>> +@@ >>> + >>> + fn(..., Error ** >>> +- ____ >>> ++ errp >>> + , ...) >>> + { >>> + ... >>> + } >>> diff --git a/include/qapi/error.h b/include/qapi/error.h >>> index 30140d9bfe..56c133520d 100644 >>> --- a/include/qapi/error.h >>> +++ b/include/qapi/error.h >>> @@ -214,6 +214,9 @@ >>> * } >>> * ... >>> * } >>> + * >>> + * For mass-conversion use script >>> + * scripts/coccinelle/auto-propagated-errp.cocci >>> */ >>> #ifndef ERROR_H >>> diff --git a/MAINTAINERS b/MAINTAINERS >>> index 857f969aa1..047f1b9714 100644 >>> --- a/MAINTAINERS >>> +++ b/MAINTAINERS >>> @@ -1998,6 +1998,7 @@ F: include/qemu/error-report.h >>> F: qapi/error.json >>> F: util/error.c >>> F: util/qemu-error.c >>> +F: scripts/coccinelle/*err*.cocci >>> GDB stub >>> M: Alex Benn=C3=A9e >> >From 42a08c529024337d1b859839c9ce7f797f784555 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 13 Mar 2020 14:27:57 +0100 Subject: [PATCH] fixup! scripts: Coccinelle script to use ERRP_AUTO_PROPAGATE() --- scripts/coccinelle/auto-propagated-errp.cocci | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/scripts/coccinelle/auto-propagated-errp.cocci b/scripts/coccin= elle/auto-propagated-errp.cocci index 7dac2dcfa4..43b0b0e63b 100644 --- a/scripts/coccinelle/auto-propagated-errp.cocci +++ b/scripts/coccinelle/auto-propagated-errp.cocci @@ -136,45 +136,48 @@ symbol errp; =20 // Warn several Error * definitions. @check1 disable optional_qualifier exists@ -identifier fn =3D rule1.fn, local_err, local_err2; +identifier fn, _errp, local_err, local_err2; +position p1, p2; @@ =20 - fn(..., Error ** ____, ...) + fn(..., Error **_errp, ...) { ... - Error *local_err =3D NULL; + Error *local_err =3D NULL;@p1 ... when any - Error *local_err2 =3D NULL; + Error *local_err2 =3D NULL;@p2 ... when any } =20 @ script:python @ fn << check1.fn; +p1 << check1.p1; +p2 << check1.p2; @@ =20 print('Warning: function {} has several definitions of ' - 'Error * local variable'.format(fn)) + 'Error * local variable: at {}:{} and then at {}:{}'.format( + fn, p1[0].file, p1[0].line, p2[0].file, p2[0].line)) =20 // Warn several propagations in control flow. @check2 disable optional_qualifier exists@ -identifier fn =3D rule1.fn; -symbol errp; +identifier fn, _errp; position p1, p2; @@ =20 - fn(..., Error ** ____, ...) + fn(..., Error **_errp, ...) { ... ( - error_propagate_prepend(errp, ...);@p1 + error_propagate_prepend(_errp, ...);@p1 | - error_propagate(errp, ...);@p1 + error_propagate(_errp, ...);@p1 ) ... ( - error_propagate_prepend(errp, ...);@p2 + error_propagate_prepend(_errp, ...);@p2 | - error_propagate(errp, ...);@p2 + error_propagate(_errp, ...);@p2 ) ... when any } @@ -198,7 +201,7 @@ print('Warning: function {} propagates to errp several = times in ' // the same, just without error_propagate() call), coccinelle fails to // match this "out: }". @ disable optional_qualifier@ -identifier rule1.fn, rule1.local_err, out; +identifier fn, rule1.local_err, out; symbol errp; @@ =20 @@ -239,7 +242,7 @@ symbol errp; // *errp =3D NULL; // } @ disable optional_qualifier exists@ -identifier rule1.fn, rule1.local_err; +identifier fn, rule1.local_err; expression list args; symbol errp; @@ @@ -287,7 +290,7 @@ symbol errp; // previous hunk, as this conflicts with other substitutions in it (at // least with "- local_err =3D NULL"). @ disable optional_qualifier@ -identifier rule1.fn, rule1.local_err; +identifier fn, rule1.local_err; symbol errp; @@ =20 @@ -301,7 +304,7 @@ symbol errp; =20 // Always use the same pattern for checking error @ disable optional_qualifier@ -identifier rule1.fn; +identifier fn; symbol errp; @@ =20 @@ -315,7 +318,7 @@ symbol errp; =20 // Revert temporary ___ identifier. @ disable optional_qualifier@ -identifier rule1.fn; +identifier fn; @@ =20 fn(..., Error ** --=20 2.21.1