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 1uaish-008xDj-TT for pgsql-hackers@arkaria.postgresql.org; Sat, 12 Jul 2025 22:39:44 +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 1uairg-00Bhcw-2D for pgsql-hackers@arkaria.postgresql.org; Sat, 12 Jul 2025 22:38:40 +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 1uairf-00Bhco-0s for pgsql-hackers@lists.postgresql.org; Sat, 12 Jul 2025 22:38:40 +0000 Received: from fout-b6-smtp.messagingengine.com ([202.12.124.149]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1uairc-006zHF-2i for pgsql-hackers@postgresql.org; Sat, 12 Jul 2025 22:38:38 +0000 Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfout.stl.internal (Postfix) with ESMTP id 8232F1D000F5 for ; Sat, 12 Jul 2025 18:38:35 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Sat, 12 Jul 2025 18:38:35 -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 :message-id:mime-version:reply-to:subject:subject:to:to; s=fm2; t=1752359915; x=1752446315; bh=CZvfJrrGbIa+9T/cBx8z+Yq8uWXgvfq6 ObZ/igGG/bI=; b=L6gcH2YKjdQzGB0wwbNNxmtFTOaweQIU3LQA9U2gDoSpONdI E8zZxn5iUlG2itcMj4KqboXQX552ztnFjTCHLrMntybiKk7eHgfNO+8IJTK3dObT BlCOT/mqFGX73Xj1toXBrvHmaI1AhYGWHMgxurwxz0llzgCSgtp+6nWZ4a9kByEl wJdL2GEuzk5inlWGYD8WBspqTWsA8mJeBM02kx9usB7x1tZAwYAuUXqAVNKPkTp/ Mntq4MNrzYsZWb8J4rZmb6IJ5jwH4z54Dxkoh9WJDC2ifR1UHESWI3FmNVgs0yGP fKIDbz/KT77jfyRSuUSP8gKPyW47Dx8xY3cWIw== 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:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1752359915; x= 1752446315; bh=CZvfJrrGbIa+9T/cBx8z+Yq8uWXgvfq6ObZ/igGG/bI=; b=b 0y3gXMxKMv3431l3xju8MDcCPmcPWjE6op7W47DNMTbb9nryMFlfYZ+509NHfrJa h5dxxsr/o0IoNA8goW0rKs/VmXjY2i/iulhB4XJsby7OXFs0/NyetLiKplklQOkJ l38ffWaVmb352uyCQgR/0CUcfXk0zrZGAzB1A7Hx8/PWWHX4gd2qz4zG0HI/BKzY 1YsJvnPwYtuvtuDj1k0Vmg05Ex1x+CgB8svOjWrM7q6reCPpJ03kBkiz0gpo5oGk fNZfgn5wdMpi2L6n1fonmMWWJDErGgAeRRap4P/J6vHPToSbs0ocJGVOuSzmWAQf 60h3710xInRpCQ+34QK9Q== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdegjeegudcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepofggfffhvffkufgtsehmtderreertddtne cuhfhrohhmpedflfhovghlucflrggtohgsshhonhdfuceojhhovghlsegtohhmphhilhgv rhdrohhrgheqnecuggftrfgrthhtvghrnhephedtvedtgefgffefgfekgeefheduuefftd ekuefgvedvvdduheelgfdtveekuddunecuffhomhgrihhnpehgihhthhhusgdrtghomhen ucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehjohgvlh estghomhhpihhlvghrrdhorhhgpdhnsggprhgtphhtthhopedupdhmohguvgepshhmthhp ohhuthdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehpohhsthhgrhgvshhqlh drohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id B011E18E0063; Sat, 12 Jul 2025 18:38:34 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: T90889ce1c5a9472e Date: Sun, 13 Jul 2025 00:35:21 +0200 From: "Joel Jacobson" To: pgsql-hackers Message-Id: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> Subject: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=e60477712d0242898ea7170d4a00c39c List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --e60477712d0242898ea7170d4a00c39c Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi hackers, The current LISTEN/NOTIFY implementation is well-suited for use-cases like cache invalidation where many backends listen on the same channel. However, its scalability is limited when many backends listen on distinct channels. The root of the problem is that Async_Notify must signal every listening backend in the database, as it lacks central knowledge of which backend is interested in which channel. This results in an O(N) number of kill(pid, SIGUSR1) syscalls as the listener count grows. 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. When NOTIFY is issued, we first check this table. If a single listener is found, we signal only that backend. Otherwise, we fall back to the existing broadcast behavior. The performance impact for this pattern is significant. A benchmark [1] measuring a NOTIFY "ping-pong" between two connections, while adding a variable number of idle listeners, shows the following: master (8893c3a): 0 extra listeners: 9126 TPS 10 extra listeners: 6233 TPS 100 extra listeners: 2020 TPS 1000 extra listeners: 238 TPS 0001-Optimize-LISTEN-NOTIFY-signaling-for-single-listener.patch: 0 extra listeners: 9152 TPS 10 extra listeners: 9352 TPS 100 extra listeners: 9320 TPS 1000 extra listeners: 8937 TPS As you can see, the patched version's performance is near O(1) with respect to the number of idle listeners, while the current implementation shows the expected O(N) degradation. This patch is a first-step. It uses a simple boolean has_multiple_listeners flag in the hash entry. Once a channel gets a second listener, this flag is set and, crucially, never cleared. The entry will then permanently indicate "multiple listeners", even after all backends on that channel disconnect. A more complete solution would likely use reference counting for each channel's listeners. This would solve the "stuck entry" problem and could also enable a further optimization: targeted signaling to all listeners of a multi-user channel, avoiding the database-wide broadcast entirely. The patch also includes a "wake only tail" optimization (contributed by Marko Tikkaja) to help prevent backends from falling too far behind. Instead of waking all lagging backends at once and creating a "thundering herd", this logic signals only the single backend that is currently at the queue tail. This ensures the global queue tail can always advance, relying on a chain reaction to get backends caught up efficiently. This seems like a sensible improvement in its own right. Thoughts? /Joel [1] Benchmark tool and full results: https://github.com/joelonsql/pg-bench-listen-notify --e60477712d0242898ea7170d4a00c39c Content-Disposition: attachment; filename*0="0001-Optimize-LISTEN-NOTIFY-signaling-for-single-listener.pat"; filename*1="ch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-Optimize-LISTEN-NOTIFY-signaling-for-single-listener.patc?= =?UTF-8?Q?h?=" Content-Transfer-Encoding: base64 RnJvbSBhYmEwZmZiMmE5ZTFjNWQ3NzM5M2E5MmMwY2U0M2E5NjhjMjNjYmI1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAxNSBKdW4gMjAyNSAwMDowOTo0MyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIE9wdGltaXplIExJU1RFTi9OT1RJRlkgc2lnbmFsaW5nIGZvciBzaW5nbGUtbGlzdGVu ZXIgY2hhbm5lbHMKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWlu OyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKClByZXZp b3VzbHksIHRoZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBzaWduYWwgZXZlcnkgYmFja2VuZCBw cm9jZXNzIHRoYXQgd2FzCmxpc3RlbmluZyBvbiBhbnkgY2hhbm5lbCBpbiB0aGUgc2FtZSBk YXRhYmFzZS4gVGhpcyBzaWduYWxpbmcgaXMgcGVyZm9ybWVkIHZpYQpTZW5kUHJvY1NpZ25h bCgpLCB3aGljaCB1bHRpbWF0ZWx5IGlzc3VlcyBhIGtpbGwocGlkLCBTSUdVU1IxKSBzeXNj YWxsIGZvciBlYWNoCmxpc3RlbmluZyBiYWNrZW5kLgoKVGhpcyBicm9hZGNhc3QgYXBwcm9h Y2ggaXMgd2VsbC1zdWl0ZWQgZm9yIHVzZSBjYXNlcyBsaWtlIGNhY2hlIGludmFsaWRhdGlv biBidXQKbGltaXRzIHRoZSBzY2FsYWJpbGl0eSBvZiBhcHBsaWNhdGlvbiBwYXR0ZXJucyB3 aGVyZSBiYWNrZW5kcyBsaXN0ZW4gb24gZGlzdGluY3QKY2hhbm5lbHMuIEZvciBleGFtcGxl LCBhIHN5c3RlbSBvZiB3b3JrZXIgcHJvY2Vzc2VzIG1pZ2h0IHVzZSB1bmlxdWUgY2hhbm5l bApuYW1lcyB0byBkaXJlY3Qgd29yayB0byBhIHNwZWNpZmljIHdvcmtlci4gSW4gdGhlc2Ug c2NlbmFyaW9zLCBhIE5PVElGWSBpbnRlbmRlZApmb3IgYSBzaW5nbGUgbGlzdGVuZXIgdW5u ZWNlc3NhcmlseSB0cmlnZ2VycyBhIHN5c2NhbGwgZm9yIGV2ZXJ5IG90aGVyIGxpc3Rlbmlu ZwpiYWNrZW5kLgoKVGhpcyBjb21taXQgaW1wcm92ZXMgc2NhbGFiaWxpdHkgZm9yIHN1Y2gg d29ya2xvYWRzIGJ5IG9wdGltaXppbmcgZm9yCnRoZSBzaW5nbGUtbGlzdGVuZXIgY2FzZS4g QnkgbWFraW5nIHRoaXMgcGF0dGVybiBtb3JlIHBlcmZvcm1hbnQsIHdlIGVuYWJsZSBpdAp0 byBiZSB1c2VkIG1vcmUgZWZmZWN0aXZlbHkgaW4gaGlnaC10aHJvdWdocHV0IHN5c3RlbXMs IHB1c2hpbmcgUG9zdGdyZVNRTCdzCnNjYWxhYmlsaXR5IGxpbWl0cyBmb3IgdGhpcyBjbGFz cyBvZiBhcHBsaWNhdGlvbnMuIEEgbmV3IHNoYXJlZCBtZW1vcnkgaGFzaAp0YWJsZSBpcyBp bnRyb2R1Y2VkIHRvIHRyYWNrIHdoaWNoIGJhY2tlbmQgcHJvY2VzcyBpcyBsaXN0ZW5pbmcg b24gZWFjaCBjaGFubmVsLgpXaGVuIGEgTk9USUZZIGlzIGlzc3VlZCwgaWYgYSBjaGFubmVs IGhhcyBleGFjdGx5IG9uZSByZWdpc3RlcmVkIGxpc3RlbmVyLCB3ZQpjYW4gc2lnbmFsIHRo YXQgc3BlY2lmaWMgYmFja2VuZCBkaXJlY3RseS4KClRoZSBzeXN0ZW0gZ3JhY2VmdWxseSBm YWxscyBiYWNrIHRvIGJyb2FkY2FzdCBiZWhhdmlvciB1bmRlciB0d28gY29uZGl0aW9uczoK CjEuIFdoZW4gYSBjaGFubmVsIGhhcyBtdWx0aXBsZSBiYWNrZW5kcyBsaXN0ZW5pbmcgdG8g aXQuCjIuIElmIHRoZSBzaGFyZWQgaGFzaCB0YWJsZSBydW5zIG91dCBvZiBtZW1vcnkgYW5k IGNhbm5vdCBjcmVhdGUgYSBuZXcgZW50cnkuCgpUbyBzdXBwb3J0IHRoaXMsIHRoZSBMSVNU RU4gYW5kIFVOTElTVEVOIGNvbW1hbmRzLCBhcyB3ZWxsIGFzIHRoZSBiYWNrZW5kIGV4aXQK Y2xlYW51cCBsb2dpYyBpbiBhc3luY1F1ZXVlVW5yZWdpc3RlciwgYXJlIHVwZGF0ZWQgdG8g bWFuYWdlIGVudHJpZXMgaW4gdGhlIG5ldwpjaGFubmVsIGhhc2ggdGFibGUuIFRoZSBtYWlu IHNpZ25hbGluZyBsb2dpYyBpbiBTaWduYWxCYWNrZW5kcyBoYXMgYmVlbiByZXdvcmtlZAp0 byBpbXBsZW1lbnQgdGhlIHRhcmdldGVkLXZzLWJyb2FkY2FzdCBkZWNpc2lvbi4KClRvIGVu c3VyZSB0aGUgZ2xvYmFsIHF1ZXVlIHRhaWwgY2FuIGFsd2F5cyBhZHZhbmNlLCB0aGlzIGNo YW5nZSBhbHNvIGluY2x1ZGVzIGEKIndha2Ugb25seSB0YWlsIiBvcHRpbWl6YXRpb24sIGNv bnRyaWJ1dGVkIGJ5IE1hcmtvIFRpa2thamEgKGpvaHRvKS4gSW5zdGVhZApvZiB3YWtpbmcg YWxsIGJhY2tlbmRzIHRoYXQgYXJlIGxhZ2dpbmcgZmFyIGJlaGluZCwgdGhpcyBsb2dpYyBz cGVjaWZpY2FsbHkKc2lnbmFscyBvbmx5IHRoZSBiYWNrZW5kIHRoYXQgaXMgY3VycmVudGx5 IGF0IHRoZSBxdWV1ZSB0YWlsLiBUaGlzIHRhcmdldGVkCndha2UtdXAgcHJldmVudHMgYSAi dGh1bmRlcmluZyBoZXJkIiBvZiBzaWduYWxzIGFuZCByZWxpZXMgb24gYSBjaGFpbgpyZWFj dGlvbuKAlHdoZXJlIGVhY2ggYmFja2VuZCB3YWtlcyB0aGUgbmV4dOKAlHRvIHByb2Nlc3Mg dGhlIHF1ZXVlIGVmZmljaWVudGx5LgpUaGlzIG1lY2hhbmlzbSB3b3JrcyBpbiBjb25qdW5j dGlvbiB3aXRoIGJvdGggdGhlIG5ldyB0YXJnZXRlZCBzaWduYWxpbmcgYW5kCnRoZSBicm9h ZGNhc3QgZmFsbGJhY2suCgpDQVZFQVQ6IFRoaXMgcGF0Y2ggc2hvdWxkIGJlIGNvbnNpZGVy ZWQgYSBmaXJzdC1zdGVwLCBwcm9vZi1vZi1jb25jZXB0Cm9wdGltaXphdGlvbi4gSXQgdXNl cyBhIHNpbXBsZSBib29sZWFuIGZsYWcgdG8gZGlzdGluZ3Vpc2ggc2luZ2xlLWxpc3RlbmVy CmNoYW5uZWxzIGZyb20gbXVsdGktbGlzdGVuZXIgb25lcyBhbmQgZG9lcyBub3QgdHJhY2sg dGhlIGZ1bGwgbGlzdCBvZiBiYWNrZW5kcwpmb3IgYSBtdWx0aS1saXN0ZW5lciBjaGFubmVs LiBBcyBhIHJlc3VsdCwgaXQgY2Fubm90IHJlbW92ZSBhIGhhc2ggZW50cnkgZm9yCmEgY2hh bm5lbCBvbmNlIGl0IGhhcyBiZWVuIG1hcmtlZCBhcyBoYXZpbmcgbXVsdGlwbGUgbGlzdGVu ZXJzLCBjYXVzaW5nIHN1Y2gKZW50cmllcyB0byBwZXJzaXN0IGV2ZW4gYWZ0ZXIgYWxsIGxp c3RlbmVycyBoYXZlIGRlcGFydGVkLiBBIG1vcmUgY29tcGxldGUKc29sdXRpb24gd291bGQg bGlrZWx5IGludm9sdmUgcmVmZXJlbmNlIGNvdW50aW5nIHRvIHRyYWNrIGFsbCBsaXN0ZW5p bmcgYmFja2VuZHMKZm9yIGVhY2ggY2hhbm5lbC4gVGhpcyB3b3VsZCBub3Qgb25seSBwcmV2 ZW50IHN0dWNrIGhhc2ggZW50cmllcyBidXQgY291bGQgYWxzbwplbmFibGUgdGFyZ2V0ZWQg c2lnbmFsaW5nIHRvIGFsbCBsaXN0ZW5lcnMgb2YgYSBzcGVjaWZpYyBtdWx0aS11c2VyIGNo YW5uZWwsCmZ1cnRoZXIgcmVmaW5pbmcgdGhlIG9wdGltaXphdGlvbiBhbmQgYXZvaWRpbmcg dGhlIGZhbGxiYWNrIHRvIGEgZnVsbApkYXRhYmFzZS13aWRlIGJyb2FkY2FzdC4KLS0tCiBz cmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jIHwgNTcyICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrLS0tCiAxIGZpbGUgY2hhbmdlZCwgNTM3IGluc2VydGlvbnMoKyksIDM1 IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5j LmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCmluZGV4IDRiZDM3ZDViZWI1Li5h MGI3ZGFhZWY3ZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYwor KysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCkBAIC0yNCw4ICsyNCwxMSBAQAog ICoJICBBbGwgbm90aWZpY2F0aW9uIG1lc3NhZ2VzIGFyZSBwbGFjZWQgaW4gdGhlIHF1ZXVl IGFuZCBsYXRlciByZWFkIG91dAogICoJICBieSBsaXN0ZW5pbmcgYmFja2VuZHMuCiAgKgot ICoJICBUaGVyZSBpcyBubyBjZW50cmFsIGtub3dsZWRnZSBvZiB3aGljaCBiYWNrZW5kIGxp c3RlbnMgb24gd2hpY2ggY2hhbm5lbDsKLSAqCSAgZXZlcnkgYmFja2VuZCBoYXMgaXRzIG93 biBsaXN0IG9mIGludGVyZXN0aW5nIGNoYW5uZWxzLgorICoJICBJbiBhZGRpdGlvbiB0byBl YWNoIGJhY2tlbmQgbWFpbnRhaW5pbmcgaXRzIG93biBsaXN0IG9mIGNoYW5uZWxzLCB3ZSBh bHNvCisgKgkgIG1haW50YWluIGEgY2VudHJhbCBoYXNoIHRhYmxlIHRoYXQgdHJhY2tzIGNo YW5uZWxzIHdpdGggc2luZ2xlIGxpc3RlbmVycy4KKyAqCSAgV2hlbiBhIGNoYW5uZWwgaGFz IGV4YWN0bHkgb25lIGxpc3RlbmluZyBiYWNrZW5kLCB3ZSBjYW4gc2lnbmFsIGp1c3QgdGhh dAorICoJICBiYWNrZW5kLiBGb3IgY2hhbm5lbHMgd2l0aCBtdWx0aXBsZSBsaXN0ZW5lcnMs IHdlIHNpZ25hbCBhbGwgbGlzdGVuaW5nCisgKgkgIGJhY2tlbmRzLgogICoKICAqCSAgQWx0 aG91Z2ggdGhlcmUgaXMgb25seSBvbmUgcXVldWUsIG5vdGlmaWNhdGlvbnMgYXJlIHRyZWF0 ZWQgYXMgYmVpbmcKICAqCSAgZGF0YWJhc2UtbG9jYWw7IHRoaXMgaXMgZG9uZSBieSBpbmNs dWRpbmcgdGhlIHNlbmRlcidzIGRhdGFiYXNlIE9JRApAQCAtNzEsMTMgKzc0LDE2IEBACiAg KgkgIG1ha2UgYW55IGFjdHVhbCB1cGRhdGVzIHRvIHRoZSBlZmZlY3RpdmUgbGlzdGVuIHN0 YXRlIChsaXN0ZW5DaGFubmVscykuCiAgKgkgIFRoZW4gd2Ugc2lnbmFsIGFueSBiYWNrZW5k cyB0aGF0IG1heSBiZSBpbnRlcmVzdGVkIGluIG91ciBtZXNzYWdlcwogICoJICAoaW5jbHVk aW5nIG91ciBvd24gYmFja2VuZCwgaWYgbGlzdGVuaW5nKS4gIFRoaXMgaXMgZG9uZSBieQot ICoJICBTaWduYWxCYWNrZW5kcygpLCB3aGljaCBzY2FucyB0aGUgbGlzdCBvZiBsaXN0ZW5p bmcgYmFja2VuZHMgYW5kIHNlbmRzIGEKLSAqCSAgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBU IHNpZ25hbCB0byBldmVyeSBsaXN0ZW5pbmcgYmFja2VuZCAod2UgZG9uJ3QKLSAqCSAga25v dyB3aGljaCBiYWNrZW5kIGlzIGxpc3RlbmluZyBvbiB3aGljaCBjaGFubmVsIHNvIHdlIG11 c3Qgc2lnbmFsIHRoZW0KLSAqCSAgYWxsKS4gIFdlIGNhbiBleGNsdWRlIGJhY2tlbmRzIHRo YXQgYXJlIGFscmVhZHkgdXAgdG8gZGF0ZSwgdGhvdWdoLCBhbmQKLSAqCSAgd2UgY2FuIGFs c28gZXhjbHVkZSBiYWNrZW5kcyB0aGF0IGFyZSBpbiBvdGhlciBkYXRhYmFzZXMgKHVubGVz cyB0aGV5Ci0gKgkgIGFyZSB3YXkgYmVoaW5kIGFuZCBzaG91bGQgYmUga2lja2VkIHRvIG1h a2UgdGhlbSBhZHZhbmNlIHRoZWlyCi0gKgkgIHBvaW50ZXJzKS4KKyAqCSAgU2lnbmFsQmFj a2VuZHMoKSwgd2hpY2ggaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb24sIGRlcGVuZGluZyBv bgorICoJICBpZiBhbnkgb2Ygb3VyIGNoYW5uZWxzIGhhdmUgbXVsdGlwbGUgbGlzdGVuaW5n IGJhY2tlbmRzIG9yIG5vdDoKKyAqCSAgYSkgSWYgdGhlcmUgYXJlIG11bHRpcGxlIGxpc3Rl bmluZyBiYWNrZW5kcywgYSBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQKKyAqCSAgc2lnbmFs IGlzIHNlbnQgdG8gZXZlcnkgbGlzdGVuaW5nIGJhY2tlbmQuCisgKgkgIGIpIE90aGVyd2lz ZSwgc3VjaCBzaWduYWxzIGFyZSBvbmx5IHNlbnQgdG8gZWFjaCBzaW5nbGUgbGlzdGVuaW5n IGJhY2tlbmQKKyAqCSAgcGVyIGNoYW5uZWwuCisgKgkgIEFkZGl0aW9uYWxseSwgd2UgdXNl IGEgIndha2Ugb25seSB0YWlsIiBvcHRpbWl6YXRpb246IHdlIGFsd2F5cyBzaWduYWwKKyAq CSAgdGhlIGJhY2tlbmQgZnVydGhlc3QgYmVoaW5kIGluIHRoZSBxdWV1ZSB0byBoZWxwIHBy ZXZlbnQgYmFja2VuZHMgZnJvbQorICoJICBnZXR0aW5nIGZhciBiZWhpbmQgYW5kIGNyZWF0 ZSBhIGNoYWluIHJlYWN0aW9uIG9mIHdha2UtdXBzLgorICoJICBXZSBjYW4gZXhjbHVkZSBi YWNrZW5kcyB0aGF0IGFyZSBhbHJlYWR5IHVwIHRvIGRhdGUsIHRob3VnaC4KICAqCiAgKgkg IEZpbmFsbHksIGFmdGVyIHdlIGFyZSBvdXQgb2YgdGhlIHRyYW5zYWN0aW9uIGFsdG9nZXRo ZXIgYW5kIGFib3V0IHRvIGdvCiAgKgkgIGlkbGUsIHdlIHNjYW4gdGhlIHF1ZXVlIGZvciBt ZXNzYWdlcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0byBvdXIKQEAgLTE0Niw2ICsxNTIsNyBA QAogI2luY2x1ZGUgInRjb3AvdGNvcHByb3QuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlu cy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgorI2luY2x1ZGUgInV0aWxzL2hz ZWFyY2guaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxz L3BzX3N0YXR1cy5oIgogI2luY2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKQEAgLTE2Miw2ICsx NjksNTggQEAKICAqLwogI2RlZmluZSBOT1RJRllfUEFZTE9BRF9NQVhfTEVOR1RICShCTENL U1ogLSBOQU1FREFUQUxFTiAtIDEyOCkKIAorLyoKKyAqIENoYW5uZWwgaGFzaCB0YWJsZSBk ZWZpbml0aW9ucworICoKKyAqIFRoaXMgaGFzaCB0YWJsZSBwcm92aWRlcyBhbiBvcHRpbWl6 YXRpb24gYnkgdHJhY2tpbmcgd2hpY2ggYmFja2VuZCBpcworICogbGlzdGVuaW5nIG9uIGVh Y2ggY2hhbm5lbC4gQ2hhbm5lbHMgYXJlIGlkZW50aWZpZWQgYnkgZGF0YWJhc2UgT0lEIGFu ZAorICogY2hhbm5lbCBuYW1lLCBtYWtpbmcgdGhlbSBkYXRhYmFzZS1zcGVjaWZpYy4KKyAq CisgKiBXaGVuIGV4YWN0bHkgb25lIGJhY2tlbmQgbGlzdGVucyBvbiBhIGNoYW5uZWwsIHdl IHNpZ25hbCB0aGF0IHNwZWNpZmljCisgKiBiYWNrZW5kLCBhdm9pZGluZyB1bm5lY2Vzc2Fy eSBzaWduYWxzIHRvIGFsbCBsaXN0ZW5pbmcgYmFja2VuZHMuCisgKgorICogV2UgZmFsbCBi YWNrIHRvIGJyb2FkY2FzdCBtb2RlIGFuZCBzaWduYWwgYWxsIGxpc3RlbmluZyBiYWNrZW5k cyB3aGVuOgorICogMSkgTXVsdGlwbGUgYmFja2VuZHMgbGlzdGVuIG9uIHRoZSBzYW1lIGNo YW5uZWwsIE9SCisgKiAyKSBUaGUgaGFzaCB0YWJsZSBydW5zIG91dCBvZiBzaGFyZWQgbWVt b3J5IGZvciBuZXcgZW50cmllcworICoKKyAqIE5vdGUgdGhhdCBDSEFOTkVMX0hBU0hfTUFY X1NJWkUgaXMgbm90IGEgaGFyZCBsaW1pdCAtIHRoZSBoYXNoIHRhYmxlIGNhbgorICogc3Rv cmUgbW9yZSBlbnRyaWVzIHRoYW4gdGhpcywgYnV0IHBlcmZvcm1hbmNlIHdpbGwgZGVncmFk ZSBkdWUgdG8gYnVja2V0CisgKiBvdmVyZmxvdy4gVGhlIGFjdHVhbCBmYWxsYmFjayB0byBi cm9hZGNhc3QgbW9kZSBvY2N1cnMgb25seSB3aGVuIHNoYXJlZAorICogbWVtb3J5IGlzIGV4 aGF1c3RlZCBhbmQgd2UgY2Fubm90IGFsbG9jYXRlIG5ldyBoYXNoIGVudHJpZXMuCisgKgor ICogVGhlIG1heGltdW0gc2l6ZSAoQ0hBTk5FTF9IQVNIX01BWF9TSVpFKSBpcyBiYXNlZCBv biB0aGUgdHlwaWNhbCBPUyBwb3J0CisgKiByYW5nZS4gVGhpcyBwcm92aWRlcyBhIHJlYXNv bmFibGUgdXBwZXIgYm91bmQgZm9yIHN5c3RlbXMgdGhhdCB1c2UKKyAqIHBlci1jb25uZWN0 aW9uIGNoYW5uZWxzLgorICoKKyAqLworI2RlZmluZSBDSEFOTkVMX0hBU0hfSU5JVF9TSVpF CQkyNTYKKyNkZWZpbmUgQ0hBTk5FTF9IQVNIX01BWF9TSVpFCQk2NTUzNQorCisvKgorICog S2V5IHN0cnVjdHVyZSBmb3IgdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4KKyAqIENoYW5uZWxz IGFyZSBkYXRhYmFzZS1zcGVjaWZpYywgc28gd2UgbmVlZCBib3RoIHRoZSBkYXRhYmFzZSBP SUQKKyAqIGFuZCB0aGUgY2hhbm5lbCBuYW1lIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgY2hh bm5lbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ2hhbm5lbEhhc2hLZXkKK3sKKwlPaWQJCQlk Ym9pZDsKKwljaGFyCQljaGFubmVsW05BTUVEQVRBTEVOXTsKK30JCQlDaGFubmVsSGFzaEtl eTsKKworLyoKKyAqIEVhY2ggZW50cnkgY29udGFpbnMgYSBjaGFubmVsIGtleSAoZGF0YWJh c2UgT0lEICsgY2hhbm5lbCBuYW1lKSBhbmQgYQorICogc2luZ2xlIGJhY2tlbmQgUHJvY051 bWJlciB0aGF0IGlzIGxpc3RlbmluZyBvbiB0aGF0IGNoYW5uZWwuIElmIG11bHRpcGxlCisg KiBiYWNrZW5kcyB0cnkgdG8gbGlzdGVuIG9uIHRoZSBzYW1lIGNoYW5uZWwsIHdlIG1hcmsg aXQgYXMgaGF2aW5nIG11bHRpcGxlCisgKiBsaXN0ZW5lcnMgYW5kIGZhbGwgYmFjayB0byBi cm9hZGNhc3QgYmVoYXZpb3IuCisgKi8KK3R5cGVkZWYgc3RydWN0IENoYW5uZWxFbnRyeQor eworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlQcm9jTnVtYmVyCWxpc3RlbmVyOwkJLyogc2lu Z2xlIGJhY2tlbmQgSUQsIG9yIElOVkFMSURfUFJPQ19OVU1CRVIKKwkJCQkJCQkJICogaWYg bXVsdGlwbGUgKi8KKwlib29sCQloYXNfbXVsdGlwbGVfbGlzdGVuZXJzOworfQkJCUNoYW5u ZWxFbnRyeTsKKwogLyoKICAqIFN0cnVjdCByZXByZXNlbnRpbmcgYW4gZW50cnkgaW4gdGhl IGdsb2JhbCBub3RpZnkgcXVldWUKICAqCkBAIC0yOTMsNiArMzUyLDM5IEBAIHR5cGVkZWYg c3RydWN0IEFzeW5jUXVldWVDb250cm9sCiAKIHN0YXRpYyBBc3luY1F1ZXVlQ29udHJvbCAq YXN5bmNRdWV1ZUNvbnRyb2w7CiAKKy8qIENoYW5uZWwgaGFzaCB0YWJsZSBmb3Igc2luZ2xl IGxpc3RlbmluZyBiYWNrZW5kIHNpZ25hbGxpbmcgKi8KK3N0YXRpYyBIVEFCICpjaGFubmVs SGFzaCA9IE5VTEw7CisKKy8qCisgKiBHZXRDaGFubmVsSGFzaAorICoJCUdldCB0aGUgY2hh bm5lbCBoYXNoIHRhYmxlLCBpbml0aWFsaXppbmcgb3VyIGJhY2tlbmQncyBwb2ludGVyIGlm IG5lZWRlZC4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgYWNjZXNz IHRvIHRoZSBjaGFubmVsIGhhc2ggdGFibGUuCisgKiBUaGUgaGFzaCB0YWJsZSBpdHNlbGYg aXMgY3JlYXRlZCBpbiBzaGFyZWQgbWVtb3J5IGR1cmluZyBBc3luY1NobWVtSW5pdCwKKyAq IGJ1dCBlYWNoIGJhY2tlbmQgbmVlZHMgdG8gZ2V0IGl0cyBvd24gcG9pbnRlciB0byBpdC4K KyAqLworc3RhdGljIEhUQUIgKgorR2V0Q2hhbm5lbEhhc2godm9pZCkKK3sKKwlpZiAoY2hh bm5lbEhhc2ggPT0gTlVMTCkKKwl7CisJCUhBU0hDVEwJCWhhc2hfY3RsOworCisJCS8qIFNl dCB1cCB0byBhdHRhY2ggdG8gdGhlIGV4aXN0aW5nIHNoYXJlZCBoYXNoIHRhYmxlICovCisJ CU1lbVNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNoX2N0bC5r ZXlzaXplID0gc2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKwkJaGFzaF9jdGwuZW50cnlzaXpl ID0gc2l6ZW9mKENoYW5uZWxFbnRyeSk7CisKKwkJY2hhbm5lbEhhc2ggPSBTaG1lbUluaXRI YXNoKCJDaGFubmVsIEhhc2giLAorCQkJCQkJCQkJQ0hBTk5FTF9IQVNIX0lOSVRfU0laRSwK KwkJCQkJCQkJCUNIQU5ORUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCSZoYXNoX2N0bCwK KwkJCQkJCQkJCUhBU0hfRUxFTSB8IEhBU0hfQkxPQlMpOworCX0KKworCXJldHVybiBjaGFu bmVsSGFzaDsKK30KKwogI2RlZmluZSBRVUVVRV9IRUFECQkJCQkoYXN5bmNRdWV1ZUNvbnRy b2wtPmhlYWQpCiAjZGVmaW5lIFFVRVVFX1RBSUwJCQkJCShhc3luY1F1ZXVlQ29udHJvbC0+ dGFpbCkKICNkZWZpbmUgUVVFVUVfU1RPUF9QQUdFCQkJCShhc3luY1F1ZXVlQ29udHJvbC0+ c3RvcFBhZ2UpCkBAIC00NTgsNiArNTUwLDE0IEBAIHN0YXRpYyB1aW50MzIgbm90aWZpY2F0 aW9uX2hhc2goY29uc3Qgdm9pZCAqa2V5LCBTaXplIGtleXNpemUpOwogc3RhdGljIGludAlu b3RpZmljYXRpb25fbWF0Y2goY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5Miwg U2l6ZSBrZXlzaXplKTsKIHN0YXRpYyB2b2lkIENsZWFyUGVuZGluZ0FjdGlvbnNBbmROb3Rp Zmllcyh2b2lkKTsKIAorLyogQ2hhbm5lbCBoYXNoIHRhYmxlIG1hbmFnZW1lbnQgZnVuY3Rp b25zICovCitzdGF0aWMgaW5saW5lIHZvaWQgQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KENoYW5u ZWxIYXNoS2V5ICoga2V5LCBPaWQgZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpOworc3Rh dGljIHZvaWQgQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsLCBQ cm9jTnVtYmVyIHByb2Nubyk7CitzdGF0aWMgdm9pZCBDaGFubmVsSGFzaFJlbW92ZUxpc3Rl bmVyKGNvbnN0IGNoYXIgKmNoYW5uZWwsIFByb2NOdW1iZXIgcHJvY25vKTsKK3N0YXRpYyB2 b2lkIENoYW5uZWxIYXNoUmVtb3ZlQmFja2VuZEZyb21BbGwoUHJvY051bWJlciBwcm9jbm8p Oworc3RhdGljIENoYW5uZWxFbnRyeSAqIENoYW5uZWxIYXNoTG9va3VwKGNvbnN0IGNoYXIg KmNoYW5uZWwpOworc3RhdGljIExpc3QgKkdldFBlbmRpbmdOb3RpZnlDaGFubmVscyh2b2lk KTsKKwogLyoKICAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcXVldWUg cGFnZSBudW1iZXJzLgogICogUHJldmlvdXNseSB0aGlzIGZ1bmN0aW9uIGFjY291bnRlZCBm b3IgYSB3cmFwYXJvdW5kLgpAQCAtNDkyLDYgKzU5Miw5IEBAIEFzeW5jU2htZW1TaXplKHZv aWQpCiAKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgU2ltcGxlTHJ1U2htZW1TaXplKG5vdGlm eV9idWZmZXJzLCAwKSk7CiAKKwlzaXplID0gYWRkX3NpemUoc2l6ZSwgaGFzaF9lc3RpbWF0 ZV9zaXplKENIQU5ORUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCQkJIHNpemVvZihDaGFu bmVsRW50cnkpKSk7CisKIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtNTQ2LDYgKzY0OSwyMyBA QCBBc3luY1NobWVtSW5pdCh2b2lkKQogCQkgKi8KIAkJKHZvaWQpIFNscnVTY2FuRGlyZWN0 b3J5KE5vdGlmeUN0bCwgU2xydVNjYW5EaXJDYkRlbGV0ZUFsbCwgTlVMTCk7CiAJfQorCisJ LyoKKwkgKiBDcmVhdGUgb3IgYXR0YWNoIHRvIHRoZSBjaGFubmVsIGhhc2ggdGFibGUuCisJ ICovCisJeworCQlIQVNIQ1RMCQloYXNoX2N0bDsKKworCQlNZW1TZXQoJmhhc2hfY3RsLCAw LCBzaXplb2YoaGFzaF9jdGwpKTsKKwkJaGFzaF9jdGwua2V5c2l6ZSA9IHNpemVvZihDaGFu bmVsSGFzaEtleSk7CisJCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihDaGFubmVsRW50 cnkpOworCisJCWNoYW5uZWxIYXNoID0gU2htZW1Jbml0SGFzaCgiQ2hhbm5lbCBIYXNoIiwK KwkJCQkJCQkJCUNIQU5ORUxfSEFTSF9JTklUX1NJWkUsCisJCQkJCQkJCQlDSEFOTkVMX0hB U0hfTUFYX1NJWkUsCisJCQkJCQkJCQkmaGFzaF9jdGwsCisJCQkJCQkJCQlIQVNIX0VMRU0g fCBIQVNIX0JMT0JTKTsKKwl9CiB9CiAKIApAQCAtMTA0Myw2ICsxMTYzLDcgQEAgRXhlY19M aXN0ZW5QcmVDb21taXQodm9pZCkKIAlRdWV1ZVBvc2l0aW9uIGhlYWQ7CiAJUXVldWVQb3Np dGlvbiBtYXg7CiAJUHJvY051bWJlcglwcmV2TGlzdGVuZXI7CisJTGlzdENlbGwgICAqcDsK IAogCS8qCiAJICogTm90aGluZyB0byBkbyBpZiB3ZSBhcmUgYWxyZWFkeSBsaXN0ZW5pbmcg dG8gc29tZXRoaW5nLCBub3IgaWYgd2UKQEAgLTExMTAsNiArMTIzMSwxOCBAQCBFeGVjX0xp c3RlblByZUNvbW1pdCh2b2lkKQogCQlRVUVVRV9ORVhUX0xJU1RFTkVSKE15UHJvY051bWJl cikgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsKIAkJUVVFVUVfRklSU1RfTElTVEVORVIgPSBN eVByb2NOdW1iZXI7CiAJfQorCisJLyoKKwkgKiBBZGQgYWxsIG91ciBjaGFubmVscyB0byB0 aGUgY2hhbm5lbCBoYXNoIHRhYmxlIHdoaWxlIHdlIHN0aWxsIGhvbGQKKwkgKiBleGNsdXNp dmUgbG9jayBvbiBOb3RpZnlRdWV1ZUxvY2suCisJICovCisJZm9yZWFjaChwLCBsaXN0ZW5D aGFubmVscykKKwl7CisJCWNoYXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsZmlyc3QocCk7 CisKKwkJQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihjaGFubmVsLCBNeVByb2NOdW1iZXIpOwor CX0KKwogCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKIAogCS8qIE5vdyB3ZSBh cmUgbGlzdGVkIGluIHRoZSBnbG9iYWwgYXJyYXksIHNvIHJlbWVtYmVyIHdlJ3JlIGxpc3Rl bmluZyAqLwpAQCAtMTE1Miw2ICsxMjg1LDEwIEBAIEV4ZWNfTGlzdGVuQ29tbWl0KGNvbnN0 IGNoYXIgKmNoYW5uZWwpCiAJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhU b3BNZW1vcnlDb250ZXh0KTsKIAlsaXN0ZW5DaGFubmVscyA9IGxhcHBlbmQobGlzdGVuQ2hh bm5lbHMsIHBzdHJkdXAoY2hhbm5lbCkpOwogCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRj b250ZXh0KTsKKworCUxXTG9ja0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJ VkUpOworCUNoYW5uZWxIYXNoQWRkTGlzdGVuZXIoY2hhbm5lbCwgTXlQcm9jTnVtYmVyKTsK KwlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CiB9CiAKIC8qCkBAIC0xMTc1LDYg KzEzMTIsMTAgQEAgRXhlY19Vbmxpc3RlbkNvbW1pdChjb25zdCBjaGFyICpjaGFubmVsKQog CQl7CiAJCQlsaXN0ZW5DaGFubmVscyA9IGZvcmVhY2hfZGVsZXRlX2N1cnJlbnQobGlzdGVu Q2hhbm5lbHMsIHEpOwogCQkJcGZyZWUobGNoYW4pOworCisJCQlMV0xvY2tBY3F1aXJlKE5v dGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsKKwkJCUNoYW5uZWxIYXNoUmVtb3ZlTGlz dGVuZXIoY2hhbm5lbCwgTXlQcm9jTnVtYmVyKTsKKwkJCUxXTG9ja1JlbGVhc2UoTm90aWZ5 UXVldWVMb2NrKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTIzOSw2ICsxMzgwLDkgQEAg YXN5bmNRdWV1ZVVucmVnaXN0ZXIodm9pZCkKIAkgKiBOZWVkIGV4Y2x1c2l2ZSBsb2NrIGhl cmUgdG8gbWFuaXB1bGF0ZSBsaXN0IGxpbmtzLgogCSAqLwogCUxXTG9ja0FjcXVpcmUoTm90 aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOworCisJQ2hhbm5lbEhhc2hSZW1vdmVCYWNr ZW5kRnJvbUFsbChNeVByb2NOdW1iZXIpOworCiAJLyogTWFyayBvdXIgZW50cnkgYXMgaW52 YWxpZCAqLwogCVFVRVVFX0JBQ0tFTkRfUElEKE15UHJvY051bWJlcikgPSBJbnZhbGlkUGlk OwogCVFVRVVFX0JBQ0tFTkRfREJPSUQoTXlQcm9jTnVtYmVyKSA9IEludmFsaWRPaWQ7CkBA IC0xNTY1LDEyICsxNzA5LDE4IEBAIGFzeW5jUXVldWVGaWxsV2FybmluZyh2b2lkKQogLyoK ICAqIFNlbmQgc2lnbmFscyB0byBsaXN0ZW5pbmcgYmFja2VuZHMuCiAgKgotICogTm9ybWFs bHkgd2Ugc2lnbmFsIG9ubHkgYmFja2VuZHMgaW4gb3VyIG93biBkYXRhYmFzZSwgc2luY2Ug b25seSB0aG9zZQotICogYmFja2VuZHMgY291bGQgYmUgaW50ZXJlc3RlZCBpbiBub3RpZmll cyB3ZSBzZW5kLiAgSG93ZXZlciwgaWYgdGhlcmUncwotICogbm90aWZ5IHRyYWZmaWMgaW4g b3VyIGRhdGFiYXNlIGJ1dCBubyB0cmFmZmljIGluIGFub3RoZXIgZGF0YWJhc2UgdGhhdAot ICogZG9lcyBoYXZlIGxpc3RlbmVyKHMpLCB0aG9zZSBsaXN0ZW5lcnMgd2lsbCBmYWxsIGZ1 cnRoZXIgYW5kIGZ1cnRoZXIKLSAqIGJlaGluZC4gIFdha2VuIHRoZW0gYW55d2F5IGlmIHRo ZXkncmUgZmFyIGVub3VnaCBiZWhpbmQsIHNvIHRoYXQgdGhleSdsbAotICogYWR2YW5jZSB0 aGVpciBxdWV1ZSBwb3NpdGlvbiBwb2ludGVycywgYWxsb3dpbmcgdGhlIGdsb2JhbCB0YWls IHRvIGFkdmFuY2UuCisgKiBUaGlzIGZ1bmN0aW9uIG9wZXJhdGVzIGluIHR3byBtb2RlczoK KyAqIDEuIFNlbGVjdGl2ZSBtb2RlOiBXaGVuIGFsbCBwZW5kaW5nIG5vdGlmaWNhdGlvbiBj aGFubmVscyBoYXZlIGV4YWN0bHkgb25lCisgKiAgICBsaXN0ZW5lciBlYWNoLCB3ZSBzaWdu YWwgb25seSB0aG9zZSBzcGVjaWZpYyBiYWNrZW5kcyB0aGF0IGFyZSBsaXN0ZW5pbmcKKyAq ICAgIG9uIHRoZSBjaGFubmVscyB3aXRoIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4KKyAqIDIu IEJyb2FkY2FzdCBtb2RlOiBXaGVuIGFueSBjaGFubmVsIGhhcyBtdWx0aXBsZSBsaXN0ZW5l cnMgKG9yIHdlIHJhbiBvdXQKKyAqICAgIG9mIHNoYXJlZCBtZW1vcnkgZm9yIHRoZSBjaGFu bmVsIGhhc2ggdGFibGUpLCB3ZSBzaWduYWwgYWxsIGxpc3RlbmluZworICogICAgYmFja2Vu ZHMgaW4gb3VyIGRhdGFiYXNlLgorICoKKyAqIEluIGFkZGl0aW9uIHRvIHRoZSBjaGFubmVs LXNwZWNpZmljIHNpZ25hbGluZywgd2UgYWxzbyBpbXBsZW1lbnQgYSAid2FrZQorICogb25s eSB0YWlsIiBvcHRpbWl6YXRpb246IHdlIHNpZ25hbCB0aGUgYmFja2VuZCB0aGF0IGlzIGZ1 cnRoZXN0IGJlaGluZAorICogaW4gdGhlIHF1ZXVlIHRvIGhlbHAgcHJldmVudCBiYWNrZW5k cyBmcm9tIGdldHRpbmcgZmFyIGJlaGluZCBhbmQgY3JlYXRlCisgKiBhIGNoYWluIHJlYWN0 aW9uIG9mIHdha2UtdXBzLiBUaGlzIGF2b2lkcyB0aHVuZGVyaW5nIGhlcmQgcHJvYmxlbXMu CiAgKgogICogU2luY2Ugd2Uga25vdyB0aGUgUHJvY051bWJlciBhbmQgdGhlIFBpZCB0aGUg c2lnbmFsaW5nIGlzIHF1aXRlIGNoZWFwLgogICoKQEAgLTE1ODMsNiArMTczMywxMSBAQCBT aWduYWxCYWNrZW5kcyh2b2lkKQogCWludDMyCSAgICpwaWRzOwogCVByb2NOdW1iZXIgKnBy b2Nub3M7CiAJaW50CQkJY291bnQ7CisJTGlzdAkgICAqY2hhbm5lbHM7CisJTGlzdENlbGwg ICAqcDsKKwlib29sCSAgICpzaWduYWxlZDsKKwlib29sCQlicm9hZGNhc3RfbW9kZSA9IGZh bHNlOworCWJvb2wJCXRhaWxfd29rZW4gPSBmYWxzZTsKIAogCS8qCiAJICogSWRlbnRpZnkg YmFja2VuZHMgdGhhdCB3ZSBuZWVkIHRvIHNpZ25hbC4gIFdlIGRvbid0IHdhbnQgdG8gc2Vu ZApAQCAtMTU5NCw0MCArMTc0OSwxNTkgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAkgKi8K IAlwaWRzID0gKGludDMyICopIHBhbGxvYyhNYXhCYWNrZW5kcyAqIHNpemVvZihpbnQzMikp OwogCXByb2Nub3MgPSAoUHJvY051bWJlciAqKSBwYWxsb2MoTWF4QmFja2VuZHMgKiBzaXpl b2YoUHJvY051bWJlcikpOworCXNpZ25hbGVkID0gKGJvb2wgKikgcGFsbG9jMChNYXhCYWNr ZW5kcyAqIHNpemVvZihib29sKSk7CiAJY291bnQgPSAwOwogCisJLyogR2V0IGxpc3Qgb2Yg Y2hhbm5lbHMgdGhhdCBoYXZlIHBlbmRpbmcgbm90aWZpY2F0aW9ucyAqLworCWNoYW5uZWxz ID0gR2V0UGVuZGluZ05vdGlmeUNoYW5uZWxzKCk7CisKIAlMV0xvY2tBY3F1aXJlKE5vdGlm eVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCS8qCisJICogQ2hlY2sgaWYgYW55IGNo YW5uZWwgaGFzIG11bHRpcGxlIGxpc3RlbmVycywgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZAor CSAqIG5lZWQgdG8gc2lnbmFsIGFsbCBiYWNrZW5kcyBhbnl3YXkuCisJICovCisJZm9yZWFj aChwLCBjaGFubmVscykKKwl7CisJCWNoYXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsZmly c3QocCk7CisJCUNoYW5uZWxFbnRyeSAqZW50cnkgPSBDaGFubmVsSGFzaExvb2t1cChjaGFu bmVsKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBubyBlbnRyeSwgaXQgY291bGQgbWVh biB3ZSByYW4gb3V0IG9mIHNoYXJlZCBtZW1vcnkKKwkJICogd2hlbiB0cnlpbmcgdG8gYWRk IHRoaXMgY2hhbm5lbCB0byB0aGUgaGFzaCB0YWJsZSwgc28gd2UgbmVlZCB0bworCQkgKiBi cm9hZGNhc3QgaW4gdGhhdCBjYXNlIGFzIHdlbGwuCisJCSAqLworCQlpZiAoIWVudHJ5IHx8 IGVudHJ5LT5oYXNfbXVsdGlwbGVfbGlzdGVuZXJzKQorCQl7CisJCQlicm9hZGNhc3RfbW9k ZSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChicm9hZGNhc3RfbW9kZSkK Kwl7CisJCS8qCisJCSAqIEluIGJyb2FkY2FzdCBtb2RlLCB3ZSBpdGVyYXRlIG92ZXIgYWxs IGxpc3RlbmluZyBiYWNrZW5kcyBhbmQKKwkJICogc2lnbmFsIHRoZSBvbmVzIGluIG91ciBk YXRhYmFzZSB0aGF0IGFyZSBub3QgYWxyZWFkeSBjYXVnaHQgdXAuCisJCSAqLworCQlmb3Ig KFByb2NOdW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RFTkVSOyBpICE9IElOVkFMSURfUFJP Q19OVU1CRVI7IGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpKQorCQl7CisJCQlpbnQzMgkJ cGlkOworCQkJUXVldWVQb3NpdGlvbiBwb3M7CisKKwkJCWlmIChRVUVVRV9CQUNLRU5EX0RC T0lEKGkpICE9IE15RGF0YWJhc2VJZCkKKwkJCQljb250aW51ZTsKKworCQkJcG9zID0gUVVF VUVfQkFDS0VORF9QT1MoaSk7CisKKwkJCS8qCisJCQkgKiBBbHdheXMgc2lnbmFsIGxpc3Rl bmVycyBpbiBvdXIgb3duIGRhdGFiYXNlLCB1bmxlc3MgdGhleSdyZQorCQkJICogYWxyZWFk eSBjYXVnaHQgdXAuCisJCQkgKi8KKwkJCWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBRVUVV RV9IRUFEKSkKKwkJCQljb250aW51ZTsKKworCQkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQo aSk7CisJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQpOworCisJCQkvKiBPSywgbmVlZCB0 byBzaWduYWwgdGhpcyBvbmUgKi8KKwkJCXBpZHNbY291bnRdID0gcGlkOworCQkJcHJvY25v c1tjb3VudF0gPSBpOworCQkJc2lnbmFsZWRbaV0gPSB0cnVlOworCQkJY291bnQrKzsKKwkJ fQorCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBTaWduYWwgc3BlY2lmaWMgbGlzdGVuaW5n IGJhY2tlbmRzCisJCSAqLworCQlmb3JlYWNoKHAsIGNoYW5uZWxzKQorCQl7CisJCQljaGFy CSAgICpjaGFubmVsID0gKGNoYXIgKikgbGZpcnN0KHApOworCQkJQ2hhbm5lbEVudHJ5ICpl bnRyeSA9IENoYW5uZWxIYXNoTG9va3VwKGNoYW5uZWwpOworCisJCQlQcm9jTnVtYmVyCWkg PSBlbnRyeS0+bGlzdGVuZXI7CisJCQlpbnQzMgkJcGlkOworCQkJUXVldWVQb3NpdGlvbiBw b3M7CisKKwkJCUFzc2VydChlbnRyeSAmJiAhZW50cnktPmhhc19tdWx0aXBsZV9saXN0ZW5l cnMpOworCisJCQlpZiAoc2lnbmFsZWRbaV0pCisJCQkJY29udGludWU7CisKKwkJCXBvcyA9 IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOworCisJCQkvKgorCQkJICogU2tpcCBzaWduYWxpbmcg bGlzdGVuZXJzIGlmIHRoZXkgYWxyZWFkeSBjYXVnaHQgdXAuCisJCQkgKi8KKwkJCWlmIChR VUVVRV9QT1NfRVFVQUwocG9zLCBRVUVVRV9IRUFEKSkKKwkJCQljb250aW51ZTsKKworCQkJ aWYgKFFVRVVFX0JBQ0tFTkRfREJPSUQoaSkgIT0gTXlEYXRhYmFzZUlkKQorCQkJCWNvbnRp bnVlOworCisJCQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKKwkJCUFzc2VydChwaWQg IT0gSW52YWxpZFBpZCk7CisKKwkJCS8qIE9LLCBuZWVkIHRvIHNpZ25hbCB0aGlzIG9uZSAq LworCQkJcGlkc1tjb3VudF0gPSBwaWQ7CisJCQlwcm9jbm9zW2NvdW50XSA9IGk7CisJCQlz aWduYWxlZFtpXSA9IHRydWU7CisJCQljb3VudCsrOworCQl9CisJfQorCisJLyoKKwkgKiBB bHNvIGNoZWNrIGZvciBhbnkgYmFja2VuZHMgdGhhdCBhcmUgZmFyIGJlaGluZC4gVGhpcyBl bnN1cmVzIHRoZQorCSAqIGdsb2JhbCB0YWlsIGNhbiBhZHZhbmNlIGV2ZW4gaWYgdGhleSdy ZSBub3QgYWN0aXZlbHkgcmVjZWl2aW5nCisJICogbm90aWZpY2F0aW9ucyBvbiB0aGVpciBj aGFubmVscy4KKwkgKi8KIAlmb3IgKFByb2NOdW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RF TkVSOyBpICE9IElOVkFMSURfUFJPQ19OVU1CRVI7IGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVS KGkpKQogCXsKLQkJaW50MzIJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOworCQlpbnQz MgkJcGlkOwogCQlRdWV1ZVBvc2l0aW9uIHBvczsKIAotCQlBc3NlcnQocGlkICE9IEludmFs aWRQaWQpOworCQkvKgorCQkgKiBTa2lwIGlmIHdlJ3ZlIGFscmVhZHkgZGVjaWRlZCB0byBz aWduYWwgdGhpcyBvbmUuCisJCSAqLworCQlpZiAoc2lnbmFsZWRbaV0pCisJCQljb250aW51 ZTsKKwogCQlwb3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhpKTsKLQkJaWYgKFFVRVVFX0JBQ0tF TkRfREJPSUQoaSkgPT0gTXlEYXRhYmFzZUlkKQotCQl7Ci0JCQkvKgotCQkJICogQWx3YXlz IHNpZ25hbCBsaXN0ZW5lcnMgaW4gb3VyIG93biBkYXRhYmFzZSwgdW5sZXNzIHRoZXkncmUK LQkJCSAqIGFscmVhZHkgY2F1Z2h0IHVwICh1bmxpa2VseSwgYnV0IHBvc3NpYmxlKS4KLQkJ CSAqLwotCQkJaWYgKFFVRVVFX1BPU19FUVVBTChwb3MsIFFVRVVFX0hFQUQpKQotCQkJCWNv bnRpbnVlOwotCQl9CisKKwkJLyoKKwkJICogU2tpcCBzaWduYWxpbmcgbGlzdGVuZXJzIGlm IHRoZXkgYWxyZWFkeSBjYXVnaHQgdXAuCisJCSAqLworCQlpZiAoUVVFVUVfUE9TX0VRVUFM KHBvcywgUVVFVUVfSEVBRCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXYWtlIG9u bHkgdGFpbCBvcHRpbWl6YXRpb246IFNpZ25hbCB0aGUgYmFja2VuZCB0aGF0IGlzIGZ1cnRo ZXN0CisJCSAqIGJlaGluZCB0byBoZWxwIHByZXZlbnQgYmFja2VuZHMgZnJvbSBnZXR0aW5n IGZhciBiZWhpbmQgaW4gdGhlCisJCSAqIGZpcnN0IHBsYWNlLiBUaGlzIGNyZWF0ZXMgYSBj aGFpbiByZWFjdGlvbiB3aGVyZSBlYWNoIGJhY2tlbmQKKwkJICogZXZlbnR1YWxseSB3YWtl cyB1cCB0aGUgbmV4dCBvbmUgYXMgbm90aWZpY2F0aW9ucyBhcmUgcHJvY2Vzc2VkLAorCQkg KiBhdm9pZGluZyB0aHVuZGVyaW5nIGhlcmQuCisJCSAqCisJCSAqIE90aGVyd2lzZSwgb25s eSBza2lwIHNpZ25hbGluZyBsaXN0ZW5lcnMgaWYgdGhleSBhcmUgbm90IGZhcgorCQkgKiBi ZWhpbmQuCisJCSAqLworCQlpZiAoIXRhaWxfd29rZW4gJiYgYXN5bmNRdWV1ZVBhZ2VEaWZm KFFVRVVFX1BPU19QQUdFKFFVRVVFX1RBSUwpLAorCQkJCQkJCQkJCQkgIFFVRVVFX1BPU19Q QUdFKHBvcykpID09IDApCisJCQl0YWlsX3dva2VuID0gdHJ1ZTsKIAkJZWxzZQotCQl7Ci0J CQkvKgotCQkJICogTGlzdGVuZXJzIGluIG90aGVyIGRhdGFiYXNlcyBzaG91bGQgYmUgc2ln bmFsZWQgb25seSBpZiB0aGV5Ci0JCQkgKiBhcmUgZmFyIGJlaGluZC4KLQkJCSAqLwotCQkJ aWYgKGFzeW5jUXVldWVQYWdlRGlmZihRVUVVRV9QT1NfUEFHRShRVUVVRV9IRUFEKSwKLQkJ CQkJCQkJICAgUVVFVUVfUE9TX1BBR0UocG9zKSkgPCBRVUVVRV9DTEVBTlVQX0RFTEFZKQot CQkJCWNvbnRpbnVlOwotCQl9CisJCQljb250aW51ZTsKKworCQlwaWQgPSBRVUVVRV9CQUNL RU5EX1BJRChpKTsKKwkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKIAkJLyogT0ssIG5l ZWQgdG8gc2lnbmFsIHRoaXMgb25lICovCiAJCXBpZHNbY291bnRdID0gcGlkOwogCQlwcm9j bm9zW2NvdW50XSA9IGk7CiAJCWNvdW50Kys7CisKKwogCX0KKwogCUxXTG9ja1JlbGVhc2Uo Tm90aWZ5UXVldWVMb2NrKTsKIAogCS8qIE5vdyBzZW5kIHNpZ25hbHMgKi8KQEAgLTE2NTcs NiArMTkzMSw3IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAKIAlwZnJlZShwaWRzKTsKIAlw ZnJlZShwcm9jbm9zKTsKKwlwZnJlZShzaWduYWxlZCk7CiB9CiAKIC8qCkBAIC0yMzk1LDMg KzI2NzAsMjMwIEBAIGNoZWNrX25vdGlmeV9idWZmZXJzKGludCAqbmV3dmFsLCB2b2lkICoq ZXh0cmEsIEd1Y1NvdXJjZSBzb3VyY2UpCiB7CiAJcmV0dXJuIGNoZWNrX3NscnVfYnVmZmVy cygibm90aWZ5X2J1ZmZlcnMiLCBuZXd2YWwpOwogfQorCisvKgorICogQ2hhbm5lbCBoYXNo IHRhYmxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKi8KKworLyoKKyAqIENoYW5uZWxIYXNo UHJlcGFyZUtleQorICoJCVByZXBhcmUgYSBjaGFubmVsIGtleSAoZGF0YWJhc2UgT0lEICsg Y2hhbm5lbCBuYW1lKSBmb3IgdXNlIGFzIGEgaGFzaCBrZXkuCisgKi8KK3N0YXRpYyBpbmxp bmUgdm9pZAorQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KENoYW5uZWxIYXNoS2V5ICoga2V5LCBP aWQgZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7CisJbWVtc2V0KGtleSwgMCwgc2l6 ZW9mKENoYW5uZWxIYXNoS2V5KSk7CisJa2V5LT5kYm9pZCA9IGRib2lkOworCXN0cmxjcHko a2V5LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFUQUxFTik7Cit9CisKKy8qCisgKiBDaGFu bmVsSGFzaEFkZExpc3RlbmVyCisgKgkJUmVnaXN0ZXIgdGhlIGdpdmVuIGJhY2tlbmQgYXMg YSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsCisgKgkJaW4gdGhlIHNoYXJl ZCBjaGFubmVsIGhhc2ggdGFibGUuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBleGNsdXNp dmUgTm90aWZ5UXVldWVMb2NrLgorICovCitzdGF0aWMgdm9pZAorQ2hhbm5lbEhhc2hBZGRM aXN0ZW5lcihjb25zdCBjaGFyICpjaGFubmVsLCBQcm9jTnVtYmVyIHByb2NubykKK3sKKwlD aGFubmVsRW50cnkgKmVudHJ5OworCWJvb2wJCWZvdW5kOworCUNoYW5uZWxIYXNoS2V5IGtl eTsKKworCUNoYW5uZWxIYXNoUHJlcGFyZUtleSgma2V5LCBNeURhdGFiYXNlSWQsIGNoYW5u ZWwpOworCisJLyogTG9vayB1cCBvciBjcmVhdGUgdGhlIGNoYW5uZWwgZW50cnkgKi8KKwll bnRyeSA9IChDaGFubmVsRW50cnkgKikgaGFzaF9zZWFyY2goR2V0Q2hhbm5lbEhhc2goKSwK KwkJCQkJCQkJCQkgJmtleSwKKwkJCQkJCQkJCQkgSEFTSF9FTlRFUl9OVUxMLAorCQkJCQkJ CQkJCSAmZm91bmQpOworCisJLyoKKwkgKiBJZiBoYXNoX3NlYXJjaCByZXR1cm5lZCBOVUxM LCB3ZSd2ZSBydW4gb3V0IG9mIHNoYXJlZCBtZW1vcnkgdG8KKwkgKiBhbGxvY2F0ZSBuZXcg aGFzaCBlbnRyaWVzLiBXZSBncmFjZWZ1bGx5IGRlZ3JhZGUgYnkgbm90IHRyYWNraW5nIHRo aXMKKwkgKiBjaGFubmVsIGluIHRoZSBoYXNoLiBUaGUgY2hhbm5lbCB3aWxsIHVzZSB0aGUg ZmFsbGJhY2sgYnJvYWRjYXN0CisJICogc2lnbmFsbGluZy4KKwkgKi8KKwlpZiAoZW50cnkg PT0gTlVMTCkKKwl7CisJCWVyZXBvcnQoREVCVUcxLAorCQkJCShlcnJtc2coInRvbyBtYW55 IG5vdGlmaWNhdGlvbiBjaGFubmVscyBhcmUgYWxyZWFkeSBiZWluZyB0cmFja2VkIikpKTsK KwkJcmV0dXJuOworCX0KKworCWlmICghZm91bmQpCisJeworCQkvKiBOZXcgY2hhbm5lbCwg aW5pdGlhbGl6ZSB0aGUgZW50cnkgKi8KKwkJbWVtY3B5KCZlbnRyeS0+a2V5LCAma2V5LCBz aXplb2YoQ2hhbm5lbEhhc2hLZXkpKTsKKwkJZW50cnktPmxpc3RlbmVyID0gcHJvY25vOwor CQllbnRyeS0+aGFzX211bHRpcGxlX2xpc3RlbmVycyA9IGZhbHNlOworCX0KKwllbHNlCisJ eworCQkvKiBDaGFubmVsIGFscmVhZHkgZXhpc3RzICovCisJCWlmICghZW50cnktPmhhc19t dWx0aXBsZV9saXN0ZW5lcnMpCisJCXsKKwkJCWlmIChlbnRyeS0+bGlzdGVuZXIgPT0gcHJv Y25vKQorCQkJCXJldHVybjsJCQkvKiBBbHJlYWR5IGxpc3RlbmluZyAqLworCisJCQkvKgor CQkJICogQW5vdGhlciBiYWNrZW5kIGlzIGFscmVhZHkgbGlzdGVuaW5nIG9uIHRoaXMgY2hh bm5lbC4gTWFyayBpdAorCQkJICogYXMgaGF2aW5nIG11bHRpcGxlIGxpc3RlbmVycyBhbmQg ZmFsbCBiYWNrIHRvIGJyb2FkY2FzdAorCQkJICogc2lnbmFsbGluZy4KKwkJCSAqLworCQkJ ZW50cnktPmhhc19tdWx0aXBsZV9saXN0ZW5lcnMgPSB0cnVlOworCQkJZW50cnktPmxpc3Rl bmVyID0gSU5WQUxJRF9QUk9DX05VTUJFUjsKKwkJfQorCQkvKiBJZiBhbHJlYWR5IG1hcmtl ZCBhcyBoYXZpbmcgbXVsdGlwbGUgbGlzdGVuZXJzLCBub3RoaW5nIHRvIGRvICovCisJfQor fQorCisvKgorICogQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcgorICoJCVVwZGF0ZSB0aGUg Y2hhbm5lbCBoYXNoIHdoZW4gYSBiYWNrZW5kIHN0b3BzIGxpc3RlbmluZyBvbiBhIGNoYW5u ZWwuCisgKgorICogSWYgdGhlIGNoYW5uZWwgZW50cnkgY3VycmVudGx5IHRyYWNrcyBleGFj dGx5IG9uZSBsaXN0ZW5lciBhbmQgdGhhdAorICogbGlzdGVuZXIgbWF0Y2hlcyB0aGUgc3Vw cGxpZWQgcHJvY25vLCByZW1vdmUgdGhlIGVudHJ5IGFsdG9nZXRoZXIuCisgKgorICogSWYg dGhlIGNoYW5uZWwgaGFzIGFscmVhZHkgYmVlbiBmbGFnZ2VkIGFzIGhhdmluZyBtdWx0aXBs ZSBsaXN0ZW5lcnMsCisgKiB3ZSBubyBsb25nZXIgdHJhY2sgaW5kaXZpZHVhbCBiYWNrZW5k czsgdGhlcmVmb3JlIHdlIGNhbm5vdCByZW1vdmUgYQorICogc2luZ2xlIGJhY2tlbmQgd2l0 aG91dCBhZGRpdGlvbmFsIGJvb2trZWVwaW5nLiAgSW4gdGhhdCBzaXR1YXRpb24gd2UKKyAq IHNpbXBseSBsZWF2ZSB0aGUgZW50cnkgaW4gcGxhY2UgKHN0aWxsIG1hcmtlZCBhcyBoYXZp bmcgbXVsdGlwbGUKKyAqIGxpc3RlbmVycykgYW5kIHJldHVybi4KKyAqCisgKiBDYWxsZXIg bXVzdCBob2xkIGV4Y2x1c2l2ZSBOb3RpZnlRdWV1ZUxvY2suCisgKi8KK3N0YXRpYyB2b2lk CitDaGFubmVsSGFzaFJlbW92ZUxpc3RlbmVyKGNvbnN0IGNoYXIgKmNoYW5uZWwsIFByb2NO dW1iZXIgcHJvY25vKQoreworCUNoYW5uZWxFbnRyeSAqZW50cnk7CisJQ2hhbm5lbEhhc2hL ZXkga2V5OworCisJQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KCZrZXksIE15RGF0YWJhc2VJZCwg Y2hhbm5lbCk7CisKKwkvKiBMb29rIHVwIHRoZSBjaGFubmVsIGVudHJ5ICovCisJZW50cnkg PSAoQ2hhbm5lbEVudHJ5ICopIGhhc2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCksCisJCQkJ CQkJCQkJICZrZXksCisJCQkJCQkJCQkJIEhBU0hfRklORCwKKwkJCQkJCQkJCQkgTlVMTCk7 CisKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm47CQkJCQkvKiBDaGFubmVsIG5vdCBmb3VuZCAq LworCisJLyoKKwkgKiBJZiB0aGlzIGNoYW5uZWwgaGFzIG11bHRpcGxlIGxpc3RlbmVycywg d2UgY2FuJ3QgdHJhY2sgaW5kaXZpZHVhbAorCSAqIHJlbW92YWxzLiBKdXN0IGxlYXZlIGl0 IG1hcmtlZCBhcyBoYXZpbmcgbXVsdGlwbGUgbGlzdGVuZXJzLgorCSAqLworCWlmIChlbnRy eS0+aGFzX211bHRpcGxlX2xpc3RlbmVycykKKwkJcmV0dXJuOworCisJLyogSWYgdGhpcyBi YWNrZW5kIGlzIHRoZSBzaW5nbGUgbGlzdGVuZXIsIHJlbW92ZSB0aGUgY2hhbm5lbCBlbnRy eSAqLworCWlmIChlbnRyeS0+bGlzdGVuZXIgPT0gcHJvY25vKQorCXsKKwkJaGFzaF9zZWFy Y2goR2V0Q2hhbm5lbEhhc2goKSwKKwkJCQkJJmtleSwKKwkJCQkJSEFTSF9SRU1PVkUsCisJ CQkJCU5VTEwpOworCX0KK30KKworLyoKKyAqIENoYW5uZWxIYXNoUmVtb3ZlQmFja2VuZEZy b21BbGwKKyAqCQlTd2VlcCB0aGUgY2hhbm5lbCBoYXNoIGFuZCBkZWxldGUgYW55IGNoYW5u ZWwgZW50cmllcyBmb3Igd2hpY2gKKyAqCQl0aGlzIGJhY2tlbmQgaXMgdGhlIG9ubHkgdHJh Y2tlZCBsaXN0ZW5lciBpbiB0aGUgY3VycmVudCBkYXRhYmFzZS4KKyAqCisgKiBDYWxsZXIg bXVzdCBob2xkIGV4Y2x1c2l2ZSBOb3RpZnlRdWV1ZUxvY2suCisgKi8KK3N0YXRpYyB2b2lk CitDaGFubmVsSGFzaFJlbW92ZUJhY2tlbmRGcm9tQWxsKFByb2NOdW1iZXIgcHJvY25vKQor eworCUhBU0hfU0VRX1NUQVRVUyBzdGF0dXM7CisJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwor CWhhc2hfc2VxX2luaXQoJnN0YXR1cywgR2V0Q2hhbm5lbEhhc2goKSk7CisKKwl3aGlsZSAo KGVudHJ5ID0gKENoYW5uZWxFbnRyeSAqKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9 IE5VTEwpCisJeworCQlpZiAoZW50cnktPmtleS5kYm9pZCAhPSBNeURhdGFiYXNlSWQpCisJ CQljb250aW51ZTsKKworCQlpZiAoZW50cnktPmhhc19tdWx0aXBsZV9saXN0ZW5lcnMpCisJ CQljb250aW51ZTsKKworCQlpZiAoZW50cnktPmxpc3RlbmVyID09IHByb2NubykKKwkJewor CQkJaGFzaF9zZWFyY2goR2V0Q2hhbm5lbEhhc2goKSwKKwkJCQkJCSZlbnRyeS0+a2V5LAor CQkJCQkJSEFTSF9SRU1PVkUsCisJCQkJCQlOVUxMKTsKKwkJfQorCX0KK30KKworLyoKKyAq IENoYW5uZWxIYXNoTG9va3VwCisgKgkJTG9vayB1cCB0aGUgY2hhbm5lbCBoYXNoIGVudHJ5 IGZvciB0aGUgZ2l2ZW4gY2hhbm5lbCBuYW1lIGluIHRoZQorICoJCWN1cnJlbnQgZGF0YWJh c2UuCisgKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBjaGFubmVsIGlzIG5vdCBiZWluZyB0 cmFja2VkIChubyBsaXN0ZW5lcnMsIG9yIGNoYW5uZWwKKyAqIGZlbGwgYmFjayB0byBicm9h ZGNhc3QgbW9kZSBiZWNhdXNlIHdlIHJhbiBvdXQgb2Ygc2hhcmVkIG1lbW9yeSB3aGVuIHRy eWluZworICogdG8gYWRkIGVudHJpZXMgdG8gdGhlIGhhc2ggdGFibGUpLgorICoKKyAqIENh bGxlciBtdXN0IGhvbGQgYXQgbGVhc3Qgc2hhcmVkIE5vdGlmeVF1ZXVlTG9jay4KKyAqLwor c3RhdGljIENoYW5uZWxFbnRyeSAqCitDaGFubmVsSGFzaExvb2t1cChjb25zdCBjaGFyICpj aGFubmVsKQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKworCUFzc2VydChMV0xvY2tIZWxk QnlNZShOb3RpZnlRdWV1ZUxvY2spKTsKKworCUNoYW5uZWxIYXNoUHJlcGFyZUtleSgma2V5 LCBNeURhdGFiYXNlSWQsIGNoYW5uZWwpOworCisJcmV0dXJuIChDaGFubmVsRW50cnkgKikg aGFzaF9zZWFyY2goR2V0Q2hhbm5lbEhhc2goKSwKKwkJCQkJCQkJCQkma2V5LAorCQkJCQkJ CQkJCUhBU0hfRklORCwKKwkJCQkJCQkJCQlOVUxMKTsKK30KKworLyoKKyAqIEdldFBlbmRp bmdOb3RpZnlDaGFubmVscworICoJCUdldCBsaXN0IG9mIHVuaXF1ZSBjaGFubmVsIG5hbWVz IGZyb20gcGVuZGluZyBub3RpZmljYXRpb25zLgorICovCitzdGF0aWMgTGlzdCAqCitHZXRQ ZW5kaW5nTm90aWZ5Q2hhbm5lbHModm9pZCkKK3sKKwlMaXN0CSAgICpjaGFubmVscyA9IE5J TDsKKwlMaXN0Q2VsbCAgICpwOworCUxpc3RDZWxsICAgKnE7CisJYm9vbAkJZm91bmQ7CisK KwlpZiAoIXBlbmRpbmdOb3RpZmllcykKKwkJcmV0dXJuIE5JTDsKKworCS8qIENvbGxlY3Qg dW5pcXVlIGNoYW5uZWwgbmFtZXMgZnJvbSBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgKi8KKwlm b3JlYWNoKHAsIHBlbmRpbmdOb3RpZmllcy0+ZXZlbnRzKQorCXsKKwkJTm90aWZpY2F0aW9u ICpuID0gKE5vdGlmaWNhdGlvbiAqKSBsZmlyc3QocCk7CisJCWNoYXIJICAgKmNoYW5uZWwg PSBuLT5kYXRhOworCisJCS8qIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGNoYW5u ZWwgaW4gb3VyIGxpc3QgKi8KKwkJZm91bmQgPSBmYWxzZTsKKwkJZm9yZWFjaChxLCBjaGFu bmVscykKKwkJeworCQkJY2hhcgkgICAqZXhpc3RpbmcgPSAoY2hhciAqKSBsZmlyc3QocSk7 CisKKwkJCWlmIChzdHJjbXAoZXhpc3RpbmcsIGNoYW5uZWwpID09IDApCisJCQl7CisJCQkJ Zm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkK KwkJCWNoYW5uZWxzID0gbGFwcGVuZChjaGFubmVscywgY2hhbm5lbCk7CisJfQorCisJcmV0 dXJuIGNoYW5uZWxzOworfQotLSAKMi40Ny4xCgo= --e60477712d0242898ea7170d4a00c39c--