Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ubnYO-005PMl-C7 for pgsql-hackers@arkaria.postgresql.org; Tue, 15 Jul 2025 21:51:12 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ubnYL-005b5T-8W for pgsql-hackers@arkaria.postgresql.org; Tue, 15 Jul 2025 21:51:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ubnYK-005b5L-FV for pgsql-hackers@lists.postgresql.org; Tue, 15 Jul 2025 21:51:09 +0000 Received: from fout-a7-smtp.messagingengine.com ([103.168.172.150]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1ubnYG-007TEs-2e for pgsql-hackers@postgresql.org; Tue, 15 Jul 2025 21:51:07 +0000 Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfout.phl.internal (Postfix) with ESMTP id 0D1D8EC041B for ; Tue, 15 Jul 2025 17:51:04 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Tue, 15 Jul 2025 17:51:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1752616264; x=1752702664; bh=WPraJj8qYn bmHXHaAcuAhFU8NGnVggG8N8rnpdtwknI=; b=AlNNCTj8ym0IxKJ0AOUaVhFfgZ 318eHioVNslbS6/YOD89LdlQW776nxjX2hg9NbWtfWkf8HTBa0FCjaDepQKWhaRV JYeNimJUlKTgymfeltx382gyduNWv3n7i0BcsUjxvNSHIJK+70SG8w8Xd5R4Hjhc Ci+emGS6RSUiIUhIKHS4BWd4MwPQ09JjDkqGGZV/dzdNH+JYoJK3pbKvFf025M8V mLYKOuI7vzAOepUTkwmwxNR3LyFuBZofPoDmhDgm++QANxsiuZOaiG4kdQbCLakf 7b4HmJd0RT6Di+vj/FeypYcXKH3+4ICCFoJlR8nJxnwmMbNvj1kR7/m6+DVA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1752616264; x=1752702664; bh=WPraJj8qYnbmHXHaAcuAhFU8NGnVggG8N8r npdtwknI=; b=ZSKehwcxlB0HbIeoonWgnqfirHQGWAvJqnOb/V8D0EdvOevw3XB 5sZlv6BnCke2hbMrkF7CrRP8ukanfNKz8e+0ES5GV/34dqfdGo7mN+VtkX/N9fqX xusJikuJSc0ZVjWc6JcUrSB0ab3RkuNaVy204iGl5lT+TSDjj3S6s19/CPijYgjC yoCaTTM/V23v+dL6naWiy2JaO7Jl9TBGcutQ/B70XK/hE9WZSInzy0qlE9uVsx2y cQzm3fzj1TGllAh1hLAgMl+ju9fotFEcqXpag+8xCDg16lVlh+1hhl49AOiS5qTV 5OnVnXCkv4rmqJ9xRYhnyfOAT9h6lRQufqQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdehheelhecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepofggfffhvffkjghfufgtsehmtderreertd dtnecuhfhrohhmpedflfhovghlucflrggtohgsshhonhdfuceojhhovghlsegtohhmphhi lhgvrhdrohhrgheqnecuggftrfgrthhtvghrnhepfeehuedtgedvgfeuueeukeeiueffhe ekueelffevkeekgeekvefhkeffgffhveelnecuvehluhhsthgvrhfuihiivgeptdenucfr rghrrghmpehmrghilhhfrhhomhepjhhovghlsegtohhmphhilhgvrhdrohhrghdpnhgspg hrtghpthhtohepuddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepphhgshhqlhdq hhgrtghkvghrshesphhoshhtghhrvghsqhhlrdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id 99A1A18E0063; Tue, 15 Jul 2025 17:51:03 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: T90889ce1c5a9472e Date: Tue, 15 Jul 2025 23:50:42 +0200 From: "Joel Jacobson" To: pgsql-hackers Message-Id: In-Reply-To: References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=6077eb32e4c447f28c609ca08c4b8731 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --6077eb32e4c447f28c609ca08c4b8731 Content-Type: text/plain Content-Transfer-Encoding: 7bit On Tue, Jul 15, 2025, at 22:56, Joel Jacobson wrote: > On Tue, Jul 15, 2025, at 09:20, Joel Jacobson wrote: >> On Sun, Jul 13, 2025, at 01:18, Tom Lane wrote: >>> "Joel Jacobson" writes: >>>> The attached proof-of-concept patch proposes a straightforward >>>> optimization for the single-listener case. It introduces a shared-memory >>>> hash table mapping (dboid, channelname) to the ProcNumber of a single >>>> listener. >>> >>> What does that do to the cost and parallelizability of LISTEN/UNLISTEN? >> >> Good point. The previous patch would effectively force all LISTEN/UNLISTEN >> to be serialized, which would at least hurt parallelizability. >> >> New benchmark confirm this hypothesis. >> >> New patch attached that combines two complementary approaches, that together >> seems to scale well for both common-channel and unique-channel scenarios: > > Thanks to the FreeBSD animal failing, I see I made a shared memory blunder. > New squashed patch attached. > > /Joel > Attachments: > * 0001-Subject-Optimize-LISTEN-NOTIFY-signaling-for-scalabi-v3.patch (cfbot is not picking up my patch; I wonder if some filename length is exceeded, trying a shorter filename, apologies for spamming) /Joel --6077eb32e4c447f28c609ca08c4b8731 Content-Disposition: attachment; filename*0="0001-optimize_listen_notify-v3.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-optimize=5Flisten=5Fnotify-v3.patch?=" Content-Transfer-Encoding: base64 RnJvbSAxODAwNGU2Njk3NGZjOWQ0YTkzZTAwYjAxODM5NTlhYzMwNmM3MjE4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAxNSBKdW4gMjAyNSAwMDowOTo0MyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIFN1YmplY3Q6IE9wdGltaXplIExJU1RFTi9OT1RJRlkgc2lnbmFsaW5nIGZvciBzY2Fs YWJpbGl0eQoKUHJldmlvdXNseSwgdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIHNpZ25hbCBl dmVyeSBiYWNrZW5kIGxpc3RlbmluZyBvbiBhbnkKY2hhbm5lbCBpbiB0aGUgZGF0YWJhc2Ug Zm9yIGV2ZXJ5IE5PVElGWS4gV2hpbGUgcm9idXN0LCB0aGlzIGJyb2FkY2FzdAphcHByb2Fj aCBsaW1pdHMgdGhlIHNjYWxhYmlsaXR5IG9mIGFwcGxpY2F0aW9uIHBhdHRlcm5zIHRoYXQg cmVseSBvbgp0YXJnZXRlZCBub3RpZmljYXRpb25zIHRvIGRpc3RpbmN0IGNoYW5uZWxzLiBU aGlzIGNvbW1pdCBpbXByb3ZlcwpzY2FsYWJpbGl0eSBmb3Igc3VjaCB3b3JrbG9hZHMgYnkg aW50cm9kdWNpbmcgYW4gb3B0aW1pemF0aW9uIGZvcgpzaW5nbGUtbGlzdGVuZXIgY2hhbm5l bHMuCgpBIG5ldyBzaGFyZWQgaGFzaCB0YWJsZSBpcyBpbnRyb2R1Y2VkIHRvIHRyYWNrIGNo YW5uZWxzIHRoYXQgaGF2ZSBleGFjdGx5Cm9uZSBsaXN0ZW5lci4gV2hlbiBhIE5PVElGWSBp cyBpc3N1ZWQsIHRoaXMgdGFibGUgaXMgY29uc3VsdGVkOyBpZiBhCnNpbmdsZSBsaXN0ZW5l ciBpcyBmb3VuZCBmb3IgdGhlIHRhcmdldCBjaGFubmVsLCBvbmx5IHRoYXQgYmFja2VuZCBp cwpzaWduYWxlZC4gVGhlIHN5c3RlbSBncmFjZWZ1bGx5IGZhbGxzIGJhY2sgdG8gdGhlIG9y aWdpbmFsIGJyb2FkY2FzdApiZWhhdmlvciBmb3IgY2hhbm5lbHMgd2l0aCBtdWx0aXBsZSBs aXN0ZW5lcnMgb3IgaWYgdGhlIGhhc2ggdGFibGUgcnVucwpvdXQgb2YgbWVtb3J5LgoKVG8g YXZvaWQgaW50cm9kdWNpbmcgYSBuZXcgY29udGVudGlvbiBwb2ludCBvbiBhIGdsb2JhbCBs b2NrLCB0aGUgaGFzaAp0YWJsZSdzIGxvY2tpbmcgaXMgcGFydGl0aW9uZWQuIEFuIGFycmF5 IG9mIGxpZ2h0d2VpZ2h0IGxvY2tzIHByb3RlY3RzCnRoZSBoYXNoIHRhYmxlLCB3aXRoIGEg Y3VzdG9tIGhhc2ggZnVuY3Rpb24gbWFwcGluZyBjaGFubmVscyB0byBsb2NrCnBhcnRpdGlv bnMuIFRoaXMgYWxsb3dzIGNvbmN1cnJlbnQgTElTVEVOL1VOTElTVEVOIG9wZXJhdGlvbnMg b24KZGlmZmVyZW50IGNoYW5uZWxzIHRvIHByb2NlZWQgaW4gcGFyYWxsZWwuIEZvciBoaWdo LWNvbmN1cnJlbmN5IHdvcmtsb2Fkcwp3aGVyZSBtYW55IGJhY2tlbmRzIGxpc3RlbiBvbiB0 aGUgKnNhbWUqIGNoYW5uZWwsIGFuIG9wdGltaXN0aWMKcmVhZC10aGVuLXVwZ3JhZGUgbG9j a2luZyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWluaW1pemUgc2VyaWFsaXphdGlvbi4gQQpzdHJp Y3QgbG9jayBvcmRlcmluZyBoaWVyYXJjaHkgKGdsb2JhbCBOb3RpZnlRdWV1ZUxvY2sgYmVm b3JlIGFueQpwYXJ0aXRpb24gbG9jaykgaXMgb2JzZXJ2ZWQgdG8gcHJldmVudCBkZWFkbG9j a3MuCgpUaGlzIGFsc28gaW5jb3Jwb3JhdGVzIHRoZSAid2FrZSBvbmx5IHRhaWwiIG9wdGlt aXphdGlvbiB0byBlbnN1cmUgdGhlCmdsb2JhbCBxdWV1ZSB0YWlsIGNhbiBhbHdheXMgYWR2 YW5jZSB3aXRob3V0IGNhdXNpbmcgYSB0aHVuZGVyaW5nIGhlcmQKb2Ygc2lnbmFscy4KLS0t CiBzcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jIHwgNjc0ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKy0tCiAxIGZpbGUgY2hhbmdlZCwgNjQxIGluc2VydGlvbnMoKyks IDMzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCmluZGV4IDRiZDM3ZDViZWI1 Li5hNWI2MTRlMWEyNCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMu YworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCkBAIC0yNCw4ICsyNCwxMSBA QAogICoJICBBbGwgbm90aWZpY2F0aW9uIG1lc3NhZ2VzIGFyZSBwbGFjZWQgaW4gdGhlIHF1 ZXVlIGFuZCBsYXRlciByZWFkIG91dAogICoJICBieSBsaXN0ZW5pbmcgYmFja2VuZHMuCiAg KgotICoJICBUaGVyZSBpcyBubyBjZW50cmFsIGtub3dsZWRnZSBvZiB3aGljaCBiYWNrZW5k IGxpc3RlbnMgb24gd2hpY2ggY2hhbm5lbDsKLSAqCSAgZXZlcnkgYmFja2VuZCBoYXMgaXRz IG93biBsaXN0IG9mIGludGVyZXN0aW5nIGNoYW5uZWxzLgorICoJICBJbiBhZGRpdGlvbiB0 byBlYWNoIGJhY2tlbmQgbWFpbnRhaW5pbmcgaXRzIG93biBsaXN0IG9mIGNoYW5uZWxzLCB3 ZSBhbHNvCisgKgkgIG1haW50YWluIGEgY2VudHJhbCBoYXNoIHRhYmxlIHRoYXQgdHJhY2tz IGNoYW5uZWxzIHdpdGggc2luZ2xlIGxpc3RlbmVycy4KKyAqCSAgV2hlbiBhIGNoYW5uZWwg aGFzIGV4YWN0bHkgb25lIGxpc3RlbmluZyBiYWNrZW5kLCB3ZSBjYW4gc2lnbmFsIGp1c3Qg dGhhdAorICoJICBiYWNrZW5kLiBGb3IgY2hhbm5lbHMgd2l0aCBtdWx0aXBsZSBsaXN0ZW5l cnMsIHdlIHNpZ25hbCBhbGwgbGlzdGVuaW5nCisgKgkgIGJhY2tlbmRzLgogICoKICAqCSAg QWx0aG91Z2ggdGhlcmUgaXMgb25seSBvbmUgcXVldWUsIG5vdGlmaWNhdGlvbnMgYXJlIHRy ZWF0ZWQgYXMgYmVpbmcKICAqCSAgZGF0YWJhc2UtbG9jYWw7IHRoaXMgaXMgZG9uZSBieSBp bmNsdWRpbmcgdGhlIHNlbmRlcidzIGRhdGFiYXNlIE9JRApAQCAtNzEsMTMgKzc0LDE2IEBA CiAgKgkgIG1ha2UgYW55IGFjdHVhbCB1cGRhdGVzIHRvIHRoZSBlZmZlY3RpdmUgbGlzdGVu IHN0YXRlIChsaXN0ZW5DaGFubmVscykuCiAgKgkgIFRoZW4gd2Ugc2lnbmFsIGFueSBiYWNr ZW5kcyB0aGF0IG1heSBiZSBpbnRlcmVzdGVkIGluIG91ciBtZXNzYWdlcwogICoJICAoaW5j bHVkaW5nIG91ciBvd24gYmFja2VuZCwgaWYgbGlzdGVuaW5nKS4gIFRoaXMgaXMgZG9uZSBi eQotICoJICBTaWduYWxCYWNrZW5kcygpLCB3aGljaCBzY2FucyB0aGUgbGlzdCBvZiBsaXN0 ZW5pbmcgYmFja2VuZHMgYW5kIHNlbmRzIGEKLSAqCSAgUFJPQ1NJR19OT1RJRllfSU5URVJS VVBUIHNpZ25hbCB0byBldmVyeSBsaXN0ZW5pbmcgYmFja2VuZCAod2UgZG9uJ3QKLSAqCSAg a25vdyB3aGljaCBiYWNrZW5kIGlzIGxpc3RlbmluZyBvbiB3aGljaCBjaGFubmVsIHNvIHdl IG11c3Qgc2lnbmFsIHRoZW0KLSAqCSAgYWxsKS4gIFdlIGNhbiBleGNsdWRlIGJhY2tlbmRz IHRoYXQgYXJlIGFscmVhZHkgdXAgdG8gZGF0ZSwgdGhvdWdoLCBhbmQKLSAqCSAgd2UgY2Fu IGFsc28gZXhjbHVkZSBiYWNrZW5kcyB0aGF0IGFyZSBpbiBvdGhlciBkYXRhYmFzZXMgKHVu bGVzcyB0aGV5Ci0gKgkgIGFyZSB3YXkgYmVoaW5kIGFuZCBzaG91bGQgYmUga2lja2VkIHRv IG1ha2UgdGhlbSBhZHZhbmNlIHRoZWlyCi0gKgkgIHBvaW50ZXJzKS4KKyAqCSAgU2lnbmFs QmFja2VuZHMoKSwgd2hpY2ggaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb24sIGRlcGVuZGlu ZyBvbgorICoJICBpZiBhbnkgb2Ygb3VyIGNoYW5uZWxzIGhhdmUgbXVsdGlwbGUgbGlzdGVu aW5nIGJhY2tlbmRzIG9yIG5vdDoKKyAqCSAgYSkgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGxp c3RlbmluZyBiYWNrZW5kcywgYSBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQKKyAqCSAgc2ln bmFsIGlzIHNlbnQgdG8gZXZlcnkgbGlzdGVuaW5nIGJhY2tlbmQuCisgKgkgIGIpIE90aGVy d2lzZSwgc3VjaCBzaWduYWxzIGFyZSBvbmx5IHNlbnQgdG8gZWFjaCBzaW5nbGUgbGlzdGVu aW5nIGJhY2tlbmQKKyAqCSAgcGVyIGNoYW5uZWwuCisgKgkgIEFkZGl0aW9uYWxseSwgd2Ug dXNlIGEgIndha2Ugb25seSB0YWlsIiBvcHRpbWl6YXRpb246IHdlIGFsd2F5cyBzaWduYWwK KyAqCSAgdGhlIGJhY2tlbmQgZnVydGhlc3QgYmVoaW5kIGluIHRoZSBxdWV1ZSB0byBoZWxw IHByZXZlbnQgYmFja2VuZHMgZnJvbQorICoJICBnZXR0aW5nIGZhciBiZWhpbmQgYW5kIGNy ZWF0ZSBhIGNoYWluIHJlYWN0aW9uIG9mIHdha2UtdXBzLgorICoJICBXZSBjYW4gZXhjbHVk ZSBiYWNrZW5kcyB0aGF0IGFyZSBhbHJlYWR5IHVwIHRvIGRhdGUsIHRob3VnaC4KICAqCiAg KgkgIEZpbmFsbHksIGFmdGVyIHdlIGFyZSBvdXQgb2YgdGhlIHRyYW5zYWN0aW9uIGFsdG9n ZXRoZXIgYW5kIGFib3V0IHRvIGdvCiAgKgkgIGlkbGUsIHdlIHNjYW4gdGhlIHF1ZXVlIGZv ciBtZXNzYWdlcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0byBvdXIKQEAgLTEyOCw2ICsxMzQs NyBAQAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1 ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAiYWNjZXNz L3BhcmFsbGVsLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3NscnUuaCIKQEAgLTE0Niw2ICsxNTMs NyBAQAogI2luY2x1ZGUgInRjb3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9idWls dGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgorI2luY2x1ZGUgInV0aWxz L2hzZWFyY2guaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0 aWxzL3BzX3N0YXR1cy5oIgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKQEAgLTE2Miw2 ICsxNzAsNjggQEAKICAqLwogI2RlZmluZSBOT1RJRllfUEFZTE9BRF9NQVhfTEVOR1RICShC TENLU1ogLSBOQU1FREFUQUxFTiAtIDEyOCkKIAorLyoKKyAqIE51bWJlciBvZiBwYXJ0aXRp b25zIGZvciB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlJ3MgbG9ja3MuCisgKiBUaGlzIG11c3Qg YmUgYSBwb3dlciBvZiB0d28uCisgKi8KKyNkZWZpbmUgTlVNX05PVElGWV9QQVJUSVRJT05T IDEyOAorCisvKgorICogQ2hhbm5lbCBoYXNoIHRhYmxlIGRlZmluaXRpb25zCisgKgorICog VGhpcyBoYXNoIHRhYmxlIHByb3ZpZGVzIGFuIG9wdGltaXphdGlvbiBieSB0cmFja2luZyB3 aGljaCBiYWNrZW5kIGlzCisgKiBsaXN0ZW5pbmcgb24gZWFjaCBjaGFubmVsLiBDaGFubmVs cyBhcmUgaWRlbnRpZmllZCBieSBkYXRhYmFzZSBPSUQgYW5kCisgKiBjaGFubmVsIG5hbWUs IG1ha2luZyB0aGVtIGRhdGFiYXNlLXNwZWNpZmljLgorICoKKyAqIFRvIGltcHJvdmUgc2Nh bGFiaWxpdHkgb2YgY29uY3VycmVudCBMSVNURU4vVU5MSVNURU4gb3BlcmF0aW9ucywgdGhl IGhhc2gKKyAqIHRhYmxlIGlzIHBhcnRpdGlvbmVkLCB3aXRoIGVhY2ggcGFydGl0aW9uIHBy b3RlY3RlZCBieSBpdHMgb3duIExXTG9jay4gVGhpcworICogYXZvaWRzIHNlcmlhbGl6aW5n IGFsbCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIGdsb2JhbCBsb2NrLgorICoKKyAqIFdoZW4g ZXhhY3RseSBvbmUgYmFja2VuZCBsaXN0ZW5zIG9uIGEgY2hhbm5lbCwgd2Ugc2lnbmFsIHRo YXQgc3BlY2lmaWMKKyAqIGJhY2tlbmQsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IHNpZ25hbHMg dG8gYWxsIGxpc3RlbmluZyBiYWNrZW5kcy4KKyAqCisgKiBXZSBmYWxsIGJhY2sgdG8gYnJv YWRjYXN0IG1vZGUgYW5kIHNpZ25hbCBhbGwgbGlzdGVuaW5nIGJhY2tlbmRzIHdoZW46Cisg KiAxKSBNdWx0aXBsZSBiYWNrZW5kcyBsaXN0ZW4gb24gdGhlIHNhbWUgY2hhbm5lbCwgT1IK KyAqIDIpIFRoZSBoYXNoIHRhYmxlIHJ1bnMgb3V0IG9mIHNoYXJlZCBtZW1vcnkgZm9yIG5l dyBlbnRyaWVzCisgKgorICogTm90ZSB0aGF0IENIQU5ORUxfSEFTSF9NQVhfU0laRSBpcyBu b3QgYSBoYXJkIGxpbWl0IC0gdGhlIGhhc2ggdGFibGUgY2FuCisgKiBzdG9yZSBtb3JlIGVu dHJpZXMgdGhhbiB0aGlzLCBidXQgcGVyZm9ybWFuY2Ugd2lsbCBkZWdyYWRlIGR1ZSB0byBi dWNrZXQKKyAqIG92ZXJmbG93LiBUaGUgYWN0dWFsIGZhbGxiYWNrIHRvIGJyb2FkY2FzdCBt b2RlIG9jY3VycyBvbmx5IHdoZW4gc2hhcmVkCisgKiBtZW1vcnkgaXMgZXhoYXVzdGVkIGFu ZCB3ZSBjYW5ub3QgYWxsb2NhdGUgbmV3IGhhc2ggZW50cmllcy4KKyAqCisgKiBUaGUgbWF4 aW11bSBzaXplIChDSEFOTkVMX0hBU0hfTUFYX1NJWkUpIGlzIGJhc2VkIG9uIHRoZSB0eXBp Y2FsIE9TIHBvcnQKKyAqIHJhbmdlLiBUaGlzIHByb3ZpZGVzIGEgcmVhc29uYWJsZSB1cHBl ciBib3VuZCBmb3Igc3lzdGVtcyB0aGF0IHVzZQorICogcGVyLWNvbm5lY3Rpb24gY2hhbm5l bHMuCisgKgorICovCisjZGVmaW5lIENIQU5ORUxfSEFTSF9JTklUX1NJWkUJCTI1NgorI2Rl ZmluZSBDSEFOTkVMX0hBU0hfTUFYX1NJWkUJCTY1NTM1CisKKy8qCisgKiBLZXkgc3RydWN0 dXJlIGZvciB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlLgorICogQ2hhbm5lbHMgYXJlIGRhdGFi YXNlLXNwZWNpZmljLCBzbyB3ZSBuZWVkIGJvdGggdGhlIGRhdGFiYXNlIE9JRAorICogYW5k IHRoZSBjaGFubmVsIG5hbWUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjaGFubmVsLgorICov Cit0eXBlZGVmIHN0cnVjdCBDaGFubmVsSGFzaEtleQoreworCU9pZAkJCWRib2lkOworCWNo YXIJCWNoYW5uZWxbTkFNRURBVEFMRU5dOworfQkJCUNoYW5uZWxIYXNoS2V5OworCisvKgor ICogRWFjaCBlbnRyeSBjb250YWlucyBhIGNoYW5uZWwga2V5IChkYXRhYmFzZSBPSUQgKyBj aGFubmVsIG5hbWUpIGFuZCBhCisgKiBzaW5nbGUgYmFja2VuZCBQcm9jTnVtYmVyIHRoYXQg aXMgbGlzdGVuaW5nIG9uIHRoYXQgY2hhbm5lbC4gSWYgbXVsdGlwbGUKKyAqIGJhY2tlbmRz IHRyeSB0byBsaXN0ZW4gb24gdGhlIHNhbWUgY2hhbm5lbCwgd2UgbWFyayBpdCBhcyBoYXZp bmcgbXVsdGlwbGUKKyAqIGxpc3RlbmVycyBhbmQgZmFsbCBiYWNrIHRvIGJyb2FkY2FzdCBi ZWhhdmlvci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ2hhbm5lbEVudHJ5Cit7CisJQ2hhbm5l bEhhc2hLZXkga2V5OworCVByb2NOdW1iZXIJbGlzdGVuZXI7CQkvKiBzaW5nbGUgYmFja2Vu ZCBJRCwgb3IgSU5WQUxJRF9QUk9DX05VTUJFUgorCQkJCQkJCQkgKiBpZiBtdWx0aXBsZSAq LworCWJvb2wJCWhhc19tdWx0aXBsZV9saXN0ZW5lcnM7Cit9CQkJQ2hhbm5lbEVudHJ5Owor CiAvKgogICogU3RydWN0IHJlcHJlc2VudGluZyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG5v dGlmeSBxdWV1ZQogICoKQEAgLTI2OSw2ICszMzksMTEgQEAgdHlwZWRlZiBzdHJ1Y3QgUXVl dWVCYWNrZW5kU3RhdHVzCiAgKiBJbiBvcmRlciB0byBhdm9pZCBkZWFkbG9ja3MsIHdoZW5l dmVyIHdlIG5lZWQgbXVsdGlwbGUgbG9ja3MsIHdlIGZpcnN0IGdldAogICogTm90aWZ5UXVl dWVUYWlsTG9jaywgdGhlbiBOb3RpZnlRdWV1ZUxvY2ssIGFuZCBsYXN0bHkgU0xSVSBiYW5r IGxvY2suCiAgKgorICogVGhlIGNoYW5uZWwgaGFzaCB0YWJsZSBpcyBwcm90ZWN0ZWQgYnkg YSBzZXBhcmF0ZSBzZXQgb2YgcGFydGl0aW9uZWQKKyAqIGxvY2tzLiBUbyBwcmV2ZW50IGRl YWRsb2NrcyBiZXR3ZWVuIHRoZXNlIGFuZCBOb3RpZnlRdWV1ZUxvY2ssIHRoZSBnbG9iYWwK KyAqIGxvY2stb3JkZXJpbmcgcnVsZSBpczogYWx3YXlzIGFjcXVpcmUgTm90aWZ5UXVldWVM b2NrICpiZWZvcmUqIGFjcXVpcmluZworICogYW55IGNoYW5uZWwgaGFzaCBwYXJ0aXRpb24g bG9jay4KKyAqCiAgKiBFYWNoIGJhY2tlbmQgdXNlcyB0aGUgYmFja2VuZFtdIGFycmF5IGVu dHJ5IHdpdGggaW5kZXggZXF1YWwgdG8gaXRzCiAgKiBQcm9jTnVtYmVyLiAgV2UgcmVseSBv biB0aGlzIHRvIG1ha2UgU2VuZFByb2NTaWduYWwgZmFzdC4KICAqCkBAIC0yOTMsNiArMzY4 LDYwIEBAIHR5cGVkZWYgc3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAKIHN0YXRpYyBBc3lu Y1F1ZXVlQ29udHJvbCAqYXN5bmNRdWV1ZUNvbnRyb2w7CiAKKy8qIExvY2tzIGZvciBwYXJ0 aXRpb25lZCBjaGFubmVsIGhhc2ggdGFibGUgKi8KK3N0YXRpYyBMV0xvY2sgKmNoYW5uZWxI YXNoTG9ja3M7CitzdGF0aWMgaW50CWNoYW5uZWxIYXNoVHJhbmNoZUlkID0gMDsKKworLyog U3RydWN0dXJlIHRvIGhvbGQgY2hhbm5lbCBoYXNoIGxvY2tzIGFuZCB0cmFuY2hlIElEIGlu IHNoYXJlZCBtZW1vcnkgKi8KK3R5cGVkZWYgc3RydWN0IENoYW5uZWxIYXNoTG9ja0RhdGEK K3sKKwlpbnQJCQl0cmFuY2hlSWQ7CisJTFdMb2NrCQlsb2Nrc1tGTEVYSUJMRV9BUlJBWV9N RU1CRVJdOworfQkJCUNoYW5uZWxIYXNoTG9ja0RhdGE7CisKK3N0YXRpYyBDaGFubmVsSGFz aExvY2tEYXRhICogY2hhbm5lbEhhc2hMb2NrRGF0YTsKKworLyogQ2hhbm5lbCBoYXNoIHRh YmxlIGZvciBzaW5nbGUgbGlzdGVuaW5nIGJhY2tlbmQgc2lnbmFsbGluZyAqLworc3RhdGlj IEhUQUIgKmNoYW5uZWxIYXNoID0gTlVMTDsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBu ZWVkZWQgYnkgR2V0Q2hhbm5lbEhhc2ggKi8KK3N0YXRpYyB1aW50MzIgY2hhbm5lbF9oYXNo X2Z1bmMoY29uc3Qgdm9pZCAqa2V5LCBTaXplIGtleXNpemUpOworCisvKgorICogR2V0Q2hh bm5lbEhhc2gKKyAqCQlHZXQgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZSwgaW5pdGlhbGl6aW5n IG91ciBiYWNrZW5kJ3MgcG9pbnRlciBpZiBuZWVkZWQuCisgKgorICogVGhpcyBtdXN0IGJl IGNhbGxlZCBiZWZvcmUgYW55IGFjY2VzcyB0byB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlLgor ICogVGhlIGhhc2ggdGFibGUgaXRzZWxmIGlzIGNyZWF0ZWQgaW4gc2hhcmVkIG1lbW9yeSBk dXJpbmcgQXN5bmNTaG1lbUluaXQsCisgKiBidXQgZWFjaCBiYWNrZW5kIG5lZWRzIHRvIGdl dCBpdHMgb3duIHBvaW50ZXIgdG8gaXQuCisgKi8KK3N0YXRpYyBIVEFCICoKK0dldENoYW5u ZWxIYXNoKHZvaWQpCit7CisJaWYgKGNoYW5uZWxIYXNoID09IE5VTEwpCisJeworCQlIQVNI Q1RMCQloYXNoX2N0bDsKKworCQkvKgorCQkgKiBTZXQgdXAgdG8gYXR0YWNoIHRvIHRoZSBl eGlzdGluZyBzaGFyZWQgaGFzaCB0YWJsZS4gVGhlIGhhc2gKKwkJICogY29udHJvbCBwYXJh bWV0ZXJzIG11c3QgbWF0Y2ggdGhvc2UgdXNlZCBpbiBBc3luY1NobWVtSW5pdC4KKwkJICov CisJCU1lbVNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNoX2N0 bC5rZXlzaXplID0gc2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKwkJaGFzaF9jdGwuZW50cnlz aXplID0gc2l6ZW9mKENoYW5uZWxFbnRyeSk7CisJCWhhc2hfY3RsLmhhc2ggPSBjaGFubmVs X2hhc2hfZnVuYzsKKwkJaGFzaF9jdGwubnVtX3BhcnRpdGlvbnMgPSBOVU1fTk9USUZZX1BB UlRJVElPTlM7CisKKwkJY2hhbm5lbEhhc2ggPSBTaG1lbUluaXRIYXNoKCJDaGFubmVsIEhh c2giLAorCQkJCQkJCQkJQ0hBTk5FTF9IQVNIX0lOSVRfU0laRSwKKwkJCQkJCQkJCUNIQU5O RUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCSZoYXNoX2N0bCwKKwkJCQkJCQkJCUhBU0hf RUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX1BBUlRJVElPTik7CisJfQorCisJcmV0dXJu IGNoYW5uZWxIYXNoOworfQorCiAjZGVmaW5lIFFVRVVFX0hFQUQJCQkJCShhc3luY1F1ZXVl Q29udHJvbC0+aGVhZCkKICNkZWZpbmUgUVVFVUVfVEFJTAkJCQkJKGFzeW5jUXVldWVDb250 cm9sLT50YWlsKQogI2RlZmluZSBRVUVVRV9TVE9QX1BBR0UJCQkJKGFzeW5jUXVldWVDb250 cm9sLT5zdG9wUGFnZSkKQEAgLTQ1OCw2ICs1ODcsMTQgQEAgc3RhdGljIHVpbnQzMiBub3Rp ZmljYXRpb25faGFzaChjb25zdCB2b2lkICprZXksIFNpemUga2V5c2l6ZSk7CiBzdGF0aWMg aW50CW5vdGlmaWNhdGlvbl9tYXRjaChjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICpr ZXkyLCBTaXplIGtleXNpemUpOwogc3RhdGljIHZvaWQgQ2xlYXJQZW5kaW5nQWN0aW9uc0Fu ZE5vdGlmaWVzKHZvaWQpOwogCisvKiBDaGFubmVsIGhhc2ggdGFibGUgbWFuYWdlbWVudCBm dW5jdGlvbnMgKi8KK3N0YXRpYyBMV0xvY2sgKkdldENoYW5uZWxIYXNoTG9jayhjb25zdCBj aGFyICpjaGFubmVsKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBDaGFubmVsSGFzaFByZXBhcmVL ZXkoQ2hhbm5lbEhhc2hLZXkgKiBrZXksIE9pZCBkYm9pZCwgY29uc3QgY2hhciAqY2hhbm5l bCk7CitzdGF0aWMgdm9pZCBDaGFubmVsSGFzaEFkZExpc3RlbmVyKGNvbnN0IGNoYXIgKmNo YW5uZWwsIFByb2NOdW1iZXIgcHJvY25vKTsKK3N0YXRpYyB2b2lkIENoYW5uZWxIYXNoUmVt b3ZlTGlzdGVuZXIoY29uc3QgY2hhciAqY2hhbm5lbCwgUHJvY051bWJlciBwcm9jbm8pOwor c3RhdGljIENoYW5uZWxFbnRyeSAqIENoYW5uZWxIYXNoTG9va3VwKGNvbnN0IGNoYXIgKmNo YW5uZWwpOworc3RhdGljIExpc3QgKkdldFBlbmRpbmdOb3RpZnlDaGFubmVscyh2b2lkKTsK KwogLyoKICAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcXVldWUgcGFn ZSBudW1iZXJzLgogICogUHJldmlvdXNseSB0aGlzIGZ1bmN0aW9uIGFjY291bnRlZCBmb3Ig YSB3cmFwYXJvdW5kLgpAQCAtNDkyLDYgKzYyOSwxMiBAQCBBc3luY1NobWVtU2l6ZSh2b2lk KQogCiAJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFNpbXBsZUxydVNobWVtU2l6ZShub3RpZnlf YnVmZmVycywgMCkpOwogCisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIGhhc2hfZXN0aW1hdGVf c2l6ZShDSEFOTkVMX0hBU0hfTUFYX1NJWkUsCisJCQkJCQkJCQkJCSBzaXplb2YoQ2hhbm5l bEVudHJ5KSkpOworCisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIG9mZnNldG9mKENoYW5uZWxI YXNoTG9ja0RhdGEsIGxvY2tzKSArCisJCQkJCW11bF9zaXplKE5VTV9OT1RJRllfUEFSVElU SU9OUywgc2l6ZW9mKExXTG9jaykpKTsKKwogCXJldHVybiBzaXplOwogfQogCkBAIC01NDYs NiArNjg5LDQ5IEBAIEFzeW5jU2htZW1Jbml0KHZvaWQpCiAJCSAqLwogCQkodm9pZCkgU2xy dVNjYW5EaXJlY3RvcnkoTm90aWZ5Q3RsLCBTbHJ1U2NhbkRpckNiRGVsZXRlQWxsLCBOVUxM KTsKIAl9CisKKwkvKgorCSAqIENyZWF0ZSBvciBhdHRhY2ggdG8gdGhlIGNoYW5uZWwgaGFz aCB0YWJsZS4KKwkgKi8KKwl7CisJCUhBU0hDVEwJCWhhc2hfY3RsOworCisJCU1lbVNldCgm aGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNoX2N0bC5rZXlzaXplID0g c2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKwkJaGFzaF9jdGwuZW50cnlzaXplID0gc2l6ZW9m KENoYW5uZWxFbnRyeSk7CisJCWhhc2hfY3RsLmhhc2ggPSBjaGFubmVsX2hhc2hfZnVuYzsK KwkJaGFzaF9jdGwubnVtX3BhcnRpdGlvbnMgPSBOVU1fTk9USUZZX1BBUlRJVElPTlM7CisK KwkJY2hhbm5lbEhhc2ggPSBTaG1lbUluaXRIYXNoKCJDaGFubmVsIEhhc2giLAorCQkJCQkJ CQkJQ0hBTk5FTF9IQVNIX0lOSVRfU0laRSwKKwkJCQkJCQkJCUNIQU5ORUxfSEFTSF9NQVhf U0laRSwKKwkJCQkJCQkJCSZoYXNoX2N0bCwKKwkJCQkJCQkJCUhBU0hfRUxFTSB8IEhBU0hf RlVOQ1RJT04gfCBIQVNIX1BBUlRJVElPTik7CisJfQorCisJLyogSW5pdGlhbGl6ZSBsb2Nr cyBmb3IgdGhlIHBhcnRpdGlvbmVkIGhhc2ggdGFibGUgKi8KKwlzaXplID0gb2Zmc2V0b2Yo Q2hhbm5lbEhhc2hMb2NrRGF0YSwgbG9ja3MpICsKKwkJbXVsX3NpemUoTlVNX05PVElGWV9Q QVJUSVRJT05TLCBzaXplb2YoTFdMb2NrKSk7CisJY2hhbm5lbEhhc2hMb2NrRGF0YSA9IChD aGFubmVsSGFzaExvY2tEYXRhICopCisJCVNobWVtSW5pdFN0cnVjdCgiQ2hhbm5lbCBIYXNo IExvY2sgRGF0YSIsIHNpemUsICZmb3VuZCk7CisJaWYgKCFmb3VuZCkKKwl7CisJCS8qIEZp cnN0IHRpbWUgdGhyb3VnaDogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgYW5kIHRyYW5jaGUgSUQg Ki8KKwkJY2hhbm5lbEhhc2hMb2NrRGF0YS0+dHJhbmNoZUlkID0gTFdMb2NrTmV3VHJhbmNo ZUlkKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgTlVNX05PVElGWV9QQVJUSVRJT05TOyBp KyspCisJCXsKKwkJCUxXTG9ja0luaXRpYWxpemUoJmNoYW5uZWxIYXNoTG9ja0RhdGEtPmxv Y2tzW2ldLAorCQkJCQkJCSBjaGFubmVsSGFzaExvY2tEYXRhLT50cmFuY2hlSWQpOworCQl9 CisJfQorCisJLyoKKwkgKiBTZXQgdXAgbG9jYWwgcG9pbnRlcnMgZm9yIGNvbnZlbmllbmNl LiBXZSBtdXN0IGFsc28gcmVnaXN0ZXIgdGhlCisJICogdHJhbmNoZSBJRCBpbiBldmVyeSBi YWNrZW5kIHRoYXQgd2lsbCB1c2UgdGhlc2UgbG9ja3MuCisJICovCisJY2hhbm5lbEhhc2hM b2NrcyA9IGNoYW5uZWxIYXNoTG9ja0RhdGEtPmxvY2tzOworCWNoYW5uZWxIYXNoVHJhbmNo ZUlkID0gY2hhbm5lbEhhc2hMb2NrRGF0YS0+dHJhbmNoZUlkOworCUxXTG9ja1JlZ2lzdGVy VHJhbmNoZShjaGFubmVsSGFzaFRyYW5jaGVJZCwgIkNoYW5uZWxIYXNoUGFydGl0aW9uIik7 CiB9CiAKIApAQCAtMTExMCw2ICsxMjk2LDcgQEAgRXhlY19MaXN0ZW5QcmVDb21taXQodm9p ZCkKIAkJUVVFVUVfTkVYVF9MSVNURU5FUihNeVByb2NOdW1iZXIpID0gUVVFVUVfRklSU1Rf TElTVEVORVI7CiAJCVFVRVVFX0ZJUlNUX0xJU1RFTkVSID0gTXlQcm9jTnVtYmVyOwogCX0K KwogCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKIAogCS8qIE5vdyB3ZSBhcmUg bGlzdGVkIGluIHRoZSBnbG9iYWwgYXJyYXksIHNvIHJlbWVtYmVyIHdlJ3JlIGxpc3Rlbmlu ZyAqLwpAQCAtMTE1Miw2ICsxMzM5LDggQEAgRXhlY19MaXN0ZW5Db21taXQoY29uc3QgY2hh ciAqY2hhbm5lbCkKIAlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKFRvcE1l bW9yeUNvbnRleHQpOwogCWxpc3RlbkNoYW5uZWxzID0gbGFwcGVuZChsaXN0ZW5DaGFubmVs cywgcHN0cmR1cChjaGFubmVsKSk7CiAJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRl eHQpOworCisJQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihjaGFubmVsLCBNeVByb2NOdW1iZXIp OwogfQogCiAvKgpAQCAtMTE3NSw2ICsxMzY0LDcgQEAgRXhlY19Vbmxpc3RlbkNvbW1pdChj b25zdCBjaGFyICpjaGFubmVsKQogCQl7CiAJCQlsaXN0ZW5DaGFubmVscyA9IGZvcmVhY2hf ZGVsZXRlX2N1cnJlbnQobGlzdGVuQ2hhbm5lbHMsIHEpOwogCQkJcGZyZWUobGNoYW4pOwor CQkJQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcihjaGFubmVsLCBNeVByb2NOdW1iZXIpOwog CQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMTkzLDkgKzEzODMsMjIgQEAgRXhlY19Vbmxpc3Rl bkNvbW1pdChjb25zdCBjaGFyICpjaGFubmVsKQogc3RhdGljIHZvaWQKIEV4ZWNfVW5saXN0 ZW5BbGxDb21taXQodm9pZCkKIHsKKwlMaXN0Q2VsbCAgICpwOworCiAJaWYgKFRyYWNlX25v dGlmeSkKIAkJZWxvZyhERUJVRzEsICJFeGVjX1VubGlzdGVuQWxsQ29tbWl0KCVkKSIsIE15 UHJvY1BpZCk7CiAKKwkvKgorCSAqIEJlZm9yZSBmcmVlaW5nIHRoZSBsb2NhbCBsaXN0LCBp dGVyYXRlIHRocm91Z2ggaXQgYW5kIHBlcmZvcm0gYQorCSAqIHRhcmdldGVkIHJlbW92YWwg Zm9yIGVhY2ggb2Ygb3VyIGNoYW5uZWxzIGZyb20gdGhlIHNoYXJlZCBoYXNoIHRhYmxlLgor CSAqLworCWZvcmVhY2gocCwgbGlzdGVuQ2hhbm5lbHMpCisJeworCQljaGFyCSAgICpjaGFu bmVsID0gKGNoYXIgKikgbGZpcnN0KHApOworCisJCUNoYW5uZWxIYXNoUmVtb3ZlTGlzdGVu ZXIoY2hhbm5lbCwgTXlQcm9jTnVtYmVyKTsKKwl9CisKIAlsaXN0X2ZyZWVfZGVlcChsaXN0 ZW5DaGFubmVscyk7CiAJbGlzdGVuQ2hhbm5lbHMgPSBOSUw7CiB9CkBAIC0xMjM5LDYgKzE0 NDIsNyBAQCBhc3luY1F1ZXVlVW5yZWdpc3Rlcih2b2lkKQogCSAqIE5lZWQgZXhjbHVzaXZl IGxvY2sgaGVyZSB0byBtYW5pcHVsYXRlIGxpc3QgbGlua3MuCiAJICovCiAJTFdMb2NrQWNx dWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX0VYQ0xVU0lWRSk7CisKIAkvKiBNYXJrIG91ciBl bnRyeSBhcyBpbnZhbGlkICovCiAJUVVFVUVfQkFDS0VORF9QSUQoTXlQcm9jTnVtYmVyKSA9 IEludmFsaWRQaWQ7CiAJUVVFVUVfQkFDS0VORF9EQk9JRChNeVByb2NOdW1iZXIpID0gSW52 YWxpZE9pZDsKQEAgLTE1NjUsMTIgKzE3NjksMTggQEAgYXN5bmNRdWV1ZUZpbGxXYXJuaW5n KHZvaWQpCiAvKgogICogU2VuZCBzaWduYWxzIHRvIGxpc3RlbmluZyBiYWNrZW5kcy4KICAq Ci0gKiBOb3JtYWxseSB3ZSBzaWduYWwgb25seSBiYWNrZW5kcyBpbiBvdXIgb3duIGRhdGFi YXNlLCBzaW5jZSBvbmx5IHRob3NlCi0gKiBiYWNrZW5kcyBjb3VsZCBiZSBpbnRlcmVzdGVk IGluIG5vdGlmaWVzIHdlIHNlbmQuICBIb3dldmVyLCBpZiB0aGVyZSdzCi0gKiBub3RpZnkg dHJhZmZpYyBpbiBvdXIgZGF0YWJhc2UgYnV0IG5vIHRyYWZmaWMgaW4gYW5vdGhlciBkYXRh YmFzZSB0aGF0Ci0gKiBkb2VzIGhhdmUgbGlzdGVuZXIocyksIHRob3NlIGxpc3RlbmVycyB3 aWxsIGZhbGwgZnVydGhlciBhbmQgZnVydGhlcgotICogYmVoaW5kLiAgV2FrZW4gdGhlbSBh bnl3YXkgaWYgdGhleSdyZSBmYXIgZW5vdWdoIGJlaGluZCwgc28gdGhhdCB0aGV5J2xsCi0g KiBhZHZhbmNlIHRoZWlyIHF1ZXVlIHBvc2l0aW9uIHBvaW50ZXJzLCBhbGxvd2luZyB0aGUg Z2xvYmFsIHRhaWwgdG8gYWR2YW5jZS4KKyAqIFRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMgaW4g dHdvIG1vZGVzOgorICogMS4gU2VsZWN0aXZlIG1vZGU6IFdoZW4gYWxsIHBlbmRpbmcgbm90 aWZpY2F0aW9uIGNoYW5uZWxzIGhhdmUgZXhhY3RseSBvbmUKKyAqICAgIGxpc3RlbmVyIGVh Y2gsIHdlIHNpZ25hbCBvbmx5IHRob3NlIHNwZWNpZmljIGJhY2tlbmRzIHRoYXQgYXJlIGxp c3RlbmluZworICogICAgb24gdGhlIGNoYW5uZWxzIHdpdGggcGVuZGluZyBub3RpZmljYXRp b25zLgorICogMi4gQnJvYWRjYXN0IG1vZGU6IFdoZW4gYW55IGNoYW5uZWwgaGFzIG11bHRp cGxlIGxpc3RlbmVycyAob3Igd2UgcmFuIG91dAorICogICAgb2Ygc2hhcmVkIG1lbW9yeSBm b3IgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZSksIHdlIHNpZ25hbCBhbGwgbGlzdGVuaW5nCisg KiAgICBiYWNrZW5kcyBpbiBvdXIgZGF0YWJhc2UuCisgKgorICogSW4gYWRkaXRpb24gdG8g dGhlIGNoYW5uZWwtc3BlY2lmaWMgc2lnbmFsaW5nLCB3ZSBhbHNvIGltcGxlbWVudCBhICJ3 YWtlCisgKiBvbmx5IHRhaWwiIG9wdGltaXphdGlvbjogd2Ugc2lnbmFsIHRoZSBiYWNrZW5k IHRoYXQgaXMgZnVydGhlc3QgYmVoaW5kCisgKiBpbiB0aGUgcXVldWUgdG8gaGVscCBwcmV2 ZW50IGJhY2tlbmRzIGZyb20gZ2V0dGluZyBmYXIgYmVoaW5kIGFuZCBjcmVhdGUKKyAqIGEg Y2hhaW4gcmVhY3Rpb24gb2Ygd2FrZS11cHMuIFRoaXMgYXZvaWRzIHRodW5kZXJpbmcgaGVy ZCBwcm9ibGVtcy4KICAqCiAgKiBTaW5jZSB3ZSBrbm93IHRoZSBQcm9jTnVtYmVyIGFuZCB0 aGUgUGlkIHRoZSBzaWduYWxpbmcgaXMgcXVpdGUgY2hlYXAuCiAgKgpAQCAtMTU4Myw2ICsx NzkzLDExIEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAJaW50MzIJICAgKnBpZHM7CiAJUHJv Y051bWJlciAqcHJvY25vczsKIAlpbnQJCQljb3VudDsKKwlMaXN0CSAgICpjaGFubmVsczsK KwlMaXN0Q2VsbCAgICpwOworCWJvb2wJICAgKnNpZ25hbGVkOworCWJvb2wJCWJyb2FkY2Fz dF9tb2RlID0gZmFsc2U7CisJYm9vbAkJdGFpbF93b2tlbiA9IGZhbHNlOwogCiAJLyoKIAkg KiBJZGVudGlmeSBiYWNrZW5kcyB0aGF0IHdlIG5lZWQgdG8gc2lnbmFsLiAgV2UgZG9uJ3Qg d2FudCB0byBzZW5kCkBAIC0xNTk0LDQwICsxODA5LDE3OSBAQCBTaWduYWxCYWNrZW5kcyh2 b2lkKQogCSAqLwogCXBpZHMgPSAoaW50MzIgKikgcGFsbG9jKE1heEJhY2tlbmRzICogc2l6 ZW9mKGludDMyKSk7CiAJcHJvY25vcyA9IChQcm9jTnVtYmVyICopIHBhbGxvYyhNYXhCYWNr ZW5kcyAqIHNpemVvZihQcm9jTnVtYmVyKSk7CisJc2lnbmFsZWQgPSAoYm9vbCAqKSBwYWxs b2MwKE1heEJhY2tlbmRzICogc2l6ZW9mKGJvb2wpKTsKIAljb3VudCA9IDA7CiAKKwkvKiBH ZXQgbGlzdCBvZiBjaGFubmVscyB0aGF0IGhhdmUgcGVuZGluZyBub3RpZmljYXRpb25zICov CisJY2hhbm5lbHMgPSBHZXRQZW5kaW5nTm90aWZ5Q2hhbm5lbHMoKTsKKworCS8qCisJICog VG8gcHJldmVudCBkZWFkbG9ja3MsIHdlIG11c3QgYWx3YXlzIGFjcXVpcmUgbG9ja3MgaW4g dGhlIHNhbWUgb3JkZXI6CisJICogZ2xvYmFsIE5vdGlmeVF1ZXVlTG9jayBmaXJzdCwgdGhl biBpbmRpdmlkdWFsIHBhcnRpdGlvbiBsb2Nrcy4KKwkgKi8KIAlMV0xvY2tBY3F1aXJlKE5v dGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsKLQlmb3IgKFByb2NOdW1iZXIgaSA9IFFV RVVFX0ZJUlNUX0xJU1RFTkVSOyBpICE9IElOVkFMSURfUFJPQ19OVU1CRVI7IGkgPSBRVUVV RV9ORVhUX0xJU1RFTkVSKGkpKQorCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgd2UgY2FuIHVz ZSB0YXJnZXRlZCBzaWduYWxpbmcgb3IgbXVzdCBicm9hZGNhc3QuIFRoaXMKKwkgKiBjaGVj ayBtdXN0IGJlIGRvbmUgd2hpbGUgaG9sZGluZyBOb3RpZnlRdWV1ZUxvY2sgdG8gcHJldmVu dCBkZWFkbG9ja3MKKwkgKiBhZ2FpbnN0IG90aGVyIGJhY2tlbmRzIHRoYXQgbWlnaHQgYmUg bW9kaWZ5aW5nIHRoZSBsaXN0ZW5lciBsaXN0IGFuZAorCSAqIGhhc2ggdGFibGUgc2ltdWx0 YW5lb3VzbHkgKGUuZy4sIGFzeW5jUXVldWVVbnJlZ2lzdGVyKS4KKwkgKi8KKwlmb3JlYWNo KHAsIGNoYW5uZWxzKQogCXsKLQkJaW50MzIJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkp OwotCQlRdWV1ZVBvc2l0aW9uIHBvczsKKwkJY2hhcgkgICAqY2hhbm5lbCA9IChjaGFyICop IGxmaXJzdChwKTsKKwkJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwkJTFdMb2NrCSAgICpsb2Nr ID0gR2V0Q2hhbm5lbEhhc2hMb2NrKGNoYW5uZWwpOworCisJCUxXTG9ja0FjcXVpcmUobG9j aywgTFdfU0hBUkVEKTsKKwkJZW50cnkgPSBDaGFubmVsSGFzaExvb2t1cChjaGFubmVsKTsK KworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBubyBlbnRyeSwgaXQgY291bGQgbWVhbiB3ZSBy YW4gb3V0IG9mIHNoYXJlZCBtZW1vcnkKKwkJICogd2hlbiB0cnlpbmcgdG8gYWRkIHRoaXMg Y2hhbm5lbCB0byB0aGUgaGFzaCB0YWJsZSwgc28gd2UgbmVlZCB0bworCQkgKiBicm9hZGNh c3QgaW4gdGhhdCBjYXNlIGFzIHdlbGwuCisJCSAqLworCQlpZiAoIWVudHJ5IHx8IGVudHJ5 LT5oYXNfbXVsdGlwbGVfbGlzdGVuZXJzKQorCQl7CisJCQlicm9hZGNhc3RfbW9kZSA9IHRy dWU7CisJCQlMV0xvY2tSZWxlYXNlKGxvY2spOworCQkJYnJlYWs7CisJCX0KKwkJTFdMb2Nr UmVsZWFzZShsb2NrKTsKKwl9CiAKLQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKLQkJ cG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7Ci0JCWlmIChRVUVVRV9CQUNLRU5EX0RCT0lE KGkpID09IE15RGF0YWJhc2VJZCkKKwlpZiAoYnJvYWRjYXN0X21vZGUpCisJeworCQkvKgor CQkgKiBJbiBicm9hZGNhc3QgbW9kZSwgd2UgaXRlcmF0ZSBvdmVyIGFsbCBsaXN0ZW5pbmcg YmFja2VuZHMgYW5kCisJCSAqIHNpZ25hbCB0aGUgb25lcyBpbiBvdXIgZGF0YWJhc2UgdGhh dCBhcmUgbm90IGFscmVhZHkgY2F1Z2h0IHVwLgorCQkgKi8KKwkJZm9yIChQcm9jTnVtYmVy IGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsgaSAhPSBJTlZBTElEX1BST0NfTlVNQkVSOyBp ID0gUVVFVUVfTkVYVF9MSVNURU5FUihpKSkKIAkJeworCQkJaW50MzIJCXBpZDsKKwkJCVF1 ZXVlUG9zaXRpb24gcG9zOworCisJCQlpZiAoUVVFVUVfQkFDS0VORF9EQk9JRChpKSAhPSBN eURhdGFiYXNlSWQpCisJCQkJY29udGludWU7CisKKwkJCXBvcyA9IFFVRVVFX0JBQ0tFTkRf UE9TKGkpOworCiAJCQkvKgogCQkJICogQWx3YXlzIHNpZ25hbCBsaXN0ZW5lcnMgaW4gb3Vy IG93biBkYXRhYmFzZSwgdW5sZXNzIHRoZXkncmUKLQkJCSAqIGFscmVhZHkgY2F1Z2h0IHVw ICh1bmxpa2VseSwgYnV0IHBvc3NpYmxlKS4KKwkJCSAqIGFscmVhZHkgY2F1Z2h0IHVwLgog CQkJICovCiAJCQlpZiAoUVVFVUVfUE9TX0VRVUFMKHBvcywgUVVFVUVfSEVBRCkpCiAJCQkJ Y29udGludWU7CisKKwkJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOworCQkJQXNzZXJ0 KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJLyogT0ssIG5lZWQgdG8gc2lnbmFsIHRoaXMg b25lICovCisJCQlwaWRzW2NvdW50XSA9IHBpZDsKKwkJCXByb2Nub3NbY291bnRdID0gaTsK KwkJCXNpZ25hbGVkW2ldID0gdHJ1ZTsKKwkJCWNvdW50Kys7CiAJCX0KLQkJZWxzZQorCX0K KwllbHNlCisJeworCQkvKgorCQkgKiBJbiB0YXJnZXRlZCBtb2RlLCBzaWduYWwgc3BlY2lm aWMgbGlzdGVuaW5nIGJhY2tlbmRzLiBXZSBtdXN0CisJCSAqIHJlLWNoZWNrIHRoZSBoYXNo IGVudHJpZXMgaGVyZSBpbnNpZGUgdGhlIGxvY2sgdG8gYXZvaWQgcmFjZXMuCisJCSAqLwor CQlmb3JlYWNoKHAsIGNoYW5uZWxzKQogCQl7Ci0JCQkvKgotCQkJICogTGlzdGVuZXJzIGlu IG90aGVyIGRhdGFiYXNlcyBzaG91bGQgYmUgc2lnbmFsZWQgb25seSBpZiB0aGV5Ci0JCQkg KiBhcmUgZmFyIGJlaGluZC4KLQkJCSAqLwotCQkJaWYgKGFzeW5jUXVldWVQYWdlRGlmZihR VUVVRV9QT1NfUEFHRShRVUVVRV9IRUFEKSwKLQkJCQkJCQkJICAgUVVFVUVfUE9TX1BBR0Uo cG9zKSkgPCBRVUVVRV9DTEVBTlVQX0RFTEFZKQotCQkJCWNvbnRpbnVlOworCQkJY2hhcgkg ICAqY2hhbm5lbCA9IChjaGFyICopIGxmaXJzdChwKTsKKwkJCUNoYW5uZWxFbnRyeSAqZW50 cnk7CisJCQlMV0xvY2sJICAgKmxvY2sgPSBHZXRDaGFubmVsSGFzaExvY2soY2hhbm5lbCk7 CisKKwkJCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfU0hBUkVEKTsKKwkJCWVudHJ5ID0gQ2hh bm5lbEhhc2hMb29rdXAoY2hhbm5lbCk7CisKKwkJCWlmIChlbnRyeSAmJiAhZW50cnktPmhh c19tdWx0aXBsZV9saXN0ZW5lcnMpCisJCQl7CisJCQkJUHJvY051bWJlcglpID0gZW50cnkt Pmxpc3RlbmVyOworCQkJCWludDMyCQlwaWQ7CisJCQkJUXVldWVQb3NpdGlvbiBwb3M7CisK KwkJCQlpZiAoc2lnbmFsZWRbaV0pCisJCQkJeworCQkJCQlMV0xvY2tSZWxlYXNlKGxvY2sp OworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlwb3MgPSBRVUVVRV9CQUNLRU5EX1BP UyhpKTsKKworCQkJCWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBRVUVVRV9IRUFEKSkKKwkJ CQl7CisJCQkJCUxXTG9ja1JlbGVhc2UobG9jayk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0K KworCQkJCWlmIChRVUVVRV9CQUNLRU5EX0RCT0lEKGkpICE9IE15RGF0YWJhc2VJZCkKKwkJ CQl7CisJCQkJCUxXTG9ja1JlbGVhc2UobG9jayk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0K KworCQkJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOworCQkJCUFzc2VydChwaWQgIT0g SW52YWxpZFBpZCk7CisKKwkJCQlwaWRzW2NvdW50XSA9IHBpZDsKKwkJCQlwcm9jbm9zW2Nv dW50XSA9IGk7CisJCQkJc2lnbmFsZWRbaV0gPSB0cnVlOworCQkJCWNvdW50Kys7CisJCQl9 CisJCQlMV0xvY2tSZWxlYXNlKGxvY2spOwogCQl9CisJfQorCisJLyoKKwkgKiBBbHNvIGNo ZWNrIGZvciBhbnkgYmFja2VuZHMgdGhhdCBhcmUgZmFyIGJlaGluZC4gVGhpcyBlbnN1cmVz IHRoZQorCSAqIGdsb2JhbCB0YWlsIGNhbiBhZHZhbmNlIGV2ZW4gaWYgdGhleSdyZSBub3Qg YWN0aXZlbHkgcmVjZWl2aW5nCisJICogbm90aWZpY2F0aW9ucyBvbiB0aGVpciBjaGFubmVs cy4KKwkgKi8KKwlmb3IgKFByb2NOdW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RFTkVSOyBp ICE9IElOVkFMSURfUFJPQ19OVU1CRVI7IGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpKQor CXsKKwkJaW50MzIJCXBpZDsKKwkJUXVldWVQb3NpdGlvbiBwb3M7CisKKwkJLyoKKwkJICog U2tpcCBpZiB3ZSd2ZSBhbHJlYWR5IGRlY2lkZWQgdG8gc2lnbmFsIHRoaXMgb25lLgorCQkg Ki8KKwkJaWYgKHNpZ25hbGVkW2ldKQorCQkJY29udGludWU7CisKKwkJcG9zID0gUVVFVUVf QkFDS0VORF9QT1MoaSk7CisKKwkJLyoKKwkJICogU2tpcCBzaWduYWxpbmcgbGlzdGVuZXJz IGlmIHRoZXkgYWxyZWFkeSBjYXVnaHQgdXAuCisJCSAqLworCQlpZiAoUVVFVUVfUE9TX0VR VUFMKHBvcywgUVVFVUVfSEVBRCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXYWtl IG9ubHkgdGFpbCBvcHRpbWl6YXRpb246IFNpZ25hbCB0aGUgYmFja2VuZCB0aGF0IGlzIGZ1 cnRoZXN0CisJCSAqIGJlaGluZCB0byBoZWxwIHByZXZlbnQgYmFja2VuZHMgZnJvbSBnZXR0 aW5nIGZhciBiZWhpbmQgaW4gdGhlCisJCSAqIGZpcnN0IHBsYWNlLiBUaGlzIGZpbmRzIHRo ZSBiYWNrZW5kKHMpIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlCisJCSAqIGdsb2JhbCB0YWls LCB3aGljaCBhcmUgdGhlIG9uZXMgaG9sZGluZyB1cCB0cnVuY2F0aW9uLiBUaGlzIGNyZWF0 ZXMKKwkJICogYSBjaGFpbiByZWFjdGlvbiB3aGVyZSBlYWNoIGJhY2tlbmQgZXZlbnR1YWxs eSB3YWtlcyB1cCB0aGUgbmV4dAorCQkgKiBvbmUgYXMgbm90aWZpY2F0aW9ucyBhcmUgcHJv Y2Vzc2VkLCBhdm9pZGluZyB0aHVuZGVyaW5nIGhlcmQuCisJCSAqLworCQlpZiAoIXRhaWxf d29rZW4gJiYgYXN5bmNRdWV1ZVBhZ2VEaWZmKFFVRVVFX1BPU19QQUdFKFFVRVVFX1RBSUwp LAorCQkJCQkJCQkJCQkgIFFVRVVFX1BPU19QQUdFKHBvcykpID09IDApCisJCQl0YWlsX3dv a2VuID0gdHJ1ZTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJcGlkID0gUVVFVUVfQkFD S0VORF9QSUQoaSk7CisJCUFzc2VydChwaWQgIT0gSW52YWxpZFBpZCk7CiAJCS8qIE9LLCBu ZWVkIHRvIHNpZ25hbCB0aGlzIG9uZSAqLwogCQlwaWRzW2NvdW50XSA9IHBpZDsKIAkJcHJv Y25vc1tjb3VudF0gPSBpOwogCQljb3VudCsrOwogCX0KKwogCUxXTG9ja1JlbGVhc2UoTm90 aWZ5UXVldWVMb2NrKTsKIAogCS8qIE5vdyBzZW5kIHNpZ25hbHMgKi8KQEAgLTE2NDcsOSAr MjAwMSw5IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAKIAkJLyoKIAkJICogTm90ZTogYXNz dW1pbmcgdGhpbmdzIGFyZW4ndCBicm9rZW4sIGEgc2lnbmFsIGZhaWx1cmUgaGVyZSBjb3Vs ZAotCQkgKiBvbmx5IG9jY3VyIGlmIHRoZSB0YXJnZXQgYmFja2VuZCBleGl0ZWQgc2luY2Ug d2UgcmVsZWFzZWQKLQkJICogTm90aWZ5UXVldWVMb2NrOyB3aGljaCBpcyB1bmxpa2VseSBi dXQgY2VydGFpbmx5IHBvc3NpYmxlLiBTbyB3ZQotCQkgKiBqdXN0IGxvZyBhIGxvdy1sZXZl bCBkZWJ1ZyBtZXNzYWdlIGlmIGl0IGhhcHBlbnMuCisJCSAqIG9ubHkgb2NjdXIgaWYgdGhl IHRhcmdldCBiYWNrZW5kIGV4aXRlZCBzaW5jZSB3ZSByZWxlYXNlZCB0aGUgbG9jazsKKwkJ ICogd2hpY2ggaXMgdW5saWtlbHkgYnV0IGNlcnRhaW5seSBwb3NzaWJsZS4gU28gd2UganVz dCBsb2cgYQorCQkgKiBsb3ctbGV2ZWwgZGVidWcgbWVzc2FnZSBpZiBpdCBoYXBwZW5zLgog CQkgKi8KIAkJaWYgKFNlbmRQcm9jU2lnbmFsKHBpZCwgUFJPQ1NJR19OT1RJRllfSU5URVJS VVBULCBwcm9jbm9zW2ldKSA8IDApCiAJCQllbG9nKERFQlVHMywgImNvdWxkIG5vdCBzaWdu YWwgYmFja2VuZCB3aXRoIFBJRCAlZDogJW0iLCBwaWQpOwpAQCAtMTY1Nyw2ICsyMDExLDcg QEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAogCXBmcmVlKHBpZHMpOwogCXBmcmVlKHByb2Nu b3MpOworCXBmcmVlKHNpZ25hbGVkKTsKIH0KIAogLyoKQEAgLTIzOTUsMyArMjc1MCwyNTYg QEAgY2hlY2tfbm90aWZ5X2J1ZmZlcnMoaW50ICpuZXd2YWwsIHZvaWQgKipleHRyYSwgR3Vj U291cmNlIHNvdXJjZSkKIHsKIAlyZXR1cm4gY2hlY2tfc2xydV9idWZmZXJzKCJub3RpZnlf YnVmZmVycyIsIG5ld3ZhbCk7CiB9CisKKy8qCisgKiBDaGFubmVsIGhhc2ggdGFibGUgbWFu YWdlbWVudCBmdW5jdGlvbnMKKyAqLworCisvKgorICogY2hhbm5lbF9oYXNoX2Z1bmMKKyAq ICAgICBDdXN0b20gaGFzaCBmdW5jdGlvbiBmb3IgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4g VGhpcyBmdW5jdGlvbiBlbnN1cmVzCisgKiAgICAgdGhhdCB0aGUgbG93LW9yZGVyIGJpdHMg b2YgdGhlIGhhc2ggYXJlIHdlbGwtZGlzdHJpYnV0ZWQsIHdoaWNoIGlzCisgKiAgICAgY3Jp dGljYWwgZm9yIHBhcnRpdGlvbmVkIGhhc2ggdGFibGVzLgorICovCitzdGF0aWMgdWludDMy CitjaGFubmVsX2hhc2hfZnVuYyhjb25zdCB2b2lkICprZXksIFNpemUga2V5c2l6ZSkKK3sK Kwljb25zdAkJQ2hhbm5lbEhhc2hLZXkgKmsgPSAoY29uc3QgQ2hhbm5lbEhhc2hLZXkgKikg a2V5OworCXVpbnQzMgkJaDsKKworCS8qCisJICogTWl4IHRoZSBkYm9pZCBhbmQgdGhlIGNo YW5uZWwgbmFtZSB0byBwcm9kdWNlIGEgZ29vZCBoYXNoLiBoYXNoX2FueSgpCisJICogaXMg YSBoaWdoLXF1YWxpdHkgcG9ydGFibGUgaGFzaCBmdW5jdGlvbi4gVGhpcyBwcmV2ZW50cyBj aGFubmVscyB3aXRoCisJICogdGhlIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgZGF0YWJhc2Vz IGZyb20gYWx3YXlzIG1hcHBpbmcgdG8gdGhlIHNhbWUKKwkgKiBwYXJ0aXRpb24uCisJICov CisJaCA9IERhdHVtR2V0VUludDMyKGhhc2hfdWludDMyKGstPmRib2lkKSk7CisJaCBePSBE YXR1bUdldFVJbnQzMihoYXNoX2FueSgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBrLT5jaGFu bmVsLAorCQkJCQkJCQkgc3RybmxlbihrLT5jaGFubmVsLCBOQU1FREFUQUxFTikpKTsKKwor CXJldHVybiBoOworfQorCisvKgorICogR2V0Q2hhbm5lbEhhc2hMb2NrCisgKiAgICAgUmV0 dXJuIHRoZSBMV0xvY2sgdGhhdCBwcm90ZWN0cyB0aGUgcGFydGl0aW9uIGZvciB0aGUgZ2l2 ZW4gY2hhbm5lbCBuYW1lLgorICovCitzdGF0aWMgTFdMb2NrICoKK0dldENoYW5uZWxIYXNo TG9jayhjb25zdCBjaGFyICpjaGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwl1 aW50MzIJCWhhc2g7CisKKwlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFz ZUlkLCBjaGFubmVsKTsKKwloYXNoID0gZ2V0X2hhc2hfdmFsdWUoR2V0Q2hhbm5lbEhhc2go KSwgJmtleSk7CisKKwlyZXR1cm4gJmNoYW5uZWxIYXNoTG9ja3NbaGFzaCAlIE5VTV9OT1RJ RllfUEFSVElUSU9OU107Cit9CisKKy8qCisgKiBDaGFubmVsSGFzaFByZXBhcmVLZXkKKyAq CQlQcmVwYXJlIGEgY2hhbm5lbCBrZXkgKGRhdGFiYXNlIE9JRCArIGNoYW5uZWwgbmFtZSkg Zm9yIHVzZSBhcyBhIGhhc2gga2V5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0NoYW5u ZWxIYXNoUHJlcGFyZUtleShDaGFubmVsSGFzaEtleSAqIGtleSwgT2lkIGRib2lkLCBjb25z dCBjaGFyICpjaGFubmVsKQoreworCW1lbXNldChrZXksIDAsIHNpemVvZihDaGFubmVsSGFz aEtleSkpOworCWtleS0+ZGJvaWQgPSBkYm9pZDsKKwlzdHJsY3B5KGtleS0+Y2hhbm5lbCwg Y2hhbm5lbCwgTkFNRURBVEFMRU4pOworfQorCisvKgorICogQ2hhbm5lbEhhc2hBZGRMaXN0 ZW5lcgorICogICAgIFJlZ2lzdGVyIHRoZSBnaXZlbiBiYWNrZW5kIGFzIGEgbGlzdGVuZXIg Zm9yIHRoZSBzcGVjaWZpZWQgY2hhbm5lbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHVzZXMg YW4gb3B0aW1pc3RpYyByZWFkLWxvY2tpbmcgc3RyYXRlZ3kgdG8gbWF4aW1pemUKKyAqIGNv bmN1cnJlbmN5IHdoZW4gbWFueSBiYWNrZW5kcyBsaXN0ZW4gb24gdGhlIHNhbWUgY2hhbm5l bC4KKyAqCisgKiAxLiBJdCBmaXJzdCB0YWtlcyBhIHNoYXJlZCBsb2NrIGFuZCBjaGVja3Mg dGhlIGNoYW5uZWwncyBzdGF0ZS4gSWYgdGhlCisgKiAgICBjaGFubmVsIGlzIGFscmVhZHkg bWFya2VkIGFzIGhhdmluZyBtdWx0aXBsZSBsaXN0ZW5lcnMsIG5vIHdyaXRlIGlzCisgKiAg ICBuZWVkZWQsIGFuZCB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LiBUaGlzIGlzIHRoZSBm YXN0IHBhdGggZm9yIHRoZQorICogICAgM3JkLCA0dGgsIGV0Yy4sIGxpc3RlbmVyIG9uIGEg Z2l2ZW4gY2hhbm5lbC4KKyAqCisgKiAyLiBJZiBhIHdyaXRlIGlzIG5lZWRlZCAoZWl0aGVy IHRvIGNyZWF0ZSB0aGUgZW50cnkgb3IgdG8gbWFyayBpdCBhcworICogICAgbXVsdGktbGlz dGVuZXIpLCBpdCByZWxlYXNlcyB0aGUgc2hhcmVkIGxvY2sgYW5kIGFjcXVpcmVzIGFuIGV4 Y2x1c2l2ZQorICogICAgbG9jay4KKyAqCisgKiAzLiBDUlVDSUFMTFksIGFmdGVyIGFjcXVp cmluZyB0aGUgZXhjbHVzaXZlIGxvY2ssIGl0IG11c3QgcmUtY2hlY2sgdGhlCisgKiAgICBz dGF0ZSwgYXMgYW5vdGhlciBiYWNrZW5kIG1heSBoYXZlIG1vZGlmaWVkIHRoZSBlbnRyeSBp biB0aGUgaW50ZXJpbS4KKyAqLworc3RhdGljIHZvaWQKK0NoYW5uZWxIYXNoQWRkTGlzdGVu ZXIoY29uc3QgY2hhciAqY2hhbm5lbCwgUHJvY051bWJlciBwcm9jbm8pCit7CisJQ2hhbm5l bEVudHJ5ICplbnRyeTsKKwlib29sCQlmb3VuZDsKKwlDaGFubmVsSGFzaEtleSBrZXk7CisJ TFdMb2NrCSAgICpsb2NrID0gR2V0Q2hhbm5lbEhhc2hMb2NrKGNoYW5uZWwpOworCisJQ2hh bm5lbEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisKKwkv KgorCSAqIEZBU1QgUEFUSDogT3B0aW1pc3RpY2FsbHkgdGFrZSBhIHNoYXJlZCBsb2NrLiBJ ZiB0aGUgY2hhbm5lbCBhbHJlYWR5CisJICogaGFzIG11bHRpcGxlIGxpc3RlbmVycywgd2Ug ZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKwkgKi8KKwlMV0xvY2tBY3F1aXJlKGxvY2ss IExXX1NIQVJFRCk7CisJZW50cnkgPSAoQ2hhbm5lbEVudHJ5ICopIGhhc2hfc2VhcmNoKEdl dENoYW5uZWxIYXNoKCksICZrZXksIEhBU0hfRklORCwgTlVMTCk7CisJaWYgKGVudHJ5ICYm IGVudHJ5LT5oYXNfbXVsdGlwbGVfbGlzdGVuZXJzKQorCXsKKwkJTFdMb2NrUmVsZWFzZShs b2NrKTsKKwkJcmV0dXJuOworCX0KKwlMV0xvY2tSZWxlYXNlKGxvY2spOworCisJLyoKKwkg KiBTTE9XIFBBVEg6IFdlIG5lZWQgdG8gd3JpdGUuIEFjcXVpcmUgZXhjbHVzaXZlIGxvY2su CisJICovCisJTFdMb2NrQWNxdWlyZShsb2NrLCBMV19FWENMVVNJVkUpOworCisJLyoKKwkg KiBSZS1jaGVjayBzdGF0ZSBhZnRlciBhY3F1aXJpbmcgZXhjbHVzaXZlIGxvY2ssIGFzIGl0 IG1heSBoYXZlIGNoYW5nZWQuCisJICovCisJZW50cnkgPSAoQ2hhbm5lbEVudHJ5ICopIGhh c2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCksICZrZXksIEhBU0hfRU5URVJfTlVMTCwgJmZv dW5kKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKQorCXsKKwkJLyogT3V0IG9mIG1lbW9yeSBp biB0aGUgaGFzaCBwYXJ0aXRpb24uICovCisJCWVyZXBvcnQoREVCVUcxLCAoZXJybXNnKCJ0 b28gbWFueSBub3RpZmljYXRpb24gY2hhbm5lbHMgYXJlIGFscmVhZHkgYmVpbmcgdHJhY2tl ZCIpKSk7CisJCUxXTG9ja1JlbGVhc2UobG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAo IWZvdW5kKQorCXsKKwkJLyogV2UgYXJlIHRoZSBmaXJzdCBsaXN0ZW5lci4gKi8KKwkJZW50 cnktPmxpc3RlbmVyID0gcHJvY25vOworCQllbnRyeS0+aGFzX211bHRpcGxlX2xpc3RlbmVy cyA9IGZhbHNlOworCX0KKwllbHNlIGlmICghZW50cnktPmhhc19tdWx0aXBsZV9saXN0ZW5l cnMpCisJeworCQkvKiBXZSBhcmUgdGhlIHNlY29uZCBsaXN0ZW5lci4gKi8KKwkJaWYgKGVu dHJ5LT5saXN0ZW5lciAhPSBwcm9jbm8pCisJCXsKKwkJCWVudHJ5LT5oYXNfbXVsdGlwbGVf bGlzdGVuZXJzID0gdHJ1ZTsKKwkJCWVudHJ5LT5saXN0ZW5lciA9IElOVkFMSURfUFJPQ19O VU1CRVI7CisJCX0KKwl9CisJLyogSWYgZW50cnktPmhhc19tdWx0aXBsZV9saXN0ZW5lcnMg aXMgbm93IHRydWUsIGRvIG5vdGhpbmcuICovCisJTFdMb2NrUmVsZWFzZShsb2NrKTsKK30K KworLyoKKyAqIENoYW5uZWxIYXNoUmVtb3ZlTGlzdGVuZXIKKyAqCQlVcGRhdGUgdGhlIGNo YW5uZWwgaGFzaCB3aGVuIGEgYmFja2VuZCBzdG9wcyBsaXN0ZW5pbmcgb24gYSBjaGFubmVs LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyBhbiBvcHRpbWlzdGljIHJlYWQtbG9jayBz dHJhdGVneSB0byBtYXhpbWl6ZSBjb25jdXJyZW5jeS4KKyAqIEFuIGV4Y2x1c2l2ZSBsb2Nr IGlzIG9ubHkgdGFrZW4gaWYgd2UgYXJlIHRoZSBzb2xlIGxpc3RlbmVyIG9uIGEgY2hhbm5l bAorICogYW5kIG5lZWQgdG8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBoYXNoIHRhYmxl LgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcihjb25zdCBj aGFyICpjaGFubmVsLCBQcm9jTnVtYmVyIHByb2NubykKK3sKKwlDaGFubmVsRW50cnkgKmVu dHJ5OworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlMV0xvY2sJICAgKmxvY2sgPSBHZXRDaGFu bmVsSGFzaExvY2soY2hhbm5lbCk7CisKKwlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwg TXlEYXRhYmFzZUlkLCBjaGFubmVsKTsKKworCS8qCisJICogVGFrZSBhIHNoYXJlZCBsb2Nr IGZpcnN0IHRvIHNlZSBpZiBhIHJlbW92YWwgaXMgZXZlbiBuZWNlc3NhcnkuIElmIHRoZQor CSAqIGVudHJ5IGRvZXNuJ3QgZXhpc3QsIG9yIGl0J3MgYSBtdWx0aS1saXN0ZW5lciBlbnRy eSwgd2UgaGF2ZSBub3RoaW5nIHRvCisJICogZG8uIFRoaXMgaXMgdGhlIGZhc3QgcGF0aC4K KwkgKi8KKwlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX1NIQVJFRCk7CisJZW50cnkgPSAoQ2hh bm5lbEVudHJ5ICopIGhhc2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCksICZrZXksIEhBU0hf RklORCwgTlVMTCk7CisJaWYgKCFlbnRyeSB8fCBlbnRyeS0+aGFzX211bHRpcGxlX2xpc3Rl bmVycyB8fCBlbnRyeS0+bGlzdGVuZXIgIT0gcHJvY25vKQorCXsKKwkJTFdMb2NrUmVsZWFz ZShsb2NrKTsKKwkJcmV0dXJuOworCX0KKwlMV0xvY2tSZWxlYXNlKGxvY2spOworCisJLyoK KwkgKiBBIHJlbW92YWwgaXMgbGlrZWx5IG5lZWRlZC4gQWNxdWlyZSBhbiBleGNsdXNpdmUg bG9jay4KKwkgKi8KKwlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkv KgorCSAqIFJlLWNoZWNrIHRoZSBzdGF0ZSwgYXMgYW5vdGhlciBiYWNrZW5kIG1pZ2h0IGhh dmUgY2hhbmdlZCBpdC4gVGhlIG9ubHkKKwkgKiBzdGF0ZSBjaGFuZ2Ugd2UgY2FyZSBhYm91 dCBpcyBpZiBpdCBiZWNhbWUgYSBtdWx0aS1saXN0ZW5lciBjaGFubmVsLCBpbgorCSAqIHdo aWNoIGNhc2Ugd2Ugc2hvdWxkIG5vIGxvbmdlciByZW1vdmUgaXQuCisJICovCisJZW50cnkg PSAoQ2hhbm5lbEVudHJ5ICopIGhhc2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCksICZrZXks IEhBU0hfRklORCwgTlVMTCk7CisJaWYgKGVudHJ5ICYmICFlbnRyeS0+aGFzX211bHRpcGxl X2xpc3RlbmVycyAmJiBlbnRyeS0+bGlzdGVuZXIgPT0gcHJvY25vKQorCXsKKwkJLyogU3Rp bGwgYSBzaW5nbGUtbGlzdGVuZXIgZW50cnkgZm9yIHVzLCBzbyByZW1vdmUgaXQuICovCisJ CSh2b2lkKSBoYXNoX3NlYXJjaChHZXRDaGFubmVsSGFzaCgpLCAma2V5LCBIQVNIX1JFTU9W RSwgTlVMTCk7CisJfQorCUxXTG9ja1JlbGVhc2UobG9jayk7Cit9CisKKy8qCisgKiBDaGFu bmVsSGFzaExvb2t1cAorICoJCUxvb2sgdXAgdGhlIGNoYW5uZWwgaGFzaCBlbnRyeSBmb3Ig dGhlIGdpdmVuIGNoYW5uZWwgbmFtZSBpbiB0aGUKKyAqCQljdXJyZW50IGRhdGFiYXNlLgor ICoKKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgY2hhbm5lbCBpcyBub3QgYmVpbmcgdHJhY2tl ZCAobm8gbGlzdGVuZXJzLCBvciBjaGFubmVsCisgKiBmZWxsIGJhY2sgdG8gYnJvYWRjYXN0 IG1vZGUgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIHNoYXJlZCBtZW1vcnkgd2hlbiB0cnlpbmcK KyAqIHRvIGFkZCBlbnRyaWVzIHRvIHRoZSBoYXNoIHRhYmxlKS4KKyAqCisgKiBDYWxsZXIg bXVzdCBob2xkIHRoZSBhcHByb3ByaWF0ZSBwYXJ0aXRpb24gbG9jayAoc2hhcmVkIGlzIHN1 ZmZpY2llbnQpLgorICovCitzdGF0aWMgQ2hhbm5lbEVudHJ5ICoKK0NoYW5uZWxIYXNoTG9v a3VwKGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7CisJQ2hhbm5lbEhhc2hLZXkga2V5OworCisJ QXNzZXJ0KExXTG9ja0hlbGRCeU1lKEdldENoYW5uZWxIYXNoTG9jayhjaGFubmVsKSkpOwor CisJQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7 CisKKwlyZXR1cm4gKENoYW5uZWxFbnRyeSAqKSBoYXNoX3NlYXJjaChHZXRDaGFubmVsSGFz aCgpLAorCQkJCQkJCQkJCSZrZXksCisJCQkJCQkJCQkJSEFTSF9GSU5ELAorCQkJCQkJCQkJ CU5VTEwpOworfQorCisvKgorICogR2V0UGVuZGluZ05vdGlmeUNoYW5uZWxzCisgKgkJR2V0 IGxpc3Qgb2YgdW5pcXVlIGNoYW5uZWwgbmFtZXMgZnJvbSBwZW5kaW5nIG5vdGlmaWNhdGlv bnMuCisgKi8KK3N0YXRpYyBMaXN0ICoKK0dldFBlbmRpbmdOb3RpZnlDaGFubmVscyh2b2lk KQoreworCUxpc3QJICAgKmNoYW5uZWxzID0gTklMOworCUxpc3RDZWxsICAgKnA7CisJTGlz dENlbGwgICAqcTsKKwlib29sCQlmb3VuZDsKKworCWlmICghcGVuZGluZ05vdGlmaWVzKQor CQlyZXR1cm4gTklMOworCisJLyogQ29sbGVjdCB1bmlxdWUgY2hhbm5lbCBuYW1lcyBmcm9t IHBlbmRpbmcgbm90aWZpY2F0aW9ucyAqLworCWZvcmVhY2gocCwgcGVuZGluZ05vdGlmaWVz LT5ldmVudHMpCisJeworCQlOb3RpZmljYXRpb24gKm4gPSAoTm90aWZpY2F0aW9uICopIGxm aXJzdChwKTsKKwkJY2hhcgkgICAqY2hhbm5lbCA9IG4tPmRhdGE7CisKKwkJLyogQ2hlY2sg aWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgY2hhbm5lbCBpbiBvdXIgbGlzdCAqLworCQlmb3Vu ZCA9IGZhbHNlOworCQlmb3JlYWNoKHEsIGNoYW5uZWxzKQorCQl7CisJCQljaGFyCSAgICpl eGlzdGluZyA9IChjaGFyICopIGxmaXJzdChxKTsKKworCQkJaWYgKHN0cmNtcChleGlzdGlu ZywgY2hhbm5lbCkgPT0gMCkKKwkJCXsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7 CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQkJY2hhbm5lbHMgPSBsYXBwZW5kKGNo YW5uZWxzLCBjaGFubmVsKTsKKwl9CisKKwlyZXR1cm4gY2hhbm5lbHM7Cit9Ci0tIAoyLjQ3 LjEKCg== --6077eb32e4c447f28c609ca08c4b8731--