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 1v1Bg8-005Uvv-Td for pgsql-hackers@arkaria.postgresql.org; Tue, 23 Sep 2025 22:40:09 +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 1v1Bg6-008drn-Up for pgsql-hackers@arkaria.postgresql.org; Tue, 23 Sep 2025 22:40:06 +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 1v1Bg6-008dre-B3 for pgsql-hackers@lists.postgresql.org; Tue, 23 Sep 2025 22:40:06 +0000 Received: from mail-pf1-x433.google.com ([2607:f8b0:4864:20::433]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v1Bg3-0024aj-0L for pgsql-hackers@postgresql.org; Tue, 23 Sep 2025 22:40:05 +0000 Received: by mail-pf1-x433.google.com with SMTP id d2e1a72fcca58-77db1bcf4d3so4671407b3a.1 for ; Tue, 23 Sep 2025 15:40:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758667202; x=1759272002; darn=postgresql.org; h=in-reply-to:references:to:from:subject:cc:message-id:date :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=b9D23E+LaZRn5/3lGa58KIyn204ZMI3PuSSNHtS6xcs=; b=gD203j74/9uDj5DYUTKJ7UQhrzoz7UMOi0IQxv6l/GNb45gnrXyVEDJ7yLM9ll/VwV Kfc2tJ9RmFiJyjUl03rvug48zjsCChDC18cQRJpeL15bZTKABW8O5ub8OEIrk5c18EqR ykHpdAMP29Mh9sojRVM2/bmCFOMDHKfRuiSzVkWNsaSKdcFiDBUdO8IJ0AcXSy5T4MZz Etabq4D44UjS1JjuC3fabDuDDoshYOlwKGcUB4zeIibFJUOWLesmcE2xbhW8wY71kElY kDKGJaVDIG4WK8upZwTUFUVFGAg5vXcN7b4hsGME5iiXSXxa6FgXs6pbIEs3qPWfPaBw U/NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758667202; x=1759272002; h=in-reply-to:references:to:from:subject:cc:message-id:date :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=b9D23E+LaZRn5/3lGa58KIyn204ZMI3PuSSNHtS6xcs=; b=kHXkTDyl8vIMrhPRBB64DHPb0Ivv0qCpudU0g9R9l4Vco9r5w1yE+6hBS50LxDbgtz gH2ZCWS3JeoCAdbU3aFOprAHZi0wTThjfL0YWz155RtQbyjUHL2Pdvy6+toRuGGN/05D Na9a+d3QgarRan+LjJKqgfdqdId6uvzi377W16LjK5YRVEnXxUUw7Ewo+5q+0y5eoIsb FACyVV1tlln7utFV53oHNGSIu7Kw2ociuWqIiSZUbonlFZVHQG5j5NIxNcKuQ61CxIJX 8rFN3d4M81ZzYuFfbrWc5C3iGOA9wLVHc/zahLoH+WiU4jntJp9tjgecNJt13jvVqKfs HoLQ== X-Forwarded-Encrypted: i=1; AJvYcCURSOb542FA61PDtgtdv3sVM212yYfGMR/+8mg+kLf4SdA72oF43ZH+aiU8mMfCkjuP5YOdoD7biJ055kqB@postgresql.org X-Gm-Message-State: AOJu0YxzzTR7iRkJ9tHkO0Ad5OFJ9tyozKroNoU+fa7sBtNmImnL1xM8 0g/j3IgNmyAm3yoySJae0SOuQIg7jijVlz+5MBvF7Ud5wfEfHgmf/Jqv X-Gm-Gg: ASbGnctzt+fV1HJyMdMO3tDOofiOfrxhAfi8MrGKYz3wRB4iQApKoh9BLT4yXwYCLD0 Ksn8b6onCwyafhsk2C2iPagt3lvcJ533OUWA+ucx8dQhdClKce9Z9gv99sfWE5qmE4sxK8G7Iwg 1J8n/mrwtY0eYfH8ZZGCxJyZ5eSq85CyXwBGPyG61ftyKuFScDX5kW2LCTJZsGMun66/+AswHFI M75cyJ/RwFAUM0AnHFs9sCN/rAntCLQx/wbT+z/ckITTOGUUvgWKOTvLHrtF2s6dY6d7IT2OZBc CHeL3frlTJ5JX72sG2gyj1JsLZ2nmdmchMn0+TigwQ5z+HDad5ii8hcxKsDNxi1S8E7LjVnklDB kYbCAfKyZ2FMDFnpsl4m/xCs0FrLWK4oArJS7LGwbrSMRT/2TkjJlFPCD X-Google-Smtp-Source: AGHT+IHLKU/91KPru1seoc+UK1wbZY7lgaCoQaQoO9B7HGYiuuLRTkxbvDY2CNA1XOK2oP8UyjAl/A== X-Received: by 2002:a05:6a21:328e:b0:251:8a26:2654 with SMTP id adf61e73a8af0-2cffedc5c8cmr6282680637.54.1758667202433; Tue, 23 Sep 2025 15:40:02 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:d887:c9bc:4225:588e]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77f3e587ceesm6426516b3a.35.2025.09.23.15.39.59 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 23 Sep 2025 15:40:01 -0700 (PDT) Content-Type: multipart/mixed; boundary=b88862a1a4f8d0e462261ea8c70f7f59b3d28cbadc42fcc6b9f2261827ec Mime-Version: 1.0 Date: Tue, 23 Sep 2025 19:39:57 -0300 Message-Id: Cc: "Masahiko Sawada" , "Rishu Bagga" , "Yura Sokolov" , "Daniil Davydov" <3danissimo@gmail.com>, =?utf-8?q?=C3=81lvaro_Herrera?= , "Alexandra Wang" , "PostgreSQL Hackers" , "Tom Lane" , "Joel Jacobson" Subject: Re: LISTEN/NOTIFY bug: VACUUM sets frozenxid past a xid in async queue From: "Matheus Alcantara" To: "Arseniy Mukhin" X-Mailer: aerc 0.20.1 References: <202508061044.ptcyt7aqsaaa@alvherre.pgsql> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --b88862a1a4f8d0e462261ea8c70f7f59b3d28cbadc42fcc6b9f2261827ec Content-Type: multipart/alternative; boundary=eba1a779bfeaf120e94d14137521754258f028d3cb6dc2e43b7fce7a3616 --eba1a779bfeaf120e94d14137521754258f028d3cb6dc2e43b7fce7a3616 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Tue Sep 23, 2025 at 1:11 PM -03, Arseniy Mukhin wrote: >> Thanks for the explanation! I'm just not sure if I understand why do we >> need the LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE) on >> PreCommit_Notify() if we already have the >> LockSharedObject(DatabaseRelationId, InvalidOid, 0, AccessExclusiveLock)= ; >> > > Good question. It seems that it would be enough to hold > NotifyQueueLock only during the head update, so I don't understand it > either. > IIUC correctly we acquire the LockSharedObject(DatabaseRelationId, InvalidOid, 0, AccessExclusiveLock) to make other COMMIT's wait and the LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE) to make listener backends wait while we are adding the entries on the queue. > Thank you for the new version! > > The fix looks exactly how I thought about it. But while thinking about > why we need to hold NotifyQueueLock in PreCommit_Notify I realized > there is a concurrency bug in the 'head resetting' approach. I thought > that listeners hold NotifyQueueLock lock while reading notifications > from the queue, but now I see that they hold it only while reading the > current head position. So we can end up in the next situation: > > There are 2 backends: listener and writer (backend with notifications) > > > listener writer > ---------------------------------------------------------------------- > writer wants to commit, so it > adds notifications to the queue > in PreCommit_Notify() and advanc= es > queue head. > > ---------------------------------------------------------------------- > listener wants to read notifications. It > gets into asyncQueueReadAllNotifications() > and reads the current head (it already > contains writer's notifications): > > > asyncQueueReadAllNotifications() > ... > LWLockAcquire(NotifyQueueLock, LW_SHARED); > head =3D QUEUE_HEAD; > LWLockRelease(NotifyQueueLock); > ... > > ---------------------------------------------------------------------- > writer failed to commit, so it > resets queue head in AtAbort_Not= ify() > and completes the transaction. > > ---------------------------------------------------------------------- > listener gets a snapshot where the writer > is not in progress. > > ... > snapshot =3D RegisterSnapshot(GetLatestSnapshot()); > ... > > > This way the listener reads the head that includes all writer's > notifications and a snapshot where the writer is not in progress, so > nothing stops the listener from sending these notifications and it's > even possible to have the listener's position that is after the queue > head, so yes, it's bad :( Sorry about that. > Yeah, this is bad. I'm wondering if we could reproduce such race conditions scenarios with some TAP tests. > Probably we can fix it (swap GetLatestSnapshot() with the head > position reading for example) but now I think that 'committed' field > approach is a more robust way to fix the bug. What do you think? > I also agree that the committed field seems a more safe approach. > BTW one thing about 'committed' field fix version [0]. It seems that > instead of remembering all notification positions, we can remember the > head position after we acquire global lock and before we write > anything to the queue and in case of abort we can just start from the > saved position and mark all notifications until the end of the queue > as 'committed =3D false'. The reason is the same as with resetting the > head approach - as we hold global lock, no writers can add > notifications to the queue, so when we in AtAbort_Notify() all > notifications after the saved position are ours. > See the new attached version which implements this idea of using the committed field approach. I was just a bit concenerd about a race condition situation where the QUEUE_HEAD is changed by another publisher process and just iterating over all entries from the saved previous QUEUE_HEAD position until the current QUEUE_HEAD position we could mark successfully committed notifications as not committed by mistake, so in this new patch version I save the QUEUE_HEAD position before we add the entries on the shared queue and also the QUEUE_HEAD position after these entries are added so we ensure that we only process the entries of this range although we have the global lock LockSharedObject(DatabaseRelationId) that may prevent this situation. What do you think? -- Matheus Alcantara --eba1a779bfeaf120e94d14137521754258f028d3cb6dc2e43b7fce7a3616-- --b88862a1a4f8d0e462261ea8c70f7f59b3d28cbadc42fcc6b9f2261827ec Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v3-0001-Make-AsyncQueueEntry-s-self-contained.patch Content-Type: text/plain; charset=utf-8; name=v3-0001-Make-AsyncQueueEntry-s-self-contained.patch RnJvbSA4YzEyNjc3MTFmMjZhN2IzMmI4ZTJiOTY5MzQ2OWIzZTQwN2JiOGE4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFNhdCwgNiBTZXAgMjAyNSAxMToyOTowMiAtMDMwMApTdWJqZWN0OiBbUEFUQ0ggdjNdIE1h a2UgQXN5bmNRdWV1ZUVudHJ5J3Mgc2VsZiBjb250YWluZWQKClByZXZpb3VzbHkgdGhlIGFzeW5j UXVldWVQcm9jZXNzUGFnZUVudHJpZXMoKSB1c2UgdGhlClRyYW5zYWN0aW9uSWREaWRDb21taXQo KSB0byBjaGVjayBpZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhIG5vdGlmaWNhdGlvbgpiZWxvbmdz IGlzIGNvbW1pdHRlZCBvciBub3QuIEFsdGhvdWdoIHRoaXMgd29yayBmb3IgYWxtb3N0IGFsbCBz Y2VuYXJpb3MKd2UgbWF5IGhhdmUgc29tZSBjYXNlcyB3aGVyZSBpZiBhIG5vdGlmaWNhdGlvbiBp cyBrZWVwIGZvciB0byBsb25nIG9uCnRoZSBxdWV1ZSBhbmQgdGhlIFZBQ1VVTSBGUkVFWkUgaXMg ZXhlY3V0ZWQgZHVyaW5nIHRoaXMgdGltZSBpdCBtYXkKcmVtb3ZlIGNsb2cgZmlsZXMgdGhhdCBp cyBuZWVkZWQgdG8gY2hlY2sgdGhlIHRyYW5zYWN0aW9uIHN0YXR1cyBvZgp0aGVzZSBub3RpZmlj YXRpb25zIHdoaWNoIHdpbGwgY2F1c2UgZXJyb3JzIHRvIGxpc3RlbmVyIGJhY2tlbmRzIHdoZW4K cmVhZGluZyB0aGUgYXN5bmMgcXVldWUuCgpUaGlzIGNvbW1pdCBmaXggdGhpcyBpc3N1ZSBieSBt YWtpbmcgdGhlIEFzeW5jUXVldWVFbnRyeSBzZWxmIGNvbnRhaW5lZApieSBhZGRpbmcgdGhlICJj b21taXR0ZWQiIGJvb2xlYW4gZmllbGQgc28gYXN5bmNRdWV1ZVByb2Nlc3NQYWdlRW50cmllcygp CmNhbiB1c2UgdGhpcyB0byBjaGVjayBpZiB0aGUgdHJhbnNhY3Rpb24gb2YgdGhlIG5vdGlmaWNh dGlvbiBpcwpjb21taXR0ZWQgb3Igbm90LgoKV2Ugc2V0IGNvbW1pdHRlZCBhcyB0cnVlIHdoZW4g YWRkaW5nIHRoZSBlbnRyeSBvbiB0aGUgU0xSVSBwYWdlIGJ1ZmZlcgpjYWNoZSB3aGVuIFByZUNv bW1pdF9Ob3RpZnkoKSBpcyBjYWxsZWQgYW5kIGlmIGFuIGVycm9yIG9jY3VyIGJlZm9yZQpBdENv bW1pdF9Ob3RpZnkoKSB0aGUgQXRBYm9ydF9Ob3RpZnkoKSB3aWxsIGJlIGNhbGxlZCB3aGljaCB3 aWxsIG1hcmsKdGhlIGNvbW1pdHRlZCBmaWVsZCBhcyBmYWxzZS4gV2UgZG8gdGhpcyBieSByZW1l bWJlcmluZyB0aGUgUVVFVUVfSEVBRApwb3NpdGlvbiBiZWZvcmUgdGhlIFByZUNvbW1pdF9Ob3Rp ZnkoKSBzdGFydCBhZGRpbmcgZW50cmllcyBvbiB0aGUKc2hhcmVkIHF1ZXVlLCBhbmQgaWYgdGhl IHRyYW5zYWN0aW9uIGNyYXNoIHdlIGl0ZXJhdGUgZnJvbSB0aGlzIHNhdmVkCnBvc2l0aW9uIHVu dGlsIHRoZSBuZXcgUVVFVUVfSEVBRCBwb3NpdGlvbiBtYXJraW5nIHRoZSBlbnRyaWVzIGFzIG5v dApjb21taXR0ZWQuCgpBbHNvIHRoaXMgY29tbWl0IGluY2x1ZGUgVEFQIHRlc3RzIHRvIGV4ZXJj aXNlIHRoZSBWQUNVVU0gRlJFRVpFIGlzc3VlCmFuZCBhbHNvIHRoZSBzY2VuYXJpbyBvZiBhbiBl cnJvciBiZWluZyBvY2N1ciBiZXR3ZWVuIHRoZQpQcmVDb21taXRfTm90aWZ5KCkgYW5kIEF0Q29t bWl0X05vdGlmeSgpIGNhbGxzLgoKQ28tYXV0aG9yZWQtYnk6IEFyc2VuaXkgTXVraGluIDxhcnNl bml5Lm11a2hpbi5kZXZAZ21haWwuY29tPgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5j LmMgICAgICAgICAgICAgICAgICB8IDE2OCArKysrKysrKysrKysrKysrKy0KIHNyYy9iYWNrZW5k L3N0b3JhZ2UvbG1nci9sbWdyLmMgICAgICAgICAgICAgICB8ICAxOSArKwogc3JjL2luY2x1ZGUv c3RvcmFnZS9sbWdyLmggICAgICAgICAgICAgICAgICAgIHwgICAzICsKIHNyYy90ZXN0L21vZHVs ZXMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvdGVzdC9tb2R1bGVz L21lc29uLmJ1aWxkICAgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL3Rlc3QvbW9kdWxlcy90 ZXN0X2xpc3Rlbl9ub3RpZnkvTWFrZWZpbGUgIHwgIDE3ICsrCiAuLi4vbW9kdWxlcy90ZXN0X2xp c3Rlbl9ub3RpZnkvbWVzb24uYnVpbGQgICAgfCAgMTQgKysKIC4uLi90ZXN0X2xpc3Rlbl9ub3Rp ZnkvdC8wMDFfeGlkX2ZyZWV6ZS5wbCAgICB8ICA2NiArKysrKysrCiAuLi4vdC8wMDJfYWJvcnRl ZF90eF9ub3RpZmllcy5wbCAgICAgICAgICAgICAgfCAgNjYgKysrKysrKwogc3JjL3Rvb2xzL3Bn aW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwgICAxICsKIDEwIGZpbGVzIGNoYW5n ZWQsIDM1NSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2xpc3Rlbl9ub3RpZnkvTWFrZWZpbGUKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbGlzdGVuX25vdGlmeS9tZXNvbi5idWlsZAog Y3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9saXN0ZW5fbm90aWZ5L3Qv MDAxX3hpZF9mcmVlemUucGwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rl c3RfbGlzdGVuX25vdGlmeS90LzAwMl9hYm9ydGVkX3R4X25vdGlmaWVzLnBsCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2Fz eW5jLmMKaW5kZXggNGJkMzdkNWJlYjUuLjQ5YzljOGIwYjVjIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9jb21tYW5kcy9hc3luYy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMK QEAgLTE4MCw2ICsxODAsOCBAQCB0eXBlZGVmIHN0cnVjdCBBc3luY1F1ZXVlRW50cnkKIAlPaWQJ CQlkYm9pZDsJCQkvKiBzZW5kZXIncyBkYXRhYmFzZSBPSUQgKi8KIAlUcmFuc2FjdGlvbklkIHhp ZDsJCQkvKiBzZW5kZXIncyBYSUQgKi8KIAlpbnQzMgkJc3JjUGlkOwkJCS8qIHNlbmRlcidzIFBJ RCAqLworCWJvb2wJCWNvbW1pdHRlZDsJCS8qIElzIHRyYW5zYWN0aW9uIHRoYXQgdGhlIGVudHJ5 IGJlbG9uZ3MKKwkJCQkJCQkJICogY29tbWl0dGVkPyAqLwogCWNoYXIJCWRhdGFbTkFNRURBVEFM RU4gKyBOT1RJRllfUEFZTE9BRF9NQVhfTEVOR1RIXTsKIH0gQXN5bmNRdWV1ZUVudHJ5OwogCkBA IC00MDEsOCArNDAzLDI3IEBAIHN0cnVjdCBOb3RpZmljYXRpb25IYXNoCiAJTm90aWZpY2F0aW9u ICpldmVudDsJCS8qID0+IHRoZSBhY3R1YWwgTm90aWZpY2F0aW9uIHN0cnVjdCAqLwogfTsKIAor LyogIEluZm9ybWF0aW9uIG5lZWRlZCBieSBBdF9BYm9ydE5vdGlmeSgpIHRvIHJlbW92ZSBlbnRy aWVzIGZyb20gdGhlIHF1ZXVlIGZvciBjcmFzaGVkIHRyYW5zYWN0aW9ucy4gKi8KK3R5cGVkZWYg c3RydWN0IEF0QWJvcnROb3RpZnlJbmZvCit7CisJLyoKKwkgKiBoZWFkIHBvc2l0aW9uIGJlZm9y ZSB0aGUgdHJhbnNhY3Rpb24gc3RhcnQgYWRkaW5nIGVudHJpZXMgb24gdGhlIHNoYXJlZAorCSAq IHF1ZXVlCisJICovCisJUXVldWVQb3NpdGlvbiBwcmV2aW91c0hlYWQ7CisKKwkvKgorCSAqIGhl YWQgcG9zaXRpb24gYWZ0ZXIgdGhlIGVudHJpZXMgZnJvbSB0aGUgaW4tcHJvZ3Jlc3MgdG8gY29t bWl0CisJICogdHJhbnNhY3Rpb24gd2VyZSBhZGRlZC4KKwkgKi8KKwlRdWV1ZVBvc2l0aW9uIGhl YWQ7CisKK30gQXRBYm9ydE5vdGlmeUluZm87CisKIHN0YXRpYyBOb3RpZmljYXRpb25MaXN0ICpw ZW5kaW5nTm90aWZpZXMgPSBOVUxMOwogCitzdGF0aWMgQXRBYm9ydE5vdGlmeUluZm8gKmF0QWJv cnRJbmZvID0gTlVMTDsKKwogLyoKICAqIEluYm91bmQgbm90aWZpY2F0aW9ucyBhcmUgaW5pdGlh bGx5IHByb2Nlc3NlZCBieSBIYW5kbGVOb3RpZnlJbnRlcnJ1cHQoKSwKICAqIGNhbGxlZCBmcm9t IGluc2lkZSBhIHNpZ25hbCBoYW5kbGVyLiBUaGF0IGp1c3Qgc2V0cyB0aGUKQEAgLTQ1Nyw2ICs0 NzgsNyBAQCBzdGF0aWMgdm9pZCBBZGRFdmVudFRvUGVuZGluZ05vdGlmaWVzKE5vdGlmaWNhdGlv biAqbik7CiBzdGF0aWMgdWludDMyIG5vdGlmaWNhdGlvbl9oYXNoKGNvbnN0IHZvaWQgKmtleSwg U2l6ZSBrZXlzaXplKTsKIHN0YXRpYyBpbnQJbm90aWZpY2F0aW9uX21hdGNoKGNvbnN0IHZvaWQg KmtleTEsIGNvbnN0IHZvaWQgKmtleTIsIFNpemUga2V5c2l6ZSk7CiBzdGF0aWMgdm9pZCBDbGVh clBlbmRpbmdBY3Rpb25zQW5kTm90aWZpZXModm9pZCk7CitzdGF0aWMgdm9pZCBhc3luY1F1ZXVl Um9sbGJhY2tOb3RpZmljYXRpb25zKHZvaWQpOwogCiAvKgogICogQ29tcHV0ZSB0aGUgZGlmZmVy ZW5jZSBiZXR3ZWVuIHR3byBxdWV1ZSBwYWdlIG51bWJlcnMuCkBAIC05MjIsNiArOTQ0LDE4IEBA IFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAkJTG9ja1NoYXJlZE9iamVjdChEYXRhYmFzZVJlbGF0 aW9uSWQsIEludmFsaWRPaWQsIDAsCiAJCQkJCQkgQWNjZXNzRXhjbHVzaXZlTG9jayk7CiAKKwkJ LyoKKwkJICogQmVmb3JlIHN0YXJ0IGFkZGluZyBlbnRyaWVzIG9uIHRoZSBzaGFyZWQgcXVldWUs IHNhdmUgdGhlIGN1cnJlbnQKKwkJICogUVVFVUVfSEVBRCBzbyBpZiB0aGUgY3VycmVudCBpbi1w cm9ncmVzcyB0byBjb21taXQgdHJhbnNhY3Rpb24KKwkJICogY3Jhc2ggd2UgY2FuIG1hcmsgdGhl IG5vdGlmaWNhdGlvbnMgYWRkZWQgYnkgdGhpcyBjcmFzaGVkCisJCSAqIHRyYW5zYWN0aW9uIGFz IG5vdCBjb21taXR0ZWQuIFNlZSBBdEFib3J0dF9Ob3RpZnkoKSBmb3IgbW9yZSBpbmZvLgorCQkg Ki8KKwkJQXNzZXJ0KGF0QWJvcnRJbmZvID09IE5VTEwpOworCQlhdEFib3J0SW5mbyA9IHBhbGxv YyhzaXplb2YoQXRBYm9ydE5vdGlmeUluZm8pKTsKKwkJTFdMb2NrQWNxdWlyZShOb3RpZnlRdWV1 ZUxvY2ssIExXX1NIQVJFRCk7CisJCWF0QWJvcnRJbmZvLT5wcmV2aW91c0hlYWQgPSBRVUVVRV9I RUFEOworCQlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CisKIAkJLyogTm93IHB1c2gg dGhlIG5vdGlmaWNhdGlvbnMgaW50byB0aGUgcXVldWUgKi8KIAkJbmV4dE5vdGlmeSA9IGxpc3Rf aGVhZChwZW5kaW5nTm90aWZpZXMtPmV2ZW50cyk7CiAJCXdoaWxlIChuZXh0Tm90aWZ5ICE9IE5V TEwpCkBAIC05NDgsNiArOTgyLDE3IEBAIFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAkJCUxXTG9j a1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKIAkJfQogCisJCS8qCisJCSAqIFNhdmUgdGhlIG5l dyBRVUVVRV9IRUFEIHBvc2l0aW9uIHNvIGlmIGFub3RoZXIgcHVibGlzaGVyIGFkZAorCQkgKiBl bnRyaWVzIG9uIHRoZSBzaGFyZWQgcXVldWUgYW5kIHN1Y2Nlc3NmdWxseSBjb21taXQgdGhlIHRy YW5zYWN0aW9uCisJCSAqIHdlIGRvbid0IGNoYW5nZSB0aGUgY29tbWl0dGVkIHN0YXR1cyBvZiB0 aGVzZSBub3RpZmljYXRpb25zIHdoaWxlCisJCSAqIG1hcmtpbmcgdGhlIG5vdGlmaWNhdGlvbiBm cm9tIGEgY3Jhc2hlZCB0cmFuc2FjdGlvbiBhcyBub3QKKwkJICogY29tbWl0dGVkLgorCQkgKi8K KwkJTFdMb2NrQWNxdWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX1NIQVJFRCk7CisJCWF0QWJvcnRJ bmZvLT5oZWFkID0gUVVFVUVfSEVBRDsKKwkJTFdMb2NrUmVsZWFzZShOb3RpZnlRdWV1ZUxvY2sp OworCiAJCS8qIE5vdGUgdGhhdCB3ZSBkb24ndCBjbGVhciBwZW5kaW5nTm90aWZpZXM7IEF0Q29t bWl0X05vdGlmeSB3aWxsLiAqLwogCX0KIH0KQEAgLTE0MDIsNiArMTQ0NywxMyBAQCBhc3luY1F1 ZXVlQWRkRW50cmllcyhMaXN0Q2VsbCAqbmV4dE5vdGlmeSkKIAkJLyogQ29uc3RydWN0IGEgdmFs aWQgcXVldWUgZW50cnkgaW4gbG9jYWwgdmFyaWFibGUgcWUgKi8KIAkJYXN5bmNRdWV1ZU5vdGlm aWNhdGlvblRvRW50cnkobiwgJnFlKTsKIAorCQkvKgorCQkgKiBNYXJrIHRoZSBlbnRyeSBhcyBj b21taXR0ZWQuIElmIHRoZSB0cmFuc2FjdGlvbiB0aGF0IHRoaXMKKwkJICogbm90aWZpY2F0aW9u IGJlbG9uZ3MgZmFpbHMgdG8gY29tbWl0IHRoZSBBdEFib3J0X05vdGlmeSgpIHdpbGwgbWFyawor CQkgKiB0aGlzIGVudHJ5IGFzIG5vdCBjb21taXR0ZWQuCisJCSAqLworCQlxZS5jb21taXR0ZWQg PSB0cnVlOworCiAJCW9mZnNldCA9IFFVRVVFX1BPU19PRkZTRVQocXVldWVfaGVhZCk7CiAKIAkJ LyogQ2hlY2sgd2hldGhlciB0aGUgZW50cnkgcmVhbGx5IGZpdHMgb24gdGhlIGN1cnJlbnQgcGFn ZSAqLwpAQCAtMTY3OCw2ICsxNzMwLDE2IEBAIEF0QWJvcnRfTm90aWZ5KHZvaWQpCiAJaWYgKGFt UmVnaXN0ZXJlZExpc3RlbmVyICYmIGxpc3RlbkNoYW5uZWxzID09IE5JTCkKIAkJYXN5bmNRdWV1 ZVVucmVnaXN0ZXIoKTsKIAorCS8qCisJICogQXRBYm9ydF9Ob3RpZnkgaW5mb3JtYXRpb24gaXMg c2V0IHdoZW4gd2UgYXJlIGFkZGluZyBlbnRyaWVzIG9uIHRoZQorCSAqIGdsb2JhbCBzaGFyZWQg cXVldWUgYXQgUHJlQ29tbWl0X05vdGlmeSgpLCBzbyBpbiBjYXNlIG9mIGEgY3Jhc2ggb24gdGhl CisJICogdHJhbnNhY3Rpb24gYmV0d2VlbiB0aGUgUHJlQ29tbWl0X05vdGlmeSgpIGFuZCBBdENv bW1pdF9Ob3RpZnkoKSB3ZSB1c2UKKwkgKiB0aGlzIGluZm9ybWF0aW9uIHRvIG1hcmsgdGhlIGVu dHJpZXMgZnJvbSB0aGUgY3Jhc2hlZCB0cmFuc2FjdGlvbiBhcworCSAqIG5vdCBjb21taXR0ZWQu CisJICovCisJaWYgKGF0QWJvcnRJbmZvICE9IE5VTEwpCisJCWFzeW5jUXVldWVSb2xsYmFja05v dGlmaWNhdGlvbnMoKTsKKwogCS8qIEFuZCBjbGVhbiB1cCAqLwogCUNsZWFyUGVuZGluZ0FjdGlv bnNBbmROb3RpZmllcygpOwogfQpAQCAtMjA2Niw3ICsyMTI4LDcgQEAgYXN5bmNRdWV1ZVByb2Nl c3NQYWdlRW50cmllcyh2b2xhdGlsZSBRdWV1ZVBvc2l0aW9uICpjdXJyZW50LAogCQkJCXJlYWNo ZWRTdG9wID0gdHJ1ZTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWVsc2UgaWYgKFRyYW5zYWN0aW9u SWREaWRDb21taXQocWUtPnhpZCkpCisJCQllbHNlIGlmIChxZS0+Y29tbWl0dGVkKQogCQkJewog CQkJCS8qIHFlLT5kYXRhIGlzIHRoZSBudWxsLXRlcm1pbmF0ZWQgY2hhbm5lbCBuYW1lICovCiAJ CQkJY2hhcgkgICAqY2hhbm5lbCA9IHFlLT5kYXRhOwpAQCAtMjM4NSw2ICsyNDQ3LDcgQEAgQ2xl YXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpCiAJICovCiAJcGVuZGluZ0FjdGlvbnMg PSBOVUxMOwogCXBlbmRpbmdOb3RpZmllcyA9IE5VTEw7CisJYXRBYm9ydEluZm8gPSBOVUxMOwog fQogCiAvKgpAQCAtMjM5NSwzICsyNDU4LDEwNiBAQCBjaGVja19ub3RpZnlfYnVmZmVycyhpbnQg Km5ld3ZhbCwgdm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKQogewogCXJldHVybiBjaGVj a19zbHJ1X2J1ZmZlcnMoIm5vdGlmeV9idWZmZXJzIiwgbmV3dmFsKTsKIH0KKworCisvKgorICog IE1hcmsgbm90aWZpY2F0aW9ucyBhZGRlZCBvbiBhbiBpbi1wcm9ncmVzcyB0byBjb21taXQgdHJh bnNhY3Rpb24gYXMgbm90IGNvbW1pdHRlZC4KKyAqCisgKiBOb3RpZmljYXRpb25zIGFkZGVkIG9u IHRoZSBzaGFyZWQgZ2xvYmFsIHF1ZXVlIGFyZSBhZGRlZCB3aXRoIGNvbW1pdHRlZCA9CisgKiB0 cnVlIGR1cmluZyBQcmVDb21taXRfTm90aWZ5KCkgY2FsbC4gSWYgYW4gZXJyb3Igb2NjdXIgYmV0 d2VlbiB0aGUKKyAqIFByZUNvbW1pdF9Ob3RpZnkoKSBhbmQgQXRDb21taXRfTm90aWZ5KCkgdGhl IEF0QWJvcnRfTm90aWZ5KCkgd2lsbCBiZSBjYWxsZWQKKyAqIGFuZCB3ZSBuZWVkIHRvIG1hcmsg dGhlc2Ugbm90aWZpY2F0aW9ucyBhZGRlZCBvbiB0aGUgc2hhcmVkIHF1ZXVlIGJ5IHRoZQorICog Y3Jhc2hlZCB0cmFuc2FjdGlvbiBhcyBub3QgY29tbWl0dGVkIHNvIHRoYXQgbGlzdGVuZXIgYmFj a2VuZHMgY2FuIHNraXAKKyAqIHRoZXNlIG5vdGlmaWNhdGlvbnMgd2hlbiByZWFkaW5nIHRoZSBx dWV1ZS4KKyAqCisgKiBXZSBwcmV2aW91c2x5IHJlbHkgb24gVHJhbnNhY3Rpb25EaWRDb21taXQo KSB0byBjaGVjayB0aGlzIGJ1dCBpZiBhCisgKiBub3RpZmljYXRpb24gaXMga2VlcCBmb3IgdG9v IGxvbmcgb24gdGhlIHF1ZXVlIGFuZCB0aGUgVkFDVVVNIEZSRUVaRSBpcworICogZXhlY3V0ZWQg ZHVyaW5nIHRoaXMgcGVyaW9kIGl0IGNhbiByZW1vdmUgY2xvZyBmaWxlcyB0aGF0IGlzIG5lZWRl ZCB0byBjaGVjaworICogdGhlIHRyYW5zYWN0aW9uIHN0YXR1cyBvZiB0aGlzIG5vdGlmaWNhdGlv biwgc28gd2UgbWFrZSB0aGUgbm90aWZpY2F0aW9uCisgKiBlbnRyaWVzIHNlbGYgY29udGFpbmVk IHRvIHNraXAgdGhpcyBwcm9ibGVtLgorICoKKyAqLworc3RhdGljIHZvaWQKK2FzeW5jUXVldWVS b2xsYmFja05vdGlmaWNhdGlvbnModm9pZCkKK3sKKwlRdWV1ZVBvc2l0aW9uIGN1cnJlbnQgPSBh dEFib3J0SW5mby0+cHJldmlvdXNIZWFkOworCVF1ZXVlUG9zaXRpb24gaGVhZCA9IGF0QWJvcnRJ bmZvLT5oZWFkOworCisJLyoKKwkgKiBJdGVyYXRlcyBmcm9tIHRoZSBwb3NpdGlvbiBzYXZlZCBh dCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2FjdGlvbgorCSAqIChwcmV2aW91c0hlYWQpIHRv IHRoZSBjdXJyZW50IGhlYWQgb2YgdGhlIHF1ZXVlLiBXZSBkbyB0aGlzIHRvIG1hcmsgYWxsCisJ ICogZW50cmllcyB3aXRoaW4gdGhpcyByYW5nZSBhcyB1bmNvbW1pdHRlZCBpbiBjYXNlIG9mIGEg dHJhbnNhY3Rpb24KKwkgKiBjcmFzaC4KKwkgKi8KKwlmb3IgKDs7KQorCXsKKwkJaW50NjQJCWN1 cnBhZ2UgPSBRVUVVRV9QT1NfUEFHRShjdXJyZW50KTsKKwkJaW50CQkJY3Vyb2Zmc2V0ID0gUVVF VUVfUE9TX09GRlNFVChjdXJyZW50KTsKKwkJTFdMb2NrCSAgICpsb2NrID0gU2ltcGxlTHJ1R2V0 QmFua0xvY2soTm90aWZ5Q3RsLCBjdXJwYWdlKTsKKwkJaW50CQkJc2xvdG5vOworCisJCS8qCisJ CSAqIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgaGVhZCwgYWxsIGVudHJpZXMgZnJvbSB0aGlzIHRy YW5zYWN0aW9uIGhhdmUKKwkJICogYmVlbiBtYXJrZWQgYXMgbm90IGNvbW1pdHRlZCBzbyBicmVh ayB0aGUgbG9vcC4KKwkJICovCisJCWlmIChRVUVVRV9QT1NfRVFVQUwoY3VycmVudCwgaGVhZCkp CisJCQlicmVhazsKKworCQkvKgorCQkgKiBBY3F1aXJlIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRo ZSBjdXJyZW50IFNMUlUgcGFnZSB0byBlbnN1cmUgbm8KKwkJICogb3RoZXIgcHJvY2VzcyBjYW4g cmVhZCBvciB3cml0ZSB0byBpdCB3aGlsZSB3ZSBhcmUgbWFya2luZyB0aGUKKwkJICogZW50cmll cy4KKwkJICovCisJCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfRVhDTFVTSVZFKTsKKworCQkvKiBG ZXRjaCB0aGUgcGFnZSBmcm9tIFNMUlUgdG8gbWFyayBlbnRyaWVzIGFzIG5vdCBjb21taXR0ZWQu ICovCisJCXNsb3RubyA9IFNpbXBsZUxydVJlYWRQYWdlKE5vdGlmeUN0bCwgY3VycGFnZSwgdHJ1 ZSwgSW52YWxpZFRyYW5zYWN0aW9uSWQpOworCisJCS8qCisJCSAqIExvb3AgdGhyb3VnaCBhbGwg ZW50cmllcyBvbiB0aGUgY3VycmVudCBwYWdlLiBUaGUgbG9vcCB3aWxsCisJCSAqIGNvbnRpbnVl IHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHBhZ2Ugb3IgdGhlIGN1cnJlbnQgaGVhZC4K KwkJICovCisJCWZvciAoOzspCisJCXsKKwkJCUFzeW5jUXVldWVFbnRyeSAqcWU7CisJCQlib29s CQlyZWFjaGVkRW5kT2ZQYWdlOworCisJCQkvKgorCQkJICogQ2hlY2sgYWdhaW4gdG8gc3RvcCBw cm9jZXNzaW5nIHRoZSBlbnRyaWVzIG9uIHRoZSBjdXJyZW50IHBhZ2UuCisJCQkgKi8KKwkJCWlm IChRVUVVRV9QT1NfRVFVQUwoY3VycmVudCwgaGVhZCkpCisJCQkJYnJlYWs7CisKKwkJCS8qCisJ CQkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVudHJ5IHdpdGhpbiB0aGUgc2hhcmVk IHBhZ2UKKwkJCSAqIGJ1ZmZlci4KKwkJCSAqLworCQkJcWUgPSAoQXN5bmNRdWV1ZUVudHJ5ICop IChOb3RpZnlDdGwtPnNoYXJlZC0+cGFnZV9idWZmZXJbc2xvdG5vXSArIGN1cm9mZnNldCk7CisK KwkJCS8qCisJCQkgKiBKdXN0IGZvciBzYW5pdHksIGFsbCBlbnRyaWVzIG9uIHRoZSBzaGFyZWQg cXVldWUgc2hvdWxkIGJlCisJCQkgKiBtYXJrZWQgYXMgbm90IGNvbW1pdHRlZC4KKwkJCSAqLwor CQkJQXNzZXJ0KHFlLT5jb21taXR0ZWQpOworCisJCQkvKgorCQkJICogTWFyayB0aGUgZW50cnkg YXMgdW5jb21taXR0ZWQgc28gbGlzdGVuZXIgYmFja2VuZHMgY2FuIHNraXAKKwkJCSAqIHRoaXMg bm90aWZpY2F0aW9uLgorCQkJICovCisJCQlxZS0+Y29tbWl0dGVkID0gZmFsc2U7CisKKwkJCS8q IEFkdmFuY2Ugb3VyIHBvc2l0aW9uLiAqLworCQkJcmVhY2hlZEVuZE9mUGFnZSA9IGFzeW5jUXVl dWVBZHZhbmNlKCZjdXJyZW50LCBxZS0+bGVuZ3RoKTsKKwkJCWlmIChyZWFjaGVkRW5kT2ZQYWdl KQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogVXBkYXRlIHRoZSBvZmZzZXQgZm9yIHRoZSBu ZXh0IGl0ZXJhdGlvbiB3aXRoaW4gdGhlIHNhbWUgcGFnZS4KKwkJCSAqLworCQkJY3Vyb2Zmc2V0 ID0gUVVFVUVfUE9TX09GRlNFVChjdXJyZW50KTsKKwkJfQorCisJCS8qIFJlbGVhc2UgdGhlIGV4 Y2x1c2l2ZSBsb2NrIG9uIHRoZSBwYWdlLiAqLworCQlMV0xvY2tSZWxlYXNlKGxvY2spOworCX0K K30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9sbWdyLmMgYi9zcmMvYmFj a2VuZC9zdG9yYWdlL2xtZ3IvbG1nci5jCmluZGV4IDQ3OThlYjc5MDAzLi4xMmEyMWM1MTQ1MiAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL2xtZ3IuYworKysgYi9zcmMvYmFj a2VuZC9zdG9yYWdlL2xtZ3IvbG1nci5jCkBAIC0zNTcsNiArMzU3LDI1IEBAIENoZWNrUmVsYXRp b25PaWRMb2NrZWRCeU1lKE9pZCByZWxpZCwgTE9DS01PREUgbG9ja21vZGUsIGJvb2wgb3JzdHJv bmdlcikKIAlyZXR1cm4gTG9ja0hlbGRCeU1lKCZ0YWcsIGxvY2ttb2RlLCBvcnN0cm9uZ2VyKTsK IH0KIAorLyoKKyAqICBDaGVja1NoYXJlZE9iamVjdExvY2tlZEJ5TWUKKyAqCisgKiAgTGlrZSBD aGVja1JlbGF0aW9uTG9ja2VkQnlNZSwgYnV0IGl0IGNoZWNrcyBmb3Igc2hhcmVkIG9iamVjdHMu CisgKi8KK2Jvb2wKK0NoZWNrU2hhcmVkT2JqZWN0TG9ja2VkQnlNZShPaWQgY2xhc3NpZCwgTE9D S01PREUgbG9ja21vZGUsIGJvb2wgb3JzdHJvbmdlcikKK3sKKwlMT0NLVEFHCQl0YWc7CisKKwlT RVRfTE9DS1RBR19PQkpFQ1QodGFnLAorCQkJCQkgICBJbnZhbGlkT2lkLAorCQkJCQkgICBjbGFz c2lkLAorCQkJCQkgICBJbnZhbGlkT2lkLAorCQkJCQkgICAwKTsKKworCXJldHVybiBMb2NrSGVs ZEJ5TWUoJnRhZywgbG9ja21vZGUsIG9yc3Ryb25nZXIpOworfQorCiAvKgogICoJCUxvY2tIYXNX YWl0ZXJzUmVsYXRpb24KICAqCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2xtZ3Iu aCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbG1nci5oCmluZGV4IGI3YWJkMTgzOTdkLi5jMTE5Yzhm NGRlZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sbWdyLmgKKysrIGIvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9sbWdyLmgKQEAgLTUwLDYgKzUwLDkgQEAgZXh0ZXJuIGJvb2wgQ2hlY2tS ZWxhdGlvbkxvY2tlZEJ5TWUoUmVsYXRpb24gcmVsYXRpb24sIExPQ0tNT0RFIGxvY2ttb2RlLAog CQkJCQkJCQkJYm9vbCBvcnN0cm9uZ2VyKTsKIGV4dGVybiBib29sIENoZWNrUmVsYXRpb25PaWRM b2NrZWRCeU1lKE9pZCByZWxpZCwgTE9DS01PREUgbG9ja21vZGUsCiAJCQkJCQkJCQkgICBib29s IG9yc3Ryb25nZXIpOworZXh0ZXJuIGJvb2wgQ2hlY2tTaGFyZWRPYmplY3RMb2NrZWRCeU1lKE9p ZCBjbGFzc2lkLCBMT0NLTU9ERSBsb2NrbW9kZSwKKwkJCQkJCQkJCSAgIGJvb2wgb3JzdHJvbmdl cik7CisKIGV4dGVybiBib29sIExvY2tIYXNXYWl0ZXJzUmVsYXRpb24oUmVsYXRpb24gcmVsYXRp b24sIExPQ0tNT0RFIGxvY2ttb2RlKTsKIAogZXh0ZXJuIHZvaWQgTG9ja1JlbGF0aW9uSWRGb3JT ZXNzaW9uKExvY2tSZWxJZCAqcmVsaWQsIExPQ0tNT0RFIGxvY2ttb2RlKTsKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L21vZHVsZXMvTWFrZWZpbGUgYi9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCmlu ZGV4IDkwMmE3OTU0MTAxLi5hMDE1Yzk2MWQzNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxl cy9NYWtlZmlsZQorKysgYi9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCkBAIC0yOSw2ICsyOSw3 IEBAIFNVQkRJUlMgPSBcCiAJCSAgdGVzdF9pbnQxMjggXAogCQkgIHRlc3RfaW50ZWdlcnNldCBc CiAJCSAgdGVzdF9qc29uX3BhcnNlciBcCisJCSAgdGVzdF9saXN0ZW5fbm90aWZ5IFwKIAkJICB0 ZXN0X2xmaW5kIFwKIAkJICB0ZXN0X2x3bG9ja190cmFuY2hlcyBcCiAJCSAgdGVzdF9taXNjIFwK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1 bGVzL21lc29uLmJ1aWxkCmluZGV4IDE0ZmM3NjFjNGNmLi42YWYzMzQ0OGQ3YiAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL21l c29uLmJ1aWxkCkBAIC0yOCw2ICsyOCw3IEBAIHN1YmRpcigndGVzdF9naW5wb3N0aW5nbGlzdCcp CiBzdWJkaXIoJ3Rlc3RfaW50MTI4JykKIHN1YmRpcigndGVzdF9pbnRlZ2Vyc2V0JykKIHN1YmRp cigndGVzdF9qc29uX3BhcnNlcicpCitzdWJkaXIoJ3Rlc3RfbGlzdGVuX25vdGlmeScpCiBzdWJk aXIoJ3Rlc3RfbGZpbmQnKQogc3ViZGlyKCd0ZXN0X2x3bG9ja190cmFuY2hlcycpCiBzdWJkaXIo J3Rlc3RfbWlzYycpCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbGlzdGVuX25v dGlmeS9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9saXN0ZW5fbm90aWZ5L01ha2Vm aWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5kYTFiZjViYjFiNwot LS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9saXN0ZW5fbm90aWZ5L01h a2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2xpc3Rlbl9u b3RpZnkvTWFrZWZpbGUKKworTU9EVUxFID0gdGVzdF9saXN0ZW5fbm90aWZ5CitQR0ZJTEVERVND ID0gInRlc3RfbGlzdGVuX25vdGlmeSAtIHJlZ3Jlc3Npb24gdGVzdGluZyBmb3IgTElTVEVOL05P VElGWSBzdXBwb3J0IgorCitUQVBfVEVTVFMgPSAxCisKK2lmZGVmIFVTRV9QR1hTCitQR19DT05G SUcgPSBwZ19jb25maWcKK1BHWFMgOj0gJChzaGVsbCAkKFBHX0NPTkZJRykgLS1wZ3hzKQoraW5j bHVkZSAkKFBHWFMpCitlbHNlCitzdWJkaXIgPSBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbGlzdGVu X25vdGlmeQordG9wX2J1aWxkZGlyID0gLi4vLi4vLi4vLi4KK2luY2x1ZGUgJCh0b3BfYnVpbGRk aXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9jb250cmliL2Nv bnRyaWItZ2xvYmFsLm1rCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0 X2xpc3Rlbl9ub3RpZnkvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbGlzdGVu X25vdGlmeS9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uYTY4MDUyY2QzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf bGlzdGVuX25vdGlmeS9tZXNvbi5idWlsZApAQCAtMCwwICsxLDE0IEBACisjIENvcHlyaWdodCAo YykgMjAyMi0yMDI1LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCit0ZXN0 cyArPSB7CisgICduYW1lJzogJ3Rlc3RfbGlzdGVuX25vdGlmeScsCisgICdzZCc6IG1lc29uLmN1 cnJlbnRfc291cmNlX2RpcigpLAorICAnYmQnOiBtZXNvbi5jdXJyZW50X2J1aWxkX2RpcigpLAor ICAndGFwJzogeworICAgICd0ZXN0cyc6IFsKKyAgICAgICd0LzAwMV94aWRfZnJlZXplLnBsJywK KyAgICAgICd0LzAwMl9hYm9ydGVkX3R4X25vdGlmaWVzLnBsJworICAgIF0sCisgIH0sCit9CisK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9saXN0ZW5fbm90aWZ5L3QvMDAxX3hp ZF9mcmVlemUucGwgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbGlzdGVuX25vdGlmeS90LzAwMV94 aWRfZnJlZXplLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4wYTUx MzBhMDQyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9saXN0ZW5f bm90aWZ5L3QvMDAxX3hpZF9mcmVlemUucGwKQEAgLTAsMCArMSw2NiBAQAorIyBDb3B5cmlnaHQg KGMpIDIwMjQtMjAyNSwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKwordXNl IHN0cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBGaWxlOjpQYXRoIHF3 KG1rcGF0aCk7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBQb3N0Z3JlU1FM OjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCitteSAkbm9kZSA9IFBvc3RncmVTUUw6 OlRlc3Q6OkNsdXN0ZXItPm5ldygnbm9kZScpOworJG5vZGUtPmluaXQ7Ciskbm9kZS0+c3RhcnQ7 CisKKyMgU2V0dXAKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0NSRUFURSBFWFRFTlNJ T04geGlkX3dyYXBhcm91bmQnKTsKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwknQ1JF QVRFIFRBQkxFIHQgQVMgU0VMRUNUIGcgQVMgYSwgZysyIEFTIGIgZnJvbSBnZW5lcmF0ZV9zZXJp ZXMoMSwxMDAwMDApIGc7JworKTsKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwknQUxU RVIgREFUQUJBU0UgdGVtcGxhdGUwIFdJVEggQUxMT1dfQ09OTkVDVElPTlMgdHJ1ZScpOworCisj IC0tLSBTdGFydCBTZXNzaW9uIDEgYW5kIGxlYXZlIGl0IGlkbGUgaW4gdHJhbnNhY3Rpb24KK215 ICRwc3FsX3Nlc3Npb24xID0gJG5vZGUtPmJhY2tncm91bmRfcHNxbCgncG9zdGdyZXMnKTsKKyRw c3FsX3Nlc3Npb24xLT5xdWVyeV9zYWZlKCdsaXN0ZW4gczsnLCAiU2Vzc2lvbiAxIGxpc3RlbnMg dG8gJ3MnIik7CiskcHNxbF9zZXNzaW9uMS0+cXVlcnlfc2FmZSgnYmVnaW47JywgIlNlc3Npb24g MSBzdGFydHMgYSB0cmFuc2FjdGlvbiIpOworCisjIC0tLSBTZXNzaW9uIDIsIG11bHRpcGxlIG5v dGlmeSdzLCBhbmQgY29tbWl0IC0tLQorZm9yIG15ICRpICgxIC4uIDEwKQoreworCSRub2RlLT5z YWZlX3BzcWwoCisJCSdwb3N0Z3JlcycsICIKKwkJQkVHSU47CisJCU5PVElGWSBzLCAnJGknOwor CQlDT01NSVQ7Iik7Cit9CisKKyMgQ29uc3VtZSBlbm91Z2ggWElEcyB0byB0cmlnZ2VyIHRydW5j YXRpb24KKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ3NlbGVjdCBjb25zdW1lX3hpZHMo MTAwMDAwMDApOycpOworCisjIEV4ZWN1dGUgdXBkYXRlIHNvIHRoZSBmcm96ZW4geGlkIG9mICJ0 IiB0YWJsZSBpcyB1cGRhdGVkIHRvIGEgeGlkIGdyZWF0ZXIKKyMgdGhhbiBjb25zdW1lX3hpZHMo KSByZXN1bHQKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ1VQREFURSB0IFNFVCBhID0g YStiOycpOworCisjIFJlbWVtYmVyIGN1cnJlbnQgZGF0ZnJvemVueGlkIGJlZm9yZSB2YWN1dW0g ZnJlZXplIHRvIGVuc3VyZSB0aGF0IGl0IGlzIGFkdmFuY2VkLgorbXkgJGRhdGFmcm9uemVueGlk ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAic2VsZWN0IGRhdGZyb3plbnhpZCBmcm9t IHBnX2RhdGFiYXNlIHdoZXJlIGRhdG5hbWUgPSAncG9zdGdyZXMnIik7CisKKyMgRXhlY3V0ZSB2 YWN1dW0gZnJlZXplIG9uIGFsbCBkYXRhYmFzZXMKKyRub2RlLT5jb21tYW5kX29rKFsgJ3ZhY3V1 bWRiJywgJy0tYWxsJywgJy0tZnJlZXplJywgJy0tcG9ydCcsICRub2RlLT5wb3J0IF0sCisJInZh Y3V1bWRiIC0tYWxsIC0tZnJlZXplIik7CisKKyMgR2V0IHRoZSBuZXcgZGF0ZnJvemVueGlkIGFm dGVyIHZhY3V1bSBmcmVlemUgdG8gZW5zdXJlIHRoYXQgaXMgYWR2YW5jZWQgYnV0CisjIHdlIGNh biBzdGlsbCBnZXQgdGhlIG5vdGlmaWNhdGlvbiBzdGF0dXMgb2YgdGhlIG5vdGlmaWNhdGlvbgor bXkgJGRhdGFmcm9uemVueGlkX2ZyZWV6ZSA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywg InNlbGVjdCBkYXRmcm96ZW54aWQgZnJvbSBwZ19kYXRhYmFzZSB3aGVyZSBkYXRuYW1lID0gJ3Bv c3RncmVzJyIpOworb2soJGRhdGFmcm9uemVueGlkX2ZyZWV6ZSA+ICRkYXRhZnJvbnplbnhpZCwg J2RhdGZyb3plbnhpZCBpcyBhZHZhbmNlZCcpOworCisjIE9uIFNlc3Npb24gMSwgY29tbWl0IGFu ZCBlbnN1cmUgdGhhdCB0aGUgYWxsIG5vdGlmaWNhdGlvbnMgaXMgcmVjZWl2ZWQKK215ICRyZXMg PSAkcHNxbF9zZXNzaW9uMS0+cXVlcnlfc2FmZSgnY29tbWl0OycsICJjb21taXQgbGlzdGVuIHM7 Iik7CitteSAkbm90aWZpY2F0aW9uc19jb3VudCA9IDA7Citmb3JlYWNoIG15ICRpIChzcGxpdCgn XG4nLCAkcmVzKSkKK3sKKwkkbm90aWZpY2F0aW9uc19jb3VudCsrOworCWxpa2UoJGksIHFyL0Fz eW5jaHJvbm91cyBub3RpZmljYXRpb24gInMiIHdpdGggcGF5bG9hZCAiJG5vdGlmaWNhdGlvbnNf Y291bnQiIHJlY2VpdmVkLyk7Cit9Citpcygkbm90aWZpY2F0aW9uc19jb3VudCwgMTAsICdyZWNl aXZlZCBhbGwgY29tbWl0dGVkIG5vdGlmaWNhdGlvbnMnKTsKKworZG9uZV90ZXN0aW5nKCk7CmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbGlzdGVuX25vdGlmeS90LzAwMl9hYm9y dGVkX3R4X25vdGlmaWVzLnBsIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2xpc3Rlbl9ub3RpZnkv dC8wMDJfYWJvcnRlZF90eF9ub3RpZmllcy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMC4uMTdmY2I0Yjc4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1 bGVzL3Rlc3RfbGlzdGVuX25vdGlmeS90LzAwMl9hYm9ydGVkX3R4X25vdGlmaWVzLnBsCkBAIC0w LDAgKzEsNjYgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI0LTIwMjUsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3MgRkFUQUwgPT4g J2FsbCc7Cit1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGgpOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6 OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsK KworbXkgJG5vZGUgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ25vZGUnKTsKKyRu b2RlLT5pbml0OworJG5vZGUtPnN0YXJ0OworCisjIFRlc3QgY2hlY2tzIHRoYXQgbGlzdGVuZXJz IGRvIG5vdCByZWNlaXZlIG5vdGlmaWNhdGlvbnMgZnJvbSBhYm9ydGVkCisjIHRyYW5zYWN0aW9u IGV2ZW4gaWYgbm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGxpc3Rlbi9ub3Rp ZnkKKyMgcXVldWUuIFRvIHJlcHJvZHVjZSBpdCB3ZSB1c2UgdGhlIGZhY3QgdGhhdCBzZXJpYWxp emFibGUgY29uZmxpY3RzCisjIGFyZSBjaGVja2VkIGFmdGVyIHR4IGFkZHMgbm90aWZpY2F0aW9u cyB0byB0aGUgcXVldWUuCisKKyMgU2V0dXAKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywg J0NSRUFURSBUQUJMRSB0MSAoYSBiaWdzZXJpYWwpOycpOworCisjIExpc3RlbmVyCitteSAkcHNx bF9saXN0ZW5lciA9ICRub2RlLT5iYWNrZ3JvdW5kX3BzcWwoJ3Bvc3RncmVzJyk7CiskcHNxbF9s aXN0ZW5lci0+cXVlcnlfc2FmZSgnTElTVEVOIGNoOycpOworCisjIFNlc3Npb24xLiBTdGFydCBT RVJJQUxJWkFCTEUgdHggYW5kIGFkZCBhIG5vdGlmaWNhdGlvbi4KK215ICRwc3FsX3Nlc3Npb24x ID0gJG5vZGUtPmJhY2tncm91bmRfcHNxbCgncG9zdGdyZXMnKTsKKyRwc3FsX3Nlc3Npb24xLT5x dWVyeV9zYWZlKCIKKwlCRUdJTiBJU09MQVRJT04gTEVWRUwgU0VSSUFMSVpBQkxFOworCVNFTEVD VCAqIEZST00gdDE7CisJSU5TRVJUIElOVE8gdDEgREVGQVVMVCBWQUxVRVM7CisJTk9USUZZIGNo LCdjb21taXR0ZWQnOworIik7CisKKyMgU2Vzc2lvbjIuIFN0YXJ0IFNFUklBTElaQUJMRSB0eCwg YWRkIGEgbm90aWZpY2F0aW9uIGFuZCBpbnRyb2R1Y2UgYSBjb25mbGljdAorIyB3aXRoIHNlc3Np b24xLgorbXkgJHBzcWxfc2Vzc2lvbjIgPSAkbm9kZS0+YmFja2dyb3VuZF9wc3FsKCdwb3N0Z3Jl cycsIG9uX2Vycm9yX3N0b3AgPT4gMCk7CiskcHNxbF9zZXNzaW9uMi0+cXVlcnlfc2FmZSgiCisJ QkVHSU4gSVNPTEFUSU9OIExFVkVMIFNFUklBTElaQUJMRTsKKwlTRUxFQ1QgKiBGUk9NIHQxOwor CUlOU0VSVCBJTlRPIHQxIERFRkFVTFQgVkFMVUVTOworCU5PVElGWSBjaCwnYWJvcnRlZCc7Cisi KTsKKworIyBTZXNzaW9uMSBzaG91bGQgYmUgY29tbWl0dGVkIHN1Y2Nlc3NmdWxseS4gTGlzdGVu ZXJzIG11c3QgcmVjZWl2ZSBzZXNzaW9uMQorIyBub3RpZmljYXRpb25zLgorJHBzcWxfc2Vzc2lv bjEtPnF1ZXJ5X3NhZmUoIkNPTU1JVDsiKTsKKworIyBTZXNzaW9uMiBzaG91bGQgYmUgYWJvcnRl ZCBkdWUgdG8gdGhlIGNvbmZsaWN0IHdpdGggc2Vzc2lvbjEuIFRyYW5zYWN0aW9uCisjIGlzIGFi b3J0ZWQgYWZ0ZXIgYWRkaW5nIG5vdGlmaWNhdGlvbnMgdG8gdGhlIGxpc3Rlbi9ub3RpZnkgcXVl dWUsIGJ1dAorIyBsaXN0ZW5lcnMgc2hvdWxkIG5vdCByZWNlaXZlIHNlc3Npb24yIG5vdGlmaWNh dGlvbnMuCiskcHNxbF9zZXNzaW9uMi0+cXVlcnkoIkNPTU1JVDsiKTsKKworIyBzZW5kIGFub3Ro ZXIgbm90aWZpY2F0aW9uIGFmdGVyIGFib3J0ZWQKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVz JywgIk5PVElGWSBjaCwgJ25leHRfY29tbWl0dGVkJzsiKTsKKworIyBmZXRjaCBub3RpZmljYXRp b25zCitteSAkcmVzID0gJHBzcWxfbGlzdGVuZXItPnF1ZXJ5X3NhZmUoJ2JlZ2luOyBjb21taXQ7 Jyk7CisKKyMgY2hlY2sgcmVjZWl2ZWQgbm90aWZpY2F0aW9ucworbXkgQGxpbmVzID0gc3BsaXQo J1xuJywgJHJlcyk7CitpcyhAbGluZXMsIDIsICdyZWNlaXZlZCBhbGwgY29tbWl0dGVkIG5vdGlm aWNhdGlvbnMnKTsKK2xpa2UoJGxpbmVzWzBdLCBxci9Bc3luY2hyb25vdXMgbm90aWZpY2F0aW9u ICJjaCIgd2l0aCBwYXlsb2FkICJjb21taXR0ZWQiIHJlY2VpdmVkLyk7CitsaWtlKCRsaW5lc1sx XSwgcXIvQXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbiAiY2giIHdpdGggcGF5bG9hZCAibmV4dF9j b21taXR0ZWQiIHJlY2VpdmVkLyk7CisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3Jj L3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRl ZnMubGlzdAppbmRleCAzYzgwZDQ5YjY3ZS4uOTY3YzljZGY3MDQgMTAwNjQ0Ci0tLSBhL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBl ZGVmcy5saXN0CkBAIC0xNTksNiArMTU5LDcgQEAgQXJyYXlUeXBlCiBBc3luY1F1ZXVlQ29udHJv bAogQXN5bmNRdWV1ZUVudHJ5CiBBc3luY1JlcXVlc3QKK0F0QWJvcnROb3RpZnlJbmZvCiBBdHRJ bk1ldGFkYXRhCiBBdHRTdGF0c1Nsb3QKIEF0dG9wdENhY2hlRW50cnkKLS0gCjIuMzkuNSAoQXBw bGUgR2l0LTE1NCkKCg== --b88862a1a4f8d0e462261ea8c70f7f59b3d28cbadc42fcc6b9f2261827ec--