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=-0.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 D5679C433E0 for ; Sun, 17 May 2020 08:48:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AF242206D5 for ; Sun, 17 May 2020 08:48:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727037AbgEQIsT (ORCPT ); Sun, 17 May 2020 04:48:19 -0400 Received: from eu-smtp-delivery-151.mimecast.com ([207.82.80.151]:42214 "EHLO eu-smtp-delivery-151.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727046AbgEQIsN (ORCPT ); Sun, 17 May 2020 04:48:13 -0400 Received: from AcuMS.aculab.com (156.67.243.126 [156.67.243.126]) (Using TLS) by relay.mimecast.com with ESMTP id uk-mta-134-1s_UAGXuNcaiB_0okryfNQ-1; Sun, 17 May 2020 09:48:03 +0100 X-MC-Unique: 1s_UAGXuNcaiB_0okryfNQ-1 Received: from AcuMS.Aculab.com (fd9f:af1c:a25b:0:43c:695e:880f:8750) by AcuMS.aculab.com (fd9f:af1c:a25b:0:43c:695e:880f:8750) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Sun, 17 May 2020 09:48:02 +0100 Received: from AcuMS.Aculab.com ([fe80::43c:695e:880f:8750]) by AcuMS.aculab.com ([fe80::43c:695e:880f:8750%12]) with mapi id 15.00.1347.000; Sun, 17 May 2020 09:48:02 +0100 From: David Laight To: 'Matthew Wilcox' CC: 'David Howells' , Christoph Hellwig , Marcelo Ricardo Leitner , "linux-nvme@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-sctp@vger.kernel.org" , "target-devel@vger.kernel.org" , "linux-afs@lists.infradead.org" , "drbd-dev@lists.linbit.com" , "linux-cifs@vger.kernel.org" , "rds-devel@oss.oracle.com" , "linux-rdma@vger.kernel.org" , "cluster-devel@redhat.com" , Jakub Kicinski , "linux-block@vger.kernel.org" , Alexey Kuznetsov , "ceph-devel@vger.kernel.org" , "linux-nfs@vger.kernel.org" , Neil Horman , Hideaki YOSHIFUJI , "netdev@vger.kernel.org" , Vlad Yasevich , Eric Dumazet , Jon Maloy , Ying Xue , "David S. Miller" , "ocfs2-devel@oss.oracle.com" Subject: RE: [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx Thread-Topic: [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx Thread-Index: AQHWKsxNyiOODFVfBEqdWGEpseVc56iq0duQ///3bQCAAS9X8A== Date: Sun, 17 May 2020 08:48:02 +0000 Message-ID: <49f712b3b6704c3096d3834a5985a4d6@AcuMS.aculab.com> References: <20200514062820.GC8564@lst.de> <20200513062649.2100053-1-hch@lst.de> <20200513062649.2100053-28-hch@lst.de> <20200513180058.GB2491@localhost.localdomain> <129070.1589556002@warthog.procyon.org.uk> <05d946ae948946158dbfcbc07939b799@AcuMS.aculab.com> <20200516153652.GM16070@bombadil.infradead.org> In-Reply-To: <20200516153652.GM16070@bombadil.infradead.org> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.202.205.107] MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: aculab.com Content-Type: multipart/mixed; boundary="_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_" Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Matthew Wilcox > Sent: 16 May 2020 16:37 ... > > Basically: > > > > This patch sequence (to be written) does the following: > > > > Patch 1: Change __sys_setsockopt() to allocate a kernel buffer, > > copy the data into it then call set_fs(KERNEL_DS). > > An on-stack buffer (say 64 bytes) will be used for > > small transfers. > > > > Patch 2: The same for __sys_getsockopt(). > > > > Patch 3: Compat setsockopt. > > > > Patch 4: Compat getsockopt. > > > > Patch 5: Remove the user copies from the global socket options code. > > > > Patches 6 to n-1; Remove the user copies from the per-protocol code. > > > > Patch n: Remove the set_fs(KERNEL_DS) from the entry points. > > > > This should be bisectable. >=20 > I appreciate your dedication to not publishing the source code to > your kernel module, but Christoph's patch series is actually better. > It's typesafe rather than passing void pointers around. There are plenty on interfaces that pass a 'pointer and length'. Having the compiler do a type check doesn't give any security benefit - just stops silly errors. Oh yes, I've attached the only driver source file that calls into the Linux kernel. You are perfectly free to look at all the thing we have to do to support different and broken kernel releases. =09David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1= PT, UK Registration No: 1397386 (Wales) --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; name=ss7osglue.c; charset=WINDOWS-1252 Content-Description: ss7osglue.c Content-Disposition: attachment; filename="ss7osglue.c"; size=36047; creation-date="Thu, 26 Sep 2019 10:15:35 GMT"; modification-date="Thu, 26 Sep 2019 10:15:35 GMT" Content-Transfer-Encoding: base64 I2lkZW50ICJAKCMpIChjKSBBY3VsYWIgcGxjICRIZWFkZXI6IC9ob21lL2N2cy9yZXBvc2l0b3J5 L3NzNy9zdGFjay9zcmMvZHJpdmVyL2xpbnV4L3NzN29zZ2x1ZS5jLHYgMS4xNTcgMjAxOS0wOC0y OSAxNjowOToxNCBkYXZpZGxhIEV4cCAkICROYW1lOiAgJCIKI2lmbmRlZiBNT0RVTEUKI2RlZmlu ZSBNT0RVTEUKI2VuZGlmCgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgoKI2lmIExJTlVYX1ZF UlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI4KQojZXJyb3IgbWluaW11bSBrZXJu ZWwgdmVyc2lvbiBpcyAyLjYuMjgKI2VuZGlmCgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtF Uk5FTF9WRVJTSU9OKDIsIDYsIDM0KQojaW5jbHVkZSA8Z2VuZXJhdGVkL2F1dG9jb25mLmg+CiNl bHNlCiNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgojZW5kaWYKCiNpbmNsdWRlIDxsaW51eC9p bml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K I2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxs aW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpZiBMSU5VWF9WRVJTSU9O X0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oNCwgMTEsIDApCiNpbmNsdWRlIDxsaW51eC9zY2hlZC9z aWduYWwuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9z b2NrZXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5o PgojaW5jbHVkZSA8bGludXgvbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiNpbmNs dWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxhc20v YXRvbWljLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGxpbnV4L2t0aHJl YWQuaD4KCi8qIFRoaXMgaXMgb25seSBpbiB0aGUga2VybmVsIGJ1aWxkIHRyZWUgKi8KI2luY2x1 ZGUgPG5ldC9zb2NrLmg+CgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9O KDMsIDEwLCAwKQojaW5jbHVkZSA8dWFwaS9saW51eC9zY3RwLmg+CiNlbHNlCiNpbmNsdWRlIDxu ZXQvc2N0cC91c2VyLmg+ICAgIC8qIG5ldGluZXQvc2N0cC5oIG91Z2h0IHRvIGJlIHRoaXMgZmls ZSAqLwojZW5kaWYKCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LCAx MywgMCkKI2RlZmluZSB3YWl0X3F1ZXVlX2hlYWQgX193YWl0X3F1ZXVlX2hlYWQKI2RlZmluZSB3 YWl0X3F1ZXVlX2VudHJ5IF9fd2FpdF9xdWV1ZQojZW5kaWYKCiNkZWZpbmUgU0tfUFJPVE9DT0wo c29jaykgKHNvY2spLT5zay0+c2tfcHJvdG9jb2wKCmV4dGVybiB2b2lkIHNzN190cmFjZV9tZW0o aW50LCB2b2lkICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOwpleHRlcm4gdm9pZCBzczdfdHJh Y2VfcHJpbnRmKGludCwgY29uc3QgY2hhciAqLCAuLi4pOwoKLyogQWN1bGFiIERBQ1AgaW50ZXJm YWNlcyAtIHRoZXNlIGFyZSBpbiBhY3VsYWIncyBrZXJuX2lmLmggKi8Kdm9pZCAqZGFjcF9zeW1i b2xfZ2V0KGNvbnN0IGNoYXIgKik7CmludCBkYWNwX3N5bWJvbF9yZWxlYXNlKGNvbnN0IGNoYXIg Kik7CgpNT0RVTEVfQVVUSE9SKCJBY3VsYWIiKTsKTU9EVUxFX0xJQ0VOU0UoIlByb3ByaWV0YXJ5 Iik7CgojaW5jbHVkZSAic3M3b3NnbHVlLmgiCgovKiBNdXRleCBmb3IgZHJpdmVyIGludGVyZmFj ZSBjb2RlICovCnN0YXRpYyBzdHJ1Y3QgbXV0ZXggc3M3X2dsdWVfbXV0ZXg7CgpzdGF0aWMgaW50 IHNzN2Rldl9tYWpvcjsKc3RhdGljIGNvbnN0IHZvaWQgKnNzN19kdGxzX2hhbmRsZTsKc3RhdGlj IGludCBzczdfdXNlX2NvdW50OwpzdGF0aWMgaW50IHNzN19zdG9wX3BpZDsKCnN0YXRpYyBzdHJ1 Y3QgdGFza19zdHJ1Y3QgKmFzc2VydGVkX3Rhc2tzWzE2XTsKc3RhdGljIHVuc2lnbmVkIGludCBh c3NlcnRlZF90YXNrX2NvdW50OwoKdHlwZWRlZiBjaGFyIHNzN192ZXJpZnlfY29uc3RbIFNTN19T T0NLX1NUUkVBTSA9PSBTT0NLX1NUUkVBTSAmJiBTUzdfU09DS19TRVFQQUNLRVQgPT0gU09DS19T RVFQQUNLRVQgPyAxIDogLTFdOwoKc3RhdGljIHZvaWQgc3M3X25ldF9uc191bmxvYWQodm9pZCk7 CgojZGVmaW5lIFRDUF9OT0RFTEFZIDEKCnN0YXRpYyBpbnQgc3M3X2dsdWVfb3BlbihzdHJ1Y3Qg aW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CnN0YXRpYyBpbnQgc3M3X2dsdWVfcmVsZWFzZShzdHJ1 Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CnN0YXRpYyBsb25nIHNzN19nbHVlX3VubG9ja2Vk X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CnN0YXRp YyB1bnNpZ25lZCBpbnQgc3M3X2dsdWVfcG9sbChzdHJ1Y3QgZmlsZSAqY29uc3QsIHBvbGxfdGFi bGUgKik7CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzczdkZXZfZm9wID0KewogICAg b3BlbjogICAgICAgICAgIHNzN19nbHVlX29wZW4sCiAgICByZWxlYXNlOiAgICAgICAgc3M3X2ds dWVfcmVsZWFzZSwKICAgIHVubG9ja2VkX2lvY3RsOiBzczdfZ2x1ZV91bmxvY2tlZF9pb2N0bCwK ICAgIGNvbXBhdF9pb2N0bDogICBzczdfZ2x1ZV91bmxvY2tlZF9pb2N0bCwKICAgIHBvbGw6ICAg ICAgICAgICBzczdfZ2x1ZV9wb2xsLAogICAgb3duZXI6ICAgICAgICAgIFRISVNfTU9EVUxFCn07 CgpzdGF0aWMgaW50IHNzN19yZWJvb3Rfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIs IHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogICAgICAgIHZvaWQgKmRhdGEpCnsKICAgIC8qIFN5c3Rl bSBiZWluZyByZWJvb3RlZC4KICAgICAqIEkgYWRkZWQgdGhpcyBob3BpbmcgdG8gdXNlIGl0IHRv IGdldCB0aGUgc3M3bWFpbnQgZGFlbW9uIHRvIGV4aXQsCiAgICAgKiBidXQgaXQgaXNuJ3QgY2Fs bGVkIHVudGlsIGFsbCB1c2VyIHByb2Nlc3NlcyBoYXZlIGRpZWQuCiAgICAgKiBMZWF2ZSBpdCBo ZXJlIC0gbWlnaHQgYmUgdXNlZnVsIG9uZSBkYXkuICovCiAgICByZXR1cm4gMDsKfQoKc3RhdGlj IHN0cnVjdCBub3RpZmllcl9ibG9jayBzczdfcmVib290X25vdGlmaWVyX2Jsb2NrID0gewogICAg Lm5vdGlmaWVyX2NhbGwgPSBzczdfcmVib290X25vdGlmeSwKfTsKCnN0YXRpYyBpbnQKc3M3X2lu aXRfZmFpbChpbnQgcnZhbCkKewogICAgaWYgKHNzN2Rldl9tYWpvciA+IDApCiAgICAgICAgdW5y ZWdpc3Rlcl9jaHJkZXYoc3M3ZGV2X21ham9yLCAic3M3c2VydmVyIik7CiAgICByZXR1cm4gcnZh bDsKfQoKc3RhdGljIGludApzczdfaW5pdF9tb2Qodm9pZCkKewogICAgY29uc3Qgdm9pZCAqKCpk dGxzX3JlZ2lzdGVyKShjb25zdCBjaGFyICosIGludCAoKikoc3RydWN0IGR0bHNfZ2V0X2lmICop KTsKICAgIGludCBydmFsOwoKICAgIHNzN19tdXRleF9pbml0KCZzczdfZ2x1ZV9tdXRleCk7Cgog ICAgcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHNzN3ZlcnNpb24pOwoKICAgIHNzN2Rldl9tYWpv ciA9IHJlZ2lzdGVyX2NocmRldigwLCAic3M3c2VydmVyIiwgJnNzN2Rldl9mb3ApOwoKICAgIGlm IChzczdkZXZfbWFqb3IgPCAwKSB7CiAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic3M3c2VydmVy OiByZWdpc3Rlcl9jaHJkZXYoKSBmYWlsZWQ6ICVkXG4iLAogICAgICAgICAgICAgICAgc3M3ZGV2 X21ham9yKTsKICAgICAgICByZXR1cm4gc3M3X2luaXRfZmFpbChzczdkZXZfbWFqb3IpOwogICAg fQoKICAgIHJ2YWwgPSBzczdfZHJpdmVyX2luaXQoKTsKICAgIGlmIChydmFsICE9IDApIHsKICAg ICAgICBwcmludGsoS0VSTl9JTkZPICJzczdzZXJ2ZXI6IHNzN19kcml2ZXJfaW5pdCgpIGZhaWxl ZDogJWRcbiIsIHJ2YWwpOwogICAgICAgIHJldHVybiBzczdfaW5pdF9mYWlsKC1FSU8pOwogICAg fQoKICAgIGR0bHNfcmVnaXN0ZXIgPSBkYWNwX3N5bWJvbF9nZXQoImFjdWNfZHRsc19yZWdpc3Rl ciIpOwogICAgaWYgKGR0bHNfcmVnaXN0ZXIgPT0gTlVMTCkKICAgICAgICBwcmludGsoS0VSTl9J TkZPICJzczdzZXJ2ZXI6IGNhbm5vdCBsb2NhdGUgXCJhY3VjX2R0bHNfcmVnaXN0ZXJcIlxuIik7 CiAgICBlbHNlCiAgICAgICAgc3M3X2R0bHNfaGFuZGxlID0gZHRsc19yZWdpc3RlcihEWU5BTUlD X1RMU19QUkVGSVggInNzNyIsCiAgICAgICAgICAgICAgICBzczdfdGxzX2dldF9pZik7CgogICAg cmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzczdfcmVib290X25vdGlmaWVyX2Jsb2NrKTsKICAg IHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApzczdfY2xlYW51cF9tb2Qodm9pZCkKewogICAgaW50 ICgqZHRsc191bnJlZ2lzdGVyKShjb25zdCB2b2lkICopOwoKICAgIHVucmVnaXN0ZXJfcmVib290 X25vdGlmaWVyKCZzczdfcmVib290X25vdGlmaWVyX2Jsb2NrKTsKCiAgICBpZiAoc3M3X2R0bHNf aGFuZGxlICE9IE5VTEwpIHsKICAgICAgICBkdGxzX3VucmVnaXN0ZXIgPSBkYWNwX3N5bWJvbF9n ZXQoImFjdWNfZHRsc191bnJlZ2lzdGVyIik7CiAgICAgICAgZGFjcF9zeW1ib2xfcmVsZWFzZSgi YWN1Y19kdGxzX3JlZ2lzdGVyIik7CiAgICAgICAgaWYgKGR0bHNfdW5yZWdpc3RlciAhPSBOVUxM KSB7CiAgICAgICAgICAgIGR0bHNfdW5yZWdpc3RlcihzczdfZHRsc19oYW5kbGUpOwogICAgICAg ICAgICBkYWNwX3N5bWJvbF9yZWxlYXNlKCJhY3VjX2R0bHNfdW5yZWdpc3RlciIpOwogICAgICAg IH0KICAgIH0KCiAgICBzczdfaW5pdF9mYWlsKDApOwoKICAgIHByaW50ayhLRVJOX0lORk8gIkFj dWxhYiBzczdzZXJ2ZXI6IGRyaXZlciB1bmxvYWRlZFxuIik7Cn0KCm1vZHVsZV9pbml0KHNzN19p bml0X21vZCkKbW9kdWxlX2V4aXQoc3M3X2NsZWFudXBfbW9kKQoKc3RhdGljIGludApzczdfZ2x1 ZV9vcGVuKHN0cnVjdCBpbm9kZSAqY29uc3QgaW5vZGUsIHN0cnVjdCBmaWxlICpjb25zdCBmaWxw KQp7CiAgICBpbnQgcnZhbCwgcGlkOwoKICAgIGlmIChmaWxwLT5wcml2YXRlX2RhdGEpCiAgICAg ICAgLyogRHVwbGljYXRlIG9wZW4gKi8KICAgICAgICByZXR1cm4gMDsKCiAgICBzczdfbXV0ZXhf ZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAgIGlmIChzczdfdXNlX2NvdW50IDwgMCkgewogICAg ICAgIC8qIHNzN19kcml2ZXJfc2h1dGRvd24oKSBoYXMgYmVlbiBjYWxsZWQsIHRvIGxhdGUgdG8g ZG8gYW55dGhpbmcgKi8KICAgICAgICBzczdfbXV0ZXhfZXhpdCgmc3M3X2dsdWVfbXV0ZXgpOwog ICAgICAgIHJldHVybiAtRUlPOwogICAgfQogICAgc3M3X3VzZV9jb3VudCsrOwogICAgc3M3X211 dGV4X2V4aXQoJnNzN19nbHVlX211dGV4KTsKCiAgICBydmFsID0gc3M3X2RldmlmX29wZW4oJmZp bHAtPnByaXZhdGVfZGF0YSk7CiAgICBpZiAocnZhbCAhPSAwKSB7CiAgICAgICAgc3M3X211dGV4 X2VudGVyKCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgc3M3X3VzZV9jb3VudC0tOwogICAgICAg IHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgcGlkID0gc3M3X3BpZCgp OwogICAgICAgIGlmIChwaWQgIT0gc3M3X3N0b3BfcGlkKQogICAgICAgICAgICBwcmludGsoS0VS Tl9JTkZPICJzczdfZGV2aWZfb3BlbigpIHBpZCAlZCBmYWlsZWQgc3M3IGVycm9yICVkXG4iLAog ICAgICAgICAgICAgICAgICAgIHBpZCwgcnZhbCk7CiAgICAgICAgcmV0dXJuIC1FSU87CiAgICB9 CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKc3M3X2dsdWVfcmVsZWFzZShzdHJ1Y3QgaW5v ZGUgKmNvbnN0IGlub2RlLCBzdHJ1Y3QgZmlsZSAqY29uc3QgZmlscCkKewogICAgaWYgKGZpbHAt PnByaXZhdGVfZGF0YSkKICAgICAgICBzczdfZGV2aWZfY2xvc2UoZmlscC0+cHJpdmF0ZV9kYXRh KTsKCiAgICBzczdfbXV0ZXhfZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAgIHNzN191c2VfY291 bnQtLTsKCiAgICBpZiAoc3M3X3VzZV9jb3VudCA9PSAwICYmIHNzN19zdG9wX3BpZCAhPSAwKSB7 CiAgICAgICAgLyogTGFzdCB1c2VyIHByb2Nlc3MgaGFzIGdvbmUsIGNvbXBsZXRlIHNodXRkb3du IGZ1bmN0aW9ucyAqLwogICAgICAgIHNzN19uZXRfbnNfdW5sb2FkKCk7CiAgICAgICAgLyogU3Rv cCBhbnkgbW9yZSBvcGVucyAqLwogICAgICAgIHNzN191c2VfY291bnQgPSAtMTsKICAgICAgICBz czdfZHJpdmVyX3NodXRkb3duKCk7CiAgICB9CgogICAgc3M3X211dGV4X2V4aXQoJnNzN19nbHVl X211dGV4KTsKCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGxvbmcKc3M3X2dsdWVfdW5sb2NrZWRf aW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcg YXJnKQp7CiAgICBpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKICAgICAgICByZXR1cm4gLUVOT0RF VjsKCiAgICBzd2l0Y2ggKGNtZCkgewoKICAgIGNhc2UgU1M3X1NUT1A6ICAgICAgICAgIC8qIHNz N21haW50IHNodXR0aW5nIHVzIGRvd24gKi8KICAgICAgICAvKiBTdGFydCBzaHV0ZG93biBub3cs IHdpbGwgY29tcGxldGUgb24gbGFzdCBjbG9zZSAqLwogICAgICAgIHNzN19kcml2ZXJfc3RvcCgp OwogICAgICAgIHNzN19zdG9wX3BpZCA9IHNzN19waWQoKTsKICAgICAgICByZXR1cm4gMDsKCiAg ICAvKiBSZXF1ZXN0IGZyb20gc3M3bWFpbnQgb3IgdXNlciBhcHBsaWNhdGlvbiAqLwogICAgY2Fz ZSBTUzdfVVNFUl9JT0NUTF9DT0RFOgogICAgICAgIHJldHVybiBzczdkZXZfaW9jdGwoZmlscC0+ cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7CgogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gLUVO T1RUWTsKICAgIH0KfQoKc3RhdGljIHVuc2lnbmVkIGludApzczdfZ2x1ZV9wb2xsKHN0cnVjdCBm aWxlICpmaWxwLCBwb2xsX3RhYmxlICpwdCkKewogICAgcG9sbF93YWl0KGZpbHAsICpzczdfZGV2 aWZfZ2V0X3BvbGxxdWV1ZV9oZWFkKGZpbHAtPnByaXZhdGVfZGF0YSksIHB0KTsKICAgIHJldHVy biBzczdfZGV2aWZfZ2V0X3BvbGxfc3RhdHVzKGZpbHAtPnByaXZhdGVfZGF0YSk7Cn0KCnZvaWQg Kgpzczdfb3NfbWFsbG9jKGludCBzLCBpbnQgc3M3X2ZsYWdzKQp7CiAgICByZXR1cm4ga21hbGxv YyhzLCBHRlBfS0VSTkVMKTsKfQoKdm9pZApzczdfb3NfZnJlZSh2b2lkICpwKQp7CiAgICBrZnJl ZShwKTsKfQoKdm9pZApzczdfcG9sbF9xdWV1ZV9oZWFkX2RlaW5pdCh3YWl0X3F1ZXVlX2hlYWRf dCAqKnBxaHApCnsKICAgIHNzN19vc19mcmVlKCpwcWhwKTsKfQoKaW50CnNzN19wb2xsX3F1ZXVl X2hlYWRfaW5pdCh3YWl0X3F1ZXVlX2hlYWRfdCAqKnBxaHApCnsKICAgIHdhaXRfcXVldWVfaGVh ZF90ICpwcWggPSBzczdfb3NfbWFsbG9jKHNpemVvZiAqcHFoLCAwKTsKICAgIGlmIChwcWggPT0g TlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKHBxaCk7CiAg ICAqcHFocCA9IHBxaDsKICAgIHJldHVybiAwOwp9Cgp2b2lkCnNzN19wb2xsd2FrZXVwKHdhaXRf cXVldWVfaGVhZF90ICoqcHFoLCB1bnNpZ25lZCBpbnQgcG9sbF9ldmVudCkKewogICAgd2FrZV91 cCgqcHFoKTsKfQoKdm9pZApzczdfa2lsbF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywg aW50IHNpZ25vKQp7CiAgICAvKiBTZW5kIHNpZ25hbCBldmVuIHRob3VnaCBzZXQgdG8gU0lHX0lH TiAqLwogICAgZm9yY2Vfc2lnKHNpZ25vLCB0YXNrKTsKfQoKCiNpZiBMSU5VWF9WRVJTSU9OX0NP REUgPD0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzIpCi8qIHNwaW5sb2NrX3QgaXMgYSB0eXBlZGVm IGZvciBhbiB1bm5hbWVkIHN0cnVjdHVyZSBzbyB3ZSBjYW4ndAogKiBtYWtlICdzdHJ1Y3Qgc3Bp bmxvY2snIG1hdGNoIHRoZSBrZXJuZWwgc3BpbmxvY2sgdHlwZS4gKi8KI2RlZmluZSBTUElOTE9D S19DQVNUIChzcGlubG9ja190ICopCiNlbHNlCiNkZWZpbmUgU1BJTkxPQ0tfQ0FTVAojZW5kaWYK CnNpemVfdApzczdfc3Bpbl9sb2NrX3NpemUodm9pZCkKewogICAgcmV0dXJuIHNpemVvZiAqU1BJ TkxPQ0tfQ0FTVChzdHJ1Y3Qgc3BpbmxvY2sgKikwOwp9Cgp2b2lkCnNzN19zcGluX2xvY2tfaW5p dChzdHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAgIHNwaW5fbG9ja19pbml0KFNQSU5MT0NLX0NBU1Qg cyk7Cn0KCnZvaWQKc3M3X3NwaW5fbG9ja19lbnRlcihzdHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAg IHNwaW5fbG9jayhTUElOTE9DS19DQVNUIHMpOwp9Cgp2b2lkCnNzN19zcGluX2xvY2tfZXhpdChz dHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAgIHNwaW5fdW5sb2NrKFNQSU5MT0NLX0NBU1Qgcyk7Cn0K CnNpemVfdApzczdfbXV0ZXhfc2l6ZSh2b2lkKQp7CiAgICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBt dXRleCk7Cn0KCnZvaWQKc3M3X211dGV4X2luaXQoc3RydWN0IG11dGV4ICpzKQp7CiAgICBtdXRl eF9pbml0KHMpOwp9Cgp2b2lkCnNzN19tdXRleF9lbnRlcihzdHJ1Y3QgbXV0ZXggKnMpCnsKICAg IG11dGV4X2xvY2socyk7Cn0KCmludApzczdfbXV0ZXhfZW50ZXJfdG1vKHN0cnVjdCBtdXRleCAq cywgaW50IG1heF93YWl0KQp7CiAgICAvKiBUaGVyZSBpcyBubyBtdXRleF9lbnRlcl90aW1lb3V0 KCkgaG93ZXZlciB0aGlzIHdhcyBhbGwgYWRkZWQKICAgICAqIHRvIHN0b3Agc3RhdHVzIGNvbW1h bmRzIHNsZWVwaW5nIGZvcmV2ZXIgd2hlbiBhIHByb2Nlc3MgaGFzCiAgICAgKiAnb29wc2VkJyB3 aXRoIGEgbXV0ZXggaGVsZC4KICAgICAqIERvIGEgc25lYWsgY2hlY2sgb24gdGhlIHN0YXRlIG9m IGFueSBvd25pbmcgdGFzayB0aGVuCiAgICAgKiB3YWl0IGludGVycnVwdGlibHkuCiAgICAgKiBe QyBzaG91bGQgZXJyb3Igb3V0IHRoZSBzdGF0dXMgY2FsbC4gKi8KCiAgICAvKiBJZiB1bmNvbnRl bmRlZCBqdXN0IGFjcXVpcmUgKi8KICAgIGlmIChtdXRleF90cnlsb2NrKHMpKQogICAgICAgIHJl dHVybiAxOwoKI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTig0LCAxMCwg MCkKICAgIHsKICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOwogICAgICAgIGludCBz dGF0ZTsKCiAgICAgICAgc3Bpbl9sb2NrKCZzLT53YWl0X2xvY2spOwogICAgICAgIG93bmVyID0g X19tdXRleF9vd25lcihzKTsKICAgICAgICBzdGF0ZSA9IG93bmVyID8gb3duZXItPnN0YXRlIDog MDsKICAgICAgICBzcGluX3VubG9jaygmcy0+d2FpdF9sb2NrKTsKICAgICAgICBpZiAoc3RhdGUg JiBUQVNLX0RFQUQpCiAgICAgICAgICAgIC8qIG11dGV4IHdpbGwgbmV2ZXIgYmUgcmVsZWFzZWQs IHRyZWF0IGFzIHRpbWVvdXQgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgoK ICAgIC8qIElmIEM3X0FTU0VSVCgpIGhhcyBiZWVuIGNhbGxlZCwganVzdCBsZXQgZXZlcnlvbmUg aW4gKi8KICAgIGlmIChhc3NlcnRlZF90YXNrX2NvdW50KQogICAgICAgIHJldHVybiAwOwoKICAg IHJldHVybiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUocykgPyAtMSAvKiBFSU5UUiAqLyA6IDEg LyogYWNxdWlyZWQgKi87Cn0KCnZvaWQKc3M3X211dGV4X2V4aXQoc3RydWN0IG11dGV4ICpzKQp7 CiAgICBtdXRleF91bmxvY2socyk7Cn0KCnNpemVfdApzczdfY3Zfc2l6ZSh2b2lkKQp7CiAgICBy ZXR1cm4gc2l6ZW9mKHdhaXRfcXVldWVfaGVhZF90KTsKfQoKdm9pZApzczdfY3ZfaW5pdCh3YWl0 X3F1ZXVlX2hlYWRfdCAqY29uc3QgdikKewogICAgaW5pdF93YWl0cXVldWVfaGVhZCh2KTsKfQoK c3RhdGljIGludApzczdfc2NoZWR1bGVfdG1vKGludCB0bW9fbXMpCnsKICAgIGludCB0bW9famlm ZmllczsKCiAgICAvKiBSZWFsbHkgc2xlZXAgLSB1bmxlc3Mgd29rZW4gc2luY2UgdW5sb2NraW5n IHNwaW5sb2NrICovCiAgICBpZiAodG1vX21zID49IDApIHsKICAgICAgICBpZiAodG1vX21zIDw9 IDEpCiAgICAgICAgICAgIHRtb19qaWZmaWVzID0gdG1vX21zOwogICAgICAgIGVsc2UKICAgICAg ICAgICAgLyogQ29udmVydCB0byBqaWZmaWVzIGFuZCByb3VuZCB1cCAqLwogICAgICAgICAgICB0 bW9famlmZmllcyA9IDEgKyAodG1vX21zICsgMSAtIDEpICogMTYgLyAoMTYwMDAvSFopOwogICAg ICAgIC8qIFJldHVybiB2YWx1ZSBvZiBzY2hlZHVsZV90aW1lb3V0KCkgaXMgdW5leHBpcmVkIHRp bWVvdXQgKi8KICAgICAgICAvKiBXZSB3YW50IDAgZm9yICd0aW1lZG91dCcgKHRvIG1hdGNoIGN2 X3dhaXRfc2lnKCkpICovCiAgICAgICAgcmV0dXJuIHNjaGVkdWxlX3RpbWVvdXQodG1vX2ppZmZp ZXMpICE9IDA7CiAgICB9CgogICAgc2NoZWR1bGUoKTsKICAgIGlmICghc2lnbmFsX3BlbmRpbmco Y3VycmVudCkpCiAgICAgICAgLyogV29rZW4gYnkgdGhlIGV2ZW50ICovCiAgICAgICAgcmV0dXJu IDE7CgogICAgLyogUmVwb3J0IDAgZm9yIGEgc2lnbmFsLCBleGNlcHQgLTEgZm9yIFNJR0tJTEwg KHJlYm9vdCkgKi8KICAgIHJldHVybiBzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWdu YWwsIFNJR0tJTEwpID8gLTEgOiAwOwp9CgppbnQKc3M3X2N2X3dhaXRfZ3V0cyh3YWl0X3F1ZXVl X2hlYWRfdCAqY3ZwLCBzdHJ1Y3QgbXV0ZXggKm10eHAsCiAgICAgICAgaW50IGludGVycnVwdGli bGUsIGludCB0bW9fbXMpCnsKICAgIGludCByOwogICAgc3RydWN0IHdhaXRfcXVldWVfZW50cnkg dzsKICAgIGludCBzbGVlcF9zdGF0ZTsKCiAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmdywgY3Vy cmVudCk7CgogICAgLyogVGVsbCBzY2hlZHVsZXIgd2UgYXJlIGdvaW5nIHRvIHNsZWVwLi4uICov CiAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgIWludGVycnVwdGlibGUpCiAgICAg ICAgLyogV2UgZG9uJ3Qgd2FudCB3YWtpbmcgaW1tZWRpYXRlbHkgKGFnYWluKSAqLwogICAgICAg IHNsZWVwX3N0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CiAgICBlbHNlCiAgICAgICAgc2xl ZXBfc3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAgICBzZXRfY3VycmVudF9zdGF0ZShzbGVl cF9zdGF0ZSk7CgogICAgLyogQ29ubmVjdCB0byBjb25kaXRpb24gdmFyaWFibGUgLi4uICovCiAg ICBhZGRfd2FpdF9xdWV1ZShjdnAsICZ3KTsKICAgIG11dGV4X3VubG9jayhtdHhwKTsgLyogUmVs ZWFzZSBtdXRleCAqLwoKICAgIHIgPSBzczdfc2NoZWR1bGVfdG1vKHRtb19tcyk7CgogICAgLyog RGlzY29ubmVjdCBmcm9tIGNvbmRpdGlvbiB2YXJpYWJsZSAuLi4gKi8KICAgIHJlbW92ZV93YWl0 X3F1ZXVlKGN2cCwgJncpOwoKICAgIC8qIFJlLWFjcXVpcmUgbXV0ZXggKi8KICAgIG11dGV4X2xv Y2sobXR4cCk7CgogICAgLyogcmV0dXJuIDEgaWYgd29rZW4sIDAgaWYgdGltZWRfb3V0L3NpZ25h bCwgLTEgaWYgU0lHS0lMTCAqLwogICAgcmV0dXJuIHI7Cn0KCmludApzczdfY3Zfd2FpdF9zcGlu X2xvY2sod2FpdF9xdWV1ZV9oZWFkX3QgKmN2cCwgc3RydWN0IHNwaW5sb2NrICpsb2NrLAogICAg ICAgIGludCBpbnRlcnJ1cHRpYmxlLCBpbnQgdG1vX21zKQp7CiAgICBpbnQgcjsKICAgIHN0cnVj dCB3YWl0X3F1ZXVlX2VudHJ5IHc7CiAgICBpbnQgc2xlZXBfc3RhdGU7CgogICAgaW5pdF93YWl0 cXVldWVfZW50cnkoJncsIGN1cnJlbnQpOwoKICAgIC8qIFRlbGwgc2NoZWR1bGVyIHdlIGFyZSBn b2luZyB0byBzbGVlcC4uLiAqLwogICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmICFp bnRlcnJ1cHRpYmxlKQogICAgICAgIC8qIFdlIGRvbid0IHdhbnQgd2FraW5nIGltbWVkaWF0ZWx5 IChhZ2FpbikgKi8KICAgICAgICBzbGVlcF9zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwog ICAgZWxzZQogICAgICAgIHNsZWVwX3N0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwogICAgc2V0 X2N1cnJlbnRfc3RhdGUoc2xlZXBfc3RhdGUpOwoKICAgIC8qIENvbm5lY3QgdG8gY29uZGl0aW9u IHZhcmlhYmxlIC4uLiAqLwogICAgYWRkX3dhaXRfcXVldWUoY3ZwLCAmdyk7CiAgICBzcGluX3Vu bG9jayhTUElOTE9DS19DQVNUIGxvY2spOwoKICAgIHIgPSBzczdfc2NoZWR1bGVfdG1vKHRtb19t cyk7CgogICAgLyogRGlzY29ubmVjdCBmcm9tIGNvbmRpdGlvbiB2YXJpYWJsZSAuLi4gKi8KICAg IHJlbW92ZV93YWl0X3F1ZXVlKGN2cCwgJncpOwoKICAgIC8qIFJlLWFjcXVpcmUgbXV0ZXggKi8K ICAgIHNwaW5fbG9jayhTUElOTE9DS19DQVNUIGxvY2spOwoKICAgIHJldHVybiByOwp9CgovKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSoqCioqIHNzN19jdl9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKiogQXdha2VuIGFsbCB0aHJlYWRzIHRoYXQg YXJlIHNsZWVwaW5nIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgICAgICAqKgoqKiBDYWxsZXIg bXVzdCB1c2UgdGhlIGFzc29jaWF0ZWQgbXV0ZXggc2Vuc2libHksIGkuZS4gLi4uICAgICAgICAg ICAgICoqCioqICAgICAgYWNxdWlyZSB0aGUgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKioKKiogICAgICBTZXQgc29tZSBmbGFnIHRoYXQgYSBzbGVl cGluZyB0aHJlYWQgd2lsbCBjaGVjayBmb3IgICAgICAgICAgICAqKgoqKiAgICAgIHNzN19jdl9i cm9hZGNhc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoq CioqICAgICAgcmVsZWFzZSB0aGUgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKioKKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZApzczdfY3ZfYnJvYWRjYXN0 KHdhaXRfcXVldWVfaGVhZF90ICpjb25zdCBjdnApCnsKICAgIHdha2VfdXAoY3ZwKTsKfQoKCnVu c2lnbmVkIGxvbmcKc3M3X2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwg dW5zaWduZWQgbG9uZyBjKQp7CiAgICByZXR1cm4gY29weV90b191c2VyKHRvLCBmcm9tLCBjKTsK fQoKdW5zaWduZWQgbG9uZwpzczdfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQg KmZyb20sIHVuc2lnbmVkIGxvbmcgYykKewogICAgcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBm cm9tLCBjKTsKfQoKdW5zaWduZWQgaW50CnNzN19waWQodm9pZCkKewogICAgcmV0dXJuIGN1cnJl bnQtPnBpZDsKfQoKc3RydWN0IHRhc2tfc3RydWN0ICoKc3M3X2N1cnJlbnRfdGFzayh2b2lkKQp7 CiAgICByZXR1cm4gY3VycmVudDsKfQoKdW5zaWduZWQgaW50CnNzN190YXNrX3BpZChzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnRhc2spCnsKICAgIHJldHVybiB0YXNrLT5waWQ7Cn0KCmludApzczdfZ2x1 ZV90aHJlYWRfZm4odm9pZCAqc3M3X3RocmVhZCkKewogICAgc3M3X3RocmVhZF9ydW4oc3M3X3Ro cmVhZCk7CiAgICBtb2R1bGVfcHV0X2FuZF9leGl0KDApOwogICAgcmV0dXJuIDA7Cn0KCnN0cnVj dCB0YXNrX3N0cnVjdCAqCnNzN19vc190aHJlYWRfY3JlYXRlKHN0cnVjdCBzczdfdGhyZWFkICp0 aHJwLCBjb25zdCBjaGFyICpkZXNjKQp7CiAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAg ICBjb25zdCBjaGFyICpzcDsKICAgIGludCBsZW47CgogICAgaWYgKCF0cnlfbW9kdWxlX2dldChU SElTX01PRFVMRSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogVGhlIHRocmVhZCBkZXNj cmlwdGlvbiBnZXRzIHRydW5jYXRlZCB0byAxNSBjaGFycywgY2FuJ3QgYmUgaGVscGVkIQogICAg ICogVXNlICdzczdtYWludCBvc3N0YXR1cyAtdCcgdG8gZ2V0IHRoZSBmdWxsIGRlc2NyaXB0aW9u LiAqLwoKICAgIC8qIFJlbW92ZSBhbnkgbGVhZGluZyBzcGFjZSBhbmQgdHJ1bmNhdGUgYWZ0ZXIg c2Vjb25kIHdvcmQgKi8KICAgIGlmIChkZXNjWzBdID09ICcgJykKICAgICAgICBkZXNjKys7CiAg ICBsZW4gPSAxMDA7CiAgICBzcCA9IHNzN3N0cmNocihkZXNjLCAnICcpOwogICAgaWYgKHNwICE9 IE5VTEwpIHsKICAgICAgICBzcCA9IHNzN3N0cmNocihzcCArIDEsICcgJyk7CiAgICAgICAgaWYg KHNwICE9IE5VTEwpCiAgICAgICAgICAgIGxlbiA9IHNwIC0gZGVzYzsKICAgIH0KCiAgICB0YXNr ID0ga3RocmVhZF9ydW4oc3M3X2dsdWVfdGhyZWFkX2ZuLCB0aHJwLCAic3M3OiUuKnMiLCBsZW4s IGRlc2MpOwogICAgaWYgKElTX0VSUih0YXNrKSkgewogICAgICAgIG1vZHVsZV9wdXQoVEhJU19N T0RVTEUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIHRhc2s7Cn0KCnZv aWQKc3M3X21zX2RlbGF5KGNvbnN0IHVuc2lnbmVkIGludCBtcykKewogICAgc2V0X2N1cnJlbnRf c3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogICAgc2NoZWR1bGVfdGltZW91dCgodW5zaWdu ZWQgbG9uZyBsb25nKUhaICogbXMgLyAxMDAwKTsKfQoKaW50CnNzN19vc19nZXRfdGlja3Modm9p ZCkKewogICAgcmV0dXJuIGppZmZpZXM7Cn0KCmludApzczdfb3NfdGlja3NfdG9fdXMoaW50IGlu dGVydmFsKQp7CiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAwMDAwIC8gSFo7Cn0KCmludApzczdf b3NfdGlja3NfdG9fbXMoaW50IGludGVydmFsKQp7CiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAw IC8gSFo7Cn0KCmludApzczdfb3NfdGlja3NfdG9fc2VjcyhpbnQgaW50ZXJ2YWwpCnsKICAgIHJl dHVybiBpbnRlcnZhbCAvIEhaOwp9Cgp1bnNpZ25lZCBpbnQKc3M3X2dldF9tc190aW1lKHZvaWQp CnsKICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVwb2NoOwogICAgc3RydWN0IHRpbWVzcGVjIG5v dzsKCiAgICBnZXRyYXdtb25vdG9uaWMoJm5vdyk7CgogICAgaWYgKGVwb2NoID09IDApCiAgICAg ICBlcG9jaCA9IG5vdy50dl9zZWM7CgogICAgcmV0dXJuIChub3cudHZfc2VjIC0gZXBvY2gpICog MTAwMCArIG5vdy50dl9uc2VjIC8gMTAwMDAwMDsKfQoKc3RydWN0IGFjdV9zczdtYWludF90aW1l IHsKICAgdW5zaWduZWQgaW50IHN0X3NlYzsKICAgdW5zaWduZWQgaW50IHN0X3VzZWM7Cn07Cgoj aWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDUsIDAsIDApCnN0YXRpYyBp bmxpbmUgdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQp7CiAgICAgICAg c3RydWN0IHRpbWVzcGVjNjQgdHM7CgogICAgICAgIGt0aW1lX2dldF9yZWFsX3RzNjQoJnRzKTsK ICAgICAgICB0di0+dHZfc2VjID0gdHMudHZfc2VjOwogICAgICAgIHR2LT50dl91c2VjID0gdHMu dHZfbnNlYy8xMDAwdTsKfQojZW5kaWYKCnZvaWQKc3M3X2dldF90aW1lc3RhbXAoc3RydWN0IGFj dV9zczdtYWludF90aW1lICpwdGltZSkKewogICAgc3RydWN0IHRpbWV2YWwgdHY7CgogICAgLyog ZG9fZ2V0dGltZW9mZGF5KCkgcmV0dXJucyAnd2FsbCBjbG9jayB0aW1lJy4KICAgICAqIEl0IGNh biBnbyBiYWNrd2FyZHMuICAqLwogICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAgICBwdGltZS0+ c3Rfc2VjID0gdHYudHZfc2VjOwogICAgcHRpbWUtPnN0X3VzZWMgPSB0di50dl91c2VjOwp9Cgp1 bnNpZ25lZCBpbnQKc3M3X2dldF9lbGFwc2VkKGNvbnN0IHN0cnVjdCBhY3Vfc3M3bWFpbnRfdGlt ZSAqZXBvY2gpCnsKICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgZG9fZ2V0dGltZW9mZGF5KCZ0 dik7CgogICAgcmV0dXJuIHR2LnR2X3NlYyAtIGVwb2NoLT5zdF9zZWM7Cn0KCnZvaWQKc3M3X29z X2xvZ19lcnJvcihjb25zdCBjaGFyICp0ZXh0KQp7CiAgICBwcmludGsoS0VSTl9FTUVSRyAic3M3 c2VydmVyOiAlcyIsIHRleHQpOwogICAgaWYgKG1lbWNtcCh0ZXh0LCAiQXNzZXJ0aW9uIGZhaWwi LCAxNCkgPT0gMCkgewogICAgICAgIGR1bXBfc3RhY2soKTsKICAgICAgICAvKiBBbHRob3VnaCB3 ZSByZXR1cm4sIHRoZSBjYWxsZXIgc2xlZXBzIGZvcmV2ZXIgKi8KICAgICAgICAvKiBSZW1lbWJl ciB0aGUgJ3N0dWNrJyB0YXNrcyAqLwogICAgICAgIGFzc2VydGVkX3Rhc2tzW2Fzc2VydGVkX3Rh c2tfY291bnQrKyAmIDE1XSA9IGN1cnJlbnQ7CiAgICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKiog TWlzY2VsbGFub3VzIHN0cmluZyBhbmQgbWVtb3J5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqKgoqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2b2lkCnNzN21lbXplcm8odm9pZCAqYnVm LCBzaXplX3QgbGVuKQp7CiAgICBtZW1zZXQoYnVmLCAwLCBsZW4pOwp9Cgp2b2lkCnNzN21lbWNw eSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCnsKICAgIG1lbWNweShk ZXN0LCBzcmMsIGxlbik7Cn0KCnZvaWQKc3M3X21lbW1vdmUodm9pZCAqZGVzdCwgY29uc3Qgdm9p ZCAqc3JjLCBzaXplX3QgbGVuKQp7CiAgICBtZW1tb3ZlKGRlc3QsIHNyYywgbGVuKTsKfQoKaW50 CnNzN21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCnsK ICAgIHJldHVybiBtZW1jbXAoczEsIHMyLCBsZW4pOwp9Cgp1bnNpZ25lZCBpbnQKc3M3c3RybGVu KGNvbnN0IGNoYXIgKnN0cikKewogICAgcmV0dXJuIHN0cmxlbihzdHIpOwp9Cgp2b2lkCnNzN3N0 cmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCnsKICAgIHN0cmNweShkZXN0LCBzcmMp Owp9CgppbnQKc3M3c3RyY21wKGNvbnN0IGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKewog ICAgcmV0dXJuIHN0cmNtcChkZXN0LCBzcmMpOwp9CgpjaGFyICoKc3M3c3RybmNweShjaGFyICpj b25zdCBzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQp7CiAgICByZXR1cm4gc3RybmNweShz MSwgczIsIG4pOwp9CgpjaGFyICoKc3M3c3RyY2hyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGludCBj KQp7CiAgICByZXR1cm4gc3RyY2hyKHMsIGMpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCioqIFRDUC9J UCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKioKKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50CnNzN19zY3RwX3N1cHBvcnRlZCh2b2lkKQp7 CiAgICByZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50CnNzN19nZXRfZGVmYXVsdF9hZl9vcHRzKHVu c2lnbmVkIGludCBwcm90b2NvbCwgdW5zaWduZWQgaW50IHBvcnQpCnsKICAgIC8qIFRoZSBTUzcg ZHJpdmVyIG5lZWRzIHRvIGtub3cgdGhlIHdoaWNoIGFkZHJlc3MgZmFtaWxpZXMgKElQdjQgb3Ig SVB2NikKICAgICAqIHRvIHVzZSBmb3IgbGlzdGVuaW5nIHNvY2tldHMuCiAgICAgKgogICAgICog V2hldGhlciBhbiBJUFY2IHNvY2tldCBjYW4gYWNjZXB0IElQVjQgY29ubmVjdGlvbnMgZGVwZW5k cyBvbgogICAgICogdGhlIElQVjZfVjZPTkxZIHNvY2tldCBvcHRpb24uIFRoZSBkZWZhdWx0IGZv ciB3aGljaCBkZXBlbmRzCiAgICAgKiBvbiBuZXQuaXB2Ni5iaW5kdjZvbmx5ICh3aGljaCB1c3Vh bGx5IGRlZmF1bHRzIHRvIDAgLSBhbGxvd2luZyBJUFY0KS4KICAgICAqIFRoZXJlIGFsc28gbWln aHQgYmUga2VybmVscyB3aGVyZSBjbGVhcmluZyBJUFY2X1Y2T05MWSBpcyBkaXNhbGxvd2VkLgog ICAgICoKICAgICAqIE5vcm1hbGx5IG9ubHkgYSBzaW5nbGUgc29ja2V0IGlzIGNyZWF0ZWQgZm9y IGVhY2ggcG9ydCBzaW5jZSBhbiBJUHY2CiAgICAgKiBzb2NrZXQgY2FuIHJlY2VpdmUgSVB2NCBj b25uZWN0aW9ucy4gSG93ZXZlciBhIHNlcGFyYXRlIElQdjQgc29ja2V0CiAgICAgKiBjYW4gYmUg cmVxdWVzdGVkLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUg b2Y6CiAgICAgKiAgICBTUzdfQUZfT1BUX0lQdjYKICAgICAqICAgICAgICBJUFY2IHNvY2tldCB3 aXRoIHRoZSBkZWZhdWx0IElQVjZfVjZPTkxZIHZhbHVlLgogICAgICogICAgU1M3X0FGX09QVF9J UHY2X1Y2T05MWV9DTFIKICAgICAqICAgICAgICBJUFY2IHNvY2tldCB3aXRoIElQVjZfVjZPTkxZ IGV4cGxpY2l0bHkgY2xlYXJlZC4KICAgICAqICAgIFNTN19BRl9PUFRfSVB2Nl9WNk9OTFlfU0VU CiAgICAgKiAgICAgICAgSVBWNiBzb2NrZXQgd2l0aCBJUFY2X1Y2T05MWSBleHBsaWNpdGx5IHNl dC4KICAgICAqIFBvc3NpYmx5IGxvZ2ljYWxseSBvcmVkIHdpdGg6CiAgICAgKiAgICBTUzdfQUZf T1BUX0lQdjQKICAgICAqICAgICAgICBBIHNlcGFyYXRlIElQdjQgc29ja2V0LgogICAgICoKICAg ICAqIEZvciBmbGV4aWJpbGl0eSB0aGUgZGVjaXNpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBwcm90 b2NvbCAoZWl0aGVyCiAgICAgKiBJUFBST1RPX1NDVFAgb3IgSVBQUk9UT19UQ1ApIG9yIHRoZSBw b3J0IG51bWJlci4KICAgICAqCiAgICAgKiBEZWZhdWx0IHRvIGNyZWF0aW5nIGEgc2luZ2xlIHNv Y2tldCBhbmQgZGlzYWJsaW5nIElQVjZfVjZPTkxZLgogICAgICovCiNpZm5kZWYgU1M3X0RFRkFV TFRfQUZfT1BUUwojZGVmaW5lIFNTN19ERUZBVUxUX0FGX09QVFMgU1M3X0FGX09QVF9JUHY2CiNl bmRpZgogICAgIHJldHVybiBTUzdfREVGQVVMVF9BRl9PUFRTOwp9CgovKiBrZXJuZWxfZ2V0L3Nl dF9zb2Nrb3B0KCkgcHJvdG90eXBlcyBoYXZlIChjaGFyICopIGZvciB0aGUgYnVmZmVyLgogKiAj ZGVmaW5lIGEgKHZvaWQgKikgY2FzdC4KICovCiNkZWZpbmUga2VybmVsX3NldHNvY2tvcHQoc29j aywgbGV2ZWwsIG5hbWUsIHZhbCwgbGVuKSBcCiAgICAgICAga2VybmVsX3NldHNvY2tvcHQoc29j aywgbGV2ZWwsIG5hbWUsICh2b2lkICopdmFsLCBsZW4pCiNkZWZpbmUga2VybmVsX2dldHNvY2tv cHQoc29jaywgbGV2ZWwsIG5hbWUsIHZhbCwgbGVuKSBcCiAgICAgICAga2VybmVsX2dldHNvY2tv cHQoc29jaywgbGV2ZWwsIG5hbWUsICh2b2lkICopdmFsLCBsZW4pCgovKiBOb3RlIHRoYXQgd2Ug Y2FuJ3QgKGVhc2lseSkgaG9sZCByZWZlcmVuY2UgY291bnRzIG9uIHRoZSBuYW1lc3BhY2UKICog YmVjYXVzZSBwdXRfbmV0KCkgaXMgR1BMX09OTFkuCiAqIEluc3RlYWQgd2Uga2VlcCBvdXIgb3du IHRhYmxlIGFuZCBjcmVhdGUgYSBzb2NrZXQgdG8gaG9sZCB0aGUKICogcmVmZXJlbmNlIGZvciB1 cy4KICogVGFibGUgZW50cmllcyAwIGFuZCAxIGFsd2F5cyByZWZlciB0byBpbml0X25ldCBhbmQg dGhlIG5hbWVzcGFjZQogKiBvZiB0aGUgKGxhc3Qgc3RhcnRlZCkgc3M3IGRhZW1vbi4gTmVpdGhl ciBpcyByZWZlcmVuY2UgY291bnRlZAogKiAoYWx0aG91Z2ggd2UgaG9sZCBhIHNpbmdsZSByZWZl cmVuY2Ugb24gdGhlIGxhdHRlcikuCiAqIEhpZ2hlciBlbnRyaWVzIGFyZSBzYXZlZCBmcm9tIGlu dm9jYXRpb25zIG9mICdzczdtYWludCBzdGFydCcKICogYW5kICdmaXJtd2FyZSBkb3dubG9hZCcu ICovCgpzdGF0aWMgc3RydWN0IHNzN19uc19pbmZvIHsKICAgIHN0cnVjdCBuZXQgICAgKm5pX25l dF9uczsKICAgIHN0cnVjdCBzb2NrZXQgKm5pX3NvY2s7CiAgICB1bnNpZ25lZCBpbnQgIG5pX3Jl ZmNvdW50Owp9IHNzN19uc190YWJsZVsyNTZdOwoKc3RhdGljIHN0cnVjdCBzb2NrZXQgKgpzczdf Z2x1ZV9jcmVhdGVfbnNfc29ja2V0KHN0cnVjdCBuZXQgKm5ldCkKewogICAgc3RydWN0IHNvY2tl dCAqc29jazsKCiAgICBpZiAoX19zb2NrX2NyZWF0ZShuZXQsIEFGX0lORVQsIFNPQ0tfREdSQU0s IElQUFJPVE9fVURQLCAmc29jaywgMCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByZXR1cm4g c29jazsKfQoKdm9pZApzczdfbmV0X25zX2dldCh1bnNpZ25lZCBpbnQgbmFtZXNwYWNlKQp7CiAg ICB1bnNpZ25lZCBpbnQgaWR4ID0gU1M3X05FVF9OU19JRFgobmFtZXNwYWNlKTsKCiAgICBpZiAo aWR4IDw9IFNTN19ORVRfTlNfSURYKFNTN19ORVRfTlNfREFFTU9OKSkKICAgICAgICAvKiBTUzdf TkVUX05TX0lOSVQgYW5kIFNTN19ORVRfTlNfREFFTU9OIGFyZW4ndCByZWYtY291bnRlZCAqLwog ICAgICAgIHJldHVybjsKCiAgICBzczdfbXV0ZXhfZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAg IHNzN19uc190YWJsZVtpZHhdLm5pX3JlZmNvdW50Kys7CiAgICBzczdfbXV0ZXhfZXhpdCgmc3M3 X2dsdWVfbXV0ZXgpOwoKICAgIHNzN190cmFjZV9wcmludGYoMCwgInNzN19uZXRfbnNfZ2V0KCV4 KTogcmVmY291bnQgJWQsIHNvY2sgJXAsIG5ldCAlcFxuIiwKICAgICAgICAgICAgbmFtZXNwYWNl LCBzczdfbnNfdGFibGVbaWR4XS5uaV9yZWZjb3VudCwgc3M3X25zX3RhYmxlW2lkeF0ubmlfc29j aywKICAgICAgICAgICAgc3M3X25zX3RhYmxlW2lkeF0ubmlfbmV0X25zKTsKfQoKdm9pZApzczdf bmV0X25zX3B1dCh1bnNpZ25lZCBpbnQgbmFtZXNwYWNlKQp7CiAgICBzdHJ1Y3Qgc3M3X25zX2lu Zm8gKm5pOwogICAgdW5zaWduZWQgaW50IGlkeCA9IFNTN19ORVRfTlNfSURYKG5hbWVzcGFjZSk7 CgogICAgaWYgKGlkeCA8PSBTUzdfTkVUX05TX0lEWChTUzdfTkVUX05TX0RBRU1PTikpCiAgICAg ICAgLyogU1M3X05FVF9OU19JTklUIGFuZCBTUzdfTkVUX05TX0RBRU1PTiBhcmVuJ3QgcmVmLWNv dW50ZWQgKi8KICAgICAgICByZXR1cm47CiAgICBuaSA9IHNzN19uc190YWJsZSArIGlkeDsKCiAg ICBzczdfdHJhY2VfcHJpbnRmKDAsICJzczdfbmV0X25zX3B1dCgleCk6IHJlZmNvdW50ICVkLCBz b2NrICVwLCBuZXQgJXBcbiIsCiAgICAgICAgICAgIG5hbWVzcGFjZSwgbmktPm5pX3JlZmNvdW50 LCBuaS0+bmlfc29jaywgbmktPm5pX25ldF9ucyk7CgogICAgc3M3X211dGV4X2VudGVyKCZzczdf Z2x1ZV9tdXRleCk7CiAgICBpZiAobmktPm5pX3JlZmNvdW50ICYmICEtLW5pLT5uaV9yZWZjb3Vu dCkgewogICAgICAgIC8qIExhc3QgcmVmZXJlbmNlIGdvbmUgKi8KICAgICAgICBzb2NrX3JlbGVh c2UobmktPm5pX3NvY2spOwogICAgICAgIG5pLT5uaV9uZXRfbnMgPSBOVUxMOwogICAgICAgIG5p LT5uaV9zb2NrID0gTlVMTDsKICAgIH0KICAgIHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRl eCk7Cn0KCnN0YXRpYyB2b2lkCnNzN19uZXRfbnNfdW5sb2FkKHZvaWQpCnsKICAgIHVuc2lnbmVk IGludCBpZHg7CiAgICBzdHJ1Y3Qgc3M3X25zX2luZm8gKm5pOwoKICAgIGZvciAoaWR4ID0gMTsg aWR4IDwgQVJSQVlfU0laRShzczdfbnNfdGFibGUpOyBpZHgrKykgewogICAgICAgIG5pID0gc3M3 X25zX3RhYmxlICsgaWR4OwogICAgICAgIGlmICghbmktPm5pX3NvY2spCiAgICAgICAgICAgIGNv bnRpbnVlOwoKICAgICAgICAvKiBUaGlzIHNob3VsZCBvbmx5IHJlcG9ydCBhbnl0aGluZyBmb3Ig dGhlICdkYWVtb24nIHNsb3QgKi8KICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzczdfbmV0X25z X3VubG9hZCgpOiBpZHggJWQsIHJlZmNvdW50ICVkLCBzb2NrICVwLCBuZXQgJXBcbiIsCiAgICAg ICAgICAgICAgICBpZHgsIG5pLT5uaV9yZWZjb3VudCwgbmktPm5pX3NvY2ssIG5pLT5uaV9uZXRf bnMpOwogICAgICAgIHNvY2tfcmVsZWFzZShuaS0+bmlfc29jayk7CiAgICAgICAgbmktPm5pX25l dF9ucyA9IE5VTEw7CiAgICAgICAgbmktPm5pX3NvY2sgPSBOVUxMOwogICAgICAgIG5pLT5uaV9y ZWZjb3VudCA9IDA7CiAgICB9Cn0KCnVuc2lnbmVkIGludApzczdfbmV0X25zX3NldCh1bnNpZ25l ZCBpbnQgbmV3X25hbWVzcGFjZSwgdW5zaWduZWQgaW50IG9sZF9uYW1lc3BhY2UpCnsKICAgIHN0 YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3VzZWRfaWR4ID0gMjsKICAgIHVuc2lnbmVkIGludCBpZHgs IGZyZWVfaWR4OwogICAgc3RydWN0IHNzN19uc19pbmZvICpuaTsKICAgIHN0cnVjdCBuZXQgKm5l dDsKCiAgICAvKiBUaGUgbmV3X25hbWVzcGFjZSBzaG91bGQgaGF2ZSB0aGUgbG93IDE2IGJpdHMg emVyby4KICAgICAqIFRoZSBsb3cgYml0cyBvZiBvbGRfbmFtZXNwYWNlIGluZGljYXRlIHdoYXQg d2FzIGFjdHVhbGx5IGJlaW5nIHVzZWQuICovCgogICAgaWYgKG5ld19uYW1lc3BhY2UgIT0gU1M3 X05FVF9OU19TVEFSVCkgewogICAgICAgIHNzN19uZXRfbnNfcHV0KG9sZF9uYW1lc3BhY2UpOwog ICAgICAgIHJldHVybiBuZXdfbmFtZXNwYWNlID09IFNTN19ORVRfTlNfREFFTU9OID8gU1M3X05F VF9OU19EQUVNT04gOiBTUzdfTkVUX05TX0lOSVQ7CiAgICB9CgogICAgLyogU1M3X05FVF9OU19T VEFSVCAtIGxvb2sgZm9yIGFuIGVudHJ5IGZvciB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50 IAogICAgICogcHJvY2VzcyAod2hpY2ggd2lsbCBiZSAnc3M3bWFpbnQgc3RhcnQnKS4gKi8KICAg IG5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKCiAgICBpZHggPSBTUzdfTkVUX05TX0lE WChvbGRfbmFtZXNwYWNlKTsKICAgIG5pID0gc3M3X25zX3RhYmxlICsgaWR4OwogICAgaWYgKG5p LT5uaV9uZXRfbnMgPT0gbmV0KQogICAgICAgIC8qIFVuY2hhbmdlZCBpbmRleCwgbm8gbmVlZCB0 byBjaGFuZ2UgcmVmZXJlbmNlIGNvdW50ICovCiAgICAgICAgcmV0dXJuIFNTN19ORVRfTlNfU1RB UlQgfCBpZHg7CgogICAgLyogRGlmZmVyZW50IHNsb3QgbmVlZGVkLCBkcm9wIG9sZCByZWZlcmVu Y2UgKi8KICAgIHNzN19uZXRfbnNfcHV0KG9sZF9uYW1lc3BhY2UpOwoKICAgIC8qIENoZWNrIGlu aXQgYW5kIGRhZW1vbiBlbnRyaWVzLCBuZWl0aGVyIGdvZXMgYXdheSAqLwogICAgaWYgKGlkeCAh PSBTUzdfTkVUX05TX0lEWChTUzdfTkVUX05TX0lOSVQpCiAgICAgICAgICAgICYmIG5ldCA9PSAm aW5pdF9uZXQpCiAgICAgICAgcmV0dXJuIFNTN19ORVRfTlNfU1RBUlQgfCBTUzdfTkVUX05TX0lE WChTUzdfTkVUX05TX0lOSVQpOwoKICAgIGlkeCA9IFNTN19ORVRfTlNfSURYKFNTN19ORVRfTlNf REFFTU9OKTsKICAgIG5pID0gc3M3X25zX3RhYmxlICsgaWR4OwogICAgaWYgKG5ldCA9PSBuaS0+ bmlfbmV0X25zKQogICAgICAgIHJldHVybiBTUzdfTkVUX05TX1NUQVJUIHwgaWR4OwoKICAgIHNz N19tdXRleF9lbnRlcigmc3M3X2dsdWVfbXV0ZXgpOwoKICAgIC8qIFNjYW4gdGFibGUgZm9yIGFu IGV4aXN0aW5nIHJlZmVyZW5jZSAqLwogICAgZnJlZV9pZHggPSAwOwogICAgZm9yIChpZHggPSAy OyBpZHggPCBudW1fdXNlZF9pZHg7IGlkeCsrKSB7CiAgICAgICAgbmkgPSBzczdfbnNfdGFibGUg KyBpZHg7CiAgICAgICAgaWYgKG5pLT5uaV9uZXRfbnMgPT0gbmV0KSB7CiAgICAgICAgICAgIC8q IGZvdW5kIGEgbWF0Y2ggKi8KICAgICAgICAgICAgbmktPm5pX3JlZmNvdW50Kys7CiAgICAgICAg ICAgIHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgICAgIHNzN190cmFj ZV9wcmludGYoMCwgInNzN19uZXRfbnNfc2V0KCV4LCAleCk6IGZvdW5kIGlkeCAlZCwgcmVmY291 bnQgJWQsIHNvY2sgJXAsIG5ldCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZXNw YWNlLCBvbGRfbmFtZXNwYWNlLCBpZHgsIG5pLT5uaV9yZWZjb3VudCwgbmktPm5pX3NvY2ssIG5p LT5uaV9uZXRfbnMpOwogICAgICAgICAgICByZXR1cm4gU1M3X05FVF9OU19TVEFSVCB8IGlkeDsK ICAgICAgICB9CiAgICAgICAgaWYgKCFmcmVlX2lkeCAmJiAhbmktPm5pX25ldF9ucykKICAgICAg ICAgICAgZnJlZV9pZHggPSBpZHg7CiAgICB9CgogICAgLyogTm90IGZvdW5kIGFsbG9jYXRlIGxv d2VzdCBmcmVlIHNsb3QgKi8KICAgIGlmICghZnJlZV9pZHgpIHsKICAgICAgICBpZiAobnVtX3Vz ZWRfaWR4ID49IEFSUkFZX1NJWkUoc3M3X25zX3RhYmxlKSkKICAgICAgICAgICAgLyogVGFibGUg ZnVsbCwgYm9ya2VkICovCiAgICAgICAgICAgIGdvdG8gbm9fcmVmOwogICAgICAgIGZyZWVfaWR4 ID0gbnVtX3VzZWRfaWR4Kys7CiAgICB9CgogICAgbmkgPSAmc3M3X25zX3RhYmxlW2ZyZWVfaWR4 XTsKICAgIG5pLT5uaV9zb2NrID0gc3M3X2dsdWVfY3JlYXRlX25zX3NvY2tldChuZXQpOwogICAg aWYgKCFuaS0+bmlfc29jaykKICAgICAgICBnb3RvIG5vX3JlZjsKICAgIG5pLT5uaV9uZXRfbnMg PSBuZXQ7CgogICAgc3M3X211dGV4X2V4aXQoJnNzN19nbHVlX211dGV4KTsKICAgIHNzN190cmFj ZV9wcmludGYoMCwgInNzN19uZXRfbnNfc2V0KCV4LCAleCk6IG5ldyBpZHggJWQsIHNvY2sgJXAs IG5ldCAlcFxuIiwKICAgICAgICAgICAgbmV3X25hbWVzcGFjZSwgb2xkX25hbWVzcGFjZSwgZnJl ZV9pZHgsIG5pLT5uaV9zb2NrLCBuaS0+bmlfbmV0X25zKTsKCiAgICByZXR1cm4gU1M3X05FVF9O U19TVEFSVCB8IGZyZWVfaWR4OwoKICBub19yZWY6CiAgICBzczdfbXV0ZXhfZXhpdCgmc3M3X2ds dWVfbXV0ZXgpOwogICAgc3M3X3RyYWNlX3ByaW50ZigwLCAic3M3X25ldF9uc19zZXQoJXgsICV4 KTogbm9fcmVmXG4iLAogICAgICAgICAgICBuZXdfbmFtZXNwYWNlLCBvbGRfbmFtZXNwYWNlKTsK ICAgIHJldHVybiBTUzdfTkVUX05TX1NUQVJUOwp9Cgp2b2lkCnNzN19nbHVlX2RhZW1vbl9vcGVu KHZvaWQpCnsKICAgIHN0cnVjdCBzczdfbnNfaW5mbyAqbmkgPSAmc3M3X25zX3RhYmxlW1NTN19O RVRfTlNfSURYKFNTN19ORVRfTlNfREFFTU9OKV07CiAgICBzdHJ1Y3QgbmV0ICpuZXQgPSBjdXJy ZW50LT5uc3Byb3h5LT5uZXRfbnM7CgogICAgLyogU2F2ZSAoYW5kIHJlZmVyZW5jZSBjb3VudCkg dGhlIG5ldHdvcmsgbmFtZXNwYWNlIHRoZSBzczcgZGFlbW9uCiAgICAgKiBpcyBzdGFydGVkIGlu LiAqLwoKICAgIC8qIEluaXRpYWxpc2UgdGhlIGVudHJ5IGZvciBpbml0X25ldCBoZXJlIC0gaGFz IHRvIGJlIGRvbmUgc29tZXdoZXJlLiAqLwogICAgc3M3X25zX3RhYmxlW1NTN19ORVRfTlNfSURY KFNTN19ORVRfTlNfSU5JVCldLm5pX25ldF9ucyA9ICZpbml0X25ldDsKCiAgICBpZiAobmV0ID09 IG5pLT5uaV9uZXRfbnMpCiAgICAgICAgLyogVW5jaGFuZ2VkICovCiAgICAgICAgcmV0dXJuOwoK ICAgIGlmIChuaS0+bmlfc29jaykKICAgICAgICBzb2NrX3JlbGVhc2UobmktPm5pX3NvY2spOwog ICAgbmktPm5pX3NvY2sgPSBOVUxMOwoKICAgIGlmIChuZXQgIT0gJmluaXRfbmV0ICYmICEoKG5p LT5uaV9zb2NrID0gc3M3X2dsdWVfY3JlYXRlX25zX3NvY2tldChuZXQpKSkpCiAgICAgICAgLyog Q2FuJ3QgY3JlYXRlIHNvY2tldCwgZGVmYXVsdCB0byBnbG9iYWwgbmFtZXNwYWNlICovCiAgICAg ICAgbmV0ID0gJmluaXRfbmV0OwoKICAgIG5pLT5uaV9uZXRfbnMgPSBuZXQ7Cn0KCmludApzczdf c29ja2V0KGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBu YW1lc3BhY2UsIHN0cnVjdCBzb2NrZXQgKipzb2NrcCkKewogICAgc3RydWN0IHNvY2tldCAqc29j azsKICAgIHN0cnVjdCBuZXQgKm5ldDsKICAgIHVuc2lnbmVkIGludCBvbmUgPSAxVTsKICAgIGlu dCBydmFsOwoKICAgIG5ldCA9IHNzN19uc190YWJsZVtTUzdfTkVUX05TX0lEWChuYW1lc3BhY2Up XS5uaV9uZXRfbnM7CiAgICBpZiAoIW5ldCkKICAgICAgICBuZXQgPSAmaW5pdF9uZXQ7CgogICAg LyogSWYgd2UgaGF2ZSB0byBhdXRvbG9hZCB0aGUgc2N0cCBtb2R1bGUsIHdlIG1pZ2h0IHJlLWVu dGVyIGl0CiAgICAgKiBiZWZvcmUgaXQgaGFzIGZpbmlzaGVkIGluaXRpYWxpc2luZyAtIG1pZ2h0 IGdvICdib29tJy4gKi8KICAgIHNzN19tdXRleF9lbnRlcigmc3M3X2dsdWVfbXV0ZXgpOwoKICAg IC8qIHNvY2tfY3JlYXRlX2tlcm4oKSBjcmVhdGVzIGEgc29ja2V0IHRoYXQgZG9lc24ndCBob2xk IGEgcmVmZXJlbmNlCiAgICAgKiB0byB0aGUgbmFtZXNwYWNlICh0aGV5IGdldCB1c2VkIGZvciBz b2NrZXRzIG5lZWRlZCBieSB0aGUgcHJvdG9jb2wKICAgICAqIHN0YWNrIGNvZGUgaXRzZWxmKS4K ICAgICAqIFdlIG5lZWQgYSBzb2NrZXQgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbmFt ZXNwYWNlLCBzbyBjcmVhdGUKICAgICAqIGEgJ3VzZXInIHNvY2tldCBpbiBhIHNwZWNpZmljIG5h bWVzcGFjZS4KICAgICAqIFRoaXMgYWRkcyBhbiBleHRyYSBzZWN1cml0eSBjaGVjayB3aGljaCB3 ZSBzaG91bGQgcGFzcyBiZWNhdXNlIGFsbCB0aGUKICAgICAqIHNvY2tldHMgYXJlIGNyZWF0ZWQg Ynkga2VybmVsIHRocmVhZHMuCiAgICAgKi8KICAgIHJ2YWwgPSBfX3NvY2tfY3JlYXRlKG5ldCwg ZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgc29ja3AsIDApOwogICAgc3M3X211dGV4X2V4aXQoJnNz N19nbHVlX211dGV4KTsKICAgIGlmIChydmFsICE9IDApCiAgICAgICAgcmV0dXJuIHJ2YWw7CiAg ICBzb2NrID0gKnNvY2twOwoKICAgIGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQs IFNPX1JFVVNFQUREUiwgJm9uZSwgc2l6ZW9mIG9uZSk7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQK c3M3X3NldHNvY2tvcHRfbm9kZWxheShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZW5hYmxlZCkK ewogICAga2VybmVsX3NldHNvY2tvcHQoc29jaywgU0tfUFJPVE9DT0woc29jayksCiAgICAgICAg ICAgIFNLX1BST1RPQ09MKHNvY2spID09IElQUFJPVE9fVENQID8gVENQX05PREVMQVkgOiBTQ1RQ X05PREVMQVksCiAgICAgICAgICAgICZlbmFibGVkLCBzaXplb2YgZW5hYmxlZCk7Cn0KCnN0YXRp YyB2b2lkCnNzN19zY3RwX3NldF9vcHRzKHN0cnVjdCBzb2NrZXQgKnNvY2spCnsKICAgIHN0cnVj dCBzY3RwX2V2ZW50X3N1YnNjcmliZSBldmVudHM7CiAgICBpbnQgbGVuLCBydmFsOwoKICAgIGlm IChTS19QUk9UT0NPTChzb2NrKSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuOwoKICAg IGxlbiA9IHNpemVvZiBldmVudHM7CiAgICBydmFsID0ga2VybmVsX2dldHNvY2tvcHQoc29jaywg SVBQUk9UT19TQ1RQLCBTQ1RQX0VWRU5UUywgJmV2ZW50cywgJmxlbik7CiAgICBpZiAocnZhbCAh PSAwKQogICAgICAgIHJldHVybjsKCiAgICAvKiBXZSBuZWVkIHRvIGtub3cgdGhlIHN0cmVhbSBh bmQgcHBpZCAqLwogICAgZXZlbnRzLnNjdHBfZGF0YV9pb19ldmVudCA9IDE7CiAgICAvKiBFbmFi bGUgbm90aWZpY2F0aW9ucyB0byBkZXRlY3QgY29ubmVjdGlvbiByZXN0YXJ0ICovCiAgICBldmVu dHMuc2N0cF9hc3NvY2lhdGlvbl9ldmVudCA9IDE7CiAgICBrZXJuZWxfc2V0c29ja29wdChzb2Nr LCBJUFBST1RPX1NDVFAsIFNDVFBfRVZFTlRTLCAmZXZlbnRzLCBzaXplb2YgZXZlbnRzKTsKfQoK dW5zaWduZWQgaW50CnNzN19nZXRfbWF4X3NjdHBfb3N0cmVhbXMoc3RydWN0IHNvY2tldCAqc29j aykKewogICAgc3RydWN0IHNjdHBfc3RhdHVzIHNzdGF0OwogICAgaW50IGxlbjsKCiAgICBpZiAo U0tfUFJPVE9DT0woc29jaykgIT0gSVBQUk9UT19TQ1RQKQogICAgICAgIHJldHVybiAwOwoKICAg IGxlbiA9IHNpemVvZiBzc3RhdDsKICAgIGlmIChrZXJuZWxfZ2V0c29ja29wdChzb2NrLCBJUFBS T1RPX1NDVFAsIFNDVFBfU1RBVFVTLCAmc3N0YXQsICZsZW4pKQogICAgICAgIHJldHVybiAwOwoK ICAgIHJldHVybiBzc3RhdC5zc3RhdF9vdXRzdHJtczsKfQoKdm9pZApzczdfc2V0X21heF9zY3Rw X3N0cmVhbXMoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IG1heF9zdHJlYW1zKQp7 CiAgICBzdHJ1Y3Qgc2N0cF9pbml0bXNnIHNpbml0OwoKICAgIGlmIChTS19QUk9UT0NPTChzb2Nr KSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuOwoKICAgIG1lbXNldCgmc2luaXQsIDAs IHNpemVvZiBzaW5pdCk7CgogICAgc2luaXQuc2luaXRfbnVtX29zdHJlYW1zID0gbWF4X3N0cmVh bXM7CiAgICBzaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zID0gbWF4X3N0cmVhbXM7CiAgICBrZXJu ZWxfc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1NDVFAsIFNDVFBfSU5JVE1TRywgJnNpbml0LCBz aXplb2Ygc2luaXQpOwp9Cgp2b2lkCnNzN190cmFuc19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQg KnNvY2spCnsKICAgIHVuc2lnbmVkIGludCBvbmUgPSAxVTsKCiAgICBzczdfc2V0c29ja29wdF9u b2RlbGF5KHNvY2ssIDEpOwogICAgc3M3X3NjdHBfc2V0X29wdHMoc29jayk7CiAgICBpZiAoU0tf UFJPVE9DT0woc29jaykgPT0gSVBQUk9UT19UQ1ApCiAgICAgICAga2VybmVsX3NldHNvY2tvcHQo c29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmb25lLCBzaXplb2Ygb25lKTsKfQoKdm9p ZApzczdfdHJhbnNiaW5kX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaykKewogICAgLyog U2V0IG9wdGlvbnMgZm9yIGEgbGlzdGVuaW5nIHNvY2tldCAqLwogICAgc3M3X3NjdHBfc2V0X29w dHMoc29jayk7CgogICAgLyogTTNVQSBtYXkgbmVlZCAxNiBkYXRhIHN0cmVhbXMsIGl0IGlzIGp1 c3QgVEZIIHRvIGNvbmZpZ3VyZSB0aGlzICovCiAgICBzczdfc2V0X21heF9zY3RwX3N0cmVhbXMo c29jaywgMSArIDE2KTsKfQoKI2RlZmluZSBJUF9BRERSX0xFTihzYSkgKChzYSktPnNpbjZfZmFt aWx5ID09IEFGX0lORVQ2ID8gc2l6ZW9mICooc2EpIDogMTYpCmludApzczdfY29ubmVjdChzdHJ1 Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYSkKewogICAgcmV0dXJuIGtl cm5lbF9jb25uZWN0KHNvY2ssICh2b2lkICopc2EsIElQX0FERFJfTEVOKHNhKSwgT19SRFdSKTsK fQoKaW50CnNzN19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYg KnNhLCB1bnNpZ25lZCBpbnQgYWZfb3B0cykKewogICAgLyogSWYgd2UgYXJlIGJpbmRpbmcgSU5B RERSNl9BTlkgdG8gYW4gSVB2NiBzb2NrZXQgKHR5cGljYWxseSBmb3IKICAgICAqIGEgbGlzdGVu aW5nIHNvY2tldCkgdGhlbiB3ZSBwcm9iYWJseSB3YW50IHRvIGVuc3VyZSB0aGF0IElQVjZfVjZP TkxZCiAgICAgKiBpcyAwIHNvIHRoYXQgdGhlIHNvY2tldCB3aWxsIGFsc28gYmUgZ2l2ZW4gSVB2 NCBjb25uZWN0aW9ucy4gKi8KICAgIGlmIChzYS0+c2luNl9mYW1pbHkgPT0gQUZfSU5FVDYgJiYg YWZfb3B0cyAmIFNTN19BRl9PUFRfSVB2Nl9WNk9OTFkKICAgICAgICAgICAgJiYgc2EtPnNpbjZf YWRkci5pbjZfdS51Nl9hZGRyMzJbMF0gPT0gMAogICAgICAgICAgICAmJiAoc2EtPnNpbjZfYWRk ci5pbjZfdS51Nl9hZGRyMzJbMV0KICAgICAgICAgICAgICAgIHwgc2EtPnNpbjZfYWRkci5pbjZf dS51Nl9hZGRyMzJbMl0KICAgICAgICAgICAgICAgIHwgc2EtPnNpbjZfYWRkci5pbjZfdS51Nl9h ZGRyMzJbM10pID09IDApIHsKICAgICAgICBpbnQgdjZvbmx5ID0gYWZfb3B0cyAmIDE7CiAgICAg ICAga2VybmVsX3NldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJnY2 b25seSwgc2l6ZW9mIHY2b25seSk7CiAgICB9CgogICAgcmV0dXJuIGtlcm5lbF9iaW5kKHNvY2ss ICh2b2lkICopc2EsIElQX0FERFJfTEVOKHNhKSk7Cn0KCmludApzczdfYmluZHgoc3RydWN0IHNv Y2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX2luNiAqc2EpCnsKICAgIGlmIChTS19QUk9UT0NP TChzb2NrKSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7 CgogICAgcmV0dXJuIGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fU0NUUCwgU0NUUF9T T0NLT1BUX0JJTkRYX0FERCwKICAgICAgICAgICAgc2EsIElQX0FERFJfTEVOKHNhKSk7Cn0KCmlu dApzczdfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZW4pCnsKICAgIHJldHVybiBr ZXJuZWxfbGlzdGVuKHNvY2ssIGxlbik7Cn0KCmludApzczdfYWNjZXB0KHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrZXQgKipuZXdfc29ja3AsIGludCBmbGFncykKewogICAgcmV0dXJu IGtlcm5lbF9hY2NlcHQoc29jaywgbmV3X3NvY2twLCBmbGFncyk7Cn0KCiNpZiBMSU5VWF9WRVJT SU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LCAxNywgMCkKc3RhdGljIGlubGluZSBpbnQKc3M3 X2tlcm5lbF9nZXRzb2NrbmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIg KmFkZHJlc3MpCnsKICAgIGludCBlcnIsIGxlbjsKCiAgICBlcnIgPSBrZXJuZWxfZ2V0c29ja25h bWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsICZsZW4pOwogICAgcmV0dXJuIGVy ciA/IGVyciA6IGxlbjsKfQojZGVmaW5lIGtlcm5lbF9nZXRzb2NrbmFtZSBzczdfa2VybmVsX2dl dHNvY2tuYW1lCgpzdGF0aWMgaW5saW5lIGludApzczdfa2VybmVsX2dldHBlZXJuYW1lKHN0cnVj dCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcykKewogICAgaW50IGVyciwg bGVuOwoKICAgIGVyciA9IGtlcm5lbF9nZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRy ICopYWRkcmVzcywgJmxlbik7CiAgICByZXR1cm4gZXJyID8gZXJyIDogbGVuOwp9CiNkZWZpbmUg a2VybmVsX2dldHBlZXJuYW1lIHNzN19rZXJuZWxfZ2V0cGVlcm5hbWUKI2VuZGlmCgppbnQKc3M3 X2dldF9sb2NfcG9ydChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQp7CiAgICBjaGFyIGFkZHJlc3NbMTI4 IC8qTUFYX1NPQ0tfQUREUiovXTsKICAgIGludCBsZW47CgogICAgbGVuID0ga2VybmVsX2dldHNv Y2tuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzKTsKICAgIGlmIChsZW4gPCAw KQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIFRoaXMgd29ya3Mgd2VsbCBlbm91Z2ggZm9yIElQ djQgYW5kIElQdjYgKi8KICAgIHJldHVybiBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFk ZHJlc3MpLT5zaW5fcG9ydCk7Cn0KCmludApzczdfZ2V0X3JlbV9hZGRyKHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhZGRyKQp7CiAgICBpbnQgbGVuOwoKICAgIGxl biA9IGtlcm5lbF9nZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopc2FkZHIpOwog ICAgaWYgKGxlbiA8IDApCiAgICAgICAgcmV0dXJuIGxlbjsKCiAgICBpZiAobGVuID4gc2l6ZW9m ICpzYWRkcikKICAgICAgICBwcmludGsoS0VSTl9FTUVSRyAic3M3c2VydmVyOiBzb2NrZXQgYWRk cmVzcyAoZmFtaWx5ICVkKSAlZCA+ICVkIiwKICAgICAgICAgICAgICAgIHNhZGRyLT5zaW42X2Zh bWlseSwgbGVuLCAoaW50KXNpemVvZiAqc2FkZHIpOwoKICAgIHJldHVybiAwOwp9CgppbnQKc3M3 X3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCnsKI2lmIExJTlVYX1ZFUlNJ T05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDE4LCAwKQogICAgaWYgKFNLX1BST1RPQ09MKHNv Y2spID09IElQUFJPVE9fU0NUUCkgewogICAgICAgIHN0cnVjdCBsaW5nZXIgbGluZ2VyOwoKICAg ICAgICAvKiBJZiB3ZSBjYWxsIGtlcm5lbF9zb2NrX3NodXRkb3duKCkgdGhlbiB0aGUgY29ubmVj dGlvbiBpc24ndCByZWxlYXNlZAogICAgICAgICAqIHVudGlsIGFsbCBvdXRzdGFuZGluZyBkYXRh IGhhcyBiZWVuIGFja2VkLgogICAgICAgICAqIElmIHRoZSByZW1vdGUgc3lzdGVtIHNlbmRzIGFu IElOSVQgKHJlc3RhcnRpbmcgdGhlIGNvbm5lY3Rpb24pCiAgICAgICAgICogd2hpbGUgdGhlIGxp bnV4IGtlcm5lbCBpcyB3YWl0aW5nIGZvciBkYXRhIHRvIGJlIGFja2VkIHRoZW4gaXQKICAgICAg ICAgKiB3aWxsIG5ldmVyIGRpc2Nvbm5lY3QuCiAgICAgICAgICogRW5hYmxpbmcgJ2xpbmdlcicg d2l0aCBhIGRlbGF5IG9mIHplcm8gY2F1c2VzIHNvY2tfcmVsZWFzZSgpCiAgICAgICAgICogdG8g YWJvcnQgdGhlIGNvbm5lY3Rpb24gKHNlbmRzIGFuIEFCT1JUIGNodW5rKS4KICAgICAgICAgKgog ICAgICAgICAqIFRoZSBzczcgY29kZSBuZXZlciBuZWVkcyB0byB3YWl0IGZvciBzZW50IGRhdGEg dG8gYmUgYWNrZWQsCiAgICAgICAgICogc28gYWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24gZG9lc24n dCByZWFsbHkgbWF0dGVyLgogICAgICAgICAqIEFsbCBjYWxscyB0byBzczdfc2h1dGRvd24oKSBh cmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgY2FsbHMgdG8KICAgICAgICAgKiBzczdfY2xvc2Vz b2NrZXQoKS4KICAgICAgICAgKgogICAgICAgICAqIFBsYXVzaWJseSB3ZSBzaG91bGQgYWx3YXlz IGFib3J0IGNvbm5lY3Rpb25zIGlmIHdlIGFyZSBkaXNjb25uZWN0aW5nCiAgICAgICAgICogZHVl IHRvIGFuIGFwcGxpY2F0aW9uIGxldmVsIHRpbWVvdXQuCiAgICAgICAgICoKICAgICAgICAgKiBG aXhlZCBieSB0aGUga2VybmVsIHBhdGNoOgogICAgICAgICAqICAgICJzY3RwOiBoYW5kbGUgYXNz b2NpYXRpb24gcmVzdGFydHMgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCIKICAgICAgICAgKiBL bm93biB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIGtlcm5lbHM6CiAgICAgICAgICog IC0gbWFpbmxpbmUgMy4xOAogICAgICAgICAqICAtIFVidW50dSAzLjEzLjExLjExCiAgICAgICAg ICogUXVldWVkIGZvciAzLjEwLXN0YWJsZSwgMy4xNC1zdGFibGUsIDMuMTYtc3RhYmxlIGFuZCAz LjE3LXN0YWJsZQogICAgICAgICAqLwoKICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CiAgICAg ICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKICAgICAgICBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBT T0xfU09DS0VULCBTT19MSU5HRVIsICZsaW5nZXIsIHNpemVvZiBsaW5nZXIpOwoKICAgICAgICBy ZXR1cm4gMDsKICAgIH0KI2VuZGlmCiAgICByZXR1cm4ga2VybmVsX3NvY2tfc2h1dGRvd24oc29j aywgaG93KTsKfQoKdm9pZApzczdfY2xvc2Vzb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaykKewog ICAgc29ja19yZWxlYXNlKHNvY2spOwp9CgppbnQKc3M3X3NlbmQoc3RydWN0IHNvY2tldCAqc29j aywgc3RydWN0IHNzN19pb3ZlYyAqaW92LCBpbnQgaW92bGVuLCBpbnQgdG90bGVuLAogICAgICAg IHZvaWQgKmN0bCwgaW50IGN0bF9sZW4sIHVuc2lnbmVkIGludCBmbGFncykKewogICAgc3RydWN0 IG1zZ2hkciBtc2c7CgogICAgbXNnLm1zZ19uYW1lICAgICAgID0gMDsKICAgIG1zZy5tc2dfbmFt ZWxlbiAgICA9IDA7CiAgICBtc2cubXNnX2NvbnRyb2wgICAgPSBjdGw7CiAgICBtc2cubXNnX2Nv bnRyb2xsZW4gPSBjdGxfbGVuOwogICAgbXNnLm1zZ19mbGFncyAgICAgID0gZmxhZ3MgfCBNU0df Tk9TSUdOQUw7CgogICAgcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIGlvdiwgaW92 bGVuLCB0b3RsZW4pOwp9CgppbnQKc3M3X3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWdu ZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgaW50IGZsYWdzKQp7CiAgICBzdHJ1Y3Qga3ZlYyBp b3Y7CiAgICBzdHJ1Y3QgbXNnaGRyIG1zZzsKCiAgICBpZiAoIXNvY2stPnNrKQogICAgICAgIHJl dHVybiAwOwoKICAgIGlvdi5pb3ZfbGVuICAgICAgICA9IGxlbmd0aDsKICAgIGlvdi5pb3ZfYmFz ZSAgICAgICA9IGRhdGE7CgogICAgbXNnLm1zZ19uYW1lICAgICAgID0gMDsKICAgIG1zZy5tc2df bmFtZWxlbiAgICA9IDA7CiAgICBtc2cubXNnX2NvbnRyb2wgICAgPSBOVUxMOwogICAgbXNnLm1z Z19jb250cm9sbGVuID0gMDsKICAgIG1zZy5tc2dfZmxhZ3MgICAgICA9IDA7CgogICAgcmV0dXJu IGtlcm5lbF9yZWN2bXNnKHNvY2ssICZtc2csICZpb3YsIDEsIGxlbmd0aCwgMCk7Cn0KCmludApz czdfcmVjdl9zY3RwKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHZvaWQgKmJ1Zl8xLCBpbnQgbGVuXzEs IHZvaWQgKmJ1Zl8yLAogICAgaW50IGxlbl8yLCBzdHJ1Y3Qgc3M3X21zZ2IgKnNzN19tc2cpCnsK ICAgIHN0cnVjdCBtc2doZHIgbXNnOwogICAgc3RydWN0IGt2ZWMgaW92WzJdOwogICAgdW5zaWdu ZWQgY2hhciAqZGF0YSA9IGJ1Zl8xOwogICAgaW50IG1zZ19sZW4sIGN0bF9sZW47CiAgICBpbnQg cnZhbDsKICAgIHVuaW9uIHsKICAgICAgICBzdHJ1Y3QgY21zZ2hkciBjbXNnOwogICAgICAgIHVu c2lnbmVkIGludCBidWZbMTZdOwogICAgfSBjdGxidWY7CgogICAgaWYgKCFzb2NrLT5zaykKICAg ICAgICByZXR1cm4gMDsKCiAgICAvKiBGb3IgU0NUUCBlYWNoIHJlY3Ztc2cgc2hvdWxkIGdpdmUg dXMgYSBzaW5nbGUgZGF0YSByZWNvcmQuCiAgICAgKiBTaW5jZSB3ZSBvbmx5IGV2ZXIgc2VuZCBT SUdUUkFOIGVuY29kZWQgbWVzc2FnZXMgYnl0ZXMgNC03IGFyZSB0aGUKICAgICAqIGxlbmd0aCAt IGFuZCBzaG91bGQgbWF0Y2ggdGhhdCBvZiB0aGUgc2N0cCBkYXRhIGNodW5rLgogICAgICogYnVm XzEvbGVuXzEgcmVmZXIgdG8gdGhlIG5vcm1hbCBzczcgbWVzc2FnZSBidWZmZXIgYXJlYSwgYnVm XzIvbGVuXzIKICAgICAqIGFyZSBwZXItc29ja2V0LiBMb25nIG1lc3NhZ2VzIGdldCBjb3BpZWQg dG9nZXRoZXIgYnkgdGhlIGNhbGxlci4KICAgICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgc2lu Z2xlIHZhbGlkIFNJR1RSQU4gbWVzc2FnZSAqLwoKICAgIGlvdlswXS5pb3ZfYmFzZSAgICA9IGJ1 Zl8xOwogICAgaW92WzBdLmlvdl9sZW4gICAgID0gbGVuXzE7CiAgICBpb3ZbMV0uaW92X2Jhc2Ug ICAgPSBidWZfMjsKICAgIGlvdlsxXS5pb3ZfbGVuICAgICA9IGxlbl8yOwoKICAgIG1zZy5tc2df bmFtZSAgICAgICA9IDA7CiAgICBtc2cubXNnX25hbWVsZW4gICAgPSAwOwogICAgbXNnLm1zZ19j b250cm9sICAgID0gJmN0bGJ1ZjsKICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZiBjdGxi dWY7CiAgICBtc2cubXNnX2ZsYWdzICAgICAgPSAwOwoKICAgIHJ2YWwgPSBrZXJuZWxfcmVjdm1z Zyhzb2NrLCAmbXNnLCBpb3YsIDIsIGxlbl8xICsgbGVuXzIsIDApOwoKICAgIGlmIChydmFsIDw9 IDApCiAgICAgICAgLyogRG9uJ3QgcmV0dXJuIEVCQURNU0cgaGVyZSAqLwogICAgICAgIHJldHVy biBydmFsICE9IC1FQkFETVNHID8gcnZhbCA6IC1FSU87CgogICAgaWYgKG1zZy5tc2dfZmxhZ3Mg JiBNU0dfTk9USUZJQ0FUSU9OKQogICAgICAgIC8qIG1zZyBkYXRhIGlzIGEgbm90aWZpY2F0aW9u ICovCiAgICAgICAgcmV0dXJuIC1FQkFETVNHOwoKICAgIGN0bF9sZW4gPSAoY2hhciAqKW1zZy5t c2dfY29udHJvbCAtIChjaGFyICopJmN0bGJ1ZjsKICAgIGlmIChjdGxfbGVuID49IGN0bGJ1Zi5j bXNnLmNtc2dfbGVuCiAgICAgICAgICAgICYmIGN0bGJ1Zi5jbXNnLmNtc2dfbGV2ZWwgPT0gSVBQ Uk9UT19TQ1RQCiAgICAgICAgICAgICYmIGN0bGJ1Zi5jbXNnLmNtc2dfdHlwZSA9PSBTQ1RQX1NO RFJDVikgewogICAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvID0gQ01TR19EQVRB KCZjdGxidWYuY21zZyk7CiAgICAgICAgc3M3X3RyYW5zX3NldF9tc2dfaW5mbyhzczdfbXNnLCBz aW5mby0+c2luZm9fc3RyZWFtLCBzaW5mby0+c2luZm9fcHBpZCk7CiAgICB9CgogICAgbXNnX2xl biA9IGRhdGFbNF0gPDwgMjQgfCBkYXRhWzVdIDw8IDE2IHwgZGF0YVs2XSA8PCA4IHwgZGF0YVs3 XTsKICAgIGlmIChtc2dfbGVuID49IDY1NTU2KQogICAgICAgIC8qIERpc2JlbGlldmUgdGhpcyBp cyB2YWxpZCBkYXRhICovCiAgICAgICAgcmV0dXJuIC1FSU87CgogICAgaWYgKHJ2YWwgIT0gbXNn X2xlbiB8fCAhKG1zZy5tc2dfZmxhZ3MgJiBNU0dfRU9SKSkKICAgICAgICByZXR1cm4gLUVJTzsK ICAgIHJldHVybiBydmFsOwp9CgppbnQKc3M3X3RyYW5zX2luaXRfc2N0cF9zaW5mbyh2b2lkICpi dWYsIGludCBtYXhsZW4sIF9fdTE2ICoqc3RyZWFtLCBfX3UzMiAqKnBwaWQpCnsKICAgIHN0cnVj dCBjbXNnaGRyICpjbXNnOwogICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CgogICAg aWYgKG1heGxlbiA8IENNU0dfTEVOKHNpemVvZiAqc2luZm8pKQogICAgICAgIHJldHVybiAtMTsK CiAgICBjbXNnID0gYnVmOwogICAgY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKICAg IGNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOwogICAgY21zZy0+Y21zZ19sZW4gPSBDTVNH X0xFTihzaXplb2YgKnNpbmZvKTsKICAgIHNpbmZvID0gQ01TR19EQVRBKGNtc2cpOwogICAgbWVt c2V0KHNpbmZvLCAwLCBzaXplb2YgKnNpbmZvKTsKICAgICpzdHJlYW0gPSAmc2luZm8tPnNpbmZv X3N0cmVhbTsKICAgICpwcGlkID0gJnNpbmZvLT5zaW5mb19wcGlkOwoKICAgIHJldHVybiBDTVNH X0xFTihzaXplb2YgKnNpbmZvKTsKfQo= --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Laight Date: Sun, 17 May 2020 08:48:02 +0000 Subject: RE: [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx Message-Id: <49f712b3b6704c3096d3834a5985a4d6@AcuMS.aculab.com> MIME-Version: 1 Content-Type: multipart/mixed; boundary="_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_" List-Id: References: <20200514062820.GC8564@lst.de> <20200513062649.2100053-1-hch@lst.de> <20200513062649.2100053-28-hch@lst.de> <20200513180058.GB2491@localhost.localdomain> <129070.1589556002@warthog.procyon.org.uk> <05d946ae948946158dbfcbc07939b799@AcuMS.aculab.com> <20200516153652.GM16070@bombadil.infradead.org> In-Reply-To: <20200516153652.GM16070@bombadil.infradead.org> To: 'Matthew Wilcox' Cc: 'David Howells' , Christoph Hellwig , Marcelo Ricardo Leitner , "linux-nvme@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-sctp@vger.kernel.org" , "target-devel@vger.kernel.org" , "linux-afs@lists.infradead.org" , "drbd-dev@lists.linbit.com" , "linux-cifs@vger.kernel.org" , "rds-devel@oss.oracle.com" , "linux-rdma@vger.kernel.org" , "cluster-devel@redhat.com" , Jakub Kicinski , linux-block@vger.kernel --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Matthew Wilcox > Sent: 16 May 2020 16:37 ... > > Basically: > > > > This patch sequence (to be written) does the following: > > > > Patch 1: Change __sys_setsockopt() to allocate a kernel buffer, > > copy the data into it then call set_fs(KERNEL_DS). > > An on-stack buffer (say 64 bytes) will be used for > > small transfers. > > > > Patch 2: The same for __sys_getsockopt(). > > > > Patch 3: Compat setsockopt. > > > > Patch 4: Compat getsockopt. > > > > Patch 5: Remove the user copies from the global socket options code. > > > > Patches 6 to n-1; Remove the user copies from the per-protocol code. > > > > Patch n: Remove the set_fs(KERNEL_DS) from the entry points. > > > > This should be bisectable. >=20 > I appreciate your dedication to not publishing the source code to > your kernel module, but Christoph's patch series is actually better. > It's typesafe rather than passing void pointers around. There are plenty on interfaces that pass a 'pointer and length'. Having the compiler do a type check doesn't give any security benefit - just stops silly errors. Oh yes, I've attached the only driver source file that calls into the Linux kernel. You are perfectly free to look at all the thing we have to do to support different and broken kernel releases. =09David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1= PT, UK Registration No: 1397386 (Wales) --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; name=ss7osglue.c; charset=WINDOWS-1252 Content-Description: ss7osglue.c Content-Disposition: attachment; filename="ss7osglue.c"; size=36047; creation-date="Thu, 26 Sep 2019 10:15:35 GMT"; modification-date="Thu, 26 Sep 2019 10:15:35 GMT" Content-Transfer-Encoding: base64 I2lkZW50ICJAKCMpIChjKSBBY3VsYWIgcGxjICRIZWFkZXI6IC9ob21lL2N2cy9yZXBvc2l0b3J5 L3NzNy9zdGFjay9zcmMvZHJpdmVyL2xpbnV4L3NzN29zZ2x1ZS5jLHYgMS4xNTcgMjAxOS0wOC0y OSAxNjowOToxNCBkYXZpZGxhIEV4cCAkICROYW1lOiAgJCIKI2lmbmRlZiBNT0RVTEUKI2RlZmlu ZSBNT0RVTEUKI2VuZGlmCgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgoKI2lmIExJTlVYX1ZF UlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI4KQojZXJyb3IgbWluaW11bSBrZXJu ZWwgdmVyc2lvbiBpcyAyLjYuMjgKI2VuZGlmCgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtF Uk5FTF9WRVJTSU9OKDIsIDYsIDM0KQojaW5jbHVkZSA8Z2VuZXJhdGVkL2F1dG9jb25mLmg+CiNl bHNlCiNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgojZW5kaWYKCiNpbmNsdWRlIDxsaW51eC9p bml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K I2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxs aW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpZiBMSU5VWF9WRVJTSU9O X0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oNCwgMTEsIDApCiNpbmNsdWRlIDxsaW51eC9zY2hlZC9z aWduYWwuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9z b2NrZXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5o PgojaW5jbHVkZSA8bGludXgvbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiNpbmNs dWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxhc20v YXRvbWljLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGxpbnV4L2t0aHJl YWQuaD4KCi8qIFRoaXMgaXMgb25seSBpbiB0aGUga2VybmVsIGJ1aWxkIHRyZWUgKi8KI2luY2x1 ZGUgPG5ldC9zb2NrLmg+CgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9O KDMsIDEwLCAwKQojaW5jbHVkZSA8dWFwaS9saW51eC9zY3RwLmg+CiNlbHNlCiNpbmNsdWRlIDxu ZXQvc2N0cC91c2VyLmg+ICAgIC8qIG5ldGluZXQvc2N0cC5oIG91Z2h0IHRvIGJlIHRoaXMgZmls ZSAqLwojZW5kaWYKCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LCAx MywgMCkKI2RlZmluZSB3YWl0X3F1ZXVlX2hlYWQgX193YWl0X3F1ZXVlX2hlYWQKI2RlZmluZSB3 YWl0X3F1ZXVlX2VudHJ5IF9fd2FpdF9xdWV1ZQojZW5kaWYKCiNkZWZpbmUgU0tfUFJPVE9DT0wo c29jaykgKHNvY2spLT5zay0+c2tfcHJvdG9jb2wKCmV4dGVybiB2b2lkIHNzN190cmFjZV9tZW0o aW50LCB2b2lkICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOwpleHRlcm4gdm9pZCBzczdfdHJh Y2VfcHJpbnRmKGludCwgY29uc3QgY2hhciAqLCAuLi4pOwoKLyogQWN1bGFiIERBQ1AgaW50ZXJm YWNlcyAtIHRoZXNlIGFyZSBpbiBhY3VsYWIncyBrZXJuX2lmLmggKi8Kdm9pZCAqZGFjcF9zeW1i b2xfZ2V0KGNvbnN0IGNoYXIgKik7CmludCBkYWNwX3N5bWJvbF9yZWxlYXNlKGNvbnN0IGNoYXIg Kik7CgpNT0RVTEVfQVVUSE9SKCJBY3VsYWIiKTsKTU9EVUxFX0xJQ0VOU0UoIlByb3ByaWV0YXJ5 Iik7CgojaW5jbHVkZSAic3M3b3NnbHVlLmgiCgovKiBNdXRleCBmb3IgZHJpdmVyIGludGVyZmFj ZSBjb2RlICovCnN0YXRpYyBzdHJ1Y3QgbXV0ZXggc3M3X2dsdWVfbXV0ZXg7CgpzdGF0aWMgaW50 IHNzN2Rldl9tYWpvcjsKc3RhdGljIGNvbnN0IHZvaWQgKnNzN19kdGxzX2hhbmRsZTsKc3RhdGlj IGludCBzczdfdXNlX2NvdW50OwpzdGF0aWMgaW50IHNzN19zdG9wX3BpZDsKCnN0YXRpYyBzdHJ1 Y3QgdGFza19zdHJ1Y3QgKmFzc2VydGVkX3Rhc2tzWzE2XTsKc3RhdGljIHVuc2lnbmVkIGludCBh c3NlcnRlZF90YXNrX2NvdW50OwoKdHlwZWRlZiBjaGFyIHNzN192ZXJpZnlfY29uc3RbIFNTN19T T0NLX1NUUkVBTSA9PSBTT0NLX1NUUkVBTSAmJiBTUzdfU09DS19TRVFQQUNLRVQgPT0gU09DS19T RVFQQUNLRVQgPyAxIDogLTFdOwoKc3RhdGljIHZvaWQgc3M3X25ldF9uc191bmxvYWQodm9pZCk7 CgojZGVmaW5lIFRDUF9OT0RFTEFZIDEKCnN0YXRpYyBpbnQgc3M3X2dsdWVfb3BlbihzdHJ1Y3Qg aW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CnN0YXRpYyBpbnQgc3M3X2dsdWVfcmVsZWFzZShzdHJ1 Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CnN0YXRpYyBsb25nIHNzN19nbHVlX3VubG9ja2Vk X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CnN0YXRp YyB1bnNpZ25lZCBpbnQgc3M3X2dsdWVfcG9sbChzdHJ1Y3QgZmlsZSAqY29uc3QsIHBvbGxfdGFi bGUgKik7CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzczdkZXZfZm9wID0KewogICAg b3BlbjogICAgICAgICAgIHNzN19nbHVlX29wZW4sCiAgICByZWxlYXNlOiAgICAgICAgc3M3X2ds dWVfcmVsZWFzZSwKICAgIHVubG9ja2VkX2lvY3RsOiBzczdfZ2x1ZV91bmxvY2tlZF9pb2N0bCwK ICAgIGNvbXBhdF9pb2N0bDogICBzczdfZ2x1ZV91bmxvY2tlZF9pb2N0bCwKICAgIHBvbGw6ICAg ICAgICAgICBzczdfZ2x1ZV9wb2xsLAogICAgb3duZXI6ICAgICAgICAgIFRISVNfTU9EVUxFCn07 CgpzdGF0aWMgaW50IHNzN19yZWJvb3Rfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIs IHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogICAgICAgIHZvaWQgKmRhdGEpCnsKICAgIC8qIFN5c3Rl bSBiZWluZyByZWJvb3RlZC4KICAgICAqIEkgYWRkZWQgdGhpcyBob3BpbmcgdG8gdXNlIGl0IHRv IGdldCB0aGUgc3M3bWFpbnQgZGFlbW9uIHRvIGV4aXQsCiAgICAgKiBidXQgaXQgaXNuJ3QgY2Fs bGVkIHVudGlsIGFsbCB1c2VyIHByb2Nlc3NlcyBoYXZlIGRpZWQuCiAgICAgKiBMZWF2ZSBpdCBo ZXJlIC0gbWlnaHQgYmUgdXNlZnVsIG9uZSBkYXkuICovCiAgICByZXR1cm4gMDsKfQoKc3RhdGlj IHN0cnVjdCBub3RpZmllcl9ibG9jayBzczdfcmVib290X25vdGlmaWVyX2Jsb2NrID0gewogICAg Lm5vdGlmaWVyX2NhbGwgPSBzczdfcmVib290X25vdGlmeSwKfTsKCnN0YXRpYyBpbnQKc3M3X2lu aXRfZmFpbChpbnQgcnZhbCkKewogICAgaWYgKHNzN2Rldl9tYWpvciA+IDApCiAgICAgICAgdW5y ZWdpc3Rlcl9jaHJkZXYoc3M3ZGV2X21ham9yLCAic3M3c2VydmVyIik7CiAgICByZXR1cm4gcnZh bDsKfQoKc3RhdGljIGludApzczdfaW5pdF9tb2Qodm9pZCkKewogICAgY29uc3Qgdm9pZCAqKCpk dGxzX3JlZ2lzdGVyKShjb25zdCBjaGFyICosIGludCAoKikoc3RydWN0IGR0bHNfZ2V0X2lmICop KTsKICAgIGludCBydmFsOwoKICAgIHNzN19tdXRleF9pbml0KCZzczdfZ2x1ZV9tdXRleCk7Cgog ICAgcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHNzN3ZlcnNpb24pOwoKICAgIHNzN2Rldl9tYWpv ciA9IHJlZ2lzdGVyX2NocmRldigwLCAic3M3c2VydmVyIiwgJnNzN2Rldl9mb3ApOwoKICAgIGlm IChzczdkZXZfbWFqb3IgPCAwKSB7CiAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic3M3c2VydmVy OiByZWdpc3Rlcl9jaHJkZXYoKSBmYWlsZWQ6ICVkXG4iLAogICAgICAgICAgICAgICAgc3M3ZGV2 X21ham9yKTsKICAgICAgICByZXR1cm4gc3M3X2luaXRfZmFpbChzczdkZXZfbWFqb3IpOwogICAg fQoKICAgIHJ2YWwgPSBzczdfZHJpdmVyX2luaXQoKTsKICAgIGlmIChydmFsICE9IDApIHsKICAg ICAgICBwcmludGsoS0VSTl9JTkZPICJzczdzZXJ2ZXI6IHNzN19kcml2ZXJfaW5pdCgpIGZhaWxl ZDogJWRcbiIsIHJ2YWwpOwogICAgICAgIHJldHVybiBzczdfaW5pdF9mYWlsKC1FSU8pOwogICAg fQoKICAgIGR0bHNfcmVnaXN0ZXIgPSBkYWNwX3N5bWJvbF9nZXQoImFjdWNfZHRsc19yZWdpc3Rl ciIpOwogICAgaWYgKGR0bHNfcmVnaXN0ZXIgPT0gTlVMTCkKICAgICAgICBwcmludGsoS0VSTl9J TkZPICJzczdzZXJ2ZXI6IGNhbm5vdCBsb2NhdGUgXCJhY3VjX2R0bHNfcmVnaXN0ZXJcIlxuIik7 CiAgICBlbHNlCiAgICAgICAgc3M3X2R0bHNfaGFuZGxlID0gZHRsc19yZWdpc3RlcihEWU5BTUlD X1RMU19QUkVGSVggInNzNyIsCiAgICAgICAgICAgICAgICBzczdfdGxzX2dldF9pZik7CgogICAg cmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzczdfcmVib290X25vdGlmaWVyX2Jsb2NrKTsKICAg IHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApzczdfY2xlYW51cF9tb2Qodm9pZCkKewogICAgaW50 ICgqZHRsc191bnJlZ2lzdGVyKShjb25zdCB2b2lkICopOwoKICAgIHVucmVnaXN0ZXJfcmVib290 X25vdGlmaWVyKCZzczdfcmVib290X25vdGlmaWVyX2Jsb2NrKTsKCiAgICBpZiAoc3M3X2R0bHNf aGFuZGxlICE9IE5VTEwpIHsKICAgICAgICBkdGxzX3VucmVnaXN0ZXIgPSBkYWNwX3N5bWJvbF9n ZXQoImFjdWNfZHRsc191bnJlZ2lzdGVyIik7CiAgICAgICAgZGFjcF9zeW1ib2xfcmVsZWFzZSgi YWN1Y19kdGxzX3JlZ2lzdGVyIik7CiAgICAgICAgaWYgKGR0bHNfdW5yZWdpc3RlciAhPSBOVUxM KSB7CiAgICAgICAgICAgIGR0bHNfdW5yZWdpc3RlcihzczdfZHRsc19oYW5kbGUpOwogICAgICAg ICAgICBkYWNwX3N5bWJvbF9yZWxlYXNlKCJhY3VjX2R0bHNfdW5yZWdpc3RlciIpOwogICAgICAg IH0KICAgIH0KCiAgICBzczdfaW5pdF9mYWlsKDApOwoKICAgIHByaW50ayhLRVJOX0lORk8gIkFj dWxhYiBzczdzZXJ2ZXI6IGRyaXZlciB1bmxvYWRlZFxuIik7Cn0KCm1vZHVsZV9pbml0KHNzN19p bml0X21vZCkKbW9kdWxlX2V4aXQoc3M3X2NsZWFudXBfbW9kKQoKc3RhdGljIGludApzczdfZ2x1 ZV9vcGVuKHN0cnVjdCBpbm9kZSAqY29uc3QgaW5vZGUsIHN0cnVjdCBmaWxlICpjb25zdCBmaWxw KQp7CiAgICBpbnQgcnZhbCwgcGlkOwoKICAgIGlmIChmaWxwLT5wcml2YXRlX2RhdGEpCiAgICAg ICAgLyogRHVwbGljYXRlIG9wZW4gKi8KICAgICAgICByZXR1cm4gMDsKCiAgICBzczdfbXV0ZXhf ZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAgIGlmIChzczdfdXNlX2NvdW50IDwgMCkgewogICAg ICAgIC8qIHNzN19kcml2ZXJfc2h1dGRvd24oKSBoYXMgYmVlbiBjYWxsZWQsIHRvIGxhdGUgdG8g ZG8gYW55dGhpbmcgKi8KICAgICAgICBzczdfbXV0ZXhfZXhpdCgmc3M3X2dsdWVfbXV0ZXgpOwog ICAgICAgIHJldHVybiAtRUlPOwogICAgfQogICAgc3M3X3VzZV9jb3VudCsrOwogICAgc3M3X211 dGV4X2V4aXQoJnNzN19nbHVlX211dGV4KTsKCiAgICBydmFsID0gc3M3X2RldmlmX29wZW4oJmZp bHAtPnByaXZhdGVfZGF0YSk7CiAgICBpZiAocnZhbCAhPSAwKSB7CiAgICAgICAgc3M3X211dGV4 X2VudGVyKCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgc3M3X3VzZV9jb3VudC0tOwogICAgICAg IHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgcGlkID0gc3M3X3BpZCgp OwogICAgICAgIGlmIChwaWQgIT0gc3M3X3N0b3BfcGlkKQogICAgICAgICAgICBwcmludGsoS0VS Tl9JTkZPICJzczdfZGV2aWZfb3BlbigpIHBpZCAlZCBmYWlsZWQgc3M3IGVycm9yICVkXG4iLAog ICAgICAgICAgICAgICAgICAgIHBpZCwgcnZhbCk7CiAgICAgICAgcmV0dXJuIC1FSU87CiAgICB9 CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKc3M3X2dsdWVfcmVsZWFzZShzdHJ1Y3QgaW5v ZGUgKmNvbnN0IGlub2RlLCBzdHJ1Y3QgZmlsZSAqY29uc3QgZmlscCkKewogICAgaWYgKGZpbHAt PnByaXZhdGVfZGF0YSkKICAgICAgICBzczdfZGV2aWZfY2xvc2UoZmlscC0+cHJpdmF0ZV9kYXRh KTsKCiAgICBzczdfbXV0ZXhfZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAgIHNzN191c2VfY291 bnQtLTsKCiAgICBpZiAoc3M3X3VzZV9jb3VudCA9PSAwICYmIHNzN19zdG9wX3BpZCAhPSAwKSB7 CiAgICAgICAgLyogTGFzdCB1c2VyIHByb2Nlc3MgaGFzIGdvbmUsIGNvbXBsZXRlIHNodXRkb3du IGZ1bmN0aW9ucyAqLwogICAgICAgIHNzN19uZXRfbnNfdW5sb2FkKCk7CiAgICAgICAgLyogU3Rv cCBhbnkgbW9yZSBvcGVucyAqLwogICAgICAgIHNzN191c2VfY291bnQgPSAtMTsKICAgICAgICBz czdfZHJpdmVyX3NodXRkb3duKCk7CiAgICB9CgogICAgc3M3X211dGV4X2V4aXQoJnNzN19nbHVl X211dGV4KTsKCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGxvbmcKc3M3X2dsdWVfdW5sb2NrZWRf aW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcg YXJnKQp7CiAgICBpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKICAgICAgICByZXR1cm4gLUVOT0RF VjsKCiAgICBzd2l0Y2ggKGNtZCkgewoKICAgIGNhc2UgU1M3X1NUT1A6ICAgICAgICAgIC8qIHNz N21haW50IHNodXR0aW5nIHVzIGRvd24gKi8KICAgICAgICAvKiBTdGFydCBzaHV0ZG93biBub3cs IHdpbGwgY29tcGxldGUgb24gbGFzdCBjbG9zZSAqLwogICAgICAgIHNzN19kcml2ZXJfc3RvcCgp OwogICAgICAgIHNzN19zdG9wX3BpZCA9IHNzN19waWQoKTsKICAgICAgICByZXR1cm4gMDsKCiAg ICAvKiBSZXF1ZXN0IGZyb20gc3M3bWFpbnQgb3IgdXNlciBhcHBsaWNhdGlvbiAqLwogICAgY2Fz ZSBTUzdfVVNFUl9JT0NUTF9DT0RFOgogICAgICAgIHJldHVybiBzczdkZXZfaW9jdGwoZmlscC0+ cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7CgogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gLUVO T1RUWTsKICAgIH0KfQoKc3RhdGljIHVuc2lnbmVkIGludApzczdfZ2x1ZV9wb2xsKHN0cnVjdCBm aWxlICpmaWxwLCBwb2xsX3RhYmxlICpwdCkKewogICAgcG9sbF93YWl0KGZpbHAsICpzczdfZGV2 aWZfZ2V0X3BvbGxxdWV1ZV9oZWFkKGZpbHAtPnByaXZhdGVfZGF0YSksIHB0KTsKICAgIHJldHVy biBzczdfZGV2aWZfZ2V0X3BvbGxfc3RhdHVzKGZpbHAtPnByaXZhdGVfZGF0YSk7Cn0KCnZvaWQg Kgpzczdfb3NfbWFsbG9jKGludCBzLCBpbnQgc3M3X2ZsYWdzKQp7CiAgICByZXR1cm4ga21hbGxv YyhzLCBHRlBfS0VSTkVMKTsKfQoKdm9pZApzczdfb3NfZnJlZSh2b2lkICpwKQp7CiAgICBrZnJl ZShwKTsKfQoKdm9pZApzczdfcG9sbF9xdWV1ZV9oZWFkX2RlaW5pdCh3YWl0X3F1ZXVlX2hlYWRf dCAqKnBxaHApCnsKICAgIHNzN19vc19mcmVlKCpwcWhwKTsKfQoKaW50CnNzN19wb2xsX3F1ZXVl X2hlYWRfaW5pdCh3YWl0X3F1ZXVlX2hlYWRfdCAqKnBxaHApCnsKICAgIHdhaXRfcXVldWVfaGVh ZF90ICpwcWggPSBzczdfb3NfbWFsbG9jKHNpemVvZiAqcHFoLCAwKTsKICAgIGlmIChwcWggPT0g TlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKHBxaCk7CiAg ICAqcHFocCA9IHBxaDsKICAgIHJldHVybiAwOwp9Cgp2b2lkCnNzN19wb2xsd2FrZXVwKHdhaXRf cXVldWVfaGVhZF90ICoqcHFoLCB1bnNpZ25lZCBpbnQgcG9sbF9ldmVudCkKewogICAgd2FrZV91 cCgqcHFoKTsKfQoKdm9pZApzczdfa2lsbF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywg aW50IHNpZ25vKQp7CiAgICAvKiBTZW5kIHNpZ25hbCBldmVuIHRob3VnaCBzZXQgdG8gU0lHX0lH TiAqLwogICAgZm9yY2Vfc2lnKHNpZ25vLCB0YXNrKTsKfQoKCiNpZiBMSU5VWF9WRVJTSU9OX0NP REUgPD0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzIpCi8qIHNwaW5sb2NrX3QgaXMgYSB0eXBlZGVm IGZvciBhbiB1bm5hbWVkIHN0cnVjdHVyZSBzbyB3ZSBjYW4ndAogKiBtYWtlICdzdHJ1Y3Qgc3Bp bmxvY2snIG1hdGNoIHRoZSBrZXJuZWwgc3BpbmxvY2sgdHlwZS4gKi8KI2RlZmluZSBTUElOTE9D S19DQVNUIChzcGlubG9ja190ICopCiNlbHNlCiNkZWZpbmUgU1BJTkxPQ0tfQ0FTVAojZW5kaWYK CnNpemVfdApzczdfc3Bpbl9sb2NrX3NpemUodm9pZCkKewogICAgcmV0dXJuIHNpemVvZiAqU1BJ TkxPQ0tfQ0FTVChzdHJ1Y3Qgc3BpbmxvY2sgKikwOwp9Cgp2b2lkCnNzN19zcGluX2xvY2tfaW5p dChzdHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAgIHNwaW5fbG9ja19pbml0KFNQSU5MT0NLX0NBU1Qg cyk7Cn0KCnZvaWQKc3M3X3NwaW5fbG9ja19lbnRlcihzdHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAg IHNwaW5fbG9jayhTUElOTE9DS19DQVNUIHMpOwp9Cgp2b2lkCnNzN19zcGluX2xvY2tfZXhpdChz dHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAgIHNwaW5fdW5sb2NrKFNQSU5MT0NLX0NBU1Qgcyk7Cn0K CnNpemVfdApzczdfbXV0ZXhfc2l6ZSh2b2lkKQp7CiAgICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBt dXRleCk7Cn0KCnZvaWQKc3M3X211dGV4X2luaXQoc3RydWN0IG11dGV4ICpzKQp7CiAgICBtdXRl eF9pbml0KHMpOwp9Cgp2b2lkCnNzN19tdXRleF9lbnRlcihzdHJ1Y3QgbXV0ZXggKnMpCnsKICAg IG11dGV4X2xvY2socyk7Cn0KCmludApzczdfbXV0ZXhfZW50ZXJfdG1vKHN0cnVjdCBtdXRleCAq cywgaW50IG1heF93YWl0KQp7CiAgICAvKiBUaGVyZSBpcyBubyBtdXRleF9lbnRlcl90aW1lb3V0 KCkgaG93ZXZlciB0aGlzIHdhcyBhbGwgYWRkZWQKICAgICAqIHRvIHN0b3Agc3RhdHVzIGNvbW1h bmRzIHNsZWVwaW5nIGZvcmV2ZXIgd2hlbiBhIHByb2Nlc3MgaGFzCiAgICAgKiAnb29wc2VkJyB3 aXRoIGEgbXV0ZXggaGVsZC4KICAgICAqIERvIGEgc25lYWsgY2hlY2sgb24gdGhlIHN0YXRlIG9m IGFueSBvd25pbmcgdGFzayB0aGVuCiAgICAgKiB3YWl0IGludGVycnVwdGlibHkuCiAgICAgKiBe QyBzaG91bGQgZXJyb3Igb3V0IHRoZSBzdGF0dXMgY2FsbC4gKi8KCiAgICAvKiBJZiB1bmNvbnRl bmRlZCBqdXN0IGFjcXVpcmUgKi8KICAgIGlmIChtdXRleF90cnlsb2NrKHMpKQogICAgICAgIHJl dHVybiAxOwoKI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTig0LCAxMCwg MCkKICAgIHsKICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOwogICAgICAgIGludCBz dGF0ZTsKCiAgICAgICAgc3Bpbl9sb2NrKCZzLT53YWl0X2xvY2spOwogICAgICAgIG93bmVyID0g X19tdXRleF9vd25lcihzKTsKICAgICAgICBzdGF0ZSA9IG93bmVyID8gb3duZXItPnN0YXRlIDog MDsKICAgICAgICBzcGluX3VubG9jaygmcy0+d2FpdF9sb2NrKTsKICAgICAgICBpZiAoc3RhdGUg JiBUQVNLX0RFQUQpCiAgICAgICAgICAgIC8qIG11dGV4IHdpbGwgbmV2ZXIgYmUgcmVsZWFzZWQs IHRyZWF0IGFzIHRpbWVvdXQgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgoK ICAgIC8qIElmIEM3X0FTU0VSVCgpIGhhcyBiZWVuIGNhbGxlZCwganVzdCBsZXQgZXZlcnlvbmUg aW4gKi8KICAgIGlmIChhc3NlcnRlZF90YXNrX2NvdW50KQogICAgICAgIHJldHVybiAwOwoKICAg IHJldHVybiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUocykgPyAtMSAvKiBFSU5UUiAqLyA6IDEg LyogYWNxdWlyZWQgKi87Cn0KCnZvaWQKc3M3X211dGV4X2V4aXQoc3RydWN0IG11dGV4ICpzKQp7 CiAgICBtdXRleF91bmxvY2socyk7Cn0KCnNpemVfdApzczdfY3Zfc2l6ZSh2b2lkKQp7CiAgICBy ZXR1cm4gc2l6ZW9mKHdhaXRfcXVldWVfaGVhZF90KTsKfQoKdm9pZApzczdfY3ZfaW5pdCh3YWl0 X3F1ZXVlX2hlYWRfdCAqY29uc3QgdikKewogICAgaW5pdF93YWl0cXVldWVfaGVhZCh2KTsKfQoK c3RhdGljIGludApzczdfc2NoZWR1bGVfdG1vKGludCB0bW9fbXMpCnsKICAgIGludCB0bW9famlm ZmllczsKCiAgICAvKiBSZWFsbHkgc2xlZXAgLSB1bmxlc3Mgd29rZW4gc2luY2UgdW5sb2NraW5n IHNwaW5sb2NrICovCiAgICBpZiAodG1vX21zID49IDApIHsKICAgICAgICBpZiAodG1vX21zIDw9 IDEpCiAgICAgICAgICAgIHRtb19qaWZmaWVzID0gdG1vX21zOwogICAgICAgIGVsc2UKICAgICAg ICAgICAgLyogQ29udmVydCB0byBqaWZmaWVzIGFuZCByb3VuZCB1cCAqLwogICAgICAgICAgICB0 bW9famlmZmllcyA9IDEgKyAodG1vX21zICsgMSAtIDEpICogMTYgLyAoMTYwMDAvSFopOwogICAg ICAgIC8qIFJldHVybiB2YWx1ZSBvZiBzY2hlZHVsZV90aW1lb3V0KCkgaXMgdW5leHBpcmVkIHRp bWVvdXQgKi8KICAgICAgICAvKiBXZSB3YW50IDAgZm9yICd0aW1lZG91dCcgKHRvIG1hdGNoIGN2 X3dhaXRfc2lnKCkpICovCiAgICAgICAgcmV0dXJuIHNjaGVkdWxlX3RpbWVvdXQodG1vX2ppZmZp ZXMpICE9IDA7CiAgICB9CgogICAgc2NoZWR1bGUoKTsKICAgIGlmICghc2lnbmFsX3BlbmRpbmco Y3VycmVudCkpCiAgICAgICAgLyogV29rZW4gYnkgdGhlIGV2ZW50ICovCiAgICAgICAgcmV0dXJu IDE7CgogICAgLyogUmVwb3J0IDAgZm9yIGEgc2lnbmFsLCBleGNlcHQgLTEgZm9yIFNJR0tJTEwg KHJlYm9vdCkgKi8KICAgIHJldHVybiBzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWdu YWwsIFNJR0tJTEwpID8gLTEgOiAwOwp9CgppbnQKc3M3X2N2X3dhaXRfZ3V0cyh3YWl0X3F1ZXVl X2hlYWRfdCAqY3ZwLCBzdHJ1Y3QgbXV0ZXggKm10eHAsCiAgICAgICAgaW50IGludGVycnVwdGli bGUsIGludCB0bW9fbXMpCnsKICAgIGludCByOwogICAgc3RydWN0IHdhaXRfcXVldWVfZW50cnkg dzsKICAgIGludCBzbGVlcF9zdGF0ZTsKCiAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmdywgY3Vy cmVudCk7CgogICAgLyogVGVsbCBzY2hlZHVsZXIgd2UgYXJlIGdvaW5nIHRvIHNsZWVwLi4uICov CiAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgIWludGVycnVwdGlibGUpCiAgICAg ICAgLyogV2UgZG9uJ3Qgd2FudCB3YWtpbmcgaW1tZWRpYXRlbHkgKGFnYWluKSAqLwogICAgICAg IHNsZWVwX3N0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CiAgICBlbHNlCiAgICAgICAgc2xl ZXBfc3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAgICBzZXRfY3VycmVudF9zdGF0ZShzbGVl cF9zdGF0ZSk7CgogICAgLyogQ29ubmVjdCB0byBjb25kaXRpb24gdmFyaWFibGUgLi4uICovCiAg ICBhZGRfd2FpdF9xdWV1ZShjdnAsICZ3KTsKICAgIG11dGV4X3VubG9jayhtdHhwKTsgLyogUmVs ZWFzZSBtdXRleCAqLwoKICAgIHIgPSBzczdfc2NoZWR1bGVfdG1vKHRtb19tcyk7CgogICAgLyog RGlzY29ubmVjdCBmcm9tIGNvbmRpdGlvbiB2YXJpYWJsZSAuLi4gKi8KICAgIHJlbW92ZV93YWl0 X3F1ZXVlKGN2cCwgJncpOwoKICAgIC8qIFJlLWFjcXVpcmUgbXV0ZXggKi8KICAgIG11dGV4X2xv Y2sobXR4cCk7CgogICAgLyogcmV0dXJuIDEgaWYgd29rZW4sIDAgaWYgdGltZWRfb3V0L3NpZ25h bCwgLTEgaWYgU0lHS0lMTCAqLwogICAgcmV0dXJuIHI7Cn0KCmludApzczdfY3Zfd2FpdF9zcGlu X2xvY2sod2FpdF9xdWV1ZV9oZWFkX3QgKmN2cCwgc3RydWN0IHNwaW5sb2NrICpsb2NrLAogICAg ICAgIGludCBpbnRlcnJ1cHRpYmxlLCBpbnQgdG1vX21zKQp7CiAgICBpbnQgcjsKICAgIHN0cnVj dCB3YWl0X3F1ZXVlX2VudHJ5IHc7CiAgICBpbnQgc2xlZXBfc3RhdGU7CgogICAgaW5pdF93YWl0 cXVldWVfZW50cnkoJncsIGN1cnJlbnQpOwoKICAgIC8qIFRlbGwgc2NoZWR1bGVyIHdlIGFyZSBn b2luZyB0byBzbGVlcC4uLiAqLwogICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmICFp bnRlcnJ1cHRpYmxlKQogICAgICAgIC8qIFdlIGRvbid0IHdhbnQgd2FraW5nIGltbWVkaWF0ZWx5 IChhZ2FpbikgKi8KICAgICAgICBzbGVlcF9zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwog ICAgZWxzZQogICAgICAgIHNsZWVwX3N0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwogICAgc2V0 X2N1cnJlbnRfc3RhdGUoc2xlZXBfc3RhdGUpOwoKICAgIC8qIENvbm5lY3QgdG8gY29uZGl0aW9u IHZhcmlhYmxlIC4uLiAqLwogICAgYWRkX3dhaXRfcXVldWUoY3ZwLCAmdyk7CiAgICBzcGluX3Vu bG9jayhTUElOTE9DS19DQVNUIGxvY2spOwoKICAgIHIgPSBzczdfc2NoZWR1bGVfdG1vKHRtb19t cyk7CgogICAgLyogRGlzY29ubmVjdCBmcm9tIGNvbmRpdGlvbiB2YXJpYWJsZSAuLi4gKi8KICAg IHJlbW92ZV93YWl0X3F1ZXVlKGN2cCwgJncpOwoKICAgIC8qIFJlLWFjcXVpcmUgbXV0ZXggKi8K ICAgIHNwaW5fbG9jayhTUElOTE9DS19DQVNUIGxvY2spOwoKICAgIHJldHVybiByOwp9CgovKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSoqCioqIHNzN19jdl9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKiogQXdha2VuIGFsbCB0aHJlYWRzIHRoYXQg YXJlIHNsZWVwaW5nIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgICAgICAqKgoqKiBDYWxsZXIg bXVzdCB1c2UgdGhlIGFzc29jaWF0ZWQgbXV0ZXggc2Vuc2libHksIGkuZS4gLi4uICAgICAgICAg ICAgICoqCioqICAgICAgYWNxdWlyZSB0aGUgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKioKKiogICAgICBTZXQgc29tZSBmbGFnIHRoYXQgYSBzbGVl cGluZyB0aHJlYWQgd2lsbCBjaGVjayBmb3IgICAgICAgICAgICAqKgoqKiAgICAgIHNzN19jdl9i cm9hZGNhc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoq CioqICAgICAgcmVsZWFzZSB0aGUgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKioKKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZApzczdfY3ZfYnJvYWRjYXN0 KHdhaXRfcXVldWVfaGVhZF90ICpjb25zdCBjdnApCnsKICAgIHdha2VfdXAoY3ZwKTsKfQoKCnVu c2lnbmVkIGxvbmcKc3M3X2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwg dW5zaWduZWQgbG9uZyBjKQp7CiAgICByZXR1cm4gY29weV90b191c2VyKHRvLCBmcm9tLCBjKTsK fQoKdW5zaWduZWQgbG9uZwpzczdfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQg KmZyb20sIHVuc2lnbmVkIGxvbmcgYykKewogICAgcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBm cm9tLCBjKTsKfQoKdW5zaWduZWQgaW50CnNzN19waWQodm9pZCkKewogICAgcmV0dXJuIGN1cnJl bnQtPnBpZDsKfQoKc3RydWN0IHRhc2tfc3RydWN0ICoKc3M3X2N1cnJlbnRfdGFzayh2b2lkKQp7 CiAgICByZXR1cm4gY3VycmVudDsKfQoKdW5zaWduZWQgaW50CnNzN190YXNrX3BpZChzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnRhc2spCnsKICAgIHJldHVybiB0YXNrLT5waWQ7Cn0KCmludApzczdfZ2x1 ZV90aHJlYWRfZm4odm9pZCAqc3M3X3RocmVhZCkKewogICAgc3M3X3RocmVhZF9ydW4oc3M3X3Ro cmVhZCk7CiAgICBtb2R1bGVfcHV0X2FuZF9leGl0KDApOwogICAgcmV0dXJuIDA7Cn0KCnN0cnVj dCB0YXNrX3N0cnVjdCAqCnNzN19vc190aHJlYWRfY3JlYXRlKHN0cnVjdCBzczdfdGhyZWFkICp0 aHJwLCBjb25zdCBjaGFyICpkZXNjKQp7CiAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAg ICBjb25zdCBjaGFyICpzcDsKICAgIGludCBsZW47CgogICAgaWYgKCF0cnlfbW9kdWxlX2dldChU SElTX01PRFVMRSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogVGhlIHRocmVhZCBkZXNj cmlwdGlvbiBnZXRzIHRydW5jYXRlZCB0byAxNSBjaGFycywgY2FuJ3QgYmUgaGVscGVkIQogICAg ICogVXNlICdzczdtYWludCBvc3N0YXR1cyAtdCcgdG8gZ2V0IHRoZSBmdWxsIGRlc2NyaXB0aW9u LiAqLwoKICAgIC8qIFJlbW92ZSBhbnkgbGVhZGluZyBzcGFjZSBhbmQgdHJ1bmNhdGUgYWZ0ZXIg c2Vjb25kIHdvcmQgKi8KICAgIGlmIChkZXNjWzBdID09ICcgJykKICAgICAgICBkZXNjKys7CiAg ICBsZW4gPSAxMDA7CiAgICBzcCA9IHNzN3N0cmNocihkZXNjLCAnICcpOwogICAgaWYgKHNwICE9 IE5VTEwpIHsKICAgICAgICBzcCA9IHNzN3N0cmNocihzcCArIDEsICcgJyk7CiAgICAgICAgaWYg KHNwICE9IE5VTEwpCiAgICAgICAgICAgIGxlbiA9IHNwIC0gZGVzYzsKICAgIH0KCiAgICB0YXNr ID0ga3RocmVhZF9ydW4oc3M3X2dsdWVfdGhyZWFkX2ZuLCB0aHJwLCAic3M3OiUuKnMiLCBsZW4s IGRlc2MpOwogICAgaWYgKElTX0VSUih0YXNrKSkgewogICAgICAgIG1vZHVsZV9wdXQoVEhJU19N T0RVTEUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIHRhc2s7Cn0KCnZv aWQKc3M3X21zX2RlbGF5KGNvbnN0IHVuc2lnbmVkIGludCBtcykKewogICAgc2V0X2N1cnJlbnRf c3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogICAgc2NoZWR1bGVfdGltZW91dCgodW5zaWdu ZWQgbG9uZyBsb25nKUhaICogbXMgLyAxMDAwKTsKfQoKaW50CnNzN19vc19nZXRfdGlja3Modm9p ZCkKewogICAgcmV0dXJuIGppZmZpZXM7Cn0KCmludApzczdfb3NfdGlja3NfdG9fdXMoaW50IGlu dGVydmFsKQp7CiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAwMDAwIC8gSFo7Cn0KCmludApzczdf b3NfdGlja3NfdG9fbXMoaW50IGludGVydmFsKQp7CiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAw IC8gSFo7Cn0KCmludApzczdfb3NfdGlja3NfdG9fc2VjcyhpbnQgaW50ZXJ2YWwpCnsKICAgIHJl dHVybiBpbnRlcnZhbCAvIEhaOwp9Cgp1bnNpZ25lZCBpbnQKc3M3X2dldF9tc190aW1lKHZvaWQp CnsKICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVwb2NoOwogICAgc3RydWN0IHRpbWVzcGVjIG5v dzsKCiAgICBnZXRyYXdtb25vdG9uaWMoJm5vdyk7CgogICAgaWYgKGVwb2NoID09IDApCiAgICAg ICBlcG9jaCA9IG5vdy50dl9zZWM7CgogICAgcmV0dXJuIChub3cudHZfc2VjIC0gZXBvY2gpICog MTAwMCArIG5vdy50dl9uc2VjIC8gMTAwMDAwMDsKfQoKc3RydWN0IGFjdV9zczdtYWludF90aW1l IHsKICAgdW5zaWduZWQgaW50IHN0X3NlYzsKICAgdW5zaWduZWQgaW50IHN0X3VzZWM7Cn07Cgoj aWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDUsIDAsIDApCnN0YXRpYyBp bmxpbmUgdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQp7CiAgICAgICAg c3RydWN0IHRpbWVzcGVjNjQgdHM7CgogICAgICAgIGt0aW1lX2dldF9yZWFsX3RzNjQoJnRzKTsK ICAgICAgICB0di0+dHZfc2VjID0gdHMudHZfc2VjOwogICAgICAgIHR2LT50dl91c2VjID0gdHMu dHZfbnNlYy8xMDAwdTsKfQojZW5kaWYKCnZvaWQKc3M3X2dldF90aW1lc3RhbXAoc3RydWN0IGFj dV9zczdtYWludF90aW1lICpwdGltZSkKewogICAgc3RydWN0IHRpbWV2YWwgdHY7CgogICAgLyog ZG9fZ2V0dGltZW9mZGF5KCkgcmV0dXJucyAnd2FsbCBjbG9jayB0aW1lJy4KICAgICAqIEl0IGNh biBnbyBiYWNrd2FyZHMuICAqLwogICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAgICBwdGltZS0+ c3Rfc2VjID0gdHYudHZfc2VjOwogICAgcHRpbWUtPnN0X3VzZWMgPSB0di50dl91c2VjOwp9Cgp1 bnNpZ25lZCBpbnQKc3M3X2dldF9lbGFwc2VkKGNvbnN0IHN0cnVjdCBhY3Vfc3M3bWFpbnRfdGlt ZSAqZXBvY2gpCnsKICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgZG9fZ2V0dGltZW9mZGF5KCZ0 dik7CgogICAgcmV0dXJuIHR2LnR2X3NlYyAtIGVwb2NoLT5zdF9zZWM7Cn0KCnZvaWQKc3M3X29z X2xvZ19lcnJvcihjb25zdCBjaGFyICp0ZXh0KQp7CiAgICBwcmludGsoS0VSTl9FTUVSRyAic3M3 c2VydmVyOiAlcyIsIHRleHQpOwogICAgaWYgKG1lbWNtcCh0ZXh0LCAiQXNzZXJ0aW9uIGZhaWwi LCAxNCkgPT0gMCkgewogICAgICAgIGR1bXBfc3RhY2soKTsKICAgICAgICAvKiBBbHRob3VnaCB3 ZSByZXR1cm4sIHRoZSBjYWxsZXIgc2xlZXBzIGZvcmV2ZXIgKi8KICAgICAgICAvKiBSZW1lbWJl ciB0aGUgJ3N0dWNrJyB0YXNrcyAqLwogICAgICAgIGFzc2VydGVkX3Rhc2tzW2Fzc2VydGVkX3Rh c2tfY291bnQrKyAmIDE1XSA9IGN1cnJlbnQ7CiAgICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKiog TWlzY2VsbGFub3VzIHN0cmluZyBhbmQgbWVtb3J5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqKgoqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2b2lkCnNzN21lbXplcm8odm9pZCAqYnVm LCBzaXplX3QgbGVuKQp7CiAgICBtZW1zZXQoYnVmLCAwLCBsZW4pOwp9Cgp2b2lkCnNzN21lbWNw eSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCnsKICAgIG1lbWNweShk ZXN0LCBzcmMsIGxlbik7Cn0KCnZvaWQKc3M3X21lbW1vdmUodm9pZCAqZGVzdCwgY29uc3Qgdm9p ZCAqc3JjLCBzaXplX3QgbGVuKQp7CiAgICBtZW1tb3ZlKGRlc3QsIHNyYywgbGVuKTsKfQoKaW50 CnNzN21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCnsK ICAgIHJldHVybiBtZW1jbXAoczEsIHMyLCBsZW4pOwp9Cgp1bnNpZ25lZCBpbnQKc3M3c3RybGVu KGNvbnN0IGNoYXIgKnN0cikKewogICAgcmV0dXJuIHN0cmxlbihzdHIpOwp9Cgp2b2lkCnNzN3N0 cmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCnsKICAgIHN0cmNweShkZXN0LCBzcmMp Owp9CgppbnQKc3M3c3RyY21wKGNvbnN0IGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKewog ICAgcmV0dXJuIHN0cmNtcChkZXN0LCBzcmMpOwp9CgpjaGFyICoKc3M3c3RybmNweShjaGFyICpj b25zdCBzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQp7CiAgICByZXR1cm4gc3RybmNweShz MSwgczIsIG4pOwp9CgpjaGFyICoKc3M3c3RyY2hyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGludCBj KQp7CiAgICByZXR1cm4gc3RyY2hyKHMsIGMpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCioqIFRDUC9J UCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKioKKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50CnNzN19zY3RwX3N1cHBvcnRlZCh2b2lkKQp7 CiAgICByZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50CnNzN19nZXRfZGVmYXVsdF9hZl9vcHRzKHVu c2lnbmVkIGludCBwcm90b2NvbCwgdW5zaWduZWQgaW50IHBvcnQpCnsKICAgIC8qIFRoZSBTUzcg ZHJpdmVyIG5lZWRzIHRvIGtub3cgdGhlIHdoaWNoIGFkZHJlc3MgZmFtaWxpZXMgKElQdjQgb3Ig SVB2NikKICAgICAqIHRvIHVzZSBmb3IgbGlzdGVuaW5nIHNvY2tldHMuCiAgICAgKgogICAgICog V2hldGhlciBhbiBJUFY2IHNvY2tldCBjYW4gYWNjZXB0IElQVjQgY29ubmVjdGlvbnMgZGVwZW5k cyBvbgogICAgICogdGhlIElQVjZfVjZPTkxZIHNvY2tldCBvcHRpb24uIFRoZSBkZWZhdWx0IGZv ciB3aGljaCBkZXBlbmRzCiAgICAgKiBvbiBuZXQuaXB2Ni5iaW5kdjZvbmx5ICh3aGljaCB1c3Vh bGx5IGRlZmF1bHRzIHRvIDAgLSBhbGxvd2luZyBJUFY0KS4KICAgICAqIFRoZXJlIGFsc28gbWln aHQgYmUga2VybmVscyB3aGVyZSBjbGVhcmluZyBJUFY2X1Y2T05MWSBpcyBkaXNhbGxvd2VkLgog ICAgICoKICAgICAqIE5vcm1hbGx5IG9ubHkgYSBzaW5nbGUgc29ja2V0IGlzIGNyZWF0ZWQgZm9y IGVhY2ggcG9ydCBzaW5jZSBhbiBJUHY2CiAgICAgKiBzb2NrZXQgY2FuIHJlY2VpdmUgSVB2NCBj b25uZWN0aW9ucy4gSG93ZXZlciBhIHNlcGFyYXRlIElQdjQgc29ja2V0CiAgICAgKiBjYW4gYmUg cmVxdWVzdGVkLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUg b2Y6CiAgICAgKiAgICBTUzdfQUZfT1BUX0lQdjYKICAgICAqICAgICAgICBJUFY2IHNvY2tldCB3 aXRoIHRoZSBkZWZhdWx0IElQVjZfVjZPTkxZIHZhbHVlLgogICAgICogICAgU1M3X0FGX09QVF9J UHY2X1Y2T05MWV9DTFIKICAgICAqICAgICAgICBJUFY2IHNvY2tldCB3aXRoIElQVjZfVjZPTkxZ IGV4cGxpY2l0bHkgY2xlYXJlZC4KICAgICAqICAgIFNTN19BRl9PUFRfSVB2Nl9WNk9OTFlfU0VU CiAgICAgKiAgICAgICAgSVBWNiBzb2NrZXQgd2l0aCBJUFY2X1Y2T05MWSBleHBsaWNpdGx5IHNl dC4KICAgICAqIFBvc3NpYmx5IGxvZ2ljYWxseSBvcmVkIHdpdGg6CiAgICAgKiAgICBTUzdfQUZf T1BUX0lQdjQKICAgICAqICAgICAgICBBIHNlcGFyYXRlIElQdjQgc29ja2V0LgogICAgICoKICAg ICAqIEZvciBmbGV4aWJpbGl0eSB0aGUgZGVjaXNpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBwcm90 b2NvbCAoZWl0aGVyCiAgICAgKiBJUFBST1RPX1NDVFAgb3IgSVBQUk9UT19UQ1ApIG9yIHRoZSBw b3J0IG51bWJlci4KICAgICAqCiAgICAgKiBEZWZhdWx0IHRvIGNyZWF0aW5nIGEgc2luZ2xlIHNv Y2tldCBhbmQgZGlzYWJsaW5nIElQVjZfVjZPTkxZLgogICAgICovCiNpZm5kZWYgU1M3X0RFRkFV TFRfQUZfT1BUUwojZGVmaW5lIFNTN19ERUZBVUxUX0FGX09QVFMgU1M3X0FGX09QVF9JUHY2CiNl bmRpZgogICAgIHJldHVybiBTUzdfREVGQVVMVF9BRl9PUFRTOwp9CgovKiBrZXJuZWxfZ2V0L3Nl dF9zb2Nrb3B0KCkgcHJvdG90eXBlcyBoYXZlIChjaGFyICopIGZvciB0aGUgYnVmZmVyLgogKiAj ZGVmaW5lIGEgKHZvaWQgKikgY2FzdC4KICovCiNkZWZpbmUga2VybmVsX3NldHNvY2tvcHQoc29j aywgbGV2ZWwsIG5hbWUsIHZhbCwgbGVuKSBcCiAgICAgICAga2VybmVsX3NldHNvY2tvcHQoc29j aywgbGV2ZWwsIG5hbWUsICh2b2lkICopdmFsLCBsZW4pCiNkZWZpbmUga2VybmVsX2dldHNvY2tv cHQoc29jaywgbGV2ZWwsIG5hbWUsIHZhbCwgbGVuKSBcCiAgICAgICAga2VybmVsX2dldHNvY2tv cHQoc29jaywgbGV2ZWwsIG5hbWUsICh2b2lkICopdmFsLCBsZW4pCgovKiBOb3RlIHRoYXQgd2Ug Y2FuJ3QgKGVhc2lseSkgaG9sZCByZWZlcmVuY2UgY291bnRzIG9uIHRoZSBuYW1lc3BhY2UKICog YmVjYXVzZSBwdXRfbmV0KCkgaXMgR1BMX09OTFkuCiAqIEluc3RlYWQgd2Uga2VlcCBvdXIgb3du IHRhYmxlIGFuZCBjcmVhdGUgYSBzb2NrZXQgdG8gaG9sZCB0aGUKICogcmVmZXJlbmNlIGZvciB1 cy4KICogVGFibGUgZW50cmllcyAwIGFuZCAxIGFsd2F5cyByZWZlciB0byBpbml0X25ldCBhbmQg dGhlIG5hbWVzcGFjZQogKiBvZiB0aGUgKGxhc3Qgc3RhcnRlZCkgc3M3IGRhZW1vbi4gTmVpdGhl ciBpcyByZWZlcmVuY2UgY291bnRlZAogKiAoYWx0aG91Z2ggd2UgaG9sZCBhIHNpbmdsZSByZWZl cmVuY2Ugb24gdGhlIGxhdHRlcikuCiAqIEhpZ2hlciBlbnRyaWVzIGFyZSBzYXZlZCBmcm9tIGlu dm9jYXRpb25zIG9mICdzczdtYWludCBzdGFydCcKICogYW5kICdmaXJtd2FyZSBkb3dubG9hZCcu ICovCgpzdGF0aWMgc3RydWN0IHNzN19uc19pbmZvIHsKICAgIHN0cnVjdCBuZXQgICAgKm5pX25l dF9uczsKICAgIHN0cnVjdCBzb2NrZXQgKm5pX3NvY2s7CiAgICB1bnNpZ25lZCBpbnQgIG5pX3Jl ZmNvdW50Owp9IHNzN19uc190YWJsZVsyNTZdOwoKc3RhdGljIHN0cnVjdCBzb2NrZXQgKgpzczdf Z2x1ZV9jcmVhdGVfbnNfc29ja2V0KHN0cnVjdCBuZXQgKm5ldCkKewogICAgc3RydWN0IHNvY2tl dCAqc29jazsKCiAgICBpZiAoX19zb2NrX2NyZWF0ZShuZXQsIEFGX0lORVQsIFNPQ0tfREdSQU0s IElQUFJPVE9fVURQLCAmc29jaywgMCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByZXR1cm4g c29jazsKfQoKdm9pZApzczdfbmV0X25zX2dldCh1bnNpZ25lZCBpbnQgbmFtZXNwYWNlKQp7CiAg ICB1bnNpZ25lZCBpbnQgaWR4ID0gU1M3X05FVF9OU19JRFgobmFtZXNwYWNlKTsKCiAgICBpZiAo aWR4IDw9IFNTN19ORVRfTlNfSURYKFNTN19ORVRfTlNfREFFTU9OKSkKICAgICAgICAvKiBTUzdf TkVUX05TX0lOSVQgYW5kIFNTN19ORVRfTlNfREFFTU9OIGFyZW4ndCByZWYtY291bnRlZCAqLwog ICAgICAgIHJldHVybjsKCiAgICBzczdfbXV0ZXhfZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAg IHNzN19uc190YWJsZVtpZHhdLm5pX3JlZmNvdW50Kys7CiAgICBzczdfbXV0ZXhfZXhpdCgmc3M3 X2dsdWVfbXV0ZXgpOwoKICAgIHNzN190cmFjZV9wcmludGYoMCwgInNzN19uZXRfbnNfZ2V0KCV4 KTogcmVmY291bnQgJWQsIHNvY2sgJXAsIG5ldCAlcFxuIiwKICAgICAgICAgICAgbmFtZXNwYWNl LCBzczdfbnNfdGFibGVbaWR4XS5uaV9yZWZjb3VudCwgc3M3X25zX3RhYmxlW2lkeF0ubmlfc29j aywKICAgICAgICAgICAgc3M3X25zX3RhYmxlW2lkeF0ubmlfbmV0X25zKTsKfQoKdm9pZApzczdf bmV0X25zX3B1dCh1bnNpZ25lZCBpbnQgbmFtZXNwYWNlKQp7CiAgICBzdHJ1Y3Qgc3M3X25zX2lu Zm8gKm5pOwogICAgdW5zaWduZWQgaW50IGlkeCA9IFNTN19ORVRfTlNfSURYKG5hbWVzcGFjZSk7 CgogICAgaWYgKGlkeCA8PSBTUzdfTkVUX05TX0lEWChTUzdfTkVUX05TX0RBRU1PTikpCiAgICAg ICAgLyogU1M3X05FVF9OU19JTklUIGFuZCBTUzdfTkVUX05TX0RBRU1PTiBhcmVuJ3QgcmVmLWNv dW50ZWQgKi8KICAgICAgICByZXR1cm47CiAgICBuaSA9IHNzN19uc190YWJsZSArIGlkeDsKCiAg ICBzczdfdHJhY2VfcHJpbnRmKDAsICJzczdfbmV0X25zX3B1dCgleCk6IHJlZmNvdW50ICVkLCBz b2NrICVwLCBuZXQgJXBcbiIsCiAgICAgICAgICAgIG5hbWVzcGFjZSwgbmktPm5pX3JlZmNvdW50 LCBuaS0+bmlfc29jaywgbmktPm5pX25ldF9ucyk7CgogICAgc3M3X211dGV4X2VudGVyKCZzczdf Z2x1ZV9tdXRleCk7CiAgICBpZiAobmktPm5pX3JlZmNvdW50ICYmICEtLW5pLT5uaV9yZWZjb3Vu dCkgewogICAgICAgIC8qIExhc3QgcmVmZXJlbmNlIGdvbmUgKi8KICAgICAgICBzb2NrX3JlbGVh c2UobmktPm5pX3NvY2spOwogICAgICAgIG5pLT5uaV9uZXRfbnMgPSBOVUxMOwogICAgICAgIG5p LT5uaV9zb2NrID0gTlVMTDsKICAgIH0KICAgIHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRl eCk7Cn0KCnN0YXRpYyB2b2lkCnNzN19uZXRfbnNfdW5sb2FkKHZvaWQpCnsKICAgIHVuc2lnbmVk IGludCBpZHg7CiAgICBzdHJ1Y3Qgc3M3X25zX2luZm8gKm5pOwoKICAgIGZvciAoaWR4ID0gMTsg aWR4IDwgQVJSQVlfU0laRShzczdfbnNfdGFibGUpOyBpZHgrKykgewogICAgICAgIG5pID0gc3M3 X25zX3RhYmxlICsgaWR4OwogICAgICAgIGlmICghbmktPm5pX3NvY2spCiAgICAgICAgICAgIGNv bnRpbnVlOwoKICAgICAgICAvKiBUaGlzIHNob3VsZCBvbmx5IHJlcG9ydCBhbnl0aGluZyBmb3Ig dGhlICdkYWVtb24nIHNsb3QgKi8KICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzczdfbmV0X25z X3VubG9hZCgpOiBpZHggJWQsIHJlZmNvdW50ICVkLCBzb2NrICVwLCBuZXQgJXBcbiIsCiAgICAg ICAgICAgICAgICBpZHgsIG5pLT5uaV9yZWZjb3VudCwgbmktPm5pX3NvY2ssIG5pLT5uaV9uZXRf bnMpOwogICAgICAgIHNvY2tfcmVsZWFzZShuaS0+bmlfc29jayk7CiAgICAgICAgbmktPm5pX25l dF9ucyA9IE5VTEw7CiAgICAgICAgbmktPm5pX3NvY2sgPSBOVUxMOwogICAgICAgIG5pLT5uaV9y ZWZjb3VudCA9IDA7CiAgICB9Cn0KCnVuc2lnbmVkIGludApzczdfbmV0X25zX3NldCh1bnNpZ25l ZCBpbnQgbmV3X25hbWVzcGFjZSwgdW5zaWduZWQgaW50IG9sZF9uYW1lc3BhY2UpCnsKICAgIHN0 YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3VzZWRfaWR4ID0gMjsKICAgIHVuc2lnbmVkIGludCBpZHgs IGZyZWVfaWR4OwogICAgc3RydWN0IHNzN19uc19pbmZvICpuaTsKICAgIHN0cnVjdCBuZXQgKm5l dDsKCiAgICAvKiBUaGUgbmV3X25hbWVzcGFjZSBzaG91bGQgaGF2ZSB0aGUgbG93IDE2IGJpdHMg emVyby4KICAgICAqIFRoZSBsb3cgYml0cyBvZiBvbGRfbmFtZXNwYWNlIGluZGljYXRlIHdoYXQg d2FzIGFjdHVhbGx5IGJlaW5nIHVzZWQuICovCgogICAgaWYgKG5ld19uYW1lc3BhY2UgIT0gU1M3 X05FVF9OU19TVEFSVCkgewogICAgICAgIHNzN19uZXRfbnNfcHV0KG9sZF9uYW1lc3BhY2UpOwog ICAgICAgIHJldHVybiBuZXdfbmFtZXNwYWNlID09IFNTN19ORVRfTlNfREFFTU9OID8gU1M3X05F VF9OU19EQUVNT04gOiBTUzdfTkVUX05TX0lOSVQ7CiAgICB9CgogICAgLyogU1M3X05FVF9OU19T VEFSVCAtIGxvb2sgZm9yIGFuIGVudHJ5IGZvciB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50 IAogICAgICogcHJvY2VzcyAod2hpY2ggd2lsbCBiZSAnc3M3bWFpbnQgc3RhcnQnKS4gKi8KICAg IG5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKCiAgICBpZHggPSBTUzdfTkVUX05TX0lE WChvbGRfbmFtZXNwYWNlKTsKICAgIG5pID0gc3M3X25zX3RhYmxlICsgaWR4OwogICAgaWYgKG5p LT5uaV9uZXRfbnMgPT0gbmV0KQogICAgICAgIC8qIFVuY2hhbmdlZCBpbmRleCwgbm8gbmVlZCB0 byBjaGFuZ2UgcmVmZXJlbmNlIGNvdW50ICovCiAgICAgICAgcmV0dXJuIFNTN19ORVRfTlNfU1RB UlQgfCBpZHg7CgogICAgLyogRGlmZmVyZW50IHNsb3QgbmVlZGVkLCBkcm9wIG9sZCByZWZlcmVu Y2UgKi8KICAgIHNzN19uZXRfbnNfcHV0KG9sZF9uYW1lc3BhY2UpOwoKICAgIC8qIENoZWNrIGlu aXQgYW5kIGRhZW1vbiBlbnRyaWVzLCBuZWl0aGVyIGdvZXMgYXdheSAqLwogICAgaWYgKGlkeCAh PSBTUzdfTkVUX05TX0lEWChTUzdfTkVUX05TX0lOSVQpCiAgICAgICAgICAgICYmIG5ldCA9PSAm aW5pdF9uZXQpCiAgICAgICAgcmV0dXJuIFNTN19ORVRfTlNfU1RBUlQgfCBTUzdfTkVUX05TX0lE WChTUzdfTkVUX05TX0lOSVQpOwoKICAgIGlkeCA9IFNTN19ORVRfTlNfSURYKFNTN19ORVRfTlNf REFFTU9OKTsKICAgIG5pID0gc3M3X25zX3RhYmxlICsgaWR4OwogICAgaWYgKG5ldCA9PSBuaS0+ bmlfbmV0X25zKQogICAgICAgIHJldHVybiBTUzdfTkVUX05TX1NUQVJUIHwgaWR4OwoKICAgIHNz N19tdXRleF9lbnRlcigmc3M3X2dsdWVfbXV0ZXgpOwoKICAgIC8qIFNjYW4gdGFibGUgZm9yIGFu IGV4aXN0aW5nIHJlZmVyZW5jZSAqLwogICAgZnJlZV9pZHggPSAwOwogICAgZm9yIChpZHggPSAy OyBpZHggPCBudW1fdXNlZF9pZHg7IGlkeCsrKSB7CiAgICAgICAgbmkgPSBzczdfbnNfdGFibGUg KyBpZHg7CiAgICAgICAgaWYgKG5pLT5uaV9uZXRfbnMgPT0gbmV0KSB7CiAgICAgICAgICAgIC8q IGZvdW5kIGEgbWF0Y2ggKi8KICAgICAgICAgICAgbmktPm5pX3JlZmNvdW50Kys7CiAgICAgICAg ICAgIHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgICAgIHNzN190cmFj ZV9wcmludGYoMCwgInNzN19uZXRfbnNfc2V0KCV4LCAleCk6IGZvdW5kIGlkeCAlZCwgcmVmY291 bnQgJWQsIHNvY2sgJXAsIG5ldCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZXNw YWNlLCBvbGRfbmFtZXNwYWNlLCBpZHgsIG5pLT5uaV9yZWZjb3VudCwgbmktPm5pX3NvY2ssIG5p LT5uaV9uZXRfbnMpOwogICAgICAgICAgICByZXR1cm4gU1M3X05FVF9OU19TVEFSVCB8IGlkeDsK ICAgICAgICB9CiAgICAgICAgaWYgKCFmcmVlX2lkeCAmJiAhbmktPm5pX25ldF9ucykKICAgICAg ICAgICAgZnJlZV9pZHggPSBpZHg7CiAgICB9CgogICAgLyogTm90IGZvdW5kIGFsbG9jYXRlIGxv d2VzdCBmcmVlIHNsb3QgKi8KICAgIGlmICghZnJlZV9pZHgpIHsKICAgICAgICBpZiAobnVtX3Vz ZWRfaWR4ID49IEFSUkFZX1NJWkUoc3M3X25zX3RhYmxlKSkKICAgICAgICAgICAgLyogVGFibGUg ZnVsbCwgYm9ya2VkICovCiAgICAgICAgICAgIGdvdG8gbm9fcmVmOwogICAgICAgIGZyZWVfaWR4 ID0gbnVtX3VzZWRfaWR4Kys7CiAgICB9CgogICAgbmkgPSAmc3M3X25zX3RhYmxlW2ZyZWVfaWR4 XTsKICAgIG5pLT5uaV9zb2NrID0gc3M3X2dsdWVfY3JlYXRlX25zX3NvY2tldChuZXQpOwogICAg aWYgKCFuaS0+bmlfc29jaykKICAgICAgICBnb3RvIG5vX3JlZjsKICAgIG5pLT5uaV9uZXRfbnMg PSBuZXQ7CgogICAgc3M3X211dGV4X2V4aXQoJnNzN19nbHVlX211dGV4KTsKICAgIHNzN190cmFj ZV9wcmludGYoMCwgInNzN19uZXRfbnNfc2V0KCV4LCAleCk6IG5ldyBpZHggJWQsIHNvY2sgJXAs IG5ldCAlcFxuIiwKICAgICAgICAgICAgbmV3X25hbWVzcGFjZSwgb2xkX25hbWVzcGFjZSwgZnJl ZV9pZHgsIG5pLT5uaV9zb2NrLCBuaS0+bmlfbmV0X25zKTsKCiAgICByZXR1cm4gU1M3X05FVF9O U19TVEFSVCB8IGZyZWVfaWR4OwoKICBub19yZWY6CiAgICBzczdfbXV0ZXhfZXhpdCgmc3M3X2ds dWVfbXV0ZXgpOwogICAgc3M3X3RyYWNlX3ByaW50ZigwLCAic3M3X25ldF9uc19zZXQoJXgsICV4 KTogbm9fcmVmXG4iLAogICAgICAgICAgICBuZXdfbmFtZXNwYWNlLCBvbGRfbmFtZXNwYWNlKTsK ICAgIHJldHVybiBTUzdfTkVUX05TX1NUQVJUOwp9Cgp2b2lkCnNzN19nbHVlX2RhZW1vbl9vcGVu KHZvaWQpCnsKICAgIHN0cnVjdCBzczdfbnNfaW5mbyAqbmkgPSAmc3M3X25zX3RhYmxlW1NTN19O RVRfTlNfSURYKFNTN19ORVRfTlNfREFFTU9OKV07CiAgICBzdHJ1Y3QgbmV0ICpuZXQgPSBjdXJy ZW50LT5uc3Byb3h5LT5uZXRfbnM7CgogICAgLyogU2F2ZSAoYW5kIHJlZmVyZW5jZSBjb3VudCkg dGhlIG5ldHdvcmsgbmFtZXNwYWNlIHRoZSBzczcgZGFlbW9uCiAgICAgKiBpcyBzdGFydGVkIGlu LiAqLwoKICAgIC8qIEluaXRpYWxpc2UgdGhlIGVudHJ5IGZvciBpbml0X25ldCBoZXJlIC0gaGFz IHRvIGJlIGRvbmUgc29tZXdoZXJlLiAqLwogICAgc3M3X25zX3RhYmxlW1NTN19ORVRfTlNfSURY KFNTN19ORVRfTlNfSU5JVCldLm5pX25ldF9ucyA9ICZpbml0X25ldDsKCiAgICBpZiAobmV0ID09 IG5pLT5uaV9uZXRfbnMpCiAgICAgICAgLyogVW5jaGFuZ2VkICovCiAgICAgICAgcmV0dXJuOwoK ICAgIGlmIChuaS0+bmlfc29jaykKICAgICAgICBzb2NrX3JlbGVhc2UobmktPm5pX3NvY2spOwog ICAgbmktPm5pX3NvY2sgPSBOVUxMOwoKICAgIGlmIChuZXQgIT0gJmluaXRfbmV0ICYmICEoKG5p LT5uaV9zb2NrID0gc3M3X2dsdWVfY3JlYXRlX25zX3NvY2tldChuZXQpKSkpCiAgICAgICAgLyog Q2FuJ3QgY3JlYXRlIHNvY2tldCwgZGVmYXVsdCB0byBnbG9iYWwgbmFtZXNwYWNlICovCiAgICAg ICAgbmV0ID0gJmluaXRfbmV0OwoKICAgIG5pLT5uaV9uZXRfbnMgPSBuZXQ7Cn0KCmludApzczdf c29ja2V0KGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBu YW1lc3BhY2UsIHN0cnVjdCBzb2NrZXQgKipzb2NrcCkKewogICAgc3RydWN0IHNvY2tldCAqc29j azsKICAgIHN0cnVjdCBuZXQgKm5ldDsKICAgIHVuc2lnbmVkIGludCBvbmUgPSAxVTsKICAgIGlu dCBydmFsOwoKICAgIG5ldCA9IHNzN19uc190YWJsZVtTUzdfTkVUX05TX0lEWChuYW1lc3BhY2Up XS5uaV9uZXRfbnM7CiAgICBpZiAoIW5ldCkKICAgICAgICBuZXQgPSAmaW5pdF9uZXQ7CgogICAg LyogSWYgd2UgaGF2ZSB0byBhdXRvbG9hZCB0aGUgc2N0cCBtb2R1bGUsIHdlIG1pZ2h0IHJlLWVu dGVyIGl0CiAgICAgKiBiZWZvcmUgaXQgaGFzIGZpbmlzaGVkIGluaXRpYWxpc2luZyAtIG1pZ2h0 IGdvICdib29tJy4gKi8KICAgIHNzN19tdXRleF9lbnRlcigmc3M3X2dsdWVfbXV0ZXgpOwoKICAg IC8qIHNvY2tfY3JlYXRlX2tlcm4oKSBjcmVhdGVzIGEgc29ja2V0IHRoYXQgZG9lc24ndCBob2xk IGEgcmVmZXJlbmNlCiAgICAgKiB0byB0aGUgbmFtZXNwYWNlICh0aGV5IGdldCB1c2VkIGZvciBz b2NrZXRzIG5lZWRlZCBieSB0aGUgcHJvdG9jb2wKICAgICAqIHN0YWNrIGNvZGUgaXRzZWxmKS4K ICAgICAqIFdlIG5lZWQgYSBzb2NrZXQgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbmFt ZXNwYWNlLCBzbyBjcmVhdGUKICAgICAqIGEgJ3VzZXInIHNvY2tldCBpbiBhIHNwZWNpZmljIG5h bWVzcGFjZS4KICAgICAqIFRoaXMgYWRkcyBhbiBleHRyYSBzZWN1cml0eSBjaGVjayB3aGljaCB3 ZSBzaG91bGQgcGFzcyBiZWNhdXNlIGFsbCB0aGUKICAgICAqIHNvY2tldHMgYXJlIGNyZWF0ZWQg Ynkga2VybmVsIHRocmVhZHMuCiAgICAgKi8KICAgIHJ2YWwgPSBfX3NvY2tfY3JlYXRlKG5ldCwg ZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgc29ja3AsIDApOwogICAgc3M3X211dGV4X2V4aXQoJnNz N19nbHVlX211dGV4KTsKICAgIGlmIChydmFsICE9IDApCiAgICAgICAgcmV0dXJuIHJ2YWw7CiAg ICBzb2NrID0gKnNvY2twOwoKICAgIGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQs IFNPX1JFVVNFQUREUiwgJm9uZSwgc2l6ZW9mIG9uZSk7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQK c3M3X3NldHNvY2tvcHRfbm9kZWxheShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZW5hYmxlZCkK ewogICAga2VybmVsX3NldHNvY2tvcHQoc29jaywgU0tfUFJPVE9DT0woc29jayksCiAgICAgICAg ICAgIFNLX1BST1RPQ09MKHNvY2spID09IElQUFJPVE9fVENQID8gVENQX05PREVMQVkgOiBTQ1RQ X05PREVMQVksCiAgICAgICAgICAgICZlbmFibGVkLCBzaXplb2YgZW5hYmxlZCk7Cn0KCnN0YXRp YyB2b2lkCnNzN19zY3RwX3NldF9vcHRzKHN0cnVjdCBzb2NrZXQgKnNvY2spCnsKICAgIHN0cnVj dCBzY3RwX2V2ZW50X3N1YnNjcmliZSBldmVudHM7CiAgICBpbnQgbGVuLCBydmFsOwoKICAgIGlm IChTS19QUk9UT0NPTChzb2NrKSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuOwoKICAg IGxlbiA9IHNpemVvZiBldmVudHM7CiAgICBydmFsID0ga2VybmVsX2dldHNvY2tvcHQoc29jaywg SVBQUk9UT19TQ1RQLCBTQ1RQX0VWRU5UUywgJmV2ZW50cywgJmxlbik7CiAgICBpZiAocnZhbCAh PSAwKQogICAgICAgIHJldHVybjsKCiAgICAvKiBXZSBuZWVkIHRvIGtub3cgdGhlIHN0cmVhbSBh bmQgcHBpZCAqLwogICAgZXZlbnRzLnNjdHBfZGF0YV9pb19ldmVudCA9IDE7CiAgICAvKiBFbmFi bGUgbm90aWZpY2F0aW9ucyB0byBkZXRlY3QgY29ubmVjdGlvbiByZXN0YXJ0ICovCiAgICBldmVu dHMuc2N0cF9hc3NvY2lhdGlvbl9ldmVudCA9IDE7CiAgICBrZXJuZWxfc2V0c29ja29wdChzb2Nr LCBJUFBST1RPX1NDVFAsIFNDVFBfRVZFTlRTLCAmZXZlbnRzLCBzaXplb2YgZXZlbnRzKTsKfQoK dW5zaWduZWQgaW50CnNzN19nZXRfbWF4X3NjdHBfb3N0cmVhbXMoc3RydWN0IHNvY2tldCAqc29j aykKewogICAgc3RydWN0IHNjdHBfc3RhdHVzIHNzdGF0OwogICAgaW50IGxlbjsKCiAgICBpZiAo U0tfUFJPVE9DT0woc29jaykgIT0gSVBQUk9UT19TQ1RQKQogICAgICAgIHJldHVybiAwOwoKICAg IGxlbiA9IHNpemVvZiBzc3RhdDsKICAgIGlmIChrZXJuZWxfZ2V0c29ja29wdChzb2NrLCBJUFBS T1RPX1NDVFAsIFNDVFBfU1RBVFVTLCAmc3N0YXQsICZsZW4pKQogICAgICAgIHJldHVybiAwOwoK ICAgIHJldHVybiBzc3RhdC5zc3RhdF9vdXRzdHJtczsKfQoKdm9pZApzczdfc2V0X21heF9zY3Rw X3N0cmVhbXMoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IG1heF9zdHJlYW1zKQp7 CiAgICBzdHJ1Y3Qgc2N0cF9pbml0bXNnIHNpbml0OwoKICAgIGlmIChTS19QUk9UT0NPTChzb2Nr KSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuOwoKICAgIG1lbXNldCgmc2luaXQsIDAs IHNpemVvZiBzaW5pdCk7CgogICAgc2luaXQuc2luaXRfbnVtX29zdHJlYW1zID0gbWF4X3N0cmVh bXM7CiAgICBzaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zID0gbWF4X3N0cmVhbXM7CiAgICBrZXJu ZWxfc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1NDVFAsIFNDVFBfSU5JVE1TRywgJnNpbml0LCBz aXplb2Ygc2luaXQpOwp9Cgp2b2lkCnNzN190cmFuc19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQg KnNvY2spCnsKICAgIHVuc2lnbmVkIGludCBvbmUgPSAxVTsKCiAgICBzczdfc2V0c29ja29wdF9u b2RlbGF5KHNvY2ssIDEpOwogICAgc3M3X3NjdHBfc2V0X29wdHMoc29jayk7CiAgICBpZiAoU0tf UFJPVE9DT0woc29jaykgPT0gSVBQUk9UT19UQ1ApCiAgICAgICAga2VybmVsX3NldHNvY2tvcHQo c29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmb25lLCBzaXplb2Ygb25lKTsKfQoKdm9p ZApzczdfdHJhbnNiaW5kX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaykKewogICAgLyog U2V0IG9wdGlvbnMgZm9yIGEgbGlzdGVuaW5nIHNvY2tldCAqLwogICAgc3M3X3NjdHBfc2V0X29w dHMoc29jayk7CgogICAgLyogTTNVQSBtYXkgbmVlZCAxNiBkYXRhIHN0cmVhbXMsIGl0IGlzIGp1 c3QgVEZIIHRvIGNvbmZpZ3VyZSB0aGlzICovCiAgICBzczdfc2V0X21heF9zY3RwX3N0cmVhbXMo c29jaywgMSArIDE2KTsKfQoKI2RlZmluZSBJUF9BRERSX0xFTihzYSkgKChzYSktPnNpbjZfZmFt aWx5ID09IEFGX0lORVQ2ID8gc2l6ZW9mICooc2EpIDogMTYpCmludApzczdfY29ubmVjdChzdHJ1 Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYSkKewogICAgcmV0dXJuIGtl cm5lbF9jb25uZWN0KHNvY2ssICh2b2lkICopc2EsIElQX0FERFJfTEVOKHNhKSwgT19SRFdSKTsK fQoKaW50CnNzN19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYg KnNhLCB1bnNpZ25lZCBpbnQgYWZfb3B0cykKewogICAgLyogSWYgd2UgYXJlIGJpbmRpbmcgSU5B RERSNl9BTlkgdG8gYW4gSVB2NiBzb2NrZXQgKHR5cGljYWxseSBmb3IKICAgICAqIGEgbGlzdGVu aW5nIHNvY2tldCkgdGhlbiB3ZSBwcm9iYWJseSB3YW50IHRvIGVuc3VyZSB0aGF0IElQVjZfVjZP TkxZCiAgICAgKiBpcyAwIHNvIHRoYXQgdGhlIHNvY2tldCB3aWxsIGFsc28gYmUgZ2l2ZW4gSVB2 NCBjb25uZWN0aW9ucy4gKi8KICAgIGlmIChzYS0+c2luNl9mYW1pbHkgPT0gQUZfSU5FVDYgJiYg YWZfb3B0cyAmIFNTN19BRl9PUFRfSVB2Nl9WNk9OTFkKICAgICAgICAgICAgJiYgc2EtPnNpbjZf YWRkci5pbjZfdS51Nl9hZGRyMzJbMF0gPT0gMAogICAgICAgICAgICAmJiAoc2EtPnNpbjZfYWRk ci5pbjZfdS51Nl9hZGRyMzJbMV0KICAgICAgICAgICAgICAgIHwgc2EtPnNpbjZfYWRkci5pbjZf dS51Nl9hZGRyMzJbMl0KICAgICAgICAgICAgICAgIHwgc2EtPnNpbjZfYWRkci5pbjZfdS51Nl9h ZGRyMzJbM10pID09IDApIHsKICAgICAgICBpbnQgdjZvbmx5ID0gYWZfb3B0cyAmIDE7CiAgICAg ICAga2VybmVsX3NldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJnY2 b25seSwgc2l6ZW9mIHY2b25seSk7CiAgICB9CgogICAgcmV0dXJuIGtlcm5lbF9iaW5kKHNvY2ss ICh2b2lkICopc2EsIElQX0FERFJfTEVOKHNhKSk7Cn0KCmludApzczdfYmluZHgoc3RydWN0IHNv Y2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX2luNiAqc2EpCnsKICAgIGlmIChTS19QUk9UT0NP TChzb2NrKSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7 CgogICAgcmV0dXJuIGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fU0NUUCwgU0NUUF9T T0NLT1BUX0JJTkRYX0FERCwKICAgICAgICAgICAgc2EsIElQX0FERFJfTEVOKHNhKSk7Cn0KCmlu dApzczdfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZW4pCnsKICAgIHJldHVybiBr ZXJuZWxfbGlzdGVuKHNvY2ssIGxlbik7Cn0KCmludApzczdfYWNjZXB0KHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrZXQgKipuZXdfc29ja3AsIGludCBmbGFncykKewogICAgcmV0dXJu IGtlcm5lbF9hY2NlcHQoc29jaywgbmV3X3NvY2twLCBmbGFncyk7Cn0KCiNpZiBMSU5VWF9WRVJT SU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LCAxNywgMCkKc3RhdGljIGlubGluZSBpbnQKc3M3 X2tlcm5lbF9nZXRzb2NrbmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIg KmFkZHJlc3MpCnsKICAgIGludCBlcnIsIGxlbjsKCiAgICBlcnIgPSBrZXJuZWxfZ2V0c29ja25h bWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsICZsZW4pOwogICAgcmV0dXJuIGVy ciA/IGVyciA6IGxlbjsKfQojZGVmaW5lIGtlcm5lbF9nZXRzb2NrbmFtZSBzczdfa2VybmVsX2dl dHNvY2tuYW1lCgpzdGF0aWMgaW5saW5lIGludApzczdfa2VybmVsX2dldHBlZXJuYW1lKHN0cnVj dCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcykKewogICAgaW50IGVyciwg bGVuOwoKICAgIGVyciA9IGtlcm5lbF9nZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRy ICopYWRkcmVzcywgJmxlbik7CiAgICByZXR1cm4gZXJyID8gZXJyIDogbGVuOwp9CiNkZWZpbmUg a2VybmVsX2dldHBlZXJuYW1lIHNzN19rZXJuZWxfZ2V0cGVlcm5hbWUKI2VuZGlmCgppbnQKc3M3 X2dldF9sb2NfcG9ydChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQp7CiAgICBjaGFyIGFkZHJlc3NbMTI4 IC8qTUFYX1NPQ0tfQUREUiovXTsKICAgIGludCBsZW47CgogICAgbGVuID0ga2VybmVsX2dldHNv Y2tuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzKTsKICAgIGlmIChsZW4gPCAw KQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIFRoaXMgd29ya3Mgd2VsbCBlbm91Z2ggZm9yIElQ djQgYW5kIElQdjYgKi8KICAgIHJldHVybiBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFk ZHJlc3MpLT5zaW5fcG9ydCk7Cn0KCmludApzczdfZ2V0X3JlbV9hZGRyKHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhZGRyKQp7CiAgICBpbnQgbGVuOwoKICAgIGxl biA9IGtlcm5lbF9nZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopc2FkZHIpOwog ICAgaWYgKGxlbiA8IDApCiAgICAgICAgcmV0dXJuIGxlbjsKCiAgICBpZiAobGVuID4gc2l6ZW9m ICpzYWRkcikKICAgICAgICBwcmludGsoS0VSTl9FTUVSRyAic3M3c2VydmVyOiBzb2NrZXQgYWRk cmVzcyAoZmFtaWx5ICVkKSAlZCA+ICVkIiwKICAgICAgICAgICAgICAgIHNhZGRyLT5zaW42X2Zh bWlseSwgbGVuLCAoaW50KXNpemVvZiAqc2FkZHIpOwoKICAgIHJldHVybiAwOwp9CgppbnQKc3M3 X3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCnsKI2lmIExJTlVYX1ZFUlNJ T05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDE4LCAwKQogICAgaWYgKFNLX1BST1RPQ09MKHNv Y2spID09IElQUFJPVE9fU0NUUCkgewogICAgICAgIHN0cnVjdCBsaW5nZXIgbGluZ2VyOwoKICAg ICAgICAvKiBJZiB3ZSBjYWxsIGtlcm5lbF9zb2NrX3NodXRkb3duKCkgdGhlbiB0aGUgY29ubmVj dGlvbiBpc24ndCByZWxlYXNlZAogICAgICAgICAqIHVudGlsIGFsbCBvdXRzdGFuZGluZyBkYXRh IGhhcyBiZWVuIGFja2VkLgogICAgICAgICAqIElmIHRoZSByZW1vdGUgc3lzdGVtIHNlbmRzIGFu IElOSVQgKHJlc3RhcnRpbmcgdGhlIGNvbm5lY3Rpb24pCiAgICAgICAgICogd2hpbGUgdGhlIGxp bnV4IGtlcm5lbCBpcyB3YWl0aW5nIGZvciBkYXRhIHRvIGJlIGFja2VkIHRoZW4gaXQKICAgICAg ICAgKiB3aWxsIG5ldmVyIGRpc2Nvbm5lY3QuCiAgICAgICAgICogRW5hYmxpbmcgJ2xpbmdlcicg d2l0aCBhIGRlbGF5IG9mIHplcm8gY2F1c2VzIHNvY2tfcmVsZWFzZSgpCiAgICAgICAgICogdG8g YWJvcnQgdGhlIGNvbm5lY3Rpb24gKHNlbmRzIGFuIEFCT1JUIGNodW5rKS4KICAgICAgICAgKgog ICAgICAgICAqIFRoZSBzczcgY29kZSBuZXZlciBuZWVkcyB0byB3YWl0IGZvciBzZW50IGRhdGEg dG8gYmUgYWNrZWQsCiAgICAgICAgICogc28gYWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24gZG9lc24n dCByZWFsbHkgbWF0dGVyLgogICAgICAgICAqIEFsbCBjYWxscyB0byBzczdfc2h1dGRvd24oKSBh cmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgY2FsbHMgdG8KICAgICAgICAgKiBzczdfY2xvc2Vz b2NrZXQoKS4KICAgICAgICAgKgogICAgICAgICAqIFBsYXVzaWJseSB3ZSBzaG91bGQgYWx3YXlz IGFib3J0IGNvbm5lY3Rpb25zIGlmIHdlIGFyZSBkaXNjb25uZWN0aW5nCiAgICAgICAgICogZHVl IHRvIGFuIGFwcGxpY2F0aW9uIGxldmVsIHRpbWVvdXQuCiAgICAgICAgICoKICAgICAgICAgKiBG aXhlZCBieSB0aGUga2VybmVsIHBhdGNoOgogICAgICAgICAqICAgICJzY3RwOiBoYW5kbGUgYXNz b2NpYXRpb24gcmVzdGFydHMgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCIKICAgICAgICAgKiBL bm93biB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIGtlcm5lbHM6CiAgICAgICAgICog IC0gbWFpbmxpbmUgMy4xOAogICAgICAgICAqICAtIFVidW50dSAzLjEzLjExLjExCiAgICAgICAg ICogUXVldWVkIGZvciAzLjEwLXN0YWJsZSwgMy4xNC1zdGFibGUsIDMuMTYtc3RhYmxlIGFuZCAz LjE3LXN0YWJsZQogICAgICAgICAqLwoKICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CiAgICAg ICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKICAgICAgICBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBT T0xfU09DS0VULCBTT19MSU5HRVIsICZsaW5nZXIsIHNpemVvZiBsaW5nZXIpOwoKICAgICAgICBy ZXR1cm4gMDsKICAgIH0KI2VuZGlmCiAgICByZXR1cm4ga2VybmVsX3NvY2tfc2h1dGRvd24oc29j aywgaG93KTsKfQoKdm9pZApzczdfY2xvc2Vzb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaykKewog ICAgc29ja19yZWxlYXNlKHNvY2spOwp9CgppbnQKc3M3X3NlbmQoc3RydWN0IHNvY2tldCAqc29j aywgc3RydWN0IHNzN19pb3ZlYyAqaW92LCBpbnQgaW92bGVuLCBpbnQgdG90bGVuLAogICAgICAg IHZvaWQgKmN0bCwgaW50IGN0bF9sZW4sIHVuc2lnbmVkIGludCBmbGFncykKewogICAgc3RydWN0 IG1zZ2hkciBtc2c7CgogICAgbXNnLm1zZ19uYW1lICAgICAgID0gMDsKICAgIG1zZy5tc2dfbmFt ZWxlbiAgICA9IDA7CiAgICBtc2cubXNnX2NvbnRyb2wgICAgPSBjdGw7CiAgICBtc2cubXNnX2Nv bnRyb2xsZW4gPSBjdGxfbGVuOwogICAgbXNnLm1zZ19mbGFncyAgICAgID0gZmxhZ3MgfCBNU0df Tk9TSUdOQUw7CgogICAgcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIGlvdiwgaW92 bGVuLCB0b3RsZW4pOwp9CgppbnQKc3M3X3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWdu ZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgaW50IGZsYWdzKQp7CiAgICBzdHJ1Y3Qga3ZlYyBp b3Y7CiAgICBzdHJ1Y3QgbXNnaGRyIG1zZzsKCiAgICBpZiAoIXNvY2stPnNrKQogICAgICAgIHJl dHVybiAwOwoKICAgIGlvdi5pb3ZfbGVuICAgICAgICA9IGxlbmd0aDsKICAgIGlvdi5pb3ZfYmFz ZSAgICAgICA9IGRhdGE7CgogICAgbXNnLm1zZ19uYW1lICAgICAgID0gMDsKICAgIG1zZy5tc2df bmFtZWxlbiAgICA9IDA7CiAgICBtc2cubXNnX2NvbnRyb2wgICAgPSBOVUxMOwogICAgbXNnLm1z Z19jb250cm9sbGVuID0gMDsKICAgIG1zZy5tc2dfZmxhZ3MgICAgICA9IDA7CgogICAgcmV0dXJu IGtlcm5lbF9yZWN2bXNnKHNvY2ssICZtc2csICZpb3YsIDEsIGxlbmd0aCwgMCk7Cn0KCmludApz czdfcmVjdl9zY3RwKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHZvaWQgKmJ1Zl8xLCBpbnQgbGVuXzEs IHZvaWQgKmJ1Zl8yLAogICAgaW50IGxlbl8yLCBzdHJ1Y3Qgc3M3X21zZ2IgKnNzN19tc2cpCnsK ICAgIHN0cnVjdCBtc2doZHIgbXNnOwogICAgc3RydWN0IGt2ZWMgaW92WzJdOwogICAgdW5zaWdu ZWQgY2hhciAqZGF0YSA9IGJ1Zl8xOwogICAgaW50IG1zZ19sZW4sIGN0bF9sZW47CiAgICBpbnQg cnZhbDsKICAgIHVuaW9uIHsKICAgICAgICBzdHJ1Y3QgY21zZ2hkciBjbXNnOwogICAgICAgIHVu c2lnbmVkIGludCBidWZbMTZdOwogICAgfSBjdGxidWY7CgogICAgaWYgKCFzb2NrLT5zaykKICAg ICAgICByZXR1cm4gMDsKCiAgICAvKiBGb3IgU0NUUCBlYWNoIHJlY3Ztc2cgc2hvdWxkIGdpdmUg dXMgYSBzaW5nbGUgZGF0YSByZWNvcmQuCiAgICAgKiBTaW5jZSB3ZSBvbmx5IGV2ZXIgc2VuZCBT SUdUUkFOIGVuY29kZWQgbWVzc2FnZXMgYnl0ZXMgNC03IGFyZSB0aGUKICAgICAqIGxlbmd0aCAt IGFuZCBzaG91bGQgbWF0Y2ggdGhhdCBvZiB0aGUgc2N0cCBkYXRhIGNodW5rLgogICAgICogYnVm XzEvbGVuXzEgcmVmZXIgdG8gdGhlIG5vcm1hbCBzczcgbWVzc2FnZSBidWZmZXIgYXJlYSwgYnVm XzIvbGVuXzIKICAgICAqIGFyZSBwZXItc29ja2V0LiBMb25nIG1lc3NhZ2VzIGdldCBjb3BpZWQg dG9nZXRoZXIgYnkgdGhlIGNhbGxlci4KICAgICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgc2lu Z2xlIHZhbGlkIFNJR1RSQU4gbWVzc2FnZSAqLwoKICAgIGlvdlswXS5pb3ZfYmFzZSAgICA9IGJ1 Zl8xOwogICAgaW92WzBdLmlvdl9sZW4gICAgID0gbGVuXzE7CiAgICBpb3ZbMV0uaW92X2Jhc2Ug ICAgPSBidWZfMjsKICAgIGlvdlsxXS5pb3ZfbGVuICAgICA9IGxlbl8yOwoKICAgIG1zZy5tc2df bmFtZSAgICAgICA9IDA7CiAgICBtc2cubXNnX25hbWVsZW4gICAgPSAwOwogICAgbXNnLm1zZ19j b250cm9sICAgID0gJmN0bGJ1ZjsKICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZiBjdGxi dWY7CiAgICBtc2cubXNnX2ZsYWdzICAgICAgPSAwOwoKICAgIHJ2YWwgPSBrZXJuZWxfcmVjdm1z Zyhzb2NrLCAmbXNnLCBpb3YsIDIsIGxlbl8xICsgbGVuXzIsIDApOwoKICAgIGlmIChydmFsIDw9 IDApCiAgICAgICAgLyogRG9uJ3QgcmV0dXJuIEVCQURNU0cgaGVyZSAqLwogICAgICAgIHJldHVy biBydmFsICE9IC1FQkFETVNHID8gcnZhbCA6IC1FSU87CgogICAgaWYgKG1zZy5tc2dfZmxhZ3Mg JiBNU0dfTk9USUZJQ0FUSU9OKQogICAgICAgIC8qIG1zZyBkYXRhIGlzIGEgbm90aWZpY2F0aW9u ICovCiAgICAgICAgcmV0dXJuIC1FQkFETVNHOwoKICAgIGN0bF9sZW4gPSAoY2hhciAqKW1zZy5t c2dfY29udHJvbCAtIChjaGFyICopJmN0bGJ1ZjsKICAgIGlmIChjdGxfbGVuID49IGN0bGJ1Zi5j bXNnLmNtc2dfbGVuCiAgICAgICAgICAgICYmIGN0bGJ1Zi5jbXNnLmNtc2dfbGV2ZWwgPT0gSVBQ Uk9UT19TQ1RQCiAgICAgICAgICAgICYmIGN0bGJ1Zi5jbXNnLmNtc2dfdHlwZSA9PSBTQ1RQX1NO RFJDVikgewogICAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvID0gQ01TR19EQVRB KCZjdGxidWYuY21zZyk7CiAgICAgICAgc3M3X3RyYW5zX3NldF9tc2dfaW5mbyhzczdfbXNnLCBz aW5mby0+c2luZm9fc3RyZWFtLCBzaW5mby0+c2luZm9fcHBpZCk7CiAgICB9CgogICAgbXNnX2xl biA9IGRhdGFbNF0gPDwgMjQgfCBkYXRhWzVdIDw8IDE2IHwgZGF0YVs2XSA8PCA4IHwgZGF0YVs3 XTsKICAgIGlmIChtc2dfbGVuID49IDY1NTU2KQogICAgICAgIC8qIERpc2JlbGlldmUgdGhpcyBp cyB2YWxpZCBkYXRhICovCiAgICAgICAgcmV0dXJuIC1FSU87CgogICAgaWYgKHJ2YWwgIT0gbXNn X2xlbiB8fCAhKG1zZy5tc2dfZmxhZ3MgJiBNU0dfRU9SKSkKICAgICAgICByZXR1cm4gLUVJTzsK ICAgIHJldHVybiBydmFsOwp9CgppbnQKc3M3X3RyYW5zX2luaXRfc2N0cF9zaW5mbyh2b2lkICpi dWYsIGludCBtYXhsZW4sIF9fdTE2ICoqc3RyZWFtLCBfX3UzMiAqKnBwaWQpCnsKICAgIHN0cnVj dCBjbXNnaGRyICpjbXNnOwogICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CgogICAg aWYgKG1heGxlbiA8IENNU0dfTEVOKHNpemVvZiAqc2luZm8pKQogICAgICAgIHJldHVybiAtMTsK CiAgICBjbXNnID0gYnVmOwogICAgY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKICAg IGNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOwogICAgY21zZy0+Y21zZ19sZW4gPSBDTVNH X0xFTihzaXplb2YgKnNpbmZvKTsKICAgIHNpbmZvID0gQ01TR19EQVRBKGNtc2cpOwogICAgbWVt c2V0KHNpbmZvLCAwLCBzaXplb2YgKnNpbmZvKTsKICAgICpzdHJlYW0gPSAmc2luZm8tPnNpbmZv X3N0cmVhbTsKICAgICpwcGlkID0gJnNpbmZvLT5zaW5mb19wcGlkOwoKICAgIHJldHVybiBDTVNH X0xFTihzaXplb2YgKnNpbmZvKTsKfQo= --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_-- 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=-0.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no 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 E0E45C433DF for ; Sun, 17 May 2020 08:48:19 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 AA923206D5 for ; Sun, 17 May 2020 08:48:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="k4Mi/XaW" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AA923206D5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=ACULAB.COM Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type: MIME-Version:In-Reply-To:References:Message-ID:Date:Subject:To:From:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=7EhmbRgUPZbGv+F8cmu3nFU8xeDSdG+L8t8smE0pHc0=; b=k4Mi/XaWnaVTO+nOfNUAeL8rN BZmfnvcsferT6xiHoBI/NHBo+YMQvCNKqAheI8MM5iXp60NuZaKBRDWjGEPv8sGrVhf/uUy1OEc2X lMHprMiJImTZNgSg+IJ++pzKL3rwkkoFFGwvdAZFF7toA1SU2DihVpSLWIDGlj9Go+R15uByqSlW5 lkoOLTRWGXzy/hle4obcvXEY6MjyA46y5ECoETb5erdnv+gAauY9OScKhmZ112y45sr7PNTrWvIwz aVjqAG8E4Q3vQS1wjbdh8bcrIhmkSW2oWo3lIvidBYv6cJW4cPzyyHk1mn9gODs5UXiqhlI1upmQN EsKSgH03A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jaExx-0002hF-Q7; Sun, 17 May 2020 08:48:13 +0000 Received: from eu-smtp-delivery-151.mimecast.com ([207.82.80.151]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jaExs-0002df-79 for linux-nvme@lists.infradead.org; Sun, 17 May 2020 08:48:11 +0000 Received: from AcuMS.aculab.com (156.67.243.126 [156.67.243.126]) (Using TLS) by relay.mimecast.com with ESMTP id uk-mta-134-1s_UAGXuNcaiB_0okryfNQ-1; Sun, 17 May 2020 09:48:03 +0100 X-MC-Unique: 1s_UAGXuNcaiB_0okryfNQ-1 Received: from AcuMS.Aculab.com (fd9f:af1c:a25b:0:43c:695e:880f:8750) by AcuMS.aculab.com (fd9f:af1c:a25b:0:43c:695e:880f:8750) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Sun, 17 May 2020 09:48:02 +0100 Received: from AcuMS.Aculab.com ([fe80::43c:695e:880f:8750]) by AcuMS.aculab.com ([fe80::43c:695e:880f:8750%12]) with mapi id 15.00.1347.000; Sun, 17 May 2020 09:48:02 +0100 From: David Laight To: 'Matthew Wilcox' Subject: RE: [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx Thread-Topic: [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx Thread-Index: AQHWKsxNyiOODFVfBEqdWGEpseVc56iq0duQ///3bQCAAS9X8A== Date: Sun, 17 May 2020 08:48:02 +0000 Message-ID: <49f712b3b6704c3096d3834a5985a4d6@AcuMS.aculab.com> References: <20200514062820.GC8564@lst.de> <20200513062649.2100053-1-hch@lst.de> <20200513062649.2100053-28-hch@lst.de> <20200513180058.GB2491@localhost.localdomain> <129070.1589556002@warthog.procyon.org.uk> <05d946ae948946158dbfcbc07939b799@AcuMS.aculab.com> <20200516153652.GM16070@bombadil.infradead.org> In-Reply-To: <20200516153652.GM16070@bombadil.infradead.org> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.202.205.107] MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: aculab.com Content-Type: multipart/mixed; boundary="_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_" X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200517_014808_678515_734683D2 X-CRM114-Status: GOOD ( 22.90 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marcelo Ricardo Leitner , Eric Dumazet , "linux-nvme@lists.infradead.org" , 'David Howells' , "linux-sctp@vger.kernel.org" , "target-devel@vger.kernel.org" , "linux-afs@lists.infradead.org" , "drbd-dev@lists.linbit.com" , "linux-cifs@vger.kernel.org" , "rds-devel@oss.oracle.com" , "linux-rdma@vger.kernel.org" , Christoph Hellwig , "cluster-devel@redhat.com" , Alexey Kuznetsov , "linux-block@vger.kernel.org" , Jakub Kicinski , "ceph-devel@vger.kernel.org" , "linux-nfs@vger.kernel.org" , Neil Horman , Hideaki YOSHIFUJI , "netdev@vger.kernel.org" , Vlad Yasevich , "linux-kernel@vger.kernel.org" , Jon Maloy , Ying Xue , "David S. Miller" , "ocfs2-devel@oss.oracle.com" Sender: "linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Matthew Wilcox > Sent: 16 May 2020 16:37 ... > > Basically: > > > > This patch sequence (to be written) does the following: > > > > Patch 1: Change __sys_setsockopt() to allocate a kernel buffer, > > copy the data into it then call set_fs(KERNEL_DS). > > An on-stack buffer (say 64 bytes) will be used for > > small transfers. > > > > Patch 2: The same for __sys_getsockopt(). > > > > Patch 3: Compat setsockopt. > > > > Patch 4: Compat getsockopt. > > > > Patch 5: Remove the user copies from the global socket options code. > > > > Patches 6 to n-1; Remove the user copies from the per-protocol code. > > > > Patch n: Remove the set_fs(KERNEL_DS) from the entry points. > > > > This should be bisectable. >=20 > I appreciate your dedication to not publishing the source code to > your kernel module, but Christoph's patch series is actually better. > It's typesafe rather than passing void pointers around. There are plenty on interfaces that pass a 'pointer and length'. Having the compiler do a type check doesn't give any security benefit - just stops silly errors. Oh yes, I've attached the only driver source file that calls into the Linux kernel. You are perfectly free to look at all the thing we have to do to support different and broken kernel releases. =09David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1= PT, UK Registration No: 1397386 (Wales) --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; name=ss7osglue.c; charset=WINDOWS-1252 Content-Description: ss7osglue.c Content-Disposition: attachment; filename="ss7osglue.c"; size=36047; creation-date="Thu, 26 Sep 2019 10:15:35 GMT"; modification-date="Thu, 26 Sep 2019 10:15:35 GMT" Content-Transfer-Encoding: base64 I2lkZW50ICJAKCMpIChjKSBBY3VsYWIgcGxjICRIZWFkZXI6IC9ob21lL2N2cy9yZXBvc2l0b3J5 L3NzNy9zdGFjay9zcmMvZHJpdmVyL2xpbnV4L3NzN29zZ2x1ZS5jLHYgMS4xNTcgMjAxOS0wOC0y OSAxNjowOToxNCBkYXZpZGxhIEV4cCAkICROYW1lOiAgJCIKI2lmbmRlZiBNT0RVTEUKI2RlZmlu ZSBNT0RVTEUKI2VuZGlmCgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgoKI2lmIExJTlVYX1ZF UlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDI4KQojZXJyb3IgbWluaW11bSBrZXJu ZWwgdmVyc2lvbiBpcyAyLjYuMjgKI2VuZGlmCgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtF Uk5FTF9WRVJTSU9OKDIsIDYsIDM0KQojaW5jbHVkZSA8Z2VuZXJhdGVkL2F1dG9jb25mLmg+CiNl bHNlCiNpbmNsdWRlIDxsaW51eC9hdXRvY29uZi5oPgojZW5kaWYKCiNpbmNsdWRlIDxsaW51eC9p bml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4K I2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxs aW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpZiBMSU5VWF9WRVJTSU9O X0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oNCwgMTEsIDApCiNpbmNsdWRlIDxsaW51eC9zY2hlZC9z aWduYWwuaD4KI2VuZGlmCiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9z b2NrZXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5o PgojaW5jbHVkZSA8bGludXgvbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CiNpbmNs dWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiNpbmNsdWRlIDxhc20v YXRvbWljLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGxpbnV4L2t0aHJl YWQuaD4KCi8qIFRoaXMgaXMgb25seSBpbiB0aGUga2VybmVsIGJ1aWxkIHRyZWUgKi8KI2luY2x1 ZGUgPG5ldC9zb2NrLmg+CgojaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9O KDMsIDEwLCAwKQojaW5jbHVkZSA8dWFwaS9saW51eC9zY3RwLmg+CiNlbHNlCiNpbmNsdWRlIDxu ZXQvc2N0cC91c2VyLmg+ICAgIC8qIG5ldGluZXQvc2N0cC5oIG91Z2h0IHRvIGJlIHRoaXMgZmls ZSAqLwojZW5kaWYKCiNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LCAx MywgMCkKI2RlZmluZSB3YWl0X3F1ZXVlX2hlYWQgX193YWl0X3F1ZXVlX2hlYWQKI2RlZmluZSB3 YWl0X3F1ZXVlX2VudHJ5IF9fd2FpdF9xdWV1ZQojZW5kaWYKCiNkZWZpbmUgU0tfUFJPVE9DT0wo c29jaykgKHNvY2spLT5zay0+c2tfcHJvdG9jb2wKCmV4dGVybiB2b2lkIHNzN190cmFjZV9tZW0o aW50LCB2b2lkICosIGludCwgY29uc3QgY2hhciAqLCAuLi4pOwpleHRlcm4gdm9pZCBzczdfdHJh Y2VfcHJpbnRmKGludCwgY29uc3QgY2hhciAqLCAuLi4pOwoKLyogQWN1bGFiIERBQ1AgaW50ZXJm YWNlcyAtIHRoZXNlIGFyZSBpbiBhY3VsYWIncyBrZXJuX2lmLmggKi8Kdm9pZCAqZGFjcF9zeW1i b2xfZ2V0KGNvbnN0IGNoYXIgKik7CmludCBkYWNwX3N5bWJvbF9yZWxlYXNlKGNvbnN0IGNoYXIg Kik7CgpNT0RVTEVfQVVUSE9SKCJBY3VsYWIiKTsKTU9EVUxFX0xJQ0VOU0UoIlByb3ByaWV0YXJ5 Iik7CgojaW5jbHVkZSAic3M3b3NnbHVlLmgiCgovKiBNdXRleCBmb3IgZHJpdmVyIGludGVyZmFj ZSBjb2RlICovCnN0YXRpYyBzdHJ1Y3QgbXV0ZXggc3M3X2dsdWVfbXV0ZXg7CgpzdGF0aWMgaW50 IHNzN2Rldl9tYWpvcjsKc3RhdGljIGNvbnN0IHZvaWQgKnNzN19kdGxzX2hhbmRsZTsKc3RhdGlj IGludCBzczdfdXNlX2NvdW50OwpzdGF0aWMgaW50IHNzN19zdG9wX3BpZDsKCnN0YXRpYyBzdHJ1 Y3QgdGFza19zdHJ1Y3QgKmFzc2VydGVkX3Rhc2tzWzE2XTsKc3RhdGljIHVuc2lnbmVkIGludCBh c3NlcnRlZF90YXNrX2NvdW50OwoKdHlwZWRlZiBjaGFyIHNzN192ZXJpZnlfY29uc3RbIFNTN19T T0NLX1NUUkVBTSA9PSBTT0NLX1NUUkVBTSAmJiBTUzdfU09DS19TRVFQQUNLRVQgPT0gU09DS19T RVFQQUNLRVQgPyAxIDogLTFdOwoKc3RhdGljIHZvaWQgc3M3X25ldF9uc191bmxvYWQodm9pZCk7 CgojZGVmaW5lIFRDUF9OT0RFTEFZIDEKCnN0YXRpYyBpbnQgc3M3X2dsdWVfb3BlbihzdHJ1Y3Qg aW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CnN0YXRpYyBpbnQgc3M3X2dsdWVfcmVsZWFzZShzdHJ1 Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CnN0YXRpYyBsb25nIHNzN19nbHVlX3VubG9ja2Vk X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CnN0YXRp YyB1bnNpZ25lZCBpbnQgc3M3X2dsdWVfcG9sbChzdHJ1Y3QgZmlsZSAqY29uc3QsIHBvbGxfdGFi bGUgKik7CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzczdkZXZfZm9wID0KewogICAg b3BlbjogICAgICAgICAgIHNzN19nbHVlX29wZW4sCiAgICByZWxlYXNlOiAgICAgICAgc3M3X2ds dWVfcmVsZWFzZSwKICAgIHVubG9ja2VkX2lvY3RsOiBzczdfZ2x1ZV91bmxvY2tlZF9pb2N0bCwK ICAgIGNvbXBhdF9pb2N0bDogICBzczdfZ2x1ZV91bmxvY2tlZF9pb2N0bCwKICAgIHBvbGw6ICAg ICAgICAgICBzczdfZ2x1ZV9wb2xsLAogICAgb3duZXI6ICAgICAgICAgIFRISVNfTU9EVUxFCn07 CgpzdGF0aWMgaW50IHNzN19yZWJvb3Rfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIs IHVuc2lnbmVkIGxvbmcgYWN0aW9uLAogICAgICAgIHZvaWQgKmRhdGEpCnsKICAgIC8qIFN5c3Rl bSBiZWluZyByZWJvb3RlZC4KICAgICAqIEkgYWRkZWQgdGhpcyBob3BpbmcgdG8gdXNlIGl0IHRv IGdldCB0aGUgc3M3bWFpbnQgZGFlbW9uIHRvIGV4aXQsCiAgICAgKiBidXQgaXQgaXNuJ3QgY2Fs bGVkIHVudGlsIGFsbCB1c2VyIHByb2Nlc3NlcyBoYXZlIGRpZWQuCiAgICAgKiBMZWF2ZSBpdCBo ZXJlIC0gbWlnaHQgYmUgdXNlZnVsIG9uZSBkYXkuICovCiAgICByZXR1cm4gMDsKfQoKc3RhdGlj IHN0cnVjdCBub3RpZmllcl9ibG9jayBzczdfcmVib290X25vdGlmaWVyX2Jsb2NrID0gewogICAg Lm5vdGlmaWVyX2NhbGwgPSBzczdfcmVib290X25vdGlmeSwKfTsKCnN0YXRpYyBpbnQKc3M3X2lu aXRfZmFpbChpbnQgcnZhbCkKewogICAgaWYgKHNzN2Rldl9tYWpvciA+IDApCiAgICAgICAgdW5y ZWdpc3Rlcl9jaHJkZXYoc3M3ZGV2X21ham9yLCAic3M3c2VydmVyIik7CiAgICByZXR1cm4gcnZh bDsKfQoKc3RhdGljIGludApzczdfaW5pdF9tb2Qodm9pZCkKewogICAgY29uc3Qgdm9pZCAqKCpk dGxzX3JlZ2lzdGVyKShjb25zdCBjaGFyICosIGludCAoKikoc3RydWN0IGR0bHNfZ2V0X2lmICop KTsKICAgIGludCBydmFsOwoKICAgIHNzN19tdXRleF9pbml0KCZzczdfZ2x1ZV9tdXRleCk7Cgog ICAgcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIHNzN3ZlcnNpb24pOwoKICAgIHNzN2Rldl9tYWpv ciA9IHJlZ2lzdGVyX2NocmRldigwLCAic3M3c2VydmVyIiwgJnNzN2Rldl9mb3ApOwoKICAgIGlm IChzczdkZXZfbWFqb3IgPCAwKSB7CiAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAic3M3c2VydmVy OiByZWdpc3Rlcl9jaHJkZXYoKSBmYWlsZWQ6ICVkXG4iLAogICAgICAgICAgICAgICAgc3M3ZGV2 X21ham9yKTsKICAgICAgICByZXR1cm4gc3M3X2luaXRfZmFpbChzczdkZXZfbWFqb3IpOwogICAg fQoKICAgIHJ2YWwgPSBzczdfZHJpdmVyX2luaXQoKTsKICAgIGlmIChydmFsICE9IDApIHsKICAg ICAgICBwcmludGsoS0VSTl9JTkZPICJzczdzZXJ2ZXI6IHNzN19kcml2ZXJfaW5pdCgpIGZhaWxl ZDogJWRcbiIsIHJ2YWwpOwogICAgICAgIHJldHVybiBzczdfaW5pdF9mYWlsKC1FSU8pOwogICAg fQoKICAgIGR0bHNfcmVnaXN0ZXIgPSBkYWNwX3N5bWJvbF9nZXQoImFjdWNfZHRsc19yZWdpc3Rl ciIpOwogICAgaWYgKGR0bHNfcmVnaXN0ZXIgPT0gTlVMTCkKICAgICAgICBwcmludGsoS0VSTl9J TkZPICJzczdzZXJ2ZXI6IGNhbm5vdCBsb2NhdGUgXCJhY3VjX2R0bHNfcmVnaXN0ZXJcIlxuIik7 CiAgICBlbHNlCiAgICAgICAgc3M3X2R0bHNfaGFuZGxlID0gZHRsc19yZWdpc3RlcihEWU5BTUlD X1RMU19QUkVGSVggInNzNyIsCiAgICAgICAgICAgICAgICBzczdfdGxzX2dldF9pZik7CgogICAg cmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZzczdfcmVib290X25vdGlmaWVyX2Jsb2NrKTsKICAg IHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApzczdfY2xlYW51cF9tb2Qodm9pZCkKewogICAgaW50 ICgqZHRsc191bnJlZ2lzdGVyKShjb25zdCB2b2lkICopOwoKICAgIHVucmVnaXN0ZXJfcmVib290 X25vdGlmaWVyKCZzczdfcmVib290X25vdGlmaWVyX2Jsb2NrKTsKCiAgICBpZiAoc3M3X2R0bHNf aGFuZGxlICE9IE5VTEwpIHsKICAgICAgICBkdGxzX3VucmVnaXN0ZXIgPSBkYWNwX3N5bWJvbF9n ZXQoImFjdWNfZHRsc191bnJlZ2lzdGVyIik7CiAgICAgICAgZGFjcF9zeW1ib2xfcmVsZWFzZSgi YWN1Y19kdGxzX3JlZ2lzdGVyIik7CiAgICAgICAgaWYgKGR0bHNfdW5yZWdpc3RlciAhPSBOVUxM KSB7CiAgICAgICAgICAgIGR0bHNfdW5yZWdpc3RlcihzczdfZHRsc19oYW5kbGUpOwogICAgICAg ICAgICBkYWNwX3N5bWJvbF9yZWxlYXNlKCJhY3VjX2R0bHNfdW5yZWdpc3RlciIpOwogICAgICAg IH0KICAgIH0KCiAgICBzczdfaW5pdF9mYWlsKDApOwoKICAgIHByaW50ayhLRVJOX0lORk8gIkFj dWxhYiBzczdzZXJ2ZXI6IGRyaXZlciB1bmxvYWRlZFxuIik7Cn0KCm1vZHVsZV9pbml0KHNzN19p bml0X21vZCkKbW9kdWxlX2V4aXQoc3M3X2NsZWFudXBfbW9kKQoKc3RhdGljIGludApzczdfZ2x1 ZV9vcGVuKHN0cnVjdCBpbm9kZSAqY29uc3QgaW5vZGUsIHN0cnVjdCBmaWxlICpjb25zdCBmaWxw KQp7CiAgICBpbnQgcnZhbCwgcGlkOwoKICAgIGlmIChmaWxwLT5wcml2YXRlX2RhdGEpCiAgICAg ICAgLyogRHVwbGljYXRlIG9wZW4gKi8KICAgICAgICByZXR1cm4gMDsKCiAgICBzczdfbXV0ZXhf ZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAgIGlmIChzczdfdXNlX2NvdW50IDwgMCkgewogICAg ICAgIC8qIHNzN19kcml2ZXJfc2h1dGRvd24oKSBoYXMgYmVlbiBjYWxsZWQsIHRvIGxhdGUgdG8g ZG8gYW55dGhpbmcgKi8KICAgICAgICBzczdfbXV0ZXhfZXhpdCgmc3M3X2dsdWVfbXV0ZXgpOwog ICAgICAgIHJldHVybiAtRUlPOwogICAgfQogICAgc3M3X3VzZV9jb3VudCsrOwogICAgc3M3X211 dGV4X2V4aXQoJnNzN19nbHVlX211dGV4KTsKCiAgICBydmFsID0gc3M3X2RldmlmX29wZW4oJmZp bHAtPnByaXZhdGVfZGF0YSk7CiAgICBpZiAocnZhbCAhPSAwKSB7CiAgICAgICAgc3M3X211dGV4 X2VudGVyKCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgc3M3X3VzZV9jb3VudC0tOwogICAgICAg IHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgcGlkID0gc3M3X3BpZCgp OwogICAgICAgIGlmIChwaWQgIT0gc3M3X3N0b3BfcGlkKQogICAgICAgICAgICBwcmludGsoS0VS Tl9JTkZPICJzczdfZGV2aWZfb3BlbigpIHBpZCAlZCBmYWlsZWQgc3M3IGVycm9yICVkXG4iLAog ICAgICAgICAgICAgICAgICAgIHBpZCwgcnZhbCk7CiAgICAgICAgcmV0dXJuIC1FSU87CiAgICB9 CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKc3M3X2dsdWVfcmVsZWFzZShzdHJ1Y3QgaW5v ZGUgKmNvbnN0IGlub2RlLCBzdHJ1Y3QgZmlsZSAqY29uc3QgZmlscCkKewogICAgaWYgKGZpbHAt PnByaXZhdGVfZGF0YSkKICAgICAgICBzczdfZGV2aWZfY2xvc2UoZmlscC0+cHJpdmF0ZV9kYXRh KTsKCiAgICBzczdfbXV0ZXhfZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAgIHNzN191c2VfY291 bnQtLTsKCiAgICBpZiAoc3M3X3VzZV9jb3VudCA9PSAwICYmIHNzN19zdG9wX3BpZCAhPSAwKSB7 CiAgICAgICAgLyogTGFzdCB1c2VyIHByb2Nlc3MgaGFzIGdvbmUsIGNvbXBsZXRlIHNodXRkb3du IGZ1bmN0aW9ucyAqLwogICAgICAgIHNzN19uZXRfbnNfdW5sb2FkKCk7CiAgICAgICAgLyogU3Rv cCBhbnkgbW9yZSBvcGVucyAqLwogICAgICAgIHNzN191c2VfY291bnQgPSAtMTsKICAgICAgICBz czdfZHJpdmVyX3NodXRkb3duKCk7CiAgICB9CgogICAgc3M3X211dGV4X2V4aXQoJnNzN19nbHVl X211dGV4KTsKCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGxvbmcKc3M3X2dsdWVfdW5sb2NrZWRf aW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcg YXJnKQp7CiAgICBpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKICAgICAgICByZXR1cm4gLUVOT0RF VjsKCiAgICBzd2l0Y2ggKGNtZCkgewoKICAgIGNhc2UgU1M3X1NUT1A6ICAgICAgICAgIC8qIHNz N21haW50IHNodXR0aW5nIHVzIGRvd24gKi8KICAgICAgICAvKiBTdGFydCBzaHV0ZG93biBub3cs IHdpbGwgY29tcGxldGUgb24gbGFzdCBjbG9zZSAqLwogICAgICAgIHNzN19kcml2ZXJfc3RvcCgp OwogICAgICAgIHNzN19zdG9wX3BpZCA9IHNzN19waWQoKTsKICAgICAgICByZXR1cm4gMDsKCiAg ICAvKiBSZXF1ZXN0IGZyb20gc3M3bWFpbnQgb3IgdXNlciBhcHBsaWNhdGlvbiAqLwogICAgY2Fz ZSBTUzdfVVNFUl9JT0NUTF9DT0RFOgogICAgICAgIHJldHVybiBzczdkZXZfaW9jdGwoZmlscC0+ cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7CgogICAgZGVmYXVsdDoKICAgICAgICByZXR1cm4gLUVO T1RUWTsKICAgIH0KfQoKc3RhdGljIHVuc2lnbmVkIGludApzczdfZ2x1ZV9wb2xsKHN0cnVjdCBm aWxlICpmaWxwLCBwb2xsX3RhYmxlICpwdCkKewogICAgcG9sbF93YWl0KGZpbHAsICpzczdfZGV2 aWZfZ2V0X3BvbGxxdWV1ZV9oZWFkKGZpbHAtPnByaXZhdGVfZGF0YSksIHB0KTsKICAgIHJldHVy biBzczdfZGV2aWZfZ2V0X3BvbGxfc3RhdHVzKGZpbHAtPnByaXZhdGVfZGF0YSk7Cn0KCnZvaWQg Kgpzczdfb3NfbWFsbG9jKGludCBzLCBpbnQgc3M3X2ZsYWdzKQp7CiAgICByZXR1cm4ga21hbGxv YyhzLCBHRlBfS0VSTkVMKTsKfQoKdm9pZApzczdfb3NfZnJlZSh2b2lkICpwKQp7CiAgICBrZnJl ZShwKTsKfQoKdm9pZApzczdfcG9sbF9xdWV1ZV9oZWFkX2RlaW5pdCh3YWl0X3F1ZXVlX2hlYWRf dCAqKnBxaHApCnsKICAgIHNzN19vc19mcmVlKCpwcWhwKTsKfQoKaW50CnNzN19wb2xsX3F1ZXVl X2hlYWRfaW5pdCh3YWl0X3F1ZXVlX2hlYWRfdCAqKnBxaHApCnsKICAgIHdhaXRfcXVldWVfaGVh ZF90ICpwcWggPSBzczdfb3NfbWFsbG9jKHNpemVvZiAqcHFoLCAwKTsKICAgIGlmIChwcWggPT0g TlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKHBxaCk7CiAg ICAqcHFocCA9IHBxaDsKICAgIHJldHVybiAwOwp9Cgp2b2lkCnNzN19wb2xsd2FrZXVwKHdhaXRf cXVldWVfaGVhZF90ICoqcHFoLCB1bnNpZ25lZCBpbnQgcG9sbF9ldmVudCkKewogICAgd2FrZV91 cCgqcHFoKTsKfQoKdm9pZApzczdfa2lsbF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywg aW50IHNpZ25vKQp7CiAgICAvKiBTZW5kIHNpZ25hbCBldmVuIHRob3VnaCBzZXQgdG8gU0lHX0lH TiAqLwogICAgZm9yY2Vfc2lnKHNpZ25vLCB0YXNrKTsKfQoKCiNpZiBMSU5VWF9WRVJTSU9OX0NP REUgPD0gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzIpCi8qIHNwaW5sb2NrX3QgaXMgYSB0eXBlZGVm IGZvciBhbiB1bm5hbWVkIHN0cnVjdHVyZSBzbyB3ZSBjYW4ndAogKiBtYWtlICdzdHJ1Y3Qgc3Bp bmxvY2snIG1hdGNoIHRoZSBrZXJuZWwgc3BpbmxvY2sgdHlwZS4gKi8KI2RlZmluZSBTUElOTE9D S19DQVNUIChzcGlubG9ja190ICopCiNlbHNlCiNkZWZpbmUgU1BJTkxPQ0tfQ0FTVAojZW5kaWYK CnNpemVfdApzczdfc3Bpbl9sb2NrX3NpemUodm9pZCkKewogICAgcmV0dXJuIHNpemVvZiAqU1BJ TkxPQ0tfQ0FTVChzdHJ1Y3Qgc3BpbmxvY2sgKikwOwp9Cgp2b2lkCnNzN19zcGluX2xvY2tfaW5p dChzdHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAgIHNwaW5fbG9ja19pbml0KFNQSU5MT0NLX0NBU1Qg cyk7Cn0KCnZvaWQKc3M3X3NwaW5fbG9ja19lbnRlcihzdHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAg IHNwaW5fbG9jayhTUElOTE9DS19DQVNUIHMpOwp9Cgp2b2lkCnNzN19zcGluX2xvY2tfZXhpdChz dHJ1Y3Qgc3BpbmxvY2sgKnMpCnsKICAgIHNwaW5fdW5sb2NrKFNQSU5MT0NLX0NBU1Qgcyk7Cn0K CnNpemVfdApzczdfbXV0ZXhfc2l6ZSh2b2lkKQp7CiAgICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBt dXRleCk7Cn0KCnZvaWQKc3M3X211dGV4X2luaXQoc3RydWN0IG11dGV4ICpzKQp7CiAgICBtdXRl eF9pbml0KHMpOwp9Cgp2b2lkCnNzN19tdXRleF9lbnRlcihzdHJ1Y3QgbXV0ZXggKnMpCnsKICAg IG11dGV4X2xvY2socyk7Cn0KCmludApzczdfbXV0ZXhfZW50ZXJfdG1vKHN0cnVjdCBtdXRleCAq cywgaW50IG1heF93YWl0KQp7CiAgICAvKiBUaGVyZSBpcyBubyBtdXRleF9lbnRlcl90aW1lb3V0 KCkgaG93ZXZlciB0aGlzIHdhcyBhbGwgYWRkZWQKICAgICAqIHRvIHN0b3Agc3RhdHVzIGNvbW1h bmRzIHNsZWVwaW5nIGZvcmV2ZXIgd2hlbiBhIHByb2Nlc3MgaGFzCiAgICAgKiAnb29wc2VkJyB3 aXRoIGEgbXV0ZXggaGVsZC4KICAgICAqIERvIGEgc25lYWsgY2hlY2sgb24gdGhlIHN0YXRlIG9m IGFueSBvd25pbmcgdGFzayB0aGVuCiAgICAgKiB3YWl0IGludGVycnVwdGlibHkuCiAgICAgKiBe QyBzaG91bGQgZXJyb3Igb3V0IHRoZSBzdGF0dXMgY2FsbC4gKi8KCiAgICAvKiBJZiB1bmNvbnRl bmRlZCBqdXN0IGFjcXVpcmUgKi8KICAgIGlmIChtdXRleF90cnlsb2NrKHMpKQogICAgICAgIHJl dHVybiAxOwoKI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTig0LCAxMCwg MCkKICAgIHsKICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyOwogICAgICAgIGludCBz dGF0ZTsKCiAgICAgICAgc3Bpbl9sb2NrKCZzLT53YWl0X2xvY2spOwogICAgICAgIG93bmVyID0g X19tdXRleF9vd25lcihzKTsKICAgICAgICBzdGF0ZSA9IG93bmVyID8gb3duZXItPnN0YXRlIDog MDsKICAgICAgICBzcGluX3VubG9jaygmcy0+d2FpdF9sb2NrKTsKICAgICAgICBpZiAoc3RhdGUg JiBUQVNLX0RFQUQpCiAgICAgICAgICAgIC8qIG11dGV4IHdpbGwgbmV2ZXIgYmUgcmVsZWFzZWQs IHRyZWF0IGFzIHRpbWVvdXQgKi8KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgoK ICAgIC8qIElmIEM3X0FTU0VSVCgpIGhhcyBiZWVuIGNhbGxlZCwganVzdCBsZXQgZXZlcnlvbmUg aW4gKi8KICAgIGlmIChhc3NlcnRlZF90YXNrX2NvdW50KQogICAgICAgIHJldHVybiAwOwoKICAg IHJldHVybiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUocykgPyAtMSAvKiBFSU5UUiAqLyA6IDEg LyogYWNxdWlyZWQgKi87Cn0KCnZvaWQKc3M3X211dGV4X2V4aXQoc3RydWN0IG11dGV4ICpzKQp7 CiAgICBtdXRleF91bmxvY2socyk7Cn0KCnNpemVfdApzczdfY3Zfc2l6ZSh2b2lkKQp7CiAgICBy ZXR1cm4gc2l6ZW9mKHdhaXRfcXVldWVfaGVhZF90KTsKfQoKdm9pZApzczdfY3ZfaW5pdCh3YWl0 X3F1ZXVlX2hlYWRfdCAqY29uc3QgdikKewogICAgaW5pdF93YWl0cXVldWVfaGVhZCh2KTsKfQoK c3RhdGljIGludApzczdfc2NoZWR1bGVfdG1vKGludCB0bW9fbXMpCnsKICAgIGludCB0bW9famlm ZmllczsKCiAgICAvKiBSZWFsbHkgc2xlZXAgLSB1bmxlc3Mgd29rZW4gc2luY2UgdW5sb2NraW5n IHNwaW5sb2NrICovCiAgICBpZiAodG1vX21zID49IDApIHsKICAgICAgICBpZiAodG1vX21zIDw9 IDEpCiAgICAgICAgICAgIHRtb19qaWZmaWVzID0gdG1vX21zOwogICAgICAgIGVsc2UKICAgICAg ICAgICAgLyogQ29udmVydCB0byBqaWZmaWVzIGFuZCByb3VuZCB1cCAqLwogICAgICAgICAgICB0 bW9famlmZmllcyA9IDEgKyAodG1vX21zICsgMSAtIDEpICogMTYgLyAoMTYwMDAvSFopOwogICAg ICAgIC8qIFJldHVybiB2YWx1ZSBvZiBzY2hlZHVsZV90aW1lb3V0KCkgaXMgdW5leHBpcmVkIHRp bWVvdXQgKi8KICAgICAgICAvKiBXZSB3YW50IDAgZm9yICd0aW1lZG91dCcgKHRvIG1hdGNoIGN2 X3dhaXRfc2lnKCkpICovCiAgICAgICAgcmV0dXJuIHNjaGVkdWxlX3RpbWVvdXQodG1vX2ppZmZp ZXMpICE9IDA7CiAgICB9CgogICAgc2NoZWR1bGUoKTsKICAgIGlmICghc2lnbmFsX3BlbmRpbmco Y3VycmVudCkpCiAgICAgICAgLyogV29rZW4gYnkgdGhlIGV2ZW50ICovCiAgICAgICAgcmV0dXJu IDE7CgogICAgLyogUmVwb3J0IDAgZm9yIGEgc2lnbmFsLCBleGNlcHQgLTEgZm9yIFNJR0tJTEwg KHJlYm9vdCkgKi8KICAgIHJldHVybiBzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWdu YWwsIFNJR0tJTEwpID8gLTEgOiAwOwp9CgppbnQKc3M3X2N2X3dhaXRfZ3V0cyh3YWl0X3F1ZXVl X2hlYWRfdCAqY3ZwLCBzdHJ1Y3QgbXV0ZXggKm10eHAsCiAgICAgICAgaW50IGludGVycnVwdGli bGUsIGludCB0bW9fbXMpCnsKICAgIGludCByOwogICAgc3RydWN0IHdhaXRfcXVldWVfZW50cnkg dzsKICAgIGludCBzbGVlcF9zdGF0ZTsKCiAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmdywgY3Vy cmVudCk7CgogICAgLyogVGVsbCBzY2hlZHVsZXIgd2UgYXJlIGdvaW5nIHRvIHNsZWVwLi4uICov CiAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgIWludGVycnVwdGlibGUpCiAgICAg ICAgLyogV2UgZG9uJ3Qgd2FudCB3YWtpbmcgaW1tZWRpYXRlbHkgKGFnYWluKSAqLwogICAgICAg IHNsZWVwX3N0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CiAgICBlbHNlCiAgICAgICAgc2xl ZXBfc3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CiAgICBzZXRfY3VycmVudF9zdGF0ZShzbGVl cF9zdGF0ZSk7CgogICAgLyogQ29ubmVjdCB0byBjb25kaXRpb24gdmFyaWFibGUgLi4uICovCiAg ICBhZGRfd2FpdF9xdWV1ZShjdnAsICZ3KTsKICAgIG11dGV4X3VubG9jayhtdHhwKTsgLyogUmVs ZWFzZSBtdXRleCAqLwoKICAgIHIgPSBzczdfc2NoZWR1bGVfdG1vKHRtb19tcyk7CgogICAgLyog RGlzY29ubmVjdCBmcm9tIGNvbmRpdGlvbiB2YXJpYWJsZSAuLi4gKi8KICAgIHJlbW92ZV93YWl0 X3F1ZXVlKGN2cCwgJncpOwoKICAgIC8qIFJlLWFjcXVpcmUgbXV0ZXggKi8KICAgIG11dGV4X2xv Y2sobXR4cCk7CgogICAgLyogcmV0dXJuIDEgaWYgd29rZW4sIDAgaWYgdGltZWRfb3V0L3NpZ25h bCwgLTEgaWYgU0lHS0lMTCAqLwogICAgcmV0dXJuIHI7Cn0KCmludApzczdfY3Zfd2FpdF9zcGlu X2xvY2sod2FpdF9xdWV1ZV9oZWFkX3QgKmN2cCwgc3RydWN0IHNwaW5sb2NrICpsb2NrLAogICAg ICAgIGludCBpbnRlcnJ1cHRpYmxlLCBpbnQgdG1vX21zKQp7CiAgICBpbnQgcjsKICAgIHN0cnVj dCB3YWl0X3F1ZXVlX2VudHJ5IHc7CiAgICBpbnQgc2xlZXBfc3RhdGU7CgogICAgaW5pdF93YWl0 cXVldWVfZW50cnkoJncsIGN1cnJlbnQpOwoKICAgIC8qIFRlbGwgc2NoZWR1bGVyIHdlIGFyZSBn b2luZyB0byBzbGVlcC4uLiAqLwogICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmICFp bnRlcnJ1cHRpYmxlKQogICAgICAgIC8qIFdlIGRvbid0IHdhbnQgd2FraW5nIGltbWVkaWF0ZWx5 IChhZ2FpbikgKi8KICAgICAgICBzbGVlcF9zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwog ICAgZWxzZQogICAgICAgIHNsZWVwX3N0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOwogICAgc2V0 X2N1cnJlbnRfc3RhdGUoc2xlZXBfc3RhdGUpOwoKICAgIC8qIENvbm5lY3QgdG8gY29uZGl0aW9u IHZhcmlhYmxlIC4uLiAqLwogICAgYWRkX3dhaXRfcXVldWUoY3ZwLCAmdyk7CiAgICBzcGluX3Vu bG9jayhTUElOTE9DS19DQVNUIGxvY2spOwoKICAgIHIgPSBzczdfc2NoZWR1bGVfdG1vKHRtb19t cyk7CgogICAgLyogRGlzY29ubmVjdCBmcm9tIGNvbmRpdGlvbiB2YXJpYWJsZSAuLi4gKi8KICAg IHJlbW92ZV93YWl0X3F1ZXVlKGN2cCwgJncpOwoKICAgIC8qIFJlLWFjcXVpcmUgbXV0ZXggKi8K ICAgIHNwaW5fbG9jayhTUElOTE9DS19DQVNUIGxvY2spOwoKICAgIHJldHVybiByOwp9CgovKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSoqCioqIHNzN19jdl9icm9hZGNhc3QgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKKiogQXdha2VuIGFsbCB0aHJlYWRzIHRoYXQg YXJlIHNsZWVwaW5nIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlLiAgICAgICAqKgoqKiBDYWxsZXIg bXVzdCB1c2UgdGhlIGFzc29jaWF0ZWQgbXV0ZXggc2Vuc2libHksIGkuZS4gLi4uICAgICAgICAg ICAgICoqCioqICAgICAgYWNxdWlyZSB0aGUgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKioKKiogICAgICBTZXQgc29tZSBmbGFnIHRoYXQgYSBzbGVl cGluZyB0aHJlYWQgd2lsbCBjaGVjayBmb3IgICAgICAgICAgICAqKgoqKiAgICAgIHNzN19jdl9i cm9hZGNhc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoq CioqICAgICAgcmVsZWFzZSB0aGUgbXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKioKKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZApzczdfY3ZfYnJvYWRjYXN0 KHdhaXRfcXVldWVfaGVhZF90ICpjb25zdCBjdnApCnsKICAgIHdha2VfdXAoY3ZwKTsKfQoKCnVu c2lnbmVkIGxvbmcKc3M3X2NvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwg dW5zaWduZWQgbG9uZyBjKQp7CiAgICByZXR1cm4gY29weV90b191c2VyKHRvLCBmcm9tLCBjKTsK fQoKdW5zaWduZWQgbG9uZwpzczdfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQg KmZyb20sIHVuc2lnbmVkIGxvbmcgYykKewogICAgcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBm cm9tLCBjKTsKfQoKdW5zaWduZWQgaW50CnNzN19waWQodm9pZCkKewogICAgcmV0dXJuIGN1cnJl bnQtPnBpZDsKfQoKc3RydWN0IHRhc2tfc3RydWN0ICoKc3M3X2N1cnJlbnRfdGFzayh2b2lkKQp7 CiAgICByZXR1cm4gY3VycmVudDsKfQoKdW5zaWduZWQgaW50CnNzN190YXNrX3BpZChzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnRhc2spCnsKICAgIHJldHVybiB0YXNrLT5waWQ7Cn0KCmludApzczdfZ2x1 ZV90aHJlYWRfZm4odm9pZCAqc3M3X3RocmVhZCkKewogICAgc3M3X3RocmVhZF9ydW4oc3M3X3Ro cmVhZCk7CiAgICBtb2R1bGVfcHV0X2FuZF9leGl0KDApOwogICAgcmV0dXJuIDA7Cn0KCnN0cnVj dCB0YXNrX3N0cnVjdCAqCnNzN19vc190aHJlYWRfY3JlYXRlKHN0cnVjdCBzczdfdGhyZWFkICp0 aHJwLCBjb25zdCBjaGFyICpkZXNjKQp7CiAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAg ICBjb25zdCBjaGFyICpzcDsKICAgIGludCBsZW47CgogICAgaWYgKCF0cnlfbW9kdWxlX2dldChU SElTX01PRFVMRSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgLyogVGhlIHRocmVhZCBkZXNj cmlwdGlvbiBnZXRzIHRydW5jYXRlZCB0byAxNSBjaGFycywgY2FuJ3QgYmUgaGVscGVkIQogICAg ICogVXNlICdzczdtYWludCBvc3N0YXR1cyAtdCcgdG8gZ2V0IHRoZSBmdWxsIGRlc2NyaXB0aW9u LiAqLwoKICAgIC8qIFJlbW92ZSBhbnkgbGVhZGluZyBzcGFjZSBhbmQgdHJ1bmNhdGUgYWZ0ZXIg c2Vjb25kIHdvcmQgKi8KICAgIGlmIChkZXNjWzBdID09ICcgJykKICAgICAgICBkZXNjKys7CiAg ICBsZW4gPSAxMDA7CiAgICBzcCA9IHNzN3N0cmNocihkZXNjLCAnICcpOwogICAgaWYgKHNwICE9 IE5VTEwpIHsKICAgICAgICBzcCA9IHNzN3N0cmNocihzcCArIDEsICcgJyk7CiAgICAgICAgaWYg KHNwICE9IE5VTEwpCiAgICAgICAgICAgIGxlbiA9IHNwIC0gZGVzYzsKICAgIH0KCiAgICB0YXNr ID0ga3RocmVhZF9ydW4oc3M3X2dsdWVfdGhyZWFkX2ZuLCB0aHJwLCAic3M3OiUuKnMiLCBsZW4s IGRlc2MpOwogICAgaWYgKElTX0VSUih0YXNrKSkgewogICAgICAgIG1vZHVsZV9wdXQoVEhJU19N T0RVTEUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIHRhc2s7Cn0KCnZv aWQKc3M3X21zX2RlbGF5KGNvbnN0IHVuc2lnbmVkIGludCBtcykKewogICAgc2V0X2N1cnJlbnRf c3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogICAgc2NoZWR1bGVfdGltZW91dCgodW5zaWdu ZWQgbG9uZyBsb25nKUhaICogbXMgLyAxMDAwKTsKfQoKaW50CnNzN19vc19nZXRfdGlja3Modm9p ZCkKewogICAgcmV0dXJuIGppZmZpZXM7Cn0KCmludApzczdfb3NfdGlja3NfdG9fdXMoaW50IGlu dGVydmFsKQp7CiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAwMDAwIC8gSFo7Cn0KCmludApzczdf b3NfdGlja3NfdG9fbXMoaW50IGludGVydmFsKQp7CiAgICByZXR1cm4gaW50ZXJ2YWwgKiAxMDAw IC8gSFo7Cn0KCmludApzczdfb3NfdGlja3NfdG9fc2VjcyhpbnQgaW50ZXJ2YWwpCnsKICAgIHJl dHVybiBpbnRlcnZhbCAvIEhaOwp9Cgp1bnNpZ25lZCBpbnQKc3M3X2dldF9tc190aW1lKHZvaWQp CnsKICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGVwb2NoOwogICAgc3RydWN0IHRpbWVzcGVjIG5v dzsKCiAgICBnZXRyYXdtb25vdG9uaWMoJm5vdyk7CgogICAgaWYgKGVwb2NoID09IDApCiAgICAg ICBlcG9jaCA9IG5vdy50dl9zZWM7CgogICAgcmV0dXJuIChub3cudHZfc2VjIC0gZXBvY2gpICog MTAwMCArIG5vdy50dl9uc2VjIC8gMTAwMDAwMDsKfQoKc3RydWN0IGFjdV9zczdtYWludF90aW1l IHsKICAgdW5zaWduZWQgaW50IHN0X3NlYzsKICAgdW5zaWduZWQgaW50IHN0X3VzZWM7Cn07Cgoj aWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDUsIDAsIDApCnN0YXRpYyBp bmxpbmUgdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQp7CiAgICAgICAg c3RydWN0IHRpbWVzcGVjNjQgdHM7CgogICAgICAgIGt0aW1lX2dldF9yZWFsX3RzNjQoJnRzKTsK ICAgICAgICB0di0+dHZfc2VjID0gdHMudHZfc2VjOwogICAgICAgIHR2LT50dl91c2VjID0gdHMu dHZfbnNlYy8xMDAwdTsKfQojZW5kaWYKCnZvaWQKc3M3X2dldF90aW1lc3RhbXAoc3RydWN0IGFj dV9zczdtYWludF90aW1lICpwdGltZSkKewogICAgc3RydWN0IHRpbWV2YWwgdHY7CgogICAgLyog ZG9fZ2V0dGltZW9mZGF5KCkgcmV0dXJucyAnd2FsbCBjbG9jayB0aW1lJy4KICAgICAqIEl0IGNh biBnbyBiYWNrd2FyZHMuICAqLwogICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAgICBwdGltZS0+ c3Rfc2VjID0gdHYudHZfc2VjOwogICAgcHRpbWUtPnN0X3VzZWMgPSB0di50dl91c2VjOwp9Cgp1 bnNpZ25lZCBpbnQKc3M3X2dldF9lbGFwc2VkKGNvbnN0IHN0cnVjdCBhY3Vfc3M3bWFpbnRfdGlt ZSAqZXBvY2gpCnsKICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgZG9fZ2V0dGltZW9mZGF5KCZ0 dik7CgogICAgcmV0dXJuIHR2LnR2X3NlYyAtIGVwb2NoLT5zdF9zZWM7Cn0KCnZvaWQKc3M3X29z X2xvZ19lcnJvcihjb25zdCBjaGFyICp0ZXh0KQp7CiAgICBwcmludGsoS0VSTl9FTUVSRyAic3M3 c2VydmVyOiAlcyIsIHRleHQpOwogICAgaWYgKG1lbWNtcCh0ZXh0LCAiQXNzZXJ0aW9uIGZhaWwi LCAxNCkgPT0gMCkgewogICAgICAgIGR1bXBfc3RhY2soKTsKICAgICAgICAvKiBBbHRob3VnaCB3 ZSByZXR1cm4sIHRoZSBjYWxsZXIgc2xlZXBzIGZvcmV2ZXIgKi8KICAgICAgICAvKiBSZW1lbWJl ciB0aGUgJ3N0dWNrJyB0YXNrcyAqLwogICAgICAgIGFzc2VydGVkX3Rhc2tzW2Fzc2VydGVkX3Rh c2tfY291bnQrKyAmIDE1XSA9IGN1cnJlbnQ7CiAgICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKioKKiog TWlzY2VsbGFub3VzIHN0cmluZyBhbmQgbWVtb3J5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqKgoqKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2b2lkCnNzN21lbXplcm8odm9pZCAqYnVm LCBzaXplX3QgbGVuKQp7CiAgICBtZW1zZXQoYnVmLCAwLCBsZW4pOwp9Cgp2b2lkCnNzN21lbWNw eSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCnsKICAgIG1lbWNweShk ZXN0LCBzcmMsIGxlbik7Cn0KCnZvaWQKc3M3X21lbW1vdmUodm9pZCAqZGVzdCwgY29uc3Qgdm9p ZCAqc3JjLCBzaXplX3QgbGVuKQp7CiAgICBtZW1tb3ZlKGRlc3QsIHNyYywgbGVuKTsKfQoKaW50 CnNzN21lbWNtcChjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBsZW4pCnsK ICAgIHJldHVybiBtZW1jbXAoczEsIHMyLCBsZW4pOwp9Cgp1bnNpZ25lZCBpbnQKc3M3c3RybGVu KGNvbnN0IGNoYXIgKnN0cikKewogICAgcmV0dXJuIHN0cmxlbihzdHIpOwp9Cgp2b2lkCnNzN3N0 cmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCnsKICAgIHN0cmNweShkZXN0LCBzcmMp Owp9CgppbnQKc3M3c3RyY21wKGNvbnN0IGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKewog ICAgcmV0dXJuIHN0cmNtcChkZXN0LCBzcmMpOwp9CgpjaGFyICoKc3M3c3RybmNweShjaGFyICpj b25zdCBzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuKQp7CiAgICByZXR1cm4gc3RybmNweShz MSwgczIsIG4pOwp9CgpjaGFyICoKc3M3c3RyY2hyKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGludCBj KQp7CiAgICByZXR1cm4gc3RyY2hyKHMsIGMpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqCioqIFRDUC9J UCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKioKKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50CnNzN19zY3RwX3N1cHBvcnRlZCh2b2lkKQp7 CiAgICByZXR1cm4gMTsKfQoKdW5zaWduZWQgaW50CnNzN19nZXRfZGVmYXVsdF9hZl9vcHRzKHVu c2lnbmVkIGludCBwcm90b2NvbCwgdW5zaWduZWQgaW50IHBvcnQpCnsKICAgIC8qIFRoZSBTUzcg ZHJpdmVyIG5lZWRzIHRvIGtub3cgdGhlIHdoaWNoIGFkZHJlc3MgZmFtaWxpZXMgKElQdjQgb3Ig SVB2NikKICAgICAqIHRvIHVzZSBmb3IgbGlzdGVuaW5nIHNvY2tldHMuCiAgICAgKgogICAgICog V2hldGhlciBhbiBJUFY2IHNvY2tldCBjYW4gYWNjZXB0IElQVjQgY29ubmVjdGlvbnMgZGVwZW5k cyBvbgogICAgICogdGhlIElQVjZfVjZPTkxZIHNvY2tldCBvcHRpb24uIFRoZSBkZWZhdWx0IGZv ciB3aGljaCBkZXBlbmRzCiAgICAgKiBvbiBuZXQuaXB2Ni5iaW5kdjZvbmx5ICh3aGljaCB1c3Vh bGx5IGRlZmF1bHRzIHRvIDAgLSBhbGxvd2luZyBJUFY0KS4KICAgICAqIFRoZXJlIGFsc28gbWln aHQgYmUga2VybmVscyB3aGVyZSBjbGVhcmluZyBJUFY2X1Y2T05MWSBpcyBkaXNhbGxvd2VkLgog ICAgICoKICAgICAqIE5vcm1hbGx5IG9ubHkgYSBzaW5nbGUgc29ja2V0IGlzIGNyZWF0ZWQgZm9y IGVhY2ggcG9ydCBzaW5jZSBhbiBJUHY2CiAgICAgKiBzb2NrZXQgY2FuIHJlY2VpdmUgSVB2NCBj b25uZWN0aW9ucy4gSG93ZXZlciBhIHNlcGFyYXRlIElQdjQgc29ja2V0CiAgICAgKiBjYW4gYmUg cmVxdWVzdGVkLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBvbmUg b2Y6CiAgICAgKiAgICBTUzdfQUZfT1BUX0lQdjYKICAgICAqICAgICAgICBJUFY2IHNvY2tldCB3 aXRoIHRoZSBkZWZhdWx0IElQVjZfVjZPTkxZIHZhbHVlLgogICAgICogICAgU1M3X0FGX09QVF9J UHY2X1Y2T05MWV9DTFIKICAgICAqICAgICAgICBJUFY2IHNvY2tldCB3aXRoIElQVjZfVjZPTkxZ IGV4cGxpY2l0bHkgY2xlYXJlZC4KICAgICAqICAgIFNTN19BRl9PUFRfSVB2Nl9WNk9OTFlfU0VU CiAgICAgKiAgICAgICAgSVBWNiBzb2NrZXQgd2l0aCBJUFY2X1Y2T05MWSBleHBsaWNpdGx5IHNl dC4KICAgICAqIFBvc3NpYmx5IGxvZ2ljYWxseSBvcmVkIHdpdGg6CiAgICAgKiAgICBTUzdfQUZf T1BUX0lQdjQKICAgICAqICAgICAgICBBIHNlcGFyYXRlIElQdjQgc29ja2V0LgogICAgICoKICAg ICAqIEZvciBmbGV4aWJpbGl0eSB0aGUgZGVjaXNpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBwcm90 b2NvbCAoZWl0aGVyCiAgICAgKiBJUFBST1RPX1NDVFAgb3IgSVBQUk9UT19UQ1ApIG9yIHRoZSBw b3J0IG51bWJlci4KICAgICAqCiAgICAgKiBEZWZhdWx0IHRvIGNyZWF0aW5nIGEgc2luZ2xlIHNv Y2tldCBhbmQgZGlzYWJsaW5nIElQVjZfVjZPTkxZLgogICAgICovCiNpZm5kZWYgU1M3X0RFRkFV TFRfQUZfT1BUUwojZGVmaW5lIFNTN19ERUZBVUxUX0FGX09QVFMgU1M3X0FGX09QVF9JUHY2CiNl bmRpZgogICAgIHJldHVybiBTUzdfREVGQVVMVF9BRl9PUFRTOwp9CgovKiBrZXJuZWxfZ2V0L3Nl dF9zb2Nrb3B0KCkgcHJvdG90eXBlcyBoYXZlIChjaGFyICopIGZvciB0aGUgYnVmZmVyLgogKiAj ZGVmaW5lIGEgKHZvaWQgKikgY2FzdC4KICovCiNkZWZpbmUga2VybmVsX3NldHNvY2tvcHQoc29j aywgbGV2ZWwsIG5hbWUsIHZhbCwgbGVuKSBcCiAgICAgICAga2VybmVsX3NldHNvY2tvcHQoc29j aywgbGV2ZWwsIG5hbWUsICh2b2lkICopdmFsLCBsZW4pCiNkZWZpbmUga2VybmVsX2dldHNvY2tv cHQoc29jaywgbGV2ZWwsIG5hbWUsIHZhbCwgbGVuKSBcCiAgICAgICAga2VybmVsX2dldHNvY2tv cHQoc29jaywgbGV2ZWwsIG5hbWUsICh2b2lkICopdmFsLCBsZW4pCgovKiBOb3RlIHRoYXQgd2Ug Y2FuJ3QgKGVhc2lseSkgaG9sZCByZWZlcmVuY2UgY291bnRzIG9uIHRoZSBuYW1lc3BhY2UKICog YmVjYXVzZSBwdXRfbmV0KCkgaXMgR1BMX09OTFkuCiAqIEluc3RlYWQgd2Uga2VlcCBvdXIgb3du IHRhYmxlIGFuZCBjcmVhdGUgYSBzb2NrZXQgdG8gaG9sZCB0aGUKICogcmVmZXJlbmNlIGZvciB1 cy4KICogVGFibGUgZW50cmllcyAwIGFuZCAxIGFsd2F5cyByZWZlciB0byBpbml0X25ldCBhbmQg dGhlIG5hbWVzcGFjZQogKiBvZiB0aGUgKGxhc3Qgc3RhcnRlZCkgc3M3IGRhZW1vbi4gTmVpdGhl ciBpcyByZWZlcmVuY2UgY291bnRlZAogKiAoYWx0aG91Z2ggd2UgaG9sZCBhIHNpbmdsZSByZWZl cmVuY2Ugb24gdGhlIGxhdHRlcikuCiAqIEhpZ2hlciBlbnRyaWVzIGFyZSBzYXZlZCBmcm9tIGlu dm9jYXRpb25zIG9mICdzczdtYWludCBzdGFydCcKICogYW5kICdmaXJtd2FyZSBkb3dubG9hZCcu ICovCgpzdGF0aWMgc3RydWN0IHNzN19uc19pbmZvIHsKICAgIHN0cnVjdCBuZXQgICAgKm5pX25l dF9uczsKICAgIHN0cnVjdCBzb2NrZXQgKm5pX3NvY2s7CiAgICB1bnNpZ25lZCBpbnQgIG5pX3Jl ZmNvdW50Owp9IHNzN19uc190YWJsZVsyNTZdOwoKc3RhdGljIHN0cnVjdCBzb2NrZXQgKgpzczdf Z2x1ZV9jcmVhdGVfbnNfc29ja2V0KHN0cnVjdCBuZXQgKm5ldCkKewogICAgc3RydWN0IHNvY2tl dCAqc29jazsKCiAgICBpZiAoX19zb2NrX2NyZWF0ZShuZXQsIEFGX0lORVQsIFNPQ0tfREdSQU0s IElQUFJPVE9fVURQLCAmc29jaywgMCkpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICByZXR1cm4g c29jazsKfQoKdm9pZApzczdfbmV0X25zX2dldCh1bnNpZ25lZCBpbnQgbmFtZXNwYWNlKQp7CiAg ICB1bnNpZ25lZCBpbnQgaWR4ID0gU1M3X05FVF9OU19JRFgobmFtZXNwYWNlKTsKCiAgICBpZiAo aWR4IDw9IFNTN19ORVRfTlNfSURYKFNTN19ORVRfTlNfREFFTU9OKSkKICAgICAgICAvKiBTUzdf TkVUX05TX0lOSVQgYW5kIFNTN19ORVRfTlNfREFFTU9OIGFyZW4ndCByZWYtY291bnRlZCAqLwog ICAgICAgIHJldHVybjsKCiAgICBzczdfbXV0ZXhfZW50ZXIoJnNzN19nbHVlX211dGV4KTsKICAg IHNzN19uc190YWJsZVtpZHhdLm5pX3JlZmNvdW50Kys7CiAgICBzczdfbXV0ZXhfZXhpdCgmc3M3 X2dsdWVfbXV0ZXgpOwoKICAgIHNzN190cmFjZV9wcmludGYoMCwgInNzN19uZXRfbnNfZ2V0KCV4 KTogcmVmY291bnQgJWQsIHNvY2sgJXAsIG5ldCAlcFxuIiwKICAgICAgICAgICAgbmFtZXNwYWNl LCBzczdfbnNfdGFibGVbaWR4XS5uaV9yZWZjb3VudCwgc3M3X25zX3RhYmxlW2lkeF0ubmlfc29j aywKICAgICAgICAgICAgc3M3X25zX3RhYmxlW2lkeF0ubmlfbmV0X25zKTsKfQoKdm9pZApzczdf bmV0X25zX3B1dCh1bnNpZ25lZCBpbnQgbmFtZXNwYWNlKQp7CiAgICBzdHJ1Y3Qgc3M3X25zX2lu Zm8gKm5pOwogICAgdW5zaWduZWQgaW50IGlkeCA9IFNTN19ORVRfTlNfSURYKG5hbWVzcGFjZSk7 CgogICAgaWYgKGlkeCA8PSBTUzdfTkVUX05TX0lEWChTUzdfTkVUX05TX0RBRU1PTikpCiAgICAg ICAgLyogU1M3X05FVF9OU19JTklUIGFuZCBTUzdfTkVUX05TX0RBRU1PTiBhcmVuJ3QgcmVmLWNv dW50ZWQgKi8KICAgICAgICByZXR1cm47CiAgICBuaSA9IHNzN19uc190YWJsZSArIGlkeDsKCiAg ICBzczdfdHJhY2VfcHJpbnRmKDAsICJzczdfbmV0X25zX3B1dCgleCk6IHJlZmNvdW50ICVkLCBz b2NrICVwLCBuZXQgJXBcbiIsCiAgICAgICAgICAgIG5hbWVzcGFjZSwgbmktPm5pX3JlZmNvdW50 LCBuaS0+bmlfc29jaywgbmktPm5pX25ldF9ucyk7CgogICAgc3M3X211dGV4X2VudGVyKCZzczdf Z2x1ZV9tdXRleCk7CiAgICBpZiAobmktPm5pX3JlZmNvdW50ICYmICEtLW5pLT5uaV9yZWZjb3Vu dCkgewogICAgICAgIC8qIExhc3QgcmVmZXJlbmNlIGdvbmUgKi8KICAgICAgICBzb2NrX3JlbGVh c2UobmktPm5pX3NvY2spOwogICAgICAgIG5pLT5uaV9uZXRfbnMgPSBOVUxMOwogICAgICAgIG5p LT5uaV9zb2NrID0gTlVMTDsKICAgIH0KICAgIHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRl eCk7Cn0KCnN0YXRpYyB2b2lkCnNzN19uZXRfbnNfdW5sb2FkKHZvaWQpCnsKICAgIHVuc2lnbmVk IGludCBpZHg7CiAgICBzdHJ1Y3Qgc3M3X25zX2luZm8gKm5pOwoKICAgIGZvciAoaWR4ID0gMTsg aWR4IDwgQVJSQVlfU0laRShzczdfbnNfdGFibGUpOyBpZHgrKykgewogICAgICAgIG5pID0gc3M3 X25zX3RhYmxlICsgaWR4OwogICAgICAgIGlmICghbmktPm5pX3NvY2spCiAgICAgICAgICAgIGNv bnRpbnVlOwoKICAgICAgICAvKiBUaGlzIHNob3VsZCBvbmx5IHJlcG9ydCBhbnl0aGluZyBmb3Ig dGhlICdkYWVtb24nIHNsb3QgKi8KICAgICAgICBwcmludGsoS0VSTl9JTkZPICJzczdfbmV0X25z X3VubG9hZCgpOiBpZHggJWQsIHJlZmNvdW50ICVkLCBzb2NrICVwLCBuZXQgJXBcbiIsCiAgICAg ICAgICAgICAgICBpZHgsIG5pLT5uaV9yZWZjb3VudCwgbmktPm5pX3NvY2ssIG5pLT5uaV9uZXRf bnMpOwogICAgICAgIHNvY2tfcmVsZWFzZShuaS0+bmlfc29jayk7CiAgICAgICAgbmktPm5pX25l dF9ucyA9IE5VTEw7CiAgICAgICAgbmktPm5pX3NvY2sgPSBOVUxMOwogICAgICAgIG5pLT5uaV9y ZWZjb3VudCA9IDA7CiAgICB9Cn0KCnVuc2lnbmVkIGludApzczdfbmV0X25zX3NldCh1bnNpZ25l ZCBpbnQgbmV3X25hbWVzcGFjZSwgdW5zaWduZWQgaW50IG9sZF9uYW1lc3BhY2UpCnsKICAgIHN0 YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3VzZWRfaWR4ID0gMjsKICAgIHVuc2lnbmVkIGludCBpZHgs IGZyZWVfaWR4OwogICAgc3RydWN0IHNzN19uc19pbmZvICpuaTsKICAgIHN0cnVjdCBuZXQgKm5l dDsKCiAgICAvKiBUaGUgbmV3X25hbWVzcGFjZSBzaG91bGQgaGF2ZSB0aGUgbG93IDE2IGJpdHMg emVyby4KICAgICAqIFRoZSBsb3cgYml0cyBvZiBvbGRfbmFtZXNwYWNlIGluZGljYXRlIHdoYXQg d2FzIGFjdHVhbGx5IGJlaW5nIHVzZWQuICovCgogICAgaWYgKG5ld19uYW1lc3BhY2UgIT0gU1M3 X05FVF9OU19TVEFSVCkgewogICAgICAgIHNzN19uZXRfbnNfcHV0KG9sZF9uYW1lc3BhY2UpOwog ICAgICAgIHJldHVybiBuZXdfbmFtZXNwYWNlID09IFNTN19ORVRfTlNfREFFTU9OID8gU1M3X05F VF9OU19EQUVNT04gOiBTUzdfTkVUX05TX0lOSVQ7CiAgICB9CgogICAgLyogU1M3X05FVF9OU19T VEFSVCAtIGxvb2sgZm9yIGFuIGVudHJ5IGZvciB0aGUgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50 IAogICAgICogcHJvY2VzcyAod2hpY2ggd2lsbCBiZSAnc3M3bWFpbnQgc3RhcnQnKS4gKi8KICAg IG5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKCiAgICBpZHggPSBTUzdfTkVUX05TX0lE WChvbGRfbmFtZXNwYWNlKTsKICAgIG5pID0gc3M3X25zX3RhYmxlICsgaWR4OwogICAgaWYgKG5p LT5uaV9uZXRfbnMgPT0gbmV0KQogICAgICAgIC8qIFVuY2hhbmdlZCBpbmRleCwgbm8gbmVlZCB0 byBjaGFuZ2UgcmVmZXJlbmNlIGNvdW50ICovCiAgICAgICAgcmV0dXJuIFNTN19ORVRfTlNfU1RB UlQgfCBpZHg7CgogICAgLyogRGlmZmVyZW50IHNsb3QgbmVlZGVkLCBkcm9wIG9sZCByZWZlcmVu Y2UgKi8KICAgIHNzN19uZXRfbnNfcHV0KG9sZF9uYW1lc3BhY2UpOwoKICAgIC8qIENoZWNrIGlu aXQgYW5kIGRhZW1vbiBlbnRyaWVzLCBuZWl0aGVyIGdvZXMgYXdheSAqLwogICAgaWYgKGlkeCAh PSBTUzdfTkVUX05TX0lEWChTUzdfTkVUX05TX0lOSVQpCiAgICAgICAgICAgICYmIG5ldCA9PSAm aW5pdF9uZXQpCiAgICAgICAgcmV0dXJuIFNTN19ORVRfTlNfU1RBUlQgfCBTUzdfTkVUX05TX0lE WChTUzdfTkVUX05TX0lOSVQpOwoKICAgIGlkeCA9IFNTN19ORVRfTlNfSURYKFNTN19ORVRfTlNf REFFTU9OKTsKICAgIG5pID0gc3M3X25zX3RhYmxlICsgaWR4OwogICAgaWYgKG5ldCA9PSBuaS0+ bmlfbmV0X25zKQogICAgICAgIHJldHVybiBTUzdfTkVUX05TX1NUQVJUIHwgaWR4OwoKICAgIHNz N19tdXRleF9lbnRlcigmc3M3X2dsdWVfbXV0ZXgpOwoKICAgIC8qIFNjYW4gdGFibGUgZm9yIGFu IGV4aXN0aW5nIHJlZmVyZW5jZSAqLwogICAgZnJlZV9pZHggPSAwOwogICAgZm9yIChpZHggPSAy OyBpZHggPCBudW1fdXNlZF9pZHg7IGlkeCsrKSB7CiAgICAgICAgbmkgPSBzczdfbnNfdGFibGUg KyBpZHg7CiAgICAgICAgaWYgKG5pLT5uaV9uZXRfbnMgPT0gbmV0KSB7CiAgICAgICAgICAgIC8q IGZvdW5kIGEgbWF0Y2ggKi8KICAgICAgICAgICAgbmktPm5pX3JlZmNvdW50Kys7CiAgICAgICAg ICAgIHNzN19tdXRleF9leGl0KCZzczdfZ2x1ZV9tdXRleCk7CiAgICAgICAgICAgIHNzN190cmFj ZV9wcmludGYoMCwgInNzN19uZXRfbnNfc2V0KCV4LCAleCk6IGZvdW5kIGlkeCAlZCwgcmVmY291 bnQgJWQsIHNvY2sgJXAsIG5ldCAlcFxuIiwKICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZXNw YWNlLCBvbGRfbmFtZXNwYWNlLCBpZHgsIG5pLT5uaV9yZWZjb3VudCwgbmktPm5pX3NvY2ssIG5p LT5uaV9uZXRfbnMpOwogICAgICAgICAgICByZXR1cm4gU1M3X05FVF9OU19TVEFSVCB8IGlkeDsK ICAgICAgICB9CiAgICAgICAgaWYgKCFmcmVlX2lkeCAmJiAhbmktPm5pX25ldF9ucykKICAgICAg ICAgICAgZnJlZV9pZHggPSBpZHg7CiAgICB9CgogICAgLyogTm90IGZvdW5kIGFsbG9jYXRlIGxv d2VzdCBmcmVlIHNsb3QgKi8KICAgIGlmICghZnJlZV9pZHgpIHsKICAgICAgICBpZiAobnVtX3Vz ZWRfaWR4ID49IEFSUkFZX1NJWkUoc3M3X25zX3RhYmxlKSkKICAgICAgICAgICAgLyogVGFibGUg ZnVsbCwgYm9ya2VkICovCiAgICAgICAgICAgIGdvdG8gbm9fcmVmOwogICAgICAgIGZyZWVfaWR4 ID0gbnVtX3VzZWRfaWR4Kys7CiAgICB9CgogICAgbmkgPSAmc3M3X25zX3RhYmxlW2ZyZWVfaWR4 XTsKICAgIG5pLT5uaV9zb2NrID0gc3M3X2dsdWVfY3JlYXRlX25zX3NvY2tldChuZXQpOwogICAg aWYgKCFuaS0+bmlfc29jaykKICAgICAgICBnb3RvIG5vX3JlZjsKICAgIG5pLT5uaV9uZXRfbnMg PSBuZXQ7CgogICAgc3M3X211dGV4X2V4aXQoJnNzN19nbHVlX211dGV4KTsKICAgIHNzN190cmFj ZV9wcmludGYoMCwgInNzN19uZXRfbnNfc2V0KCV4LCAleCk6IG5ldyBpZHggJWQsIHNvY2sgJXAs IG5ldCAlcFxuIiwKICAgICAgICAgICAgbmV3X25hbWVzcGFjZSwgb2xkX25hbWVzcGFjZSwgZnJl ZV9pZHgsIG5pLT5uaV9zb2NrLCBuaS0+bmlfbmV0X25zKTsKCiAgICByZXR1cm4gU1M3X05FVF9O U19TVEFSVCB8IGZyZWVfaWR4OwoKICBub19yZWY6CiAgICBzczdfbXV0ZXhfZXhpdCgmc3M3X2ds dWVfbXV0ZXgpOwogICAgc3M3X3RyYWNlX3ByaW50ZigwLCAic3M3X25ldF9uc19zZXQoJXgsICV4 KTogbm9fcmVmXG4iLAogICAgICAgICAgICBuZXdfbmFtZXNwYWNlLCBvbGRfbmFtZXNwYWNlKTsK ICAgIHJldHVybiBTUzdfTkVUX05TX1NUQVJUOwp9Cgp2b2lkCnNzN19nbHVlX2RhZW1vbl9vcGVu KHZvaWQpCnsKICAgIHN0cnVjdCBzczdfbnNfaW5mbyAqbmkgPSAmc3M3X25zX3RhYmxlW1NTN19O RVRfTlNfSURYKFNTN19ORVRfTlNfREFFTU9OKV07CiAgICBzdHJ1Y3QgbmV0ICpuZXQgPSBjdXJy ZW50LT5uc3Byb3h5LT5uZXRfbnM7CgogICAgLyogU2F2ZSAoYW5kIHJlZmVyZW5jZSBjb3VudCkg dGhlIG5ldHdvcmsgbmFtZXNwYWNlIHRoZSBzczcgZGFlbW9uCiAgICAgKiBpcyBzdGFydGVkIGlu LiAqLwoKICAgIC8qIEluaXRpYWxpc2UgdGhlIGVudHJ5IGZvciBpbml0X25ldCBoZXJlIC0gaGFz IHRvIGJlIGRvbmUgc29tZXdoZXJlLiAqLwogICAgc3M3X25zX3RhYmxlW1NTN19ORVRfTlNfSURY KFNTN19ORVRfTlNfSU5JVCldLm5pX25ldF9ucyA9ICZpbml0X25ldDsKCiAgICBpZiAobmV0ID09 IG5pLT5uaV9uZXRfbnMpCiAgICAgICAgLyogVW5jaGFuZ2VkICovCiAgICAgICAgcmV0dXJuOwoK ICAgIGlmIChuaS0+bmlfc29jaykKICAgICAgICBzb2NrX3JlbGVhc2UobmktPm5pX3NvY2spOwog ICAgbmktPm5pX3NvY2sgPSBOVUxMOwoKICAgIGlmIChuZXQgIT0gJmluaXRfbmV0ICYmICEoKG5p LT5uaV9zb2NrID0gc3M3X2dsdWVfY3JlYXRlX25zX3NvY2tldChuZXQpKSkpCiAgICAgICAgLyog Q2FuJ3QgY3JlYXRlIHNvY2tldCwgZGVmYXVsdCB0byBnbG9iYWwgbmFtZXNwYWNlICovCiAgICAg ICAgbmV0ID0gJmluaXRfbmV0OwoKICAgIG5pLT5uaV9uZXRfbnMgPSBuZXQ7Cn0KCmludApzczdf c29ja2V0KGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBu YW1lc3BhY2UsIHN0cnVjdCBzb2NrZXQgKipzb2NrcCkKewogICAgc3RydWN0IHNvY2tldCAqc29j azsKICAgIHN0cnVjdCBuZXQgKm5ldDsKICAgIHVuc2lnbmVkIGludCBvbmUgPSAxVTsKICAgIGlu dCBydmFsOwoKICAgIG5ldCA9IHNzN19uc190YWJsZVtTUzdfTkVUX05TX0lEWChuYW1lc3BhY2Up XS5uaV9uZXRfbnM7CiAgICBpZiAoIW5ldCkKICAgICAgICBuZXQgPSAmaW5pdF9uZXQ7CgogICAg LyogSWYgd2UgaGF2ZSB0byBhdXRvbG9hZCB0aGUgc2N0cCBtb2R1bGUsIHdlIG1pZ2h0IHJlLWVu dGVyIGl0CiAgICAgKiBiZWZvcmUgaXQgaGFzIGZpbmlzaGVkIGluaXRpYWxpc2luZyAtIG1pZ2h0 IGdvICdib29tJy4gKi8KICAgIHNzN19tdXRleF9lbnRlcigmc3M3X2dsdWVfbXV0ZXgpOwoKICAg IC8qIHNvY2tfY3JlYXRlX2tlcm4oKSBjcmVhdGVzIGEgc29ja2V0IHRoYXQgZG9lc24ndCBob2xk IGEgcmVmZXJlbmNlCiAgICAgKiB0byB0aGUgbmFtZXNwYWNlICh0aGV5IGdldCB1c2VkIGZvciBz b2NrZXRzIG5lZWRlZCBieSB0aGUgcHJvdG9jb2wKICAgICAqIHN0YWNrIGNvZGUgaXRzZWxmKS4K ICAgICAqIFdlIG5lZWQgYSBzb2NrZXQgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbmFt ZXNwYWNlLCBzbyBjcmVhdGUKICAgICAqIGEgJ3VzZXInIHNvY2tldCBpbiBhIHNwZWNpZmljIG5h bWVzcGFjZS4KICAgICAqIFRoaXMgYWRkcyBhbiBleHRyYSBzZWN1cml0eSBjaGVjayB3aGljaCB3 ZSBzaG91bGQgcGFzcyBiZWNhdXNlIGFsbCB0aGUKICAgICAqIHNvY2tldHMgYXJlIGNyZWF0ZWQg Ynkga2VybmVsIHRocmVhZHMuCiAgICAgKi8KICAgIHJ2YWwgPSBfX3NvY2tfY3JlYXRlKG5ldCwg ZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgc29ja3AsIDApOwogICAgc3M3X211dGV4X2V4aXQoJnNz N19nbHVlX211dGV4KTsKICAgIGlmIChydmFsICE9IDApCiAgICAgICAgcmV0dXJuIHJ2YWw7CiAg ICBzb2NrID0gKnNvY2twOwoKICAgIGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQs IFNPX1JFVVNFQUREUiwgJm9uZSwgc2l6ZW9mIG9uZSk7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQK c3M3X3NldHNvY2tvcHRfbm9kZWxheShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZW5hYmxlZCkK ewogICAga2VybmVsX3NldHNvY2tvcHQoc29jaywgU0tfUFJPVE9DT0woc29jayksCiAgICAgICAg ICAgIFNLX1BST1RPQ09MKHNvY2spID09IElQUFJPVE9fVENQID8gVENQX05PREVMQVkgOiBTQ1RQ X05PREVMQVksCiAgICAgICAgICAgICZlbmFibGVkLCBzaXplb2YgZW5hYmxlZCk7Cn0KCnN0YXRp YyB2b2lkCnNzN19zY3RwX3NldF9vcHRzKHN0cnVjdCBzb2NrZXQgKnNvY2spCnsKICAgIHN0cnVj dCBzY3RwX2V2ZW50X3N1YnNjcmliZSBldmVudHM7CiAgICBpbnQgbGVuLCBydmFsOwoKICAgIGlm IChTS19QUk9UT0NPTChzb2NrKSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuOwoKICAg IGxlbiA9IHNpemVvZiBldmVudHM7CiAgICBydmFsID0ga2VybmVsX2dldHNvY2tvcHQoc29jaywg SVBQUk9UT19TQ1RQLCBTQ1RQX0VWRU5UUywgJmV2ZW50cywgJmxlbik7CiAgICBpZiAocnZhbCAh PSAwKQogICAgICAgIHJldHVybjsKCiAgICAvKiBXZSBuZWVkIHRvIGtub3cgdGhlIHN0cmVhbSBh bmQgcHBpZCAqLwogICAgZXZlbnRzLnNjdHBfZGF0YV9pb19ldmVudCA9IDE7CiAgICAvKiBFbmFi bGUgbm90aWZpY2F0aW9ucyB0byBkZXRlY3QgY29ubmVjdGlvbiByZXN0YXJ0ICovCiAgICBldmVu dHMuc2N0cF9hc3NvY2lhdGlvbl9ldmVudCA9IDE7CiAgICBrZXJuZWxfc2V0c29ja29wdChzb2Nr LCBJUFBST1RPX1NDVFAsIFNDVFBfRVZFTlRTLCAmZXZlbnRzLCBzaXplb2YgZXZlbnRzKTsKfQoK dW5zaWduZWQgaW50CnNzN19nZXRfbWF4X3NjdHBfb3N0cmVhbXMoc3RydWN0IHNvY2tldCAqc29j aykKewogICAgc3RydWN0IHNjdHBfc3RhdHVzIHNzdGF0OwogICAgaW50IGxlbjsKCiAgICBpZiAo U0tfUFJPVE9DT0woc29jaykgIT0gSVBQUk9UT19TQ1RQKQogICAgICAgIHJldHVybiAwOwoKICAg IGxlbiA9IHNpemVvZiBzc3RhdDsKICAgIGlmIChrZXJuZWxfZ2V0c29ja29wdChzb2NrLCBJUFBS T1RPX1NDVFAsIFNDVFBfU1RBVFVTLCAmc3N0YXQsICZsZW4pKQogICAgICAgIHJldHVybiAwOwoK ICAgIHJldHVybiBzc3RhdC5zc3RhdF9vdXRzdHJtczsKfQoKdm9pZApzczdfc2V0X21heF9zY3Rw X3N0cmVhbXMoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IG1heF9zdHJlYW1zKQp7 CiAgICBzdHJ1Y3Qgc2N0cF9pbml0bXNnIHNpbml0OwoKICAgIGlmIChTS19QUk9UT0NPTChzb2Nr KSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuOwoKICAgIG1lbXNldCgmc2luaXQsIDAs IHNpemVvZiBzaW5pdCk7CgogICAgc2luaXQuc2luaXRfbnVtX29zdHJlYW1zID0gbWF4X3N0cmVh bXM7CiAgICBzaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zID0gbWF4X3N0cmVhbXM7CiAgICBrZXJu ZWxfc2V0c29ja29wdChzb2NrLCBJUFBST1RPX1NDVFAsIFNDVFBfSU5JVE1TRywgJnNpbml0LCBz aXplb2Ygc2luaXQpOwp9Cgp2b2lkCnNzN190cmFuc19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQg KnNvY2spCnsKICAgIHVuc2lnbmVkIGludCBvbmUgPSAxVTsKCiAgICBzczdfc2V0c29ja29wdF9u b2RlbGF5KHNvY2ssIDEpOwogICAgc3M3X3NjdHBfc2V0X29wdHMoc29jayk7CiAgICBpZiAoU0tf UFJPVE9DT0woc29jaykgPT0gSVBQUk9UT19UQ1ApCiAgICAgICAga2VybmVsX3NldHNvY2tvcHQo c29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCAmb25lLCBzaXplb2Ygb25lKTsKfQoKdm9p ZApzczdfdHJhbnNiaW5kX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaykKewogICAgLyog U2V0IG9wdGlvbnMgZm9yIGEgbGlzdGVuaW5nIHNvY2tldCAqLwogICAgc3M3X3NjdHBfc2V0X29w dHMoc29jayk7CgogICAgLyogTTNVQSBtYXkgbmVlZCAxNiBkYXRhIHN0cmVhbXMsIGl0IGlzIGp1 c3QgVEZIIHRvIGNvbmZpZ3VyZSB0aGlzICovCiAgICBzczdfc2V0X21heF9zY3RwX3N0cmVhbXMo c29jaywgMSArIDE2KTsKfQoKI2RlZmluZSBJUF9BRERSX0xFTihzYSkgKChzYSktPnNpbjZfZmFt aWx5ID09IEFGX0lORVQ2ID8gc2l6ZW9mICooc2EpIDogMTYpCmludApzczdfY29ubmVjdChzdHJ1 Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYSkKewogICAgcmV0dXJuIGtl cm5lbF9jb25uZWN0KHNvY2ssICh2b2lkICopc2EsIElQX0FERFJfTEVOKHNhKSwgT19SRFdSKTsK fQoKaW50CnNzN19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYg KnNhLCB1bnNpZ25lZCBpbnQgYWZfb3B0cykKewogICAgLyogSWYgd2UgYXJlIGJpbmRpbmcgSU5B RERSNl9BTlkgdG8gYW4gSVB2NiBzb2NrZXQgKHR5cGljYWxseSBmb3IKICAgICAqIGEgbGlzdGVu aW5nIHNvY2tldCkgdGhlbiB3ZSBwcm9iYWJseSB3YW50IHRvIGVuc3VyZSB0aGF0IElQVjZfVjZP TkxZCiAgICAgKiBpcyAwIHNvIHRoYXQgdGhlIHNvY2tldCB3aWxsIGFsc28gYmUgZ2l2ZW4gSVB2 NCBjb25uZWN0aW9ucy4gKi8KICAgIGlmIChzYS0+c2luNl9mYW1pbHkgPT0gQUZfSU5FVDYgJiYg YWZfb3B0cyAmIFNTN19BRl9PUFRfSVB2Nl9WNk9OTFkKICAgICAgICAgICAgJiYgc2EtPnNpbjZf YWRkci5pbjZfdS51Nl9hZGRyMzJbMF0gPT0gMAogICAgICAgICAgICAmJiAoc2EtPnNpbjZfYWRk ci5pbjZfdS51Nl9hZGRyMzJbMV0KICAgICAgICAgICAgICAgIHwgc2EtPnNpbjZfYWRkci5pbjZf dS51Nl9hZGRyMzJbMl0KICAgICAgICAgICAgICAgIHwgc2EtPnNpbjZfYWRkci5pbjZfdS51Nl9h ZGRyMzJbM10pID09IDApIHsKICAgICAgICBpbnQgdjZvbmx5ID0gYWZfb3B0cyAmIDE7CiAgICAg ICAga2VybmVsX3NldHNvY2tvcHQoc29jaywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgJnY2 b25seSwgc2l6ZW9mIHY2b25seSk7CiAgICB9CgogICAgcmV0dXJuIGtlcm5lbF9iaW5kKHNvY2ss ICh2b2lkICopc2EsIElQX0FERFJfTEVOKHNhKSk7Cn0KCmludApzczdfYmluZHgoc3RydWN0IHNv Y2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX2luNiAqc2EpCnsKICAgIGlmIChTS19QUk9UT0NP TChzb2NrKSAhPSBJUFBST1RPX1NDVFApCiAgICAgICAgcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7 CgogICAgcmV0dXJuIGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIElQUFJPVE9fU0NUUCwgU0NUUF9T T0NLT1BUX0JJTkRYX0FERCwKICAgICAgICAgICAgc2EsIElQX0FERFJfTEVOKHNhKSk7Cn0KCmlu dApzczdfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZW4pCnsKICAgIHJldHVybiBr ZXJuZWxfbGlzdGVuKHNvY2ssIGxlbik7Cn0KCmludApzczdfYWNjZXB0KHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrZXQgKipuZXdfc29ja3AsIGludCBmbGFncykKewogICAgcmV0dXJu IGtlcm5lbF9hY2NlcHQoc29jaywgbmV3X3NvY2twLCBmbGFncyk7Cn0KCiNpZiBMSU5VWF9WRVJT SU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTig0LCAxNywgMCkKc3RhdGljIGlubGluZSBpbnQKc3M3 X2tlcm5lbF9nZXRzb2NrbmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIg KmFkZHJlc3MpCnsKICAgIGludCBlcnIsIGxlbjsKCiAgICBlcnIgPSBrZXJuZWxfZ2V0c29ja25h bWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJlc3MsICZsZW4pOwogICAgcmV0dXJuIGVy ciA/IGVyciA6IGxlbjsKfQojZGVmaW5lIGtlcm5lbF9nZXRzb2NrbmFtZSBzczdfa2VybmVsX2dl dHNvY2tuYW1lCgpzdGF0aWMgaW5saW5lIGludApzczdfa2VybmVsX2dldHBlZXJuYW1lKHN0cnVj dCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcykKewogICAgaW50IGVyciwg bGVuOwoKICAgIGVyciA9IGtlcm5lbF9nZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRy ICopYWRkcmVzcywgJmxlbik7CiAgICByZXR1cm4gZXJyID8gZXJyIDogbGVuOwp9CiNkZWZpbmUg a2VybmVsX2dldHBlZXJuYW1lIHNzN19rZXJuZWxfZ2V0cGVlcm5hbWUKI2VuZGlmCgppbnQKc3M3 X2dldF9sb2NfcG9ydChzdHJ1Y3Qgc29ja2V0ICpzb2NrKQp7CiAgICBjaGFyIGFkZHJlc3NbMTI4 IC8qTUFYX1NPQ0tfQUREUiovXTsKICAgIGludCBsZW47CgogICAgbGVuID0ga2VybmVsX2dldHNv Y2tuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyZXNzKTsKICAgIGlmIChsZW4gPCAw KQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIFRoaXMgd29ya3Mgd2VsbCBlbm91Z2ggZm9yIElQ djQgYW5kIElQdjYgKi8KICAgIHJldHVybiBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFk ZHJlc3MpLT5zaW5fcG9ydCk7Cn0KCmludApzczdfZ2V0X3JlbV9hZGRyKHN0cnVjdCBzb2NrZXQg KnNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhZGRyKQp7CiAgICBpbnQgbGVuOwoKICAgIGxl biA9IGtlcm5lbF9nZXRwZWVybmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopc2FkZHIpOwog ICAgaWYgKGxlbiA8IDApCiAgICAgICAgcmV0dXJuIGxlbjsKCiAgICBpZiAobGVuID4gc2l6ZW9m ICpzYWRkcikKICAgICAgICBwcmludGsoS0VSTl9FTUVSRyAic3M3c2VydmVyOiBzb2NrZXQgYWRk cmVzcyAoZmFtaWx5ICVkKSAlZCA+ICVkIiwKICAgICAgICAgICAgICAgIHNhZGRyLT5zaW42X2Zh bWlseSwgbGVuLCAoaW50KXNpemVvZiAqc2FkZHIpOwoKICAgIHJldHVybiAwOwp9CgppbnQKc3M3 X3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBob3cpCnsKI2lmIExJTlVYX1ZFUlNJ T05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsIDE4LCAwKQogICAgaWYgKFNLX1BST1RPQ09MKHNv Y2spID09IElQUFJPVE9fU0NUUCkgewogICAgICAgIHN0cnVjdCBsaW5nZXIgbGluZ2VyOwoKICAg ICAgICAvKiBJZiB3ZSBjYWxsIGtlcm5lbF9zb2NrX3NodXRkb3duKCkgdGhlbiB0aGUgY29ubmVj dGlvbiBpc24ndCByZWxlYXNlZAogICAgICAgICAqIHVudGlsIGFsbCBvdXRzdGFuZGluZyBkYXRh IGhhcyBiZWVuIGFja2VkLgogICAgICAgICAqIElmIHRoZSByZW1vdGUgc3lzdGVtIHNlbmRzIGFu IElOSVQgKHJlc3RhcnRpbmcgdGhlIGNvbm5lY3Rpb24pCiAgICAgICAgICogd2hpbGUgdGhlIGxp bnV4IGtlcm5lbCBpcyB3YWl0aW5nIGZvciBkYXRhIHRvIGJlIGFja2VkIHRoZW4gaXQKICAgICAg ICAgKiB3aWxsIG5ldmVyIGRpc2Nvbm5lY3QuCiAgICAgICAgICogRW5hYmxpbmcgJ2xpbmdlcicg d2l0aCBhIGRlbGF5IG9mIHplcm8gY2F1c2VzIHNvY2tfcmVsZWFzZSgpCiAgICAgICAgICogdG8g YWJvcnQgdGhlIGNvbm5lY3Rpb24gKHNlbmRzIGFuIEFCT1JUIGNodW5rKS4KICAgICAgICAgKgog ICAgICAgICAqIFRoZSBzczcgY29kZSBuZXZlciBuZWVkcyB0byB3YWl0IGZvciBzZW50IGRhdGEg dG8gYmUgYWNrZWQsCiAgICAgICAgICogc28gYWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24gZG9lc24n dCByZWFsbHkgbWF0dGVyLgogICAgICAgICAqIEFsbCBjYWxscyB0byBzczdfc2h1dGRvd24oKSBh cmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgY2FsbHMgdG8KICAgICAgICAgKiBzczdfY2xvc2Vz b2NrZXQoKS4KICAgICAgICAgKgogICAgICAgICAqIFBsYXVzaWJseSB3ZSBzaG91bGQgYWx3YXlz IGFib3J0IGNvbm5lY3Rpb25zIGlmIHdlIGFyZSBkaXNjb25uZWN0aW5nCiAgICAgICAgICogZHVl IHRvIGFuIGFwcGxpY2F0aW9uIGxldmVsIHRpbWVvdXQuCiAgICAgICAgICoKICAgICAgICAgKiBG aXhlZCBieSB0aGUga2VybmVsIHBhdGNoOgogICAgICAgICAqICAgICJzY3RwOiBoYW5kbGUgYXNz b2NpYXRpb24gcmVzdGFydHMgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCIKICAgICAgICAgKiBL bm93biB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIGtlcm5lbHM6CiAgICAgICAgICog IC0gbWFpbmxpbmUgMy4xOAogICAgICAgICAqICAtIFVidW50dSAzLjEzLjExLjExCiAgICAgICAg ICogUXVldWVkIGZvciAzLjEwLXN0YWJsZSwgMy4xNC1zdGFibGUsIDMuMTYtc3RhYmxlIGFuZCAz LjE3LXN0YWJsZQogICAgICAgICAqLwoKICAgICAgICBsaW5nZXIubF9vbm9mZiA9IDE7CiAgICAg ICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKICAgICAgICBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBT T0xfU09DS0VULCBTT19MSU5HRVIsICZsaW5nZXIsIHNpemVvZiBsaW5nZXIpOwoKICAgICAgICBy ZXR1cm4gMDsKICAgIH0KI2VuZGlmCiAgICByZXR1cm4ga2VybmVsX3NvY2tfc2h1dGRvd24oc29j aywgaG93KTsKfQoKdm9pZApzczdfY2xvc2Vzb2NrZXQoc3RydWN0IHNvY2tldCAqc29jaykKewog ICAgc29ja19yZWxlYXNlKHNvY2spOwp9CgppbnQKc3M3X3NlbmQoc3RydWN0IHNvY2tldCAqc29j aywgc3RydWN0IHNzN19pb3ZlYyAqaW92LCBpbnQgaW92bGVuLCBpbnQgdG90bGVuLAogICAgICAg IHZvaWQgKmN0bCwgaW50IGN0bF9sZW4sIHVuc2lnbmVkIGludCBmbGFncykKewogICAgc3RydWN0 IG1zZ2hkciBtc2c7CgogICAgbXNnLm1zZ19uYW1lICAgICAgID0gMDsKICAgIG1zZy5tc2dfbmFt ZWxlbiAgICA9IDA7CiAgICBtc2cubXNnX2NvbnRyb2wgICAgPSBjdGw7CiAgICBtc2cubXNnX2Nv bnRyb2xsZW4gPSBjdGxfbGVuOwogICAgbXNnLm1zZ19mbGFncyAgICAgID0gZmxhZ3MgfCBNU0df Tk9TSUdOQUw7CgogICAgcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIGlvdiwgaW92 bGVuLCB0b3RsZW4pOwp9CgppbnQKc3M3X3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWdu ZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgaW50IGZsYWdzKQp7CiAgICBzdHJ1Y3Qga3ZlYyBp b3Y7CiAgICBzdHJ1Y3QgbXNnaGRyIG1zZzsKCiAgICBpZiAoIXNvY2stPnNrKQogICAgICAgIHJl dHVybiAwOwoKICAgIGlvdi5pb3ZfbGVuICAgICAgICA9IGxlbmd0aDsKICAgIGlvdi5pb3ZfYmFz ZSAgICAgICA9IGRhdGE7CgogICAgbXNnLm1zZ19uYW1lICAgICAgID0gMDsKICAgIG1zZy5tc2df bmFtZWxlbiAgICA9IDA7CiAgICBtc2cubXNnX2NvbnRyb2wgICAgPSBOVUxMOwogICAgbXNnLm1z Z19jb250cm9sbGVuID0gMDsKICAgIG1zZy5tc2dfZmxhZ3MgICAgICA9IDA7CgogICAgcmV0dXJu IGtlcm5lbF9yZWN2bXNnKHNvY2ssICZtc2csICZpb3YsIDEsIGxlbmd0aCwgMCk7Cn0KCmludApz czdfcmVjdl9zY3RwKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHZvaWQgKmJ1Zl8xLCBpbnQgbGVuXzEs IHZvaWQgKmJ1Zl8yLAogICAgaW50IGxlbl8yLCBzdHJ1Y3Qgc3M3X21zZ2IgKnNzN19tc2cpCnsK ICAgIHN0cnVjdCBtc2doZHIgbXNnOwogICAgc3RydWN0IGt2ZWMgaW92WzJdOwogICAgdW5zaWdu ZWQgY2hhciAqZGF0YSA9IGJ1Zl8xOwogICAgaW50IG1zZ19sZW4sIGN0bF9sZW47CiAgICBpbnQg cnZhbDsKICAgIHVuaW9uIHsKICAgICAgICBzdHJ1Y3QgY21zZ2hkciBjbXNnOwogICAgICAgIHVu c2lnbmVkIGludCBidWZbMTZdOwogICAgfSBjdGxidWY7CgogICAgaWYgKCFzb2NrLT5zaykKICAg ICAgICByZXR1cm4gMDsKCiAgICAvKiBGb3IgU0NUUCBlYWNoIHJlY3Ztc2cgc2hvdWxkIGdpdmUg dXMgYSBzaW5nbGUgZGF0YSByZWNvcmQuCiAgICAgKiBTaW5jZSB3ZSBvbmx5IGV2ZXIgc2VuZCBT SUdUUkFOIGVuY29kZWQgbWVzc2FnZXMgYnl0ZXMgNC03IGFyZSB0aGUKICAgICAqIGxlbmd0aCAt IGFuZCBzaG91bGQgbWF0Y2ggdGhhdCBvZiB0aGUgc2N0cCBkYXRhIGNodW5rLgogICAgICogYnVm XzEvbGVuXzEgcmVmZXIgdG8gdGhlIG5vcm1hbCBzczcgbWVzc2FnZSBidWZmZXIgYXJlYSwgYnVm XzIvbGVuXzIKICAgICAqIGFyZSBwZXItc29ja2V0LiBMb25nIG1lc3NhZ2VzIGdldCBjb3BpZWQg dG9nZXRoZXIgYnkgdGhlIGNhbGxlci4KICAgICAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgc2lu Z2xlIHZhbGlkIFNJR1RSQU4gbWVzc2FnZSAqLwoKICAgIGlvdlswXS5pb3ZfYmFzZSAgICA9IGJ1 Zl8xOwogICAgaW92WzBdLmlvdl9sZW4gICAgID0gbGVuXzE7CiAgICBpb3ZbMV0uaW92X2Jhc2Ug ICAgPSBidWZfMjsKICAgIGlvdlsxXS5pb3ZfbGVuICAgICA9IGxlbl8yOwoKICAgIG1zZy5tc2df bmFtZSAgICAgICA9IDA7CiAgICBtc2cubXNnX25hbWVsZW4gICAgPSAwOwogICAgbXNnLm1zZ19j b250cm9sICAgID0gJmN0bGJ1ZjsKICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZiBjdGxi dWY7CiAgICBtc2cubXNnX2ZsYWdzICAgICAgPSAwOwoKICAgIHJ2YWwgPSBrZXJuZWxfcmVjdm1z Zyhzb2NrLCAmbXNnLCBpb3YsIDIsIGxlbl8xICsgbGVuXzIsIDApOwoKICAgIGlmIChydmFsIDw9 IDApCiAgICAgICAgLyogRG9uJ3QgcmV0dXJuIEVCQURNU0cgaGVyZSAqLwogICAgICAgIHJldHVy biBydmFsICE9IC1FQkFETVNHID8gcnZhbCA6IC1FSU87CgogICAgaWYgKG1zZy5tc2dfZmxhZ3Mg JiBNU0dfTk9USUZJQ0FUSU9OKQogICAgICAgIC8qIG1zZyBkYXRhIGlzIGEgbm90aWZpY2F0aW9u ICovCiAgICAgICAgcmV0dXJuIC1FQkFETVNHOwoKICAgIGN0bF9sZW4gPSAoY2hhciAqKW1zZy5t c2dfY29udHJvbCAtIChjaGFyICopJmN0bGJ1ZjsKICAgIGlmIChjdGxfbGVuID49IGN0bGJ1Zi5j bXNnLmNtc2dfbGVuCiAgICAgICAgICAgICYmIGN0bGJ1Zi5jbXNnLmNtc2dfbGV2ZWwgPT0gSVBQ Uk9UT19TQ1RQCiAgICAgICAgICAgICYmIGN0bGJ1Zi5jbXNnLmNtc2dfdHlwZSA9PSBTQ1RQX1NO RFJDVikgewogICAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvID0gQ01TR19EQVRB KCZjdGxidWYuY21zZyk7CiAgICAgICAgc3M3X3RyYW5zX3NldF9tc2dfaW5mbyhzczdfbXNnLCBz aW5mby0+c2luZm9fc3RyZWFtLCBzaW5mby0+c2luZm9fcHBpZCk7CiAgICB9CgogICAgbXNnX2xl biA9IGRhdGFbNF0gPDwgMjQgfCBkYXRhWzVdIDw8IDE2IHwgZGF0YVs2XSA8PCA4IHwgZGF0YVs3 XTsKICAgIGlmIChtc2dfbGVuID49IDY1NTU2KQogICAgICAgIC8qIERpc2JlbGlldmUgdGhpcyBp cyB2YWxpZCBkYXRhICovCiAgICAgICAgcmV0dXJuIC1FSU87CgogICAgaWYgKHJ2YWwgIT0gbXNn X2xlbiB8fCAhKG1zZy5tc2dfZmxhZ3MgJiBNU0dfRU9SKSkKICAgICAgICByZXR1cm4gLUVJTzsK ICAgIHJldHVybiBydmFsOwp9CgppbnQKc3M3X3RyYW5zX2luaXRfc2N0cF9zaW5mbyh2b2lkICpi dWYsIGludCBtYXhsZW4sIF9fdTE2ICoqc3RyZWFtLCBfX3UzMiAqKnBwaWQpCnsKICAgIHN0cnVj dCBjbXNnaGRyICpjbXNnOwogICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CgogICAg aWYgKG1heGxlbiA8IENNU0dfTEVOKHNpemVvZiAqc2luZm8pKQogICAgICAgIHJldHVybiAtMTsK CiAgICBjbXNnID0gYnVmOwogICAgY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKICAg IGNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOwogICAgY21zZy0+Y21zZ19sZW4gPSBDTVNH X0xFTihzaXplb2YgKnNpbmZvKTsKICAgIHNpbmZvID0gQ01TR19EQVRBKGNtc2cpOwogICAgbWVt c2V0KHNpbmZvLCAwLCBzaXplb2YgKnNpbmZvKTsKICAgICpzdHJlYW0gPSAmc2luZm8tPnNpbmZv X3N0cmVhbTsKICAgICpwcGlkID0gJnNpbmZvLT5zaW5mb19wcGlkOwoKICAgIHJldHVybiBDTVNH X0xFTihzaXplb2YgKnNpbmZvKTsKfQo= --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_ Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ linux-nvme mailing list linux-nvme@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-nvme --_002_49f712b3b6704c3096d3834a5985a4d6AcuMSaculabcom_-- From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Laight Date: Sun, 17 May 2020 08:48:02 +0000 Subject: [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx In-Reply-To: <20200516153652.GM16070@bombadil.infradead.org> References: <20200514062820.GC8564@lst.de> <20200513062649.2100053-1-hch@lst.de> <20200513062649.2100053-28-hch@lst.de> <20200513180058.GB2491@localhost.localdomain> <129070.1589556002@warthog.procyon.org.uk> <05d946ae948946158dbfcbc07939b799@AcuMS.aculab.com> <20200516153652.GM16070@bombadil.infradead.org> Message-ID: <49f712b3b6704c3096d3834a5985a4d6@AcuMS.aculab.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: 'Matthew Wilcox' Cc: 'David Howells' , Christoph Hellwig , Marcelo Ricardo Leitner , "linux-nvme@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "linux-sctp@vger.kernel.org" , "target-devel@vger.kernel.org" , "linux-afs@lists.infradead.org" , "drbd-dev@lists.linbit.com" , "linux-cifs@vger.kernel.org" , "rds-devel@oss.oracle.com" , "linux-rdma@vger.kernel.org" , "cluster-devel@redhat.com" , Jakub Kicinski , linux-block@vger.kernel From: Matthew Wilcox > Sent: 16 May 2020 16:37 ... > > Basically: > > > > This patch sequence (to be written) does the following: > > > > Patch 1: Change __sys_setsockopt() to allocate a kernel buffer, > > copy the data into it then call set_fs(KERNEL_DS). > > An on-stack buffer (say 64 bytes) will be used for > > small transfers. > > > > Patch 2: The same for __sys_getsockopt(). > > > > Patch 3: Compat setsockopt. > > > > Patch 4: Compat getsockopt. > > > > Patch 5: Remove the user copies from the global socket options code. > > > > Patches 6 to n-1; Remove the user copies from the per-protocol code. > > > > Patch n: Remove the set_fs(KERNEL_DS) from the entry points. > > > > This should be bisectable. > > I appreciate your dedication to not publishing the source code to > your kernel module, but Christoph's patch series is actually better. > It's typesafe rather than passing void pointers around. There are plenty on interfaces that pass a 'pointer and length'. Having the compiler do a type check doesn't give any security benefit - just stops silly errors. Oh yes, I've attached the only driver source file that calls into the Linux kernel. You are perfectly free to look at all the thing we have to do to support different and broken kernel releases. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) -------------- next part -------------- #ident "@(#) (c) Aculab plc $Header: /home/cvs/repository/ss7/stack/src/driver/linux/ss7osglue.c,v 1.157 2019-08-29 16:09:14 davidla Exp $ $Name: $" #ifndef MODULE #define MODULE #endif #include #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 28) #error minimum kernel version is 2.6.28 #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) #include #else #include #endif #include #include #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) #include #endif #include #include #include #include #include #include #include #include #include #include #include /* This is only in the kernel build tree */ #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) #include #else #include /* netinet/sctp.h ought to be this file */ #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0) #define wait_queue_head __wait_queue_head #define wait_queue_entry __wait_queue #endif #define SK_PROTOCOL(sock) (sock)->sk->sk_protocol extern void ss7_trace_mem(int, void *, int, const char *, ...); extern void ss7_trace_printf(int, const char *, ...); /* Aculab DACP interfaces - these are in aculab's kern_if.h */ void *dacp_symbol_get(const char *); int dacp_symbol_release(const char *); MODULE_AUTHOR("Aculab"); MODULE_LICENSE("Proprietary"); #include "ss7osglue.h" /* Mutex for driver interface code */ static struct mutex ss7_glue_mutex; static int ss7dev_major; static const void *ss7_dtls_handle; static int ss7_use_count; static int ss7_stop_pid; static struct task_struct *asserted_tasks[16]; static unsigned int asserted_task_count; typedef char ss7_verify_const[ SS7_SOCK_STREAM == SOCK_STREAM && SS7_SOCK_SEQPACKET == SOCK_SEQPACKET ? 1 : -1]; static void ss7_net_ns_unload(void); #define TCP_NODELAY 1 static int ss7_glue_open(struct inode *, struct file *); static int ss7_glue_release(struct inode *, struct file *); static long ss7_glue_unlocked_ioctl(struct file *, unsigned int, unsigned long); static unsigned int ss7_glue_poll(struct file *const, poll_table *); static struct file_operations ss7dev_fop = { open: ss7_glue_open, release: ss7_glue_release, unlocked_ioctl: ss7_glue_unlocked_ioctl, compat_ioctl: ss7_glue_unlocked_ioctl, poll: ss7_glue_poll, owner: THIS_MODULE }; static int ss7_reboot_notify(struct notifier_block *nb, unsigned long action, void *data) { /* System being rebooted. * I added this hoping to use it to get the ss7maint daemon to exit, * but it isn't called until all user processes have died. * Leave it here - might be useful one day. */ return 0; } static struct notifier_block ss7_reboot_notifier_block = { .notifier_call = ss7_reboot_notify, }; static int ss7_init_fail(int rval) { if (ss7dev_major > 0) unregister_chrdev(ss7dev_major, "ss7server"); return rval; } static int ss7_init_mod(void) { const void *(*dtls_register)(const char *, int (*)(struct dtls_get_if *)); int rval; ss7_mutex_init(&ss7_glue_mutex); printk(KERN_INFO "%s\n", ss7version); ss7dev_major = register_chrdev(0, "ss7server", &ss7dev_fop); if (ss7dev_major < 0) { printk(KERN_INFO "ss7server: register_chrdev() failed: %d\n", ss7dev_major); return ss7_init_fail(ss7dev_major); } rval = ss7_driver_init(); if (rval != 0) { printk(KERN_INFO "ss7server: ss7_driver_init() failed: %d\n", rval); return ss7_init_fail(-EIO); } dtls_register = dacp_symbol_get("acuc_dtls_register"); if (dtls_register == NULL) printk(KERN_INFO "ss7server: cannot locate \"acuc_dtls_register\"\n"); else ss7_dtls_handle = dtls_register(DYNAMIC_TLS_PREFIX "ss7", ss7_tls_get_if); register_reboot_notifier(&ss7_reboot_notifier_block); return 0; } static void ss7_cleanup_mod(void) { int (*dtls_unregister)(const void *); unregister_reboot_notifier(&ss7_reboot_notifier_block); if (ss7_dtls_handle != NULL) { dtls_unregister = dacp_symbol_get("acuc_dtls_unregister"); dacp_symbol_release("acuc_dtls_register"); if (dtls_unregister != NULL) { dtls_unregister(ss7_dtls_handle); dacp_symbol_release("acuc_dtls_unregister"); } } ss7_init_fail(0); printk(KERN_INFO "Aculab ss7server: driver unloaded\n"); } module_init(ss7_init_mod) module_exit(ss7_cleanup_mod) static int ss7_glue_open(struct inode *const inode, struct file *const filp) { int rval, pid; if (filp->private_data) /* Duplicate open */ return 0; ss7_mutex_enter(&ss7_glue_mutex); if (ss7_use_count < 0) { /* ss7_driver_shutdown() has been called, to late to do anything */ ss7_mutex_exit(&ss7_glue_mutex); return -EIO; } ss7_use_count++; ss7_mutex_exit(&ss7_glue_mutex); rval = ss7_devif_open(&filp->private_data); if (rval != 0) { ss7_mutex_enter(&ss7_glue_mutex); ss7_use_count--; ss7_mutex_exit(&ss7_glue_mutex); pid = ss7_pid(); if (pid != ss7_stop_pid) printk(KERN_INFO "ss7_devif_open() pid %d failed ss7 error %d\n", pid, rval); return -EIO; } return 0; } static int ss7_glue_release(struct inode *const inode, struct file *const filp) { if (filp->private_data) ss7_devif_close(filp->private_data); ss7_mutex_enter(&ss7_glue_mutex); ss7_use_count--; if (ss7_use_count == 0 && ss7_stop_pid != 0) { /* Last user process has gone, complete shutdown functions */ ss7_net_ns_unload(); /* Stop any more opens */ ss7_use_count = -1; ss7_driver_shutdown(); } ss7_mutex_exit(&ss7_glue_mutex); return 0; } static long ss7_glue_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { if (!filp->private_data) return -ENODEV; switch (cmd) { case SS7_STOP: /* ss7maint shutting us down */ /* Start shutdown now, will complete on last close */ ss7_driver_stop(); ss7_stop_pid = ss7_pid(); return 0; /* Request from ss7maint or user application */ case SS7_USER_IOCTL_CODE: return ss7dev_ioctl(filp->private_data, cmd, arg); default: return -ENOTTY; } } static unsigned int ss7_glue_poll(struct file *filp, poll_table *pt) { poll_wait(filp, *ss7_devif_get_pollqueue_head(filp->private_data), pt); return ss7_devif_get_poll_status(filp->private_data); } void * ss7_os_malloc(int s, int ss7_flags) { return kmalloc(s, GFP_KERNEL); } void ss7_os_free(void *p) { kfree(p); } void ss7_poll_queue_head_deinit(wait_queue_head_t **pqhp) { ss7_os_free(*pqhp); } int ss7_poll_queue_head_init(wait_queue_head_t **pqhp) { wait_queue_head_t *pqh = ss7_os_malloc(sizeof *pqh, 0); if (pqh == NULL) return -1; init_waitqueue_head(pqh); *pqhp = pqh; return 0; } void ss7_pollwakeup(wait_queue_head_t **pqh, unsigned int poll_event) { wake_up(*pqh); } void ss7_kill_task(struct task_struct *task, int signo) { /* Send signal even though set to SIG_IGN */ force_sig(signo, task); } #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 32) /* spinlock_t is a typedef for an unnamed structure so we can't * make 'struct spinlock' match the kernel spinlock type. */ #define SPINLOCK_CAST (spinlock_t *) #else #define SPINLOCK_CAST #endif size_t ss7_spin_lock_size(void) { return sizeof *SPINLOCK_CAST(struct spinlock *)0; } void ss7_spin_lock_init(struct spinlock *s) { spin_lock_init(SPINLOCK_CAST s); } void ss7_spin_lock_enter(struct spinlock *s) { spin_lock(SPINLOCK_CAST s); } void ss7_spin_lock_exit(struct spinlock *s) { spin_unlock(SPINLOCK_CAST s); } size_t ss7_mutex_size(void) { return sizeof(struct mutex); } void ss7_mutex_init(struct mutex *s) { mutex_init(s); } void ss7_mutex_enter(struct mutex *s) { mutex_lock(s); } int ss7_mutex_enter_tmo(struct mutex *s, int max_wait) { /* There is no mutex_enter_timeout() however this was all added * to stop status commands sleeping forever when a process has * 'oopsed' with a mutex held. * Do a sneak check on the state of any owning task then * wait interruptibly. * ^C should error out the status call. */ /* If uncontended just acquire */ if (mutex_trylock(s)) return 1; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) { struct task_struct *owner; int state; spin_lock(&s->wait_lock); owner = __mutex_owner(s); state = owner ? owner->state : 0; spin_unlock(&s->wait_lock); if (state & TASK_DEAD) /* mutex will never be released, treat as timeout */ return 0; } #endif /* If C7_ASSERT() has been called, just let everyone in */ if (asserted_task_count) return 0; return mutex_lock_interruptible(s) ? -1 /* EINTR */ : 1 /* acquired */; } void ss7_mutex_exit(struct mutex *s) { mutex_unlock(s); } size_t ss7_cv_size(void) { return sizeof(wait_queue_head_t); } void ss7_cv_init(wait_queue_head_t *const v) { init_waitqueue_head(v); } static int ss7_schedule_tmo(int tmo_ms) { int tmo_jiffies; /* Really sleep - unless woken since unlocking spinlock */ if (tmo_ms >= 0) { if (tmo_ms <= 1) tmo_jiffies = tmo_ms; else /* Convert to jiffies and round up */ tmo_jiffies = 1 + (tmo_ms + 1 - 1) * 16 / (16000/HZ); /* Return value of schedule_timeout() is unexpired timeout */ /* We want 0 for 'timedout' (to match cv_wait_sig()) */ return schedule_timeout(tmo_jiffies) != 0; } schedule(); if (!signal_pending(current)) /* Woken by the event */ return 1; /* Report 0 for a signal, except -1 for SIGKILL (reboot) */ return sigismember(¤t->pending.signal, SIGKILL) ? -1 : 0; } int ss7_cv_wait_guts(wait_queue_head_t *cvp, struct mutex *mtxp, int interruptible, int tmo_ms) { int r; struct wait_queue_entry w; int sleep_state; init_waitqueue_entry(&w, current); /* Tell scheduler we are going to sleep... */ if (signal_pending(current) && !interruptible) /* We don't want waking immediately (again) */ sleep_state = TASK_UNINTERRUPTIBLE; else sleep_state = TASK_INTERRUPTIBLE; set_current_state(sleep_state); /* Connect to condition variable ... */ add_wait_queue(cvp, &w); mutex_unlock(mtxp); /* Release mutex */ r = ss7_schedule_tmo(tmo_ms); /* Disconnect from condition variable ... */ remove_wait_queue(cvp, &w); /* Re-acquire mutex */ mutex_lock(mtxp); /* return 1 if woken, 0 if timed_out/signal, -1 if SIGKILL */ return r; } int ss7_cv_wait_spin_lock(wait_queue_head_t *cvp, struct spinlock *lock, int interruptible, int tmo_ms) { int r; struct wait_queue_entry w; int sleep_state; init_waitqueue_entry(&w, current); /* Tell scheduler we are going to sleep... */ if (signal_pending(current) && !interruptible) /* We don't want waking immediately (again) */ sleep_state = TASK_UNINTERRUPTIBLE; else sleep_state = TASK_INTERRUPTIBLE; set_current_state(sleep_state); /* Connect to condition variable ... */ add_wait_queue(cvp, &w); spin_unlock(SPINLOCK_CAST lock); r = ss7_schedule_tmo(tmo_ms); /* Disconnect from condition variable ... */ remove_wait_queue(cvp, &w); /* Re-acquire mutex */ spin_lock(SPINLOCK_CAST lock); return r; } /*---------------------------------------------------------------------** ** ss7_cv_broadcast ** ** Awaken all threads that are sleeping on a condition variable. ** ** Caller must use the associated mutex sensibly, i.e. ... ** ** acquire the mutex ** ** Set some flag that a sleeping thread will check for ** ** ss7_cv_broadcast() ** ** release the mutex ** **---------------------------------------------------------------------*/ void ss7_cv_broadcast(wait_queue_head_t *const cvp) { wake_up(cvp); } unsigned long ss7_copy_to_user(void *to, const void *from, unsigned long c) { return copy_to_user(to, from, c); } unsigned long ss7_copy_from_user(void *to, const void *from, unsigned long c) { return copy_from_user(to, from, c); } unsigned int ss7_pid(void) { return current->pid; } struct task_struct * ss7_current_task(void) { return current; } unsigned int ss7_task_pid(struct task_struct *task) { return task->pid; } int ss7_glue_thread_fn(void *ss7_thread) { ss7_thread_run(ss7_thread); module_put_and_exit(0); return 0; } struct task_struct * ss7_os_thread_create(struct ss7_thread *thrp, const char *desc) { struct task_struct *task; const char *sp; int len; if (!try_module_get(THIS_MODULE)) return NULL; /* The thread description gets truncated to 15 chars, can't be helped! * Use 'ss7maint osstatus -t' to get the full description. */ /* Remove any leading space and truncate after second word */ if (desc[0] == ' ') desc++; len = 100; sp = ss7strchr(desc, ' '); if (sp != NULL) { sp = ss7strchr(sp + 1, ' '); if (sp != NULL) len = sp - desc; } task = kthread_run(ss7_glue_thread_fn, thrp, "ss7:%.*s", len, desc); if (IS_ERR(task)) { module_put(THIS_MODULE); return NULL; } return task; } void ss7_ms_delay(const unsigned int ms) { set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout((unsigned long long)HZ * ms / 1000); } int ss7_os_get_ticks(void) { return jiffies; } int ss7_os_ticks_to_us(int interval) { return interval * 1000000 / HZ; } int ss7_os_ticks_to_ms(int interval) { return interval * 1000 / HZ; } int ss7_os_ticks_to_secs(int interval) { return interval / HZ; } unsigned int ss7_get_ms_time(void) { static unsigned long epoch; struct timespec now; getrawmonotonic(&now); if (epoch == 0) epoch = now.tv_sec; return (now.tv_sec - epoch) * 1000 + now.tv_nsec / 1000000; } struct acu_ss7maint_time { unsigned int st_sec; unsigned int st_usec; }; #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) static inline void do_gettimeofday(struct timeval *tv) { struct timespec64 ts; ktime_get_real_ts64(&ts); tv->tv_sec = ts.tv_sec; tv->tv_usec = ts.tv_nsec/1000u; } #endif void ss7_get_timestamp(struct acu_ss7maint_time *ptime) { struct timeval tv; /* do_gettimeofday() returns 'wall clock time'. * It can go backwards. */ do_gettimeofday(&tv); ptime->st_sec = tv.tv_sec; ptime->st_usec = tv.tv_usec; } unsigned int ss7_get_elapsed(const struct acu_ss7maint_time *epoch) { struct timeval tv; do_gettimeofday(&tv); return tv.tv_sec - epoch->st_sec; } void ss7_os_log_error(const char *text) { printk(KERN_EMERG "ss7server: %s", text); if (memcmp(text, "Assertion fail", 14) == 0) { dump_stack(); /* Although we return, the caller sleeps forever */ /* Remember the 'stuck' tasks */ asserted_tasks[asserted_task_count++ & 15] = current; } } /*---------------------------------------------------------------------** ** Miscellanous string and memory functions ** **---------------------------------------------------------------------*/ void ss7memzero(void *buf, size_t len) { memset(buf, 0, len); } void ss7memcpy(void *dest, const void *src, size_t len) { memcpy(dest, src, len); } void ss7_memmove(void *dest, const void *src, size_t len) { memmove(dest, src, len); } int ss7memcmp(const void *s1, const void *s2, size_t len) { return memcmp(s1, s2, len); } unsigned int ss7strlen(const char *str) { return strlen(str); } void ss7strcpy(char *dest, const char *src) { strcpy(dest, src); } int ss7strcmp(const char *dest, const char *src) { return strcmp(dest, src); } char * ss7strncpy(char *const s1, const char *s2, size_t n) { return strncpy(s1, s2, n); } char * ss7strchr(const char *s, const int c) { return strchr(s, c); } /*---------------------------------------------------------------------** ** TCP/IP functions ** **---------------------------------------------------------------------*/ int ss7_sctp_supported(void) { return 1; } unsigned int ss7_get_default_af_opts(unsigned int protocol, unsigned int port) { /* The SS7 driver needs to know the which address families (IPv4 or IPv6) * to use for listening sockets. * * Whether an IPV6 socket can accept IPV4 connections depends on * the IPV6_V6ONLY socket option. The default for which depends * on net.ipv6.bindv6only (which usually defaults to 0 - allowing IPV4). * There also might be kernels where clearing IPV6_V6ONLY is disallowed. * * Normally only a single socket is created for each port since an IPv6 * socket can receive IPv4 connections. However a separate IPv4 socket * can be requested. * * This function should return one of: * SS7_AF_OPT_IPv6 * IPV6 socket with the default IPV6_V6ONLY value. * SS7_AF_OPT_IPv6_V6ONLY_CLR * IPV6 socket with IPV6_V6ONLY explicitly cleared. * SS7_AF_OPT_IPv6_V6ONLY_SET * IPV6 socket with IPV6_V6ONLY explicitly set. * Possibly logically ored with: * SS7_AF_OPT_IPv4 * A separate IPv4 socket. * * For flexibility the decision can be based on the protocol (either * IPPROTO_SCTP or IPPROTO_TCP) or the port number. * * Default to creating a single socket and disabling IPV6_V6ONLY. */ #ifndef SS7_DEFAULT_AF_OPTS #define SS7_DEFAULT_AF_OPTS SS7_AF_OPT_IPv6 #endif return SS7_DEFAULT_AF_OPTS; } /* kernel_get/set_sockopt() prototypes have (char *) for the buffer. * #define a (void *) cast. */ #define kernel_setsockopt(sock, level, name, val, len) \ kernel_setsockopt(sock, level, name, (void *)val, len) #define kernel_getsockopt(sock, level, name, val, len) \ kernel_getsockopt(sock, level, name, (void *)val, len) /* Note that we can't (easily) hold reference counts on the namespace * because put_net() is GPL_ONLY. * Instead we keep our own table and create a socket to hold the * reference for us. * Table entries 0 and 1 always refer to init_net and the namespace * of the (last started) ss7 daemon. Neither is reference counted * (although we hold a single reference on the latter). * Higher entries are saved from invocations of 'ss7maint start' * and 'firmware download'. */ static struct ss7_ns_info { struct net *ni_net_ns; struct socket *ni_sock; unsigned int ni_refcount; } ss7_ns_table[256]; static struct socket * ss7_glue_create_ns_socket(struct net *net) { struct socket *sock; if (__sock_create(net, AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock, 0)) return NULL; return sock; } void ss7_net_ns_get(unsigned int namespace) { unsigned int idx = SS7_NET_NS_IDX(namespace); if (idx <= SS7_NET_NS_IDX(SS7_NET_NS_DAEMON)) /* SS7_NET_NS_INIT and SS7_NET_NS_DAEMON aren't ref-counted */ return; ss7_mutex_enter(&ss7_glue_mutex); ss7_ns_table[idx].ni_refcount++; ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_get(%x): refcount %d, sock %p, net %p\n", namespace, ss7_ns_table[idx].ni_refcount, ss7_ns_table[idx].ni_sock, ss7_ns_table[idx].ni_net_ns); } void ss7_net_ns_put(unsigned int namespace) { struct ss7_ns_info *ni; unsigned int idx = SS7_NET_NS_IDX(namespace); if (idx <= SS7_NET_NS_IDX(SS7_NET_NS_DAEMON)) /* SS7_NET_NS_INIT and SS7_NET_NS_DAEMON aren't ref-counted */ return; ni = ss7_ns_table + idx; ss7_trace_printf(0, "ss7_net_ns_put(%x): refcount %d, sock %p, net %p\n", namespace, ni->ni_refcount, ni->ni_sock, ni->ni_net_ns); ss7_mutex_enter(&ss7_glue_mutex); if (ni->ni_refcount && !--ni->ni_refcount) { /* Last reference gone */ sock_release(ni->ni_sock); ni->ni_net_ns = NULL; ni->ni_sock = NULL; } ss7_mutex_exit(&ss7_glue_mutex); } static void ss7_net_ns_unload(void) { unsigned int idx; struct ss7_ns_info *ni; for (idx = 1; idx < ARRAY_SIZE(ss7_ns_table); idx++) { ni = ss7_ns_table + idx; if (!ni->ni_sock) continue; /* This should only report anything for the 'daemon' slot */ printk(KERN_INFO "ss7_net_ns_unload(): idx %d, refcount %d, sock %p, net %p\n", idx, ni->ni_refcount, ni->ni_sock, ni->ni_net_ns); sock_release(ni->ni_sock); ni->ni_net_ns = NULL; ni->ni_sock = NULL; ni->ni_refcount = 0; } } unsigned int ss7_net_ns_set(unsigned int new_namespace, unsigned int old_namespace) { static unsigned int num_used_idx = 2; unsigned int idx, free_idx; struct ss7_ns_info *ni; struct net *net; /* The new_namespace should have the low 16 bits zero. * The low bits of old_namespace indicate what was actually being used. */ if (new_namespace != SS7_NET_NS_START) { ss7_net_ns_put(old_namespace); return new_namespace == SS7_NET_NS_DAEMON ? SS7_NET_NS_DAEMON : SS7_NET_NS_INIT; } /* SS7_NET_NS_START - look for an entry for the namespace of the current * process (which will be 'ss7maint start'). */ net = current->nsproxy->net_ns; idx = SS7_NET_NS_IDX(old_namespace); ni = ss7_ns_table + idx; if (ni->ni_net_ns == net) /* Unchanged index, no need to change reference count */ return SS7_NET_NS_START | idx; /* Different slot needed, drop old reference */ ss7_net_ns_put(old_namespace); /* Check init and daemon entries, neither goes away */ if (idx != SS7_NET_NS_IDX(SS7_NET_NS_INIT) && net == &init_net) return SS7_NET_NS_START | SS7_NET_NS_IDX(SS7_NET_NS_INIT); idx = SS7_NET_NS_IDX(SS7_NET_NS_DAEMON); ni = ss7_ns_table + idx; if (net == ni->ni_net_ns) return SS7_NET_NS_START | idx; ss7_mutex_enter(&ss7_glue_mutex); /* Scan table for an existing reference */ free_idx = 0; for (idx = 2; idx < num_used_idx; idx++) { ni = ss7_ns_table + idx; if (ni->ni_net_ns == net) { /* found a match */ ni->ni_refcount++; ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_set(%x, %x): found idx %d, refcount %d, sock %p, net %p\n", new_namespace, old_namespace, idx, ni->ni_refcount, ni->ni_sock, ni->ni_net_ns); return SS7_NET_NS_START | idx; } if (!free_idx && !ni->ni_net_ns) free_idx = idx; } /* Not found allocate lowest free slot */ if (!free_idx) { if (num_used_idx >= ARRAY_SIZE(ss7_ns_table)) /* Table full, borked */ goto no_ref; free_idx = num_used_idx++; } ni = &ss7_ns_table[free_idx]; ni->ni_sock = ss7_glue_create_ns_socket(net); if (!ni->ni_sock) goto no_ref; ni->ni_net_ns = net; ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_set(%x, %x): new idx %d, sock %p, net %p\n", new_namespace, old_namespace, free_idx, ni->ni_sock, ni->ni_net_ns); return SS7_NET_NS_START | free_idx; no_ref: ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_set(%x, %x): no_ref\n", new_namespace, old_namespace); return SS7_NET_NS_START; } void ss7_glue_daemon_open(void) { struct ss7_ns_info *ni = &ss7_ns_table[SS7_NET_NS_IDX(SS7_NET_NS_DAEMON)]; struct net *net = current->nsproxy->net_ns; /* Save (and reference count) the network namespace the ss7 daemon * is started in. */ /* Initialise the entry for init_net here - has to be done somewhere. */ ss7_ns_table[SS7_NET_NS_IDX(SS7_NET_NS_INIT)].ni_net_ns = &init_net; if (net == ni->ni_net_ns) /* Unchanged */ return; if (ni->ni_sock) sock_release(ni->ni_sock); ni->ni_sock = NULL; if (net != &init_net && !((ni->ni_sock = ss7_glue_create_ns_socket(net)))) /* Can't create socket, default to global namespace */ net = &init_net; ni->ni_net_ns = net; } int ss7_socket(int family, int type, int protocol, unsigned int namespace, struct socket **sockp) { struct socket *sock; struct net *net; unsigned int one = 1U; int rval; net = ss7_ns_table[SS7_NET_NS_IDX(namespace)].ni_net_ns; if (!net) net = &init_net; /* If we have to autoload the sctp module, we might re-enter it * before it has finished initialising - might go 'boom'. */ ss7_mutex_enter(&ss7_glue_mutex); /* sock_create_kern() creates a socket that doesn't hold a reference * to the namespace (they get used for sockets needed by the protocol * stack code itself). * We need a socket that holds a reference to the namespace, so create * a 'user' socket in a specific namespace. * This adds an extra security check which we should pass because all the * sockets are created by kernel threads. */ rval = __sock_create(net, family, type, protocol, sockp, 0); ss7_mutex_exit(&ss7_glue_mutex); if (rval != 0) return rval; sock = *sockp; kernel_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one); return 0; } void ss7_setsockopt_nodelay(struct socket *sock, int enabled) { kernel_setsockopt(sock, SK_PROTOCOL(sock), SK_PROTOCOL(sock) == IPPROTO_TCP ? TCP_NODELAY : SCTP_NODELAY, &enabled, sizeof enabled); } static void ss7_sctp_set_opts(struct socket *sock) { struct sctp_event_subscribe events; int len, rval; if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return; len = sizeof events; rval = kernel_getsockopt(sock, IPPROTO_SCTP, SCTP_EVENTS, &events, &len); if (rval != 0) return; /* We need to know the stream and ppid */ events.sctp_data_io_event = 1; /* Enable notifications to detect connection restart */ events.sctp_association_event = 1; kernel_setsockopt(sock, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof events); } unsigned int ss7_get_max_sctp_ostreams(struct socket *sock) { struct sctp_status sstat; int len; if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return 0; len = sizeof sstat; if (kernel_getsockopt(sock, IPPROTO_SCTP, SCTP_STATUS, &sstat, &len)) return 0; return sstat.sstat_outstrms; } void ss7_set_max_sctp_streams(struct socket *sock, unsigned int max_streams) { struct sctp_initmsg sinit; if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return; memset(&sinit, 0, sizeof sinit); sinit.sinit_num_ostreams = max_streams; sinit.sinit_max_instreams = max_streams; kernel_setsockopt(sock, IPPROTO_SCTP, SCTP_INITMSG, &sinit, sizeof sinit); } void ss7_trans_setsockopt(struct socket *sock) { unsigned int one = 1U; ss7_setsockopt_nodelay(sock, 1); ss7_sctp_set_opts(sock); if (SK_PROTOCOL(sock) == IPPROTO_TCP) kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one); } void ss7_transbind_setsockopt(struct socket *sock) { /* Set options for a listening socket */ ss7_sctp_set_opts(sock); /* M3UA may need 16 data streams, it is just TFH to configure this */ ss7_set_max_sctp_streams(sock, 1 + 16); } #define IP_ADDR_LEN(sa) ((sa)->sin6_family == AF_INET6 ? sizeof *(sa) : 16) int ss7_connect(struct socket *sock, struct sockaddr_in6 *sa) { return kernel_connect(sock, (void *)sa, IP_ADDR_LEN(sa), O_RDWR); } int ss7_bind(struct socket *sock, struct sockaddr_in6 *sa, unsigned int af_opts) { /* If we are binding INADDR6_ANY to an IPv6 socket (typically for * a listening socket) then we probably want to ensure that IPV6_V6ONLY * is 0 so that the socket will also be given IPv4 connections. */ if (sa->sin6_family == AF_INET6 && af_opts & SS7_AF_OPT_IPv6_V6ONLY && sa->sin6_addr.in6_u.u6_addr32[0] == 0 && (sa->sin6_addr.in6_u.u6_addr32[1] | sa->sin6_addr.in6_u.u6_addr32[2] | sa->sin6_addr.in6_u.u6_addr32[3]) == 0) { int v6only = af_opts & 1; kernel_setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &v6only, sizeof v6only); } return kernel_bind(sock, (void *)sa, IP_ADDR_LEN(sa)); } int ss7_bindx(struct socket *sock, struct sockaddr_in6 *sa) { if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return -EPROTONOSUPPORT; return kernel_setsockopt(sock, IPPROTO_SCTP, SCTP_SOCKOPT_BINDX_ADD, sa, IP_ADDR_LEN(sa)); } int ss7_listen(struct socket *sock, int len) { return kernel_listen(sock, len); } int ss7_accept(struct socket *sock, struct socket **new_sockp, int flags) { return kernel_accept(sock, new_sockp, flags); } #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) static inline int ss7_kernel_getsockname(struct socket *sock, struct sockaddr *address) { int err, len; err = kernel_getsockname(sock, (struct sockaddr *)address, &len); return err ? err : len; } #define kernel_getsockname ss7_kernel_getsockname static inline int ss7_kernel_getpeername(struct socket *sock, struct sockaddr *address) { int err, len; err = kernel_getpeername(sock, (struct sockaddr *)address, &len); return err ? err : len; } #define kernel_getpeername ss7_kernel_getpeername #endif int ss7_get_loc_port(struct socket *sock) { char address[128 /*MAX_SOCK_ADDR*/]; int len; len = kernel_getsockname(sock, (struct sockaddr *)address); if (len < 0) return 0; /* This works well enough for IPv4 and IPv6 */ return ntohs(((struct sockaddr_in *)address)->sin_port); } int ss7_get_rem_addr(struct socket *sock, struct sockaddr_in6 *saddr) { int len; len = kernel_getpeername(sock, (struct sockaddr *)saddr); if (len < 0) return len; if (len > sizeof *saddr) printk(KERN_EMERG "ss7server: socket address (family %d) %d > %d", saddr->sin6_family, len, (int)sizeof *saddr); return 0; } int ss7_shutdown(struct socket *sock, int how) { #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0) if (SK_PROTOCOL(sock) == IPPROTO_SCTP) { struct linger linger; /* If we call kernel_sock_shutdown() then the connection isn't released * until all outstanding data has been acked. * If the remote system sends an INIT (restarting the connection) * while the linux kernel is waiting for data to be acked then it * will never disconnect. * Enabling 'linger' with a delay of zero causes sock_release() * to abort the connection (sends an ABORT chunk). * * The ss7 code never needs to wait for sent data to be acked, * so aborting the connection doesn't really matter. * All calls to ss7_shutdown() are immediately followed by calls to * ss7_closesocket(). * * Plausibly we should always abort connections if we are disconnecting * due to an application level timeout. * * Fixed by the kernel patch: * "sctp: handle association restarts when the socket is closed" * Known to be included in the following kernels: * - mainline 3.18 * - Ubuntu 3.13.11.11 * Queued for 3.10-stable, 3.14-stable, 3.16-stable and 3.17-stable */ linger.l_onoff = 1; linger.l_linger = 0; kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger, sizeof linger); return 0; } #endif return kernel_sock_shutdown(sock, how); } void ss7_closesocket(struct socket *sock) { sock_release(sock); } int ss7_send(struct socket *sock, struct ss7_iovec *iov, int iovlen, int totlen, void *ctl, int ctl_len, unsigned int flags) { struct msghdr msg; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_control = ctl; msg.msg_controllen = ctl_len; msg.msg_flags = flags | MSG_NOSIGNAL; return kernel_sendmsg(sock, &msg, iov, iovlen, totlen); } int ss7_recv(struct socket *sock, unsigned char *data, int length, int flags) { struct kvec iov; struct msghdr msg; if (!sock->sk) return 0; iov.iov_len = length; iov.iov_base = data; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_control = NULL; msg.msg_controllen = 0; msg.msg_flags = 0; return kernel_recvmsg(sock, &msg, &iov, 1, length, 0); } int ss7_recv_sctp(struct socket *sock, void *buf_1, int len_1, void *buf_2, int len_2, struct ss7_msgb *ss7_msg) { struct msghdr msg; struct kvec iov[2]; unsigned char *data = buf_1; int msg_len, ctl_len; int rval; union { struct cmsghdr cmsg; unsigned int buf[16]; } ctlbuf; if (!sock->sk) return 0; /* For SCTP each recvmsg should give us a single data record. * Since we only ever send SIGTRAN encoded messages bytes 4-7 are the * length - and should match that of the sctp data chunk. * buf_1/len_1 refer to the normal ss7 message buffer area, buf_2/len_2 * are per-socket. Long messages get copied together by the caller. * The result is always a single valid SIGTRAN message */ iov[0].iov_base = buf_1; iov[0].iov_len = len_1; iov[1].iov_base = buf_2; iov[1].iov_len = len_2; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_control = &ctlbuf; msg.msg_controllen = sizeof ctlbuf; msg.msg_flags = 0; rval = kernel_recvmsg(sock, &msg, iov, 2, len_1 + len_2, 0); if (rval <= 0) /* Don't return EBADMSG here */ return rval != -EBADMSG ? rval : -EIO; if (msg.msg_flags & MSG_NOTIFICATION) /* msg data is a notification */ return -EBADMSG; ctl_len = (char *)msg.msg_control - (char *)&ctlbuf; if (ctl_len >= ctlbuf.cmsg.cmsg_len && ctlbuf.cmsg.cmsg_level == IPPROTO_SCTP && ctlbuf.cmsg.cmsg_type == SCTP_SNDRCV) { struct sctp_sndrcvinfo *sinfo = CMSG_DATA(&ctlbuf.cmsg); ss7_trans_set_msg_info(ss7_msg, sinfo->sinfo_stream, sinfo->sinfo_ppid); } msg_len = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; if (msg_len >= 65556) /* Disbelieve this is valid data */ return -EIO; if (rval != msg_len || !(msg.msg_flags & MSG_EOR)) return -EIO; return rval; } int ss7_trans_init_sctp_sinfo(void *buf, int maxlen, __u16 **stream, __u32 **ppid) { struct cmsghdr *cmsg; struct sctp_sndrcvinfo *sinfo; if (maxlen < CMSG_LEN(sizeof *sinfo)) return -1; cmsg = buf; cmsg->cmsg_level = IPPROTO_SCTP; cmsg->cmsg_type = SCTP_SNDRCV; cmsg->cmsg_len = CMSG_LEN(sizeof *sinfo); sinfo = CMSG_DATA(cmsg); memset(sinfo, 0, sizeof *sinfo); *stream = &sinfo->sinfo_stream; *ppid = &sinfo->sinfo_ppid; return CMSG_LEN(sizeof *sinfo); } From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Laight Date: Sun, 17 May 2020 08:48:02 +0000 Subject: [Cluster-devel] [Ocfs2-devel] [PATCH 27/33] sctp: export sctp_setsockopt_bindx In-Reply-To: <20200516153652.GM16070@bombadil.infradead.org> References: <20200514062820.GC8564@lst.de> <20200513062649.2100053-1-hch@lst.de> <20200513062649.2100053-28-hch@lst.de> <20200513180058.GB2491@localhost.localdomain> <129070.1589556002@warthog.procyon.org.uk> <05d946ae948946158dbfcbc07939b799@AcuMS.aculab.com> <20200516153652.GM16070@bombadil.infradead.org> Message-ID: <49f712b3b6704c3096d3834a5985a4d6@AcuMS.aculab.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit From: Matthew Wilcox > Sent: 16 May 2020 16:37 ... > > Basically: > > > > This patch sequence (to be written) does the following: > > > > Patch 1: Change __sys_setsockopt() to allocate a kernel buffer, > > copy the data into it then call set_fs(KERNEL_DS). > > An on-stack buffer (say 64 bytes) will be used for > > small transfers. > > > > Patch 2: The same for __sys_getsockopt(). > > > > Patch 3: Compat setsockopt. > > > > Patch 4: Compat getsockopt. > > > > Patch 5: Remove the user copies from the global socket options code. > > > > Patches 6 to n-1; Remove the user copies from the per-protocol code. > > > > Patch n: Remove the set_fs(KERNEL_DS) from the entry points. > > > > This should be bisectable. > > I appreciate your dedication to not publishing the source code to > your kernel module, but Christoph's patch series is actually better. > It's typesafe rather than passing void pointers around. There are plenty on interfaces that pass a 'pointer and length'. Having the compiler do a type check doesn't give any security benefit - just stops silly errors. Oh yes, I've attached the only driver source file that calls into the Linux kernel. You are perfectly free to look at all the thing we have to do to support different and broken kernel releases. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales) -------------- next part -------------- #ident "@(#) (c) Aculab plc $Header: /home/cvs/repository/ss7/stack/src/driver/linux/ss7osglue.c,v 1.157 2019-08-29 16:09:14 davidla Exp $ $Name: $" #ifndef MODULE #define MODULE #endif #include #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 28) #error minimum kernel version is 2.6.28 #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34) #include #else #include #endif #include #include #include #include #include #include #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) #include #endif #include #include #include #include #include #include #include #include #include #include #include /* This is only in the kernel build tree */ #include #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0) #include #else #include /* netinet/sctp.h ought to be this file */ #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0) #define wait_queue_head __wait_queue_head #define wait_queue_entry __wait_queue #endif #define SK_PROTOCOL(sock) (sock)->sk->sk_protocol extern void ss7_trace_mem(int, void *, int, const char *, ...); extern void ss7_trace_printf(int, const char *, ...); /* Aculab DACP interfaces - these are in aculab's kern_if.h */ void *dacp_symbol_get(const char *); int dacp_symbol_release(const char *); MODULE_AUTHOR("Aculab"); MODULE_LICENSE("Proprietary"); #include "ss7osglue.h" /* Mutex for driver interface code */ static struct mutex ss7_glue_mutex; static int ss7dev_major; static const void *ss7_dtls_handle; static int ss7_use_count; static int ss7_stop_pid; static struct task_struct *asserted_tasks[16]; static unsigned int asserted_task_count; typedef char ss7_verify_const[ SS7_SOCK_STREAM == SOCK_STREAM && SS7_SOCK_SEQPACKET == SOCK_SEQPACKET ? 1 : -1]; static void ss7_net_ns_unload(void); #define TCP_NODELAY 1 static int ss7_glue_open(struct inode *, struct file *); static int ss7_glue_release(struct inode *, struct file *); static long ss7_glue_unlocked_ioctl(struct file *, unsigned int, unsigned long); static unsigned int ss7_glue_poll(struct file *const, poll_table *); static struct file_operations ss7dev_fop = { open: ss7_glue_open, release: ss7_glue_release, unlocked_ioctl: ss7_glue_unlocked_ioctl, compat_ioctl: ss7_glue_unlocked_ioctl, poll: ss7_glue_poll, owner: THIS_MODULE }; static int ss7_reboot_notify(struct notifier_block *nb, unsigned long action, void *data) { /* System being rebooted. * I added this hoping to use it to get the ss7maint daemon to exit, * but it isn't called until all user processes have died. * Leave it here - might be useful one day. */ return 0; } static struct notifier_block ss7_reboot_notifier_block = { .notifier_call = ss7_reboot_notify, }; static int ss7_init_fail(int rval) { if (ss7dev_major > 0) unregister_chrdev(ss7dev_major, "ss7server"); return rval; } static int ss7_init_mod(void) { const void *(*dtls_register)(const char *, int (*)(struct dtls_get_if *)); int rval; ss7_mutex_init(&ss7_glue_mutex); printk(KERN_INFO "%s\n", ss7version); ss7dev_major = register_chrdev(0, "ss7server", &ss7dev_fop); if (ss7dev_major < 0) { printk(KERN_INFO "ss7server: register_chrdev() failed: %d\n", ss7dev_major); return ss7_init_fail(ss7dev_major); } rval = ss7_driver_init(); if (rval != 0) { printk(KERN_INFO "ss7server: ss7_driver_init() failed: %d\n", rval); return ss7_init_fail(-EIO); } dtls_register = dacp_symbol_get("acuc_dtls_register"); if (dtls_register == NULL) printk(KERN_INFO "ss7server: cannot locate \"acuc_dtls_register\"\n"); else ss7_dtls_handle = dtls_register(DYNAMIC_TLS_PREFIX "ss7", ss7_tls_get_if); register_reboot_notifier(&ss7_reboot_notifier_block); return 0; } static void ss7_cleanup_mod(void) { int (*dtls_unregister)(const void *); unregister_reboot_notifier(&ss7_reboot_notifier_block); if (ss7_dtls_handle != NULL) { dtls_unregister = dacp_symbol_get("acuc_dtls_unregister"); dacp_symbol_release("acuc_dtls_register"); if (dtls_unregister != NULL) { dtls_unregister(ss7_dtls_handle); dacp_symbol_release("acuc_dtls_unregister"); } } ss7_init_fail(0); printk(KERN_INFO "Aculab ss7server: driver unloaded\n"); } module_init(ss7_init_mod) module_exit(ss7_cleanup_mod) static int ss7_glue_open(struct inode *const inode, struct file *const filp) { int rval, pid; if (filp->private_data) /* Duplicate open */ return 0; ss7_mutex_enter(&ss7_glue_mutex); if (ss7_use_count < 0) { /* ss7_driver_shutdown() has been called, to late to do anything */ ss7_mutex_exit(&ss7_glue_mutex); return -EIO; } ss7_use_count++; ss7_mutex_exit(&ss7_glue_mutex); rval = ss7_devif_open(&filp->private_data); if (rval != 0) { ss7_mutex_enter(&ss7_glue_mutex); ss7_use_count--; ss7_mutex_exit(&ss7_glue_mutex); pid = ss7_pid(); if (pid != ss7_stop_pid) printk(KERN_INFO "ss7_devif_open() pid %d failed ss7 error %d\n", pid, rval); return -EIO; } return 0; } static int ss7_glue_release(struct inode *const inode, struct file *const filp) { if (filp->private_data) ss7_devif_close(filp->private_data); ss7_mutex_enter(&ss7_glue_mutex); ss7_use_count--; if (ss7_use_count == 0 && ss7_stop_pid != 0) { /* Last user process has gone, complete shutdown functions */ ss7_net_ns_unload(); /* Stop any more opens */ ss7_use_count = -1; ss7_driver_shutdown(); } ss7_mutex_exit(&ss7_glue_mutex); return 0; } static long ss7_glue_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { if (!filp->private_data) return -ENODEV; switch (cmd) { case SS7_STOP: /* ss7maint shutting us down */ /* Start shutdown now, will complete on last close */ ss7_driver_stop(); ss7_stop_pid = ss7_pid(); return 0; /* Request from ss7maint or user application */ case SS7_USER_IOCTL_CODE: return ss7dev_ioctl(filp->private_data, cmd, arg); default: return -ENOTTY; } } static unsigned int ss7_glue_poll(struct file *filp, poll_table *pt) { poll_wait(filp, *ss7_devif_get_pollqueue_head(filp->private_data), pt); return ss7_devif_get_poll_status(filp->private_data); } void * ss7_os_malloc(int s, int ss7_flags) { return kmalloc(s, GFP_KERNEL); } void ss7_os_free(void *p) { kfree(p); } void ss7_poll_queue_head_deinit(wait_queue_head_t **pqhp) { ss7_os_free(*pqhp); } int ss7_poll_queue_head_init(wait_queue_head_t **pqhp) { wait_queue_head_t *pqh = ss7_os_malloc(sizeof *pqh, 0); if (pqh == NULL) return -1; init_waitqueue_head(pqh); *pqhp = pqh; return 0; } void ss7_pollwakeup(wait_queue_head_t **pqh, unsigned int poll_event) { wake_up(*pqh); } void ss7_kill_task(struct task_struct *task, int signo) { /* Send signal even though set to SIG_IGN */ force_sig(signo, task); } #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 32) /* spinlock_t is a typedef for an unnamed structure so we can't * make 'struct spinlock' match the kernel spinlock type. */ #define SPINLOCK_CAST (spinlock_t *) #else #define SPINLOCK_CAST #endif size_t ss7_spin_lock_size(void) { return sizeof *SPINLOCK_CAST(struct spinlock *)0; } void ss7_spin_lock_init(struct spinlock *s) { spin_lock_init(SPINLOCK_CAST s); } void ss7_spin_lock_enter(struct spinlock *s) { spin_lock(SPINLOCK_CAST s); } void ss7_spin_lock_exit(struct spinlock *s) { spin_unlock(SPINLOCK_CAST s); } size_t ss7_mutex_size(void) { return sizeof(struct mutex); } void ss7_mutex_init(struct mutex *s) { mutex_init(s); } void ss7_mutex_enter(struct mutex *s) { mutex_lock(s); } int ss7_mutex_enter_tmo(struct mutex *s, int max_wait) { /* There is no mutex_enter_timeout() however this was all added * to stop status commands sleeping forever when a process has * 'oopsed' with a mutex held. * Do a sneak check on the state of any owning task then * wait interruptibly. * ^C should error out the status call. */ /* If uncontended just acquire */ if (mutex_trylock(s)) return 1; #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) { struct task_struct *owner; int state; spin_lock(&s->wait_lock); owner = __mutex_owner(s); state = owner ? owner->state : 0; spin_unlock(&s->wait_lock); if (state & TASK_DEAD) /* mutex will never be released, treat as timeout */ return 0; } #endif /* If C7_ASSERT() has been called, just let everyone in */ if (asserted_task_count) return 0; return mutex_lock_interruptible(s) ? -1 /* EINTR */ : 1 /* acquired */; } void ss7_mutex_exit(struct mutex *s) { mutex_unlock(s); } size_t ss7_cv_size(void) { return sizeof(wait_queue_head_t); } void ss7_cv_init(wait_queue_head_t *const v) { init_waitqueue_head(v); } static int ss7_schedule_tmo(int tmo_ms) { int tmo_jiffies; /* Really sleep - unless woken since unlocking spinlock */ if (tmo_ms >= 0) { if (tmo_ms <= 1) tmo_jiffies = tmo_ms; else /* Convert to jiffies and round up */ tmo_jiffies = 1 + (tmo_ms + 1 - 1) * 16 / (16000/HZ); /* Return value of schedule_timeout() is unexpired timeout */ /* We want 0 for 'timedout' (to match cv_wait_sig()) */ return schedule_timeout(tmo_jiffies) != 0; } schedule(); if (!signal_pending(current)) /* Woken by the event */ return 1; /* Report 0 for a signal, except -1 for SIGKILL (reboot) */ return sigismember(¤t->pending.signal, SIGKILL) ? -1 : 0; } int ss7_cv_wait_guts(wait_queue_head_t *cvp, struct mutex *mtxp, int interruptible, int tmo_ms) { int r; struct wait_queue_entry w; int sleep_state; init_waitqueue_entry(&w, current); /* Tell scheduler we are going to sleep... */ if (signal_pending(current) && !interruptible) /* We don't want waking immediately (again) */ sleep_state = TASK_UNINTERRUPTIBLE; else sleep_state = TASK_INTERRUPTIBLE; set_current_state(sleep_state); /* Connect to condition variable ... */ add_wait_queue(cvp, &w); mutex_unlock(mtxp); /* Release mutex */ r = ss7_schedule_tmo(tmo_ms); /* Disconnect from condition variable ... */ remove_wait_queue(cvp, &w); /* Re-acquire mutex */ mutex_lock(mtxp); /* return 1 if woken, 0 if timed_out/signal, -1 if SIGKILL */ return r; } int ss7_cv_wait_spin_lock(wait_queue_head_t *cvp, struct spinlock *lock, int interruptible, int tmo_ms) { int r; struct wait_queue_entry w; int sleep_state; init_waitqueue_entry(&w, current); /* Tell scheduler we are going to sleep... */ if (signal_pending(current) && !interruptible) /* We don't want waking immediately (again) */ sleep_state = TASK_UNINTERRUPTIBLE; else sleep_state = TASK_INTERRUPTIBLE; set_current_state(sleep_state); /* Connect to condition variable ... */ add_wait_queue(cvp, &w); spin_unlock(SPINLOCK_CAST lock); r = ss7_schedule_tmo(tmo_ms); /* Disconnect from condition variable ... */ remove_wait_queue(cvp, &w); /* Re-acquire mutex */ spin_lock(SPINLOCK_CAST lock); return r; } /*---------------------------------------------------------------------** ** ss7_cv_broadcast ** ** Awaken all threads that are sleeping on a condition variable. ** ** Caller must use the associated mutex sensibly, i.e. ... ** ** acquire the mutex ** ** Set some flag that a sleeping thread will check for ** ** ss7_cv_broadcast() ** ** release the mutex ** **---------------------------------------------------------------------*/ void ss7_cv_broadcast(wait_queue_head_t *const cvp) { wake_up(cvp); } unsigned long ss7_copy_to_user(void *to, const void *from, unsigned long c) { return copy_to_user(to, from, c); } unsigned long ss7_copy_from_user(void *to, const void *from, unsigned long c) { return copy_from_user(to, from, c); } unsigned int ss7_pid(void) { return current->pid; } struct task_struct * ss7_current_task(void) { return current; } unsigned int ss7_task_pid(struct task_struct *task) { return task->pid; } int ss7_glue_thread_fn(void *ss7_thread) { ss7_thread_run(ss7_thread); module_put_and_exit(0); return 0; } struct task_struct * ss7_os_thread_create(struct ss7_thread *thrp, const char *desc) { struct task_struct *task; const char *sp; int len; if (!try_module_get(THIS_MODULE)) return NULL; /* The thread description gets truncated to 15 chars, can't be helped! * Use 'ss7maint osstatus -t' to get the full description. */ /* Remove any leading space and truncate after second word */ if (desc[0] == ' ') desc++; len = 100; sp = ss7strchr(desc, ' '); if (sp != NULL) { sp = ss7strchr(sp + 1, ' '); if (sp != NULL) len = sp - desc; } task = kthread_run(ss7_glue_thread_fn, thrp, "ss7:%.*s", len, desc); if (IS_ERR(task)) { module_put(THIS_MODULE); return NULL; } return task; } void ss7_ms_delay(const unsigned int ms) { set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout((unsigned long long)HZ * ms / 1000); } int ss7_os_get_ticks(void) { return jiffies; } int ss7_os_ticks_to_us(int interval) { return interval * 1000000 / HZ; } int ss7_os_ticks_to_ms(int interval) { return interval * 1000 / HZ; } int ss7_os_ticks_to_secs(int interval) { return interval / HZ; } unsigned int ss7_get_ms_time(void) { static unsigned long epoch; struct timespec now; getrawmonotonic(&now); if (epoch == 0) epoch = now.tv_sec; return (now.tv_sec - epoch) * 1000 + now.tv_nsec / 1000000; } struct acu_ss7maint_time { unsigned int st_sec; unsigned int st_usec; }; #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) static inline void do_gettimeofday(struct timeval *tv) { struct timespec64 ts; ktime_get_real_ts64(&ts); tv->tv_sec = ts.tv_sec; tv->tv_usec = ts.tv_nsec/1000u; } #endif void ss7_get_timestamp(struct acu_ss7maint_time *ptime) { struct timeval tv; /* do_gettimeofday() returns 'wall clock time'. * It can go backwards. */ do_gettimeofday(&tv); ptime->st_sec = tv.tv_sec; ptime->st_usec = tv.tv_usec; } unsigned int ss7_get_elapsed(const struct acu_ss7maint_time *epoch) { struct timeval tv; do_gettimeofday(&tv); return tv.tv_sec - epoch->st_sec; } void ss7_os_log_error(const char *text) { printk(KERN_EMERG "ss7server: %s", text); if (memcmp(text, "Assertion fail", 14) == 0) { dump_stack(); /* Although we return, the caller sleeps forever */ /* Remember the 'stuck' tasks */ asserted_tasks[asserted_task_count++ & 15] = current; } } /*---------------------------------------------------------------------** ** Miscellanous string and memory functions ** **---------------------------------------------------------------------*/ void ss7memzero(void *buf, size_t len) { memset(buf, 0, len); } void ss7memcpy(void *dest, const void *src, size_t len) { memcpy(dest, src, len); } void ss7_memmove(void *dest, const void *src, size_t len) { memmove(dest, src, len); } int ss7memcmp(const void *s1, const void *s2, size_t len) { return memcmp(s1, s2, len); } unsigned int ss7strlen(const char *str) { return strlen(str); } void ss7strcpy(char *dest, const char *src) { strcpy(dest, src); } int ss7strcmp(const char *dest, const char *src) { return strcmp(dest, src); } char * ss7strncpy(char *const s1, const char *s2, size_t n) { return strncpy(s1, s2, n); } char * ss7strchr(const char *s, const int c) { return strchr(s, c); } /*---------------------------------------------------------------------** ** TCP/IP functions ** **---------------------------------------------------------------------*/ int ss7_sctp_supported(void) { return 1; } unsigned int ss7_get_default_af_opts(unsigned int protocol, unsigned int port) { /* The SS7 driver needs to know the which address families (IPv4 or IPv6) * to use for listening sockets. * * Whether an IPV6 socket can accept IPV4 connections depends on * the IPV6_V6ONLY socket option. The default for which depends * on net.ipv6.bindv6only (which usually defaults to 0 - allowing IPV4). * There also might be kernels where clearing IPV6_V6ONLY is disallowed. * * Normally only a single socket is created for each port since an IPv6 * socket can receive IPv4 connections. However a separate IPv4 socket * can be requested. * * This function should return one of: * SS7_AF_OPT_IPv6 * IPV6 socket with the default IPV6_V6ONLY value. * SS7_AF_OPT_IPv6_V6ONLY_CLR * IPV6 socket with IPV6_V6ONLY explicitly cleared. * SS7_AF_OPT_IPv6_V6ONLY_SET * IPV6 socket with IPV6_V6ONLY explicitly set. * Possibly logically ored with: * SS7_AF_OPT_IPv4 * A separate IPv4 socket. * * For flexibility the decision can be based on the protocol (either * IPPROTO_SCTP or IPPROTO_TCP) or the port number. * * Default to creating a single socket and disabling IPV6_V6ONLY. */ #ifndef SS7_DEFAULT_AF_OPTS #define SS7_DEFAULT_AF_OPTS SS7_AF_OPT_IPv6 #endif return SS7_DEFAULT_AF_OPTS; } /* kernel_get/set_sockopt() prototypes have (char *) for the buffer. * #define a (void *) cast. */ #define kernel_setsockopt(sock, level, name, val, len) \ kernel_setsockopt(sock, level, name, (void *)val, len) #define kernel_getsockopt(sock, level, name, val, len) \ kernel_getsockopt(sock, level, name, (void *)val, len) /* Note that we can't (easily) hold reference counts on the namespace * because put_net() is GPL_ONLY. * Instead we keep our own table and create a socket to hold the * reference for us. * Table entries 0 and 1 always refer to init_net and the namespace * of the (last started) ss7 daemon. Neither is reference counted * (although we hold a single reference on the latter). * Higher entries are saved from invocations of 'ss7maint start' * and 'firmware download'. */ static struct ss7_ns_info { struct net *ni_net_ns; struct socket *ni_sock; unsigned int ni_refcount; } ss7_ns_table[256]; static struct socket * ss7_glue_create_ns_socket(struct net *net) { struct socket *sock; if (__sock_create(net, AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock, 0)) return NULL; return sock; } void ss7_net_ns_get(unsigned int namespace) { unsigned int idx = SS7_NET_NS_IDX(namespace); if (idx <= SS7_NET_NS_IDX(SS7_NET_NS_DAEMON)) /* SS7_NET_NS_INIT and SS7_NET_NS_DAEMON aren't ref-counted */ return; ss7_mutex_enter(&ss7_glue_mutex); ss7_ns_table[idx].ni_refcount++; ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_get(%x): refcount %d, sock %p, net %p\n", namespace, ss7_ns_table[idx].ni_refcount, ss7_ns_table[idx].ni_sock, ss7_ns_table[idx].ni_net_ns); } void ss7_net_ns_put(unsigned int namespace) { struct ss7_ns_info *ni; unsigned int idx = SS7_NET_NS_IDX(namespace); if (idx <= SS7_NET_NS_IDX(SS7_NET_NS_DAEMON)) /* SS7_NET_NS_INIT and SS7_NET_NS_DAEMON aren't ref-counted */ return; ni = ss7_ns_table + idx; ss7_trace_printf(0, "ss7_net_ns_put(%x): refcount %d, sock %p, net %p\n", namespace, ni->ni_refcount, ni->ni_sock, ni->ni_net_ns); ss7_mutex_enter(&ss7_glue_mutex); if (ni->ni_refcount && !--ni->ni_refcount) { /* Last reference gone */ sock_release(ni->ni_sock); ni->ni_net_ns = NULL; ni->ni_sock = NULL; } ss7_mutex_exit(&ss7_glue_mutex); } static void ss7_net_ns_unload(void) { unsigned int idx; struct ss7_ns_info *ni; for (idx = 1; idx < ARRAY_SIZE(ss7_ns_table); idx++) { ni = ss7_ns_table + idx; if (!ni->ni_sock) continue; /* This should only report anything for the 'daemon' slot */ printk(KERN_INFO "ss7_net_ns_unload(): idx %d, refcount %d, sock %p, net %p\n", idx, ni->ni_refcount, ni->ni_sock, ni->ni_net_ns); sock_release(ni->ni_sock); ni->ni_net_ns = NULL; ni->ni_sock = NULL; ni->ni_refcount = 0; } } unsigned int ss7_net_ns_set(unsigned int new_namespace, unsigned int old_namespace) { static unsigned int num_used_idx = 2; unsigned int idx, free_idx; struct ss7_ns_info *ni; struct net *net; /* The new_namespace should have the low 16 bits zero. * The low bits of old_namespace indicate what was actually being used. */ if (new_namespace != SS7_NET_NS_START) { ss7_net_ns_put(old_namespace); return new_namespace == SS7_NET_NS_DAEMON ? SS7_NET_NS_DAEMON : SS7_NET_NS_INIT; } /* SS7_NET_NS_START - look for an entry for the namespace of the current * process (which will be 'ss7maint start'). */ net = current->nsproxy->net_ns; idx = SS7_NET_NS_IDX(old_namespace); ni = ss7_ns_table + idx; if (ni->ni_net_ns == net) /* Unchanged index, no need to change reference count */ return SS7_NET_NS_START | idx; /* Different slot needed, drop old reference */ ss7_net_ns_put(old_namespace); /* Check init and daemon entries, neither goes away */ if (idx != SS7_NET_NS_IDX(SS7_NET_NS_INIT) && net == &init_net) return SS7_NET_NS_START | SS7_NET_NS_IDX(SS7_NET_NS_INIT); idx = SS7_NET_NS_IDX(SS7_NET_NS_DAEMON); ni = ss7_ns_table + idx; if (net == ni->ni_net_ns) return SS7_NET_NS_START | idx; ss7_mutex_enter(&ss7_glue_mutex); /* Scan table for an existing reference */ free_idx = 0; for (idx = 2; idx < num_used_idx; idx++) { ni = ss7_ns_table + idx; if (ni->ni_net_ns == net) { /* found a match */ ni->ni_refcount++; ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_set(%x, %x): found idx %d, refcount %d, sock %p, net %p\n", new_namespace, old_namespace, idx, ni->ni_refcount, ni->ni_sock, ni->ni_net_ns); return SS7_NET_NS_START | idx; } if (!free_idx && !ni->ni_net_ns) free_idx = idx; } /* Not found allocate lowest free slot */ if (!free_idx) { if (num_used_idx >= ARRAY_SIZE(ss7_ns_table)) /* Table full, borked */ goto no_ref; free_idx = num_used_idx++; } ni = &ss7_ns_table[free_idx]; ni->ni_sock = ss7_glue_create_ns_socket(net); if (!ni->ni_sock) goto no_ref; ni->ni_net_ns = net; ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_set(%x, %x): new idx %d, sock %p, net %p\n", new_namespace, old_namespace, free_idx, ni->ni_sock, ni->ni_net_ns); return SS7_NET_NS_START | free_idx; no_ref: ss7_mutex_exit(&ss7_glue_mutex); ss7_trace_printf(0, "ss7_net_ns_set(%x, %x): no_ref\n", new_namespace, old_namespace); return SS7_NET_NS_START; } void ss7_glue_daemon_open(void) { struct ss7_ns_info *ni = &ss7_ns_table[SS7_NET_NS_IDX(SS7_NET_NS_DAEMON)]; struct net *net = current->nsproxy->net_ns; /* Save (and reference count) the network namespace the ss7 daemon * is started in. */ /* Initialise the entry for init_net here - has to be done somewhere. */ ss7_ns_table[SS7_NET_NS_IDX(SS7_NET_NS_INIT)].ni_net_ns = &init_net; if (net == ni->ni_net_ns) /* Unchanged */ return; if (ni->ni_sock) sock_release(ni->ni_sock); ni->ni_sock = NULL; if (net != &init_net && !((ni->ni_sock = ss7_glue_create_ns_socket(net)))) /* Can't create socket, default to global namespace */ net = &init_net; ni->ni_net_ns = net; } int ss7_socket(int family, int type, int protocol, unsigned int namespace, struct socket **sockp) { struct socket *sock; struct net *net; unsigned int one = 1U; int rval; net = ss7_ns_table[SS7_NET_NS_IDX(namespace)].ni_net_ns; if (!net) net = &init_net; /* If we have to autoload the sctp module, we might re-enter it * before it has finished initialising - might go 'boom'. */ ss7_mutex_enter(&ss7_glue_mutex); /* sock_create_kern() creates a socket that doesn't hold a reference * to the namespace (they get used for sockets needed by the protocol * stack code itself). * We need a socket that holds a reference to the namespace, so create * a 'user' socket in a specific namespace. * This adds an extra security check which we should pass because all the * sockets are created by kernel threads. */ rval = __sock_create(net, family, type, protocol, sockp, 0); ss7_mutex_exit(&ss7_glue_mutex); if (rval != 0) return rval; sock = *sockp; kernel_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one); return 0; } void ss7_setsockopt_nodelay(struct socket *sock, int enabled) { kernel_setsockopt(sock, SK_PROTOCOL(sock), SK_PROTOCOL(sock) == IPPROTO_TCP ? TCP_NODELAY : SCTP_NODELAY, &enabled, sizeof enabled); } static void ss7_sctp_set_opts(struct socket *sock) { struct sctp_event_subscribe events; int len, rval; if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return; len = sizeof events; rval = kernel_getsockopt(sock, IPPROTO_SCTP, SCTP_EVENTS, &events, &len); if (rval != 0) return; /* We need to know the stream and ppid */ events.sctp_data_io_event = 1; /* Enable notifications to detect connection restart */ events.sctp_association_event = 1; kernel_setsockopt(sock, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof events); } unsigned int ss7_get_max_sctp_ostreams(struct socket *sock) { struct sctp_status sstat; int len; if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return 0; len = sizeof sstat; if (kernel_getsockopt(sock, IPPROTO_SCTP, SCTP_STATUS, &sstat, &len)) return 0; return sstat.sstat_outstrms; } void ss7_set_max_sctp_streams(struct socket *sock, unsigned int max_streams) { struct sctp_initmsg sinit; if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return; memset(&sinit, 0, sizeof sinit); sinit.sinit_num_ostreams = max_streams; sinit.sinit_max_instreams = max_streams; kernel_setsockopt(sock, IPPROTO_SCTP, SCTP_INITMSG, &sinit, sizeof sinit); } void ss7_trans_setsockopt(struct socket *sock) { unsigned int one = 1U; ss7_setsockopt_nodelay(sock, 1); ss7_sctp_set_opts(sock); if (SK_PROTOCOL(sock) == IPPROTO_TCP) kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof one); } void ss7_transbind_setsockopt(struct socket *sock) { /* Set options for a listening socket */ ss7_sctp_set_opts(sock); /* M3UA may need 16 data streams, it is just TFH to configure this */ ss7_set_max_sctp_streams(sock, 1 + 16); } #define IP_ADDR_LEN(sa) ((sa)->sin6_family == AF_INET6 ? sizeof *(sa) : 16) int ss7_connect(struct socket *sock, struct sockaddr_in6 *sa) { return kernel_connect(sock, (void *)sa, IP_ADDR_LEN(sa), O_RDWR); } int ss7_bind(struct socket *sock, struct sockaddr_in6 *sa, unsigned int af_opts) { /* If we are binding INADDR6_ANY to an IPv6 socket (typically for * a listening socket) then we probably want to ensure that IPV6_V6ONLY * is 0 so that the socket will also be given IPv4 connections. */ if (sa->sin6_family == AF_INET6 && af_opts & SS7_AF_OPT_IPv6_V6ONLY && sa->sin6_addr.in6_u.u6_addr32[0] == 0 && (sa->sin6_addr.in6_u.u6_addr32[1] | sa->sin6_addr.in6_u.u6_addr32[2] | sa->sin6_addr.in6_u.u6_addr32[3]) == 0) { int v6only = af_opts & 1; kernel_setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &v6only, sizeof v6only); } return kernel_bind(sock, (void *)sa, IP_ADDR_LEN(sa)); } int ss7_bindx(struct socket *sock, struct sockaddr_in6 *sa) { if (SK_PROTOCOL(sock) != IPPROTO_SCTP) return -EPROTONOSUPPORT; return kernel_setsockopt(sock, IPPROTO_SCTP, SCTP_SOCKOPT_BINDX_ADD, sa, IP_ADDR_LEN(sa)); } int ss7_listen(struct socket *sock, int len) { return kernel_listen(sock, len); } int ss7_accept(struct socket *sock, struct socket **new_sockp, int flags) { return kernel_accept(sock, new_sockp, flags); } #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) static inline int ss7_kernel_getsockname(struct socket *sock, struct sockaddr *address) { int err, len; err = kernel_getsockname(sock, (struct sockaddr *)address, &len); return err ? err : len; } #define kernel_getsockname ss7_kernel_getsockname static inline int ss7_kernel_getpeername(struct socket *sock, struct sockaddr *address) { int err, len; err = kernel_getpeername(sock, (struct sockaddr *)address, &len); return err ? err : len; } #define kernel_getpeername ss7_kernel_getpeername #endif int ss7_get_loc_port(struct socket *sock) { char address[128 /*MAX_SOCK_ADDR*/]; int len; len = kernel_getsockname(sock, (struct sockaddr *)address); if (len < 0) return 0; /* This works well enough for IPv4 and IPv6 */ return ntohs(((struct sockaddr_in *)address)->sin_port); } int ss7_get_rem_addr(struct socket *sock, struct sockaddr_in6 *saddr) { int len; len = kernel_getpeername(sock, (struct sockaddr *)saddr); if (len < 0) return len; if (len > sizeof *saddr) printk(KERN_EMERG "ss7server: socket address (family %d) %d > %d", saddr->sin6_family, len, (int)sizeof *saddr); return 0; } int ss7_shutdown(struct socket *sock, int how) { #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0) if (SK_PROTOCOL(sock) == IPPROTO_SCTP) { struct linger linger; /* If we call kernel_sock_shutdown() then the connection isn't released * until all outstanding data has been acked. * If the remote system sends an INIT (restarting the connection) * while the linux kernel is waiting for data to be acked then it * will never disconnect. * Enabling 'linger' with a delay of zero causes sock_release() * to abort the connection (sends an ABORT chunk). * * The ss7 code never needs to wait for sent data to be acked, * so aborting the connection doesn't really matter. * All calls to ss7_shutdown() are immediately followed by calls to * ss7_closesocket(). * * Plausibly we should always abort connections if we are disconnecting * due to an application level timeout. * * Fixed by the kernel patch: * "sctp: handle association restarts when the socket is closed" * Known to be included in the following kernels: * - mainline 3.18 * - Ubuntu 3.13.11.11 * Queued for 3.10-stable, 3.14-stable, 3.16-stable and 3.17-stable */ linger.l_onoff = 1; linger.l_linger = 0; kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger, sizeof linger); return 0; } #endif return kernel_sock_shutdown(sock, how); } void ss7_closesocket(struct socket *sock) { sock_release(sock); } int ss7_send(struct socket *sock, struct ss7_iovec *iov, int iovlen, int totlen, void *ctl, int ctl_len, unsigned int flags) { struct msghdr msg; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_control = ctl; msg.msg_controllen = ctl_len; msg.msg_flags = flags | MSG_NOSIGNAL; return kernel_sendmsg(sock, &msg, iov, iovlen, totlen); } int ss7_recv(struct socket *sock, unsigned char *data, int length, int flags) { struct kvec iov; struct msghdr msg; if (!sock->sk) return 0; iov.iov_len = length; iov.iov_base = data; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_control = NULL; msg.msg_controllen = 0; msg.msg_flags = 0; return kernel_recvmsg(sock, &msg, &iov, 1, length, 0); } int ss7_recv_sctp(struct socket *sock, void *buf_1, int len_1, void *buf_2, int len_2, struct ss7_msgb *ss7_msg) { struct msghdr msg; struct kvec iov[2]; unsigned char *data = buf_1; int msg_len, ctl_len; int rval; union { struct cmsghdr cmsg; unsigned int buf[16]; } ctlbuf; if (!sock->sk) return 0; /* For SCTP each recvmsg should give us a single data record. * Since we only ever send SIGTRAN encoded messages bytes 4-7 are the * length - and should match that of the sctp data chunk. * buf_1/len_1 refer to the normal ss7 message buffer area, buf_2/len_2 * are per-socket. Long messages get copied together by the caller. * The result is always a single valid SIGTRAN message */ iov[0].iov_base = buf_1; iov[0].iov_len = len_1; iov[1].iov_base = buf_2; iov[1].iov_len = len_2; msg.msg_name = 0; msg.msg_namelen = 0; msg.msg_control = &ctlbuf; msg.msg_controllen = sizeof ctlbuf; msg.msg_flags = 0; rval = kernel_recvmsg(sock, &msg, iov, 2, len_1 + len_2, 0); if (rval <= 0) /* Don't return EBADMSG here */ return rval != -EBADMSG ? rval : -EIO; if (msg.msg_flags & MSG_NOTIFICATION) /* msg data is a notification */ return -EBADMSG; ctl_len = (char *)msg.msg_control - (char *)&ctlbuf; if (ctl_len >= ctlbuf.cmsg.cmsg_len && ctlbuf.cmsg.cmsg_level == IPPROTO_SCTP && ctlbuf.cmsg.cmsg_type == SCTP_SNDRCV) { struct sctp_sndrcvinfo *sinfo = CMSG_DATA(&ctlbuf.cmsg); ss7_trans_set_msg_info(ss7_msg, sinfo->sinfo_stream, sinfo->sinfo_ppid); } msg_len = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7]; if (msg_len >= 65556) /* Disbelieve this is valid data */ return -EIO; if (rval != msg_len || !(msg.msg_flags & MSG_EOR)) return -EIO; return rval; } int ss7_trans_init_sctp_sinfo(void *buf, int maxlen, __u16 **stream, __u32 **ppid) { struct cmsghdr *cmsg; struct sctp_sndrcvinfo *sinfo; if (maxlen < CMSG_LEN(sizeof *sinfo)) return -1; cmsg = buf; cmsg->cmsg_level = IPPROTO_SCTP; cmsg->cmsg_type = SCTP_SNDRCV; cmsg->cmsg_len = CMSG_LEN(sizeof *sinfo); sinfo = CMSG_DATA(cmsg); memset(sinfo, 0, sizeof *sinfo); *stream = &sinfo->sinfo_stream; *ppid = &sinfo->sinfo_ppid; return CMSG_LEN(sizeof *sinfo); }