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 1vHQGH-0071h4-Cb for pgsql-hackers@arkaria.postgresql.org; Fri, 07 Nov 2025 17:28:33 +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 1vHQGF-00FveZ-Qa for pgsql-hackers@arkaria.postgresql.org; Fri, 07 Nov 2025 17:28:31 +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 1vHQGF-00FveN-7u for pgsql-hackers@lists.postgresql.org; Fri, 07 Nov 2025 17:28:31 +0000 Received: from mail-yw1-x1132.google.com ([2607:f8b0:4864:20::1132]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vHQGC-005wKv-1A for pgsql-hackers@postgresql.org; Fri, 07 Nov 2025 17:28:30 +0000 Received: by mail-yw1-x1132.google.com with SMTP id 00721157ae682-78682bab930so14381357b3.1 for ; Fri, 07 Nov 2025 09:28:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762536507; x=1763141307; darn=postgresql.org; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=m4Z89irG/QgULAo4lRfJS+88yYSYrjR53CIaR8g9zX8=; b=HE/CTTnLtQ3PqLW4C8P4KlfjxLBXeCNzb0zR5i/YU1RnFXMNTBridTX0EvJ934yPRM rINBsuqMMYhisy2lyD6EZQXsf3ElA+i1ysqw8FZVkRoUj3GuvYKSuu4wqijaxpSMi2qN LbWR+gH4mGDR6TXOFTnPFUSwetBnCf807BRb1uf8TZU1S5Z4cwsd9Luu7ZhlZDr5s+oY YaXr57f4VEg8oan2/hI8oUZWD2IcgBEHFhRaSdoXHgFFXfXWZ1PWIAEoH/p3R4JNaewU 8oH0h1hlNz0scyO90sh5uiWEdngdAGJrREu1kirXtfR/M+RQaStCaf9Ft2rD9FlBlWLr 4SVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762536507; x=1763141307; h=in-reply-to:content-language:references:cc:to:from:subject :user-agent:mime-version:date:message-id:x-gm-gg:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=m4Z89irG/QgULAo4lRfJS+88yYSYrjR53CIaR8g9zX8=; b=VPW8fuqNFwzIYr7JrpIEDyl+3399JSELQ2oXq0tzyNiTs/PS07wzIhpq5tHS+AweFc Ff9Q2JlYlaxtpiYqIJeW5omiK89VBTQZtCdoPijAKcrN8e3DaUBlYU7CwLJafntDrrnA sOjHERyPJ+9swT71rztKcHPj/WxC0GCpxFUeQ9K5v9FTbGIRCT6n5CB3YIir1gKSowMK Av9eRWdTSbEaeBziJiWl299gvibAmdtDL14SvNv09lXfQo9Z72AwXXbMqfX8mq/ZpVVo o6oqrPFD21ixxYuBEnUl4Z7/scyqkLgg6n4RbMpCuLBocbahiXBbtJGiit8BRB9miptr OWow== X-Gm-Message-State: AOJu0YxZztl+slScpBt7fY5z4VIb5q+xMjsURn5lBbYib8gTVFUqmqr1 fi66M4bDuhybKIlX1DtXjjCaQMmWzCBy+xa36hfUxiiamRp7pa2JUuJMuDQoja+Fhws= X-Gm-Gg: ASbGnctgdhmmiO1Ea7kdg7t5B/Itfq9sXfhwAxH2bUTgf0eMbhgCnyj1GJvbDSu1kf2 uoK3nYW0zLHNYdPQSsjs8fgFClx1Pu6V96evQJ0VYUbYyjRPtKqSXN5d6yu4a1LrBXe+vKp/s9r aBBvSECkEEukdmCO3JUUyDaAFj4Sa+dT9Fo0YlwLSXX6oOT5OupBhVyHBLEKlAPmIZ10ogFPFlh NAZsdSgWkdm3g2WNHaVMsQVtLoiEAVGfGrxHXD3/7qrZeNDbheZovJoFkqv2xVJn9ppzN38fc3d hJhBbDey2kdSpo4kH0NuC/sZ7dSPC90y3ZpIqFo7IOexSnx8hXRnW/9/ZCbdui9M5mDo06LLbiu FMeaiz212VcVhF+372dkhzJ/ijieku1sLf0TDo7aFQrR8s0onZ4d5GmvWCSZLlV7EWu8OQsPkWW fsTWhd6vUbNPVXEz8crIyV51U9PLoU4DQsIn7u35ZvjrcvrW3jf3sR7Q== X-Google-Smtp-Source: AGHT+IHQd4xATd+oDbLrIwk3fq8cPbjzkR/uGw0QF4rCAYofRhAMSP2AD4Qv95JcPqZzfkgiaGmo6g== X-Received: by 2002:a05:690c:4681:b0:787:c44d:4b39 with SMTP id 00721157ae682-787d4dbbbffmr2675727b3.4.1762536507246; Fri, 07 Nov 2025 09:28:27 -0800 (PST) Received: from ?IPV6:2600:1700:8952:80:d4ac:40e9:5ae8:a25b? ([2600:1700:8952:80:d4ac:40e9:5ae8:a25b]) by smtp.gmail.com with ESMTPSA id 00721157ae682-787b13ba0b6sm19322307b3.3.2025.11.07.09.28.25 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Nov 2025 09:28:26 -0800 (PST) Content-Type: multipart/mixed; boundary="------------UculB8fk7wiiMCLy5pTD2Gy9" Message-ID: <35f9236e-95d8-4f31-ac6b-ec54b7de4bac@gmail.com> Date: Fri, 7 Nov 2025 11:28:48 -0600 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH] O_CLOEXEC not honored on Windows - handle inheritance chain From: Bryan Green To: Thomas Munro Cc: pgsql-hackers References: <7f6779d5-7a0e-44c5-a85f-b4ef265db766@gmail.com> Content-Language: en-US In-Reply-To: <7f6779d5-7a0e-44c5-a85f-b4ef265db766@gmail.com> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------UculB8fk7wiiMCLy5pTD2Gy9 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 11/6/2025 8:42 AM, Bryan Green wrote: > On 11/6/2025 7:43 AM, Thomas Munro wrote: >> On Sat, Nov 1, 2025 at 6:16 AM Bryan Green wrote: >>> Hello, >> >> Catching up with all your emails, and I must say it's great to see >> some solid investigation of PostgreSQL-on-Windows problems. There are >> ... more. >> >>> Commit 1da569ca1f (March 2023) added O_CLOEXEC to many call sites >>> throughout the backend with a comment saying "Our open() replacement >>> does not create inheritable handles, so it is safe to ignore >>> O_CLOEXEC." But that doesn't appear to match what the code actually >>> does. I'm wondering if I've misunderstood something about how handle >>> inheritance works on Windows, or if the comment was based on a >>> misunderstanding of the code path. >> >> Yeah, it looks like I was just wrong. Oops. Your analysis looks good to me. >> >>> The fix would be straightforward if this is indeed wrong. Define >>> O_CLOEXEC to a non-zero value like 0x80000 (in the private use range >>> for open() flags), and then honor it in pgwin32_open() by setting >>> sa.bInheritHandle based on whether the flag is present: >>> >>> sa.bInheritHandle = (fileFlags & O_CLOEXEC) ? FALSE : TRUE; >> >> Looking at fcntl.h, that's the next free bit, but also the one they'll >> presumably define next (I guess "private use range" is just a turn of >> phrase and not a real thing?), so why not use the highest free bit >> after O_DIRECT? We have three fake open flags, one of which >> cybersquats a real flag from fcntl.h, ironically the one that actually >> means O_CLOEXEC. We can't change existing values in released >> branches, so that'd give: >> >> #define O_DIRECT 0x80000000 >> #define O_CLOEXEC 0x04000000 >> #define O_DSYNC _O_NO_INHERIT >> >> Perhaps in master we could rearrange them: >> >> #define O_DIRECT 0x80000000 >> #define O_DSYNC 0x04000000 >> #define O_CLOEXEC _O_NO_INHERIT >> >>> So my questions are: Am I correct that both conditions for handle >>> inheritance are met, meaning handles really are being inherited by >>> archive_command children? Is there something in Windows that prevents >>> inheritance that I don't know about? If this is a real bug, would it >>> make sense to backpatch to v16 where O_CLOEXEC was added? I'm happy to >>> provide my test code or do additional testing if that would help. >> >> Yeah, seems like it, and like we should back-patch this. I vote for >> doing that after the upcoming minor releases. Holding files open on >> Windows unintentionally is worse on Windows than on Unix (preventing >> directories from being unlinked etc). Of course we've done that for >> decades so I doubt it's really a big deal, but we should clean up this >> mistake. > > Thanks for reviewing this and confirming the analysis. Good to know I > wasn't missing something about Windows handle inheritance. > > Your point about the bit value makes sense - using 0x04000000 (highest > free bit after O_DIRECT) is definitely safer than 0x80000 which could > collide with future fcntl.h additions. I also appreciate the irony you > pointed out - we're currently using _O_NO_INHERIT (which literally > prevents handle inheritance on Windows) for O_DSYNC instead of > O_CLOEXEC. The rearrangement in master to use _O_NO_INHERIT for what it > actually means semantically makes a lot of sense. > > So the plan would be: > > Backport branches (v16+): > #define O_DIRECT 0x80000000 > #define O_CLOEXEC 0x04000000 > #define O_DSYNC _O_NO_INHERIT > > Master: > #define O_DIRECT 0x80000000 > #define O_DSYNC 0x04000000 > #define O_CLOEXEC _O_NO_INHERIT > > And then in pgwin32_open(): > sa.bInheritHandle = (fileFlags & O_CLOEXEC) ? FALSE : TRUE; > > I will prepare a new version of the patch that implements the suggested > change for master. > > The changes for master, along with a tap test, are provided with the attached patch. -- Bryan Green EDB: https://www.enterprisedb.com --------------UculB8fk7wiiMCLy5pTD2Gy9 Content-Type: text/plain; charset=UTF-8; name="v2-0001-Fix-O_CLOEXEC-flag-handling-in-Windows-port.patch" Content-Disposition: attachment; filename*0="v2-0001-Fix-O_CLOEXEC-flag-handling-in-Windows-port.patch" Content-Transfer-Encoding: base64 RnJvbSBiZWEzMmNjYzgyNzVkNWRmOGY2YjdlYjVlNGI3YjM3MTI0MDc4ODczIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBCcnlhbiBHcmVlbiA8ZGJyeWFuLmdyZWVuQGdtYWls LmNvbT4KRGF0ZTogRnJpLCAzMSBPY3QgMjAyNSAxMDoxMTozMCAtMDYwMApTdWJqZWN0OiBb UEFUQ0ggdjJdIEZpeCBPX0NMT0VYRUMgZmxhZyBoYW5kbGluZyBpbiBXaW5kb3dzIHBvcnQu CgpQb3N0Z3JlU1FMJ3Mgc3JjL3BvcnQvb3Blbi5jIGhhcyBhbHdheXMgc2V0IGJJbmhlcml0 SGFuZGxlID0gVFJVRQp3aGVuIG9wZW5pbmcgZmlsZXMgb24gV2luZG93cywgbWFraW5nIGFs bCBmaWxlIGRlc2NyaXB0b3JzIGluaGVyaXRhYmxlCmJ5IGNoaWxkIHByb2Nlc3Nlcy4gIFRo aXMgbWVhbnQgdGhlIE9fQ0xPRVhFQyBmbGFnLCBhZGRlZCB0byBtYW55IGNhbGwKc2l0ZXMg YnkgY29tbWl0IDFkYTU2OWNhMWYsIHdhcyBzaWxlbnRseSBpZ25vcmVkLgoKVGhlIG9yaWdp bmFsIGNvbW1pdCBpbmNsdWRlZCBhIGNvbW1lbnQgc3VnZ2VzdGluZyB0aGF0IG91ciBvcGVu KCkKcmVwbGFjZW1lbnQgZG9lc24ndCBjcmVhdGUgaW5oZXJpdGFibGUgaGFuZGxlcywgYnV0 IGl0IGFwcGVhcnMgdGhpcwptYXkgaGF2ZSBiZWVuIGJhc2VkIG9uIGEgbWlzdW5kZXJzdGFu ZGluZyBvZiB0aGUgY29kZSBwYXRoLiAgSW4KcHJhY3RpY2UsIHRoZSBjb2RlIHdhcyBjcmVh dGluZyBpbmhlcml0YWJsZSBoYW5kbGVzIGluIGFsbCBjYXNlcy4KClRoaXMgaGFzbid0IGNh dXNlZCB3aWRlc3ByZWFkIHByb2JsZW1zIGJlY2F1c2UgbW9zdCBjaGlsZCBwcm9jZXNzZXMK KGFyY2hpdmVfY29tbWFuZCwgQ09QWSBQUk9HUkFNLCBldGMuKSBvcGVyYXRlIG9uIGZpbGUg cGF0aHMgcGFzc2VkIGFzCmFyZ3VtZW50cyByYXRoZXIgdGhhbiBpbmhlcml0ZWQgZmlsZSBk ZXNjcmlwdG9ycy4gIEV2ZW4gaWYgYSBjaGlsZAp3YW50ZWQgdG8gdXNlIGFuIGluaGVyaXRl ZCBoYW5kbGUsIGl0IHdvdWxkIG5lZWQgdG8gbGVhcm4gdGhlIG51bWVyaWMKaGFuZGxlIHZh bHVlLCB3aGljaCBpc24ndCBwYXNzZWQgdGhyb3VnaCBvdXIgSVBDIG1lY2hhbmlzbXMuCgpO b25ldGhlbGVzcywgdGhlIGN1cnJlbnQgYmVoYXZpb3IgaXMgd3JvbmcuICBJdCB2aW9sYXRl cyBkb2N1bWVudGVkCk9fQ0xPRVhFQyBzZW1hbnRpY3MsIGNvbnRyYWRpY3RzIG91ciBvd24g Y29kZSBjb21tZW50cywgYW5kIG1ha2VzClBvc3RncmVTUUwgYmVoYXZlIGRpZmZlcmVudGx5 IG9uIFdpbmRvd3MgdGhhbiBvbiBVbml4LiAgSXQgYWxzbyBjcmVhdGVzCnBvdGVudGlhbCBp c3N1ZXMgd2l0aCBmdXR1cmUgY29kZSBvciBzZWN1cml0eSBhdWRpdGluZyB0b29scy4KClRv IGZpeCwgZGVmaW5lIE9fQ0xPRVhFQyB0byBhIG5vbnplcm8gdmFsdWUgKDB4ODAwMDAsIGlu IHRoZSBwcml2YXRlCnVzZSByYW5nZSBmb3Igb3BlbigpIGZsYWdzKS4gIFRoZW4gaG9ub3Ig aXQgaW4gcGd3aW4zMl9vcGVuX2hhbmRsZSgpCmJ5IHNldHRpbmcgYkluaGVyaXRIYW5kbGUg YWNjb3JkaW5nIHRvIHdoZXRoZXIgT19DTE9FWEVDIGlzIHNwZWNpZmllZC4KV2Ugc2V0IGJJ bmhlcml0SGFuZGxlIGRpcmVjdGx5IGluIFNFQ1VSSVRZX0FUVFJJQlVURVMgcmF0aGVyIHRo YW4gdXNpbmcKU2V0SGFuZGxlSW5mb3JtYXRpb24oKSBhZnRlcndhcmRzLCBhcyB0aGUgZm9y bWVyIGlzIHNpbXBsZXIuCgpBdXRob3I6IEJyeWFuIEdyZWVuIDxkYnJ5YW4uZ3JlZW5AZ21h aWwuY29tPgotLS0KIHNyYy9pbmNsdWRlL3BvcnQvd2luMzJfcG9ydC5oICAgICAgICAgICAg ICAgICB8ICAxNyArLQogc3JjL3BvcnQvb3Blbi5jICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgIDEzICstCiBzcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlICAgICAgICAgICAg ICAgICAgICAgfCAgIDEgKwogc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZCAgICAgICAg ICAgICAgICAgIHwgICAxICsKIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9jbG9leGVjL01ha2Vm aWxlICAgICAgICB8ICAzMCArKwogc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvUkVB RE1FICAgICAgICAgIHwgMTA1ICsrKysrKysKIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9jbG9l eGVjL21lc29uLmJ1aWxkICAgICB8ICAyNyArKwogLi4uL21vZHVsZXMvdGVzdF9jbG9leGVj L3QvMDAxX2Nsb2V4ZWMucGwgICAgIHwgIDYwICsrKysKIHNyYy90ZXN0L21vZHVsZXMvdGVz dF9jbG9leGVjL3Rlc3RfY2xvZXhlYy5jICB8IDI2NyArKysrKysrKysrKysrKysrKysKIDkg ZmlsZXMgY2hhbmdlZCwgNTEwIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9jbG9leGVjL01ha2VmaWxl CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvUkVB RE1FCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMv bWVzb24uYnVpbGQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf Y2xvZXhlYy90LzAwMV9jbG9leGVjLnBsCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2Nsb2V4ZWMvdGVzdF9jbG9leGVjLmMKCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS9wb3J0L3dpbjMyX3BvcnQuaCBiL3NyYy9pbmNsdWRlL3BvcnQvd2luMzJfcG9y dC5oCmluZGV4IGZmNzAyOGJkYzguLmFkNDQyZTFkZTcgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNs dWRlL3BvcnQvd2luMzJfcG9ydC5oCisrKyBiL3NyYy9pbmNsdWRlL3BvcnQvd2luMzJfcG9y dC5oCkBAIC0zMzUsMTkgKzMzNSwxOCBAQCBleHRlcm4gaW50CV9wZ2xzdGF0NjQoY29uc3Qg Y2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKmJ1Zik7CiAKIC8qCiAgKiBTdXBwbGVtZW50IHRv IDxmY250bC5oPi4KLSAqIFRoaXMgaXMgdGhlIHNhbWUgdmFsdWUgYXMgX09fTk9JTkhFUklU IGluIHRoZSBNUyBoZWFkZXIgZmlsZS4gVGhpcyBpcwotICogdG8gZW5zdXJlIHRoYXQgd2Ug ZG9uJ3QgY29sbGlkZSB3aXRoIGEgZnV0dXJlIGRlZmluaXRpb24uIEl0IG1lYW5zCi0gKiB3 ZSBjYW5ub3QgdXNlIF9PX05PSU5IRVJJVCBvdXJzZWx2ZXMuCisgKgogICovCi0jZGVmaW5l IE9fRFNZTkMgMHgwMDgwCisjZGVmaW5lCU9fRElSRUNUCTB4ODAwMDAwMDAKKyNkZWZpbmUJ T19EU1lOQwkJMHgwNDAwMDAwMAogCiAvKgotICogT3VyIG9wZW4oKSByZXBsYWNlbWVudCBk b2VzIG5vdCBjcmVhdGUgaW5oZXJpdGFibGUgaGFuZGxlcywgc28gaXQgaXMgc2FmZSB0bwot ICogaWdub3JlIE9fQ0xPRVhFQy4gIChJZiB3ZSB3ZXJlIHVzaW5nIFdpbmRvd3MnIG93biBv cGVuKCksIGl0IG1pZ2h0IGJlCi0gKiBuZWNlc3NhcnkgdG8gY29udmVydCB0aGlzIHRvIF9P X05PSU5IRVJJVC4pCisgKiBNYXAgT19DTE9FWEVDIHRvIFdpbmRvd3MnIF9PX05PSU5IRVJJ VCBmbGFnLiAgT3VyIHNyYy9wb3J0L29wZW4uYworICogZXhwbGljaXRseSBjaGVja3MgZm9y IHRoaXMgZmxhZyBhbmQgc2V0cyBiSW5oZXJpdEhhbmRsZSBhY2NvcmRpbmdseQorICogd2hl biBjYWxsaW5nIENyZWF0ZUZpbGUoKS4gIE5vdGUgdGhhdCBDcmVhdGVGaWxlKCkgZG9lc24n dCB1bmRlcnN0YW5kCisgKiB0aGlzIGZsYWcgbmF0aXZlbHkgLSB3ZSBtdXN0IGhhbmRsZSBp dCBpbiBvdXIgd3JhcHBlci4KICAqLwotI2RlZmluZSBPX0NMT0VYRUMgMAotCisjZGVmaW5l CU9fQ0xPRVhFQwlfT19OT0lOSEVSSVQKIC8qCiAgKiBTdXBwbGVtZW50IHRvIDxlcnJuby5o Pi4KICAqCmRpZmYgLS1naXQgYS9zcmMvcG9ydC9vcGVuLmMgYi9zcmMvcG9ydC9vcGVuLmMK aW5kZXggNGEzMWM1ZDdiNy4uNzEzNDRiOTkxNyAxMDA2NDQKLS0tIGEvc3JjL3BvcnQvb3Bl bi5jCisrKyBiL3NyYy9wb3J0L29wZW4uYwpAQCAtNzQsMTMgKzc0LDIyIEBAIHBnd2luMzJf b3Blbl9oYW5kbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIGludCBmaWxlRmxhZ3MsIGJvb2wg YmFja3VwX3NlbWFudGljcykKIAkvKiBDaGVjayB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHJl cXVlc3QgKi8KIAlhc3NlcnQoKGZpbGVGbGFncyAmICgoT19SRE9OTFkgfCBPX1dST05MWSB8 IE9fUkRXUikgfCBPX0FQUEVORCB8CiAJCQkJCQkgKE9fUkFORE9NIHwgT19TRVFVRU5USUFM IHwgT19URU1QT1JBUlkpIHwKLQkJCQkJCSBfT19TSE9SVF9MSVZFRCB8IE9fRFNZTkMgfCBP X0RJUkVDVCB8CisJCQkJCQkgX09fU0hPUlRfTElWRUQgfCBPX0RTWU5DIHwgT19ESVJFQ1Qg fCBPX0NMT0VYRUMgfAogCQkJCQkJIChPX0NSRUFUIHwgT19UUlVOQyB8IE9fRVhDTCkgfCAo T19URVhUIHwgT19CSU5BUlkpKSkgPT0gZmlsZUZsYWdzKTsKIAogCXNhLm5MZW5ndGggPSBz aXplb2Yoc2EpOwotCXNhLmJJbmhlcml0SGFuZGxlID0gVFJVRTsKIAlzYS5scFNlY3VyaXR5 RGVzY3JpcHRvciA9IE5VTEw7CiAKKwkvKgorCSAqIElmIE9fQ0xPRVhFQyBpcyBzcGVjaWZp ZWQsIGNyZWF0ZSBhIG5vbi1pbmhlcml0YWJsZSBoYW5kbGUuICBPdGhlcndpc2UsCisJICog Y3JlYXRlIGFuIGluaGVyaXRhYmxlIGhhbmRsZSAodGhlIGRlZmF1bHQgV2luZG93cyBiZWhh dmlvcikuCisJICoKKwkgKiBOb3RlOiBXZSBjb3VsZCBpbnN0ZWFkIHVzZSBTZXRIYW5kbGVJ bmZvcm1hdGlvbigpIGFmdGVyIENyZWF0ZUZpbGUoKSB0bworCSAqIGNsZWFyIEhBTkRMRV9G TEFHX0lOSEVSSVQsIGJ1dCBzZXR0aW5nIGJJbmhlcml0SGFuZGxlPUZBTFNFIGlzIHNpbXBs ZXIKKwkgKiBhbmQgYWNoaWV2ZXMgdGhlIHNhbWUgcmVzdWx0LgorCSAqLworCXNhLmJJbmhl cml0SGFuZGxlID0gKGZpbGVGbGFncyAmIE9fQ0xPRVhFQykgPyBGQUxTRSA6IFRSVUU7CisK IAl3aGlsZSAoKGggPSBDcmVhdGVGaWxlKGZpbGVOYW1lLAogCS8qIGNhbm5vdCB1c2UgT19S RE9OTFksIGFzIGl0ID09IDAgKi8KIAkJCQkJCSAgIChmaWxlRmxhZ3MgJiBPX1JEV1IpID8g KEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQpIDoKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L21vZHVsZXMvTWFrZWZpbGUgYi9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlCmluZGV4IDkw MmE3OTU0MTAuLjNhOGUyNWZhZmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvTWFr ZWZpbGUKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmlsZQpAQCAtMTgsNiArMTgsNyBA QCBTVUJESVJTID0gXAogCQkgIHRlc3RfYmluYXJ5aGVhcCBcCiAJCSAgdGVzdF9iaXRtYXBz ZXQgXAogCQkgIHRlc3RfYmxvb21maWx0ZXIgXAorCQkgIHRlc3RfY2xvZXhlYyBcCiAJCSAg dGVzdF9jb3B5X2NhbGxiYWNrcyBcCiAJCSAgdGVzdF9jdXN0b21fcm1ncnMgXAogCQkgIHRl c3RfZGRsX2RlcGFyc2UgXApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5i dWlsZCBiL3NyYy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQKaW5kZXggMTRmYzc2MWM0Yy4u ZTkzMDllY2IzZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZAor KysgYi9zcmMvdGVzdC9tb2R1bGVzL21lc29uLmJ1aWxkCkBAIC0xNyw2ICsxNyw3IEBAIHN1 YmRpcigndGVzdF9haW8nKQogc3ViZGlyKCd0ZXN0X2JpbmFyeWhlYXAnKQogc3ViZGlyKCd0 ZXN0X2JpdG1hcHNldCcpCiBzdWJkaXIoJ3Rlc3RfYmxvb21maWx0ZXInKQorc3ViZGlyKCd0 ZXN0X2Nsb2V4ZWMnKQogc3ViZGlyKCd0ZXN0X2NvcHlfY2FsbGJhY2tzJykKIHN1YmRpcign dGVzdF9jdXN0b21fcm1ncnMnKQogc3ViZGlyKCd0ZXN0X2RkbF9kZXBhcnNlJykKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9jbG9leGVjL01ha2VmaWxlIGIvc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMC4uYWY4ODVkZDNhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90 ZXN0L21vZHVsZXMvdGVzdF9jbG9leGVjL01ha2VmaWxlCkBAIC0wLDAgKzEsMzAgQEAKKyMg c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvTWFrZWZpbGUKKworTU9EVUxFX2JpZyA9 IHRlc3RfY2xvZXhlYworT0JKUyA9IFwKKwkkKFdJTjMyUkVTKSBcCisJdGVzdF9jbG9leGVj Lm8KKworUEdGSUxFREVTQyA9ICJ0ZXN0X2Nsb2V4ZWMgLSB0ZXN0IE9fQ0xPRVhFQyBmbGFn IGhhbmRsaW5nIgorCisjIFRoaXMgbW9kdWxlIGlzIGZvciBXaW5kb3dzIG9ubHkKK2lmZXEg KCQoUE9SVE5BTUUpLHdpbjMyKQorCisjIEJ1aWxkIGFzIGEgc3RhbmRhbG9uZSBwcm9ncmFt LCBub3QgYSBzaGFyZWQgbGlicmFyeQorUFJPR1JBTSA9IHRlc3RfY2xvZXhlYworb3ZlcnJp ZGUgQ1BQRkxBR1MgOj0gLUkkKGxpYnBxX3NyY2RpcikgJChDUFBGTEFHUykKKworVEFQX1RF U1RTID0gMQorCitlbmRpZgorCitpZmRlZiBVU0VfUEdYUworUEdfQ09ORklHID0gcGdfY29u ZmlnCitQR1hTIDo9ICQoc2hlbGwgJChQR19DT05GSUcpIC0tcGd4cykKK2luY2x1ZGUgJChQ R1hTKQorZWxzZQorc3ViZGlyID0gc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMKK3Rv cF9idWlsZGRpciA9IC4uLy4uLy4uLy4uCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMv TWFrZWZpbGUuZ2xvYmFsCitpbmNsdWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmli LWdsb2JhbC5taworZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9j bG9leGVjL1JFQURNRSBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9jbG9leGVjL1JFQURNRQpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4xZDUxOGVlZDAyCi0tLSAv ZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvUkVBRE1FCkBA IC0wLDAgKzEsMTA1IEBACit0ZXN0X2Nsb2V4ZWMgLSBUZXN0IE9fQ0xPRVhFQyBmbGFnIGhh bmRsaW5nIG9uIFdpbmRvd3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyB0ZXN0IG1vZHVsZSB2ZXJpZmllcyB0aGF0 IHRoZSBPX0NMT0VYRUMgZmxhZyB3b3JrcyBjb3JyZWN0bHkgb24gV2luZG93cworYWZ0ZXIg dGhlIGZpeCBpbiBzcmMvcG9ydC9vcGVuLmMuCisKK1Rlc3QgT3ZlcnZpZXcKKy0tLS0tLS0t LS0tLS0KKworVGhlIHRlc3QgdmVyaWZpZXMgdHdvIGNyaXRpY2FsIGJlaGF2aW9yczoKKwor MS4gRmlsZSBoYW5kbGVzIG9wZW5lZCBXSVRIIE9fQ0xPRVhFQyBhcmUgTk9UIGluaGVyaXRl ZCBieSBjaGlsZCBwcm9jZXNzZXMKKzIuIEZpbGUgaGFuZGxlcyBvcGVuZWQgV0lUSE9VVCBP X0NMT0VYRUMgQVJFIGluaGVyaXRlZCBieSBjaGlsZCBwcm9jZXNzZXMKKworSG93IEl0IFdv cmtzCistLS0tLS0tLS0tLS0KKworVGhlIHRlc3QgY29uc2lzdHMgb2YgYSBzdGFuZGFsb25l IEMgcHJvZ3JhbSAodGVzdF9jbG9leGVjLmMpIHRoYXQ6CisKKzEuIFBhcmVudCBQcm9jZXNz OgorICAgLSBPcGVucyB0d28gdGVzdCBmaWxlczoKKyAgICAgKiBGaWxlIDE6IHdpdGggT19D TE9FWEVDIGZsYWcgKHNob3VsZCBOT1QgYmUgaW5oZXJpdGVkKQorICAgICAqIEZpbGUgMjog d2l0aG91dCBPX0NMT0VYRUMgZmxhZyAoc2hvdWxkIGJlIGluaGVyaXRlZCkKKyAgIC0gR2V0 cyB0aGUgV2luZG93cyBIQU5ETEUgdmFsdWVzIGZvciBib3RoIGZpbGUgZGVzY3JpcHRvcnMK KyAgIC0gU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB3aXRoIGJJbmhlcml0SGFuZGxlcz1UUlVF CisgICAtIFBhc3NlcyBib3RoIEhBTkRMRSB2YWx1ZXMgdG8gdGhlIGNoaWxkIGFzIGNvbW1h bmQtbGluZSBhcmd1bWVudHMKKyAgIC0gV2FpdHMgZm9yIHRoZSBjaGlsZCB0byBjb21wbGV0 ZSBhbmQgY2hlY2tzIHRoZSBleGl0IGNvZGUKKworMi4gQ2hpbGQgUHJvY2VzczoKKyAgIC0g UmVjZWl2ZXMgdGhlIHR3byBIQU5ETEUgdmFsdWVzIGFzIGhleCBzdHJpbmdzCisgICAtIEF0 dGVtcHRzIHRvIHdyaXRlIHRvIGJvdGggaGFuZGxlcyB1c2luZyBXcml0ZUZpbGUoKQorICAg LSBSZXBvcnRzIHdoaWNoIGhhbmRsZXMgd2VyZSBhY2Nlc3NpYmxlCisgICAtIEV4aXRzIHdp dGggc3RhdHVzIDAgaWYgT19DTE9FWEVDIHdvcmtlZCBjb3JyZWN0bHk6CisgICAgICogSGFu ZGxlIDEgKE9fQ0xPRVhFQykgc2hvdWxkIGZhaWwgKG5vdCBpbmhlcml0ZWQpCisgICAgICog SGFuZGxlIDIgKG5vIE9fQ0xPRVhFQykgc2hvdWxkIHN1Y2NlZWQgKGluaGVyaXRlZCkKKwor VGVzdCBGaWxlcworLS0tLS0tLS0tLQorCistIHRlc3RfY2xvZXhlYy5jICAgICAtIFRoZSB0 ZXN0IHByb2dyYW0gKHBhcmVudCBhbmQgY2hpbGQgbG9naWMpCistIHQvMDAxX2Nsb2V4ZWMu cGwgICAtIFRBUCB0ZXN0IHNjcmlwdCB0aGF0IHJ1bnMgdGhlIHByb2dyYW0KKy0gTWFrZWZp bGUgICAgICAgICAgIC0gQnVpbGQgcnVsZXMgZm9yIG1ha2UtYmFzZWQgYnVpbGRzCistIG1l c29uLmJ1aWxkICAgICAgICAtIEJ1aWxkIHJ1bGVzIGZvciBtZXNvbi1iYXNlZCBidWlsZHMK KworSW50ZWdyYXRpb24gd2l0aCBQb3N0Z3JlU1FMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisKK1RoaXMgdGVzdCBzaG91bGQgYmUgcGxhY2VkIGluOgorICAgIHNyYy90ZXN0 L21vZHVsZXMvdGVzdF9jbG9leGVjLworCitUaGUgdGVzdCBpcyBXaW5kb3dzLW9ubHkgYW5k IHdpbGwgYmUgc2tpcHBlZCBvbiBvdGhlciBwbGF0Zm9ybXMuCisKK1RvIHJ1biB0aGUgdGVz dDoKKyAgICBtYWtlIGNoZWNrCisgICAgb3IKKyAgICBtZXNvbiB0ZXN0IHRlc3RfY2xvZXhl YworCitFeHBlY3RlZCBPdXRwdXQKKy0tLS0tLS0tLS0tLS0tLQorCitPbiBzdWNjZXNzLCB0 aGUgdGVzdCBwcm9ncmFtIG91dHB1dHM6CisgICAgUGFyZW50OiBPcGVuaW5nIHRlc3QgZmls ZXMuLi4KKyAgICBQYXJlbnQ6IGZkMT0zIChPX0NMT0VYRUMpIC0+IEhBTkRMRT0weC4uLgor ICAgIFBhcmVudDogZmQyPTQgKG5vIE9fQ0xPRVhFQykgLT4gSEFORExFPTB4Li4uCisgICAg UGFyZW50OiBTcGF3bmluZyBjaGlsZCBwcm9jZXNzLi4uCisgICAgUGFyZW50OiBXYWl0aW5n IGZvciBjaGlsZCBwcm9jZXNzLi4uCisgICAgQ2hpbGQ6IFJlY2VpdmVkIEhBTkRMRTE9MHgu Li4gKHNob3VsZCBmYWlsIC0gT19DTE9FWEVDKQorICAgIENoaWxkOiBSZWNlaXZlZCBIQU5E TEUyPTB4Li4uIChzaG91bGQgd29yayAtIG5vIE9fQ0xPRVhFQykKKyAgICBDaGlsZDogRmFp bGVkIHRvIHdyaXRlIHRvIEhBTkRMRTEgKGVycm9yIDYpCisgICAgQ2hpbGQ6IFN1Y2Nlc3Nm dWxseSB3cm90ZSB0byBIQU5ETEUyCisgICAgQ2hpbGQ6IEhBTkRMRTEgKE9fQ0xPRVhFQyk6 IE5PVCBBQ0NFU1NJQkxFIChHT09EISkKKyAgICBDaGlsZDogSEFORExFMiAobm8gT19DTE9F WEVDKTogQUNDRVNTSUJMRSAoR09PRCEpCisgICAgQ2hpbGQ6IFRlc3QgUEFTU0VEIC0gT19D TE9FWEVDIHdvcmtpbmcgY29ycmVjdGx5CisgICAgUGFyZW50OiBDaGlsZCBleGl0IGNvZGU6 IDAKKyAgICBQYXJlbnQ6IFNVQ0NFU1MgLSBPX0NMT0VYRUMgYmVoYXZpb3IgdmVyaWZpZWQK KworVGVjaG5pY2FsIERldGFpbHMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0ZXN0IHVz ZXMgV2luZG93cy1zcGVjaWZpYyBBUElzOgorCistIF9nZXRfb3NmaGFuZGxlKCkgLSBDb252 ZXJ0IENSVCBmaWxlIGRlc2NyaXB0b3IgdG8gV2luZG93cyBIQU5ETEUKKy0gQ3JlYXRlUHJv Y2VzcygpICAtIFNwYXduIGNoaWxkIHdpdGggYkluaGVyaXRIYW5kbGVzPVRSVUUKKy0gV3Jp dGVGaWxlKCkgICAgICAtIEF0dGVtcHQgdG8gd3JpdGUgdG8gaGFuZGxlcyBpbiBjaGlsZCBw cm9jZXNzCisKK1RoZSB0ZXN0IHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0OgorLSBXaW5kb3dz IEVycm9yIDYgKEVSUk9SX0lOVkFMSURfSEFORExFKSBpbmRpY2F0ZXMgdGhlIGhhbmRsZSBp cyBub3QgYWNjZXNzaWJsZQorLSBJbmhlcml0ZWQgaGFuZGxlcyB3b3JrIGFjcm9zcyBwcm9j ZXNzIGJvdW5kYXJpZXMgd2hlbiBwcm9wZXJseSBzZXQgdXAKKy0gT19DTE9FWEVDIHNob3Vs ZCBwcmV2ZW50IGluaGVyaXRhbmNlIGJ5IHNldHRpbmcgYkluaGVyaXRIYW5kbGU9RkFMU0UK KworUmVsYXRpb24gdG8gdGhlIFBhdGNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhp cyB0ZXN0IHZhbGlkYXRlcyB0aGUgY2hhbmdlcyBtYWRlIGluIHRoZSBPX0NMT0VYRUMgcGF0 Y2g6CisKKzEuIHNyYy9pbmNsdWRlL3BvcnQvd2luMzJfcG9ydC5oOgorICAgLSBDaGFuZ2Vk IE9fQ0xPRVhFQyBmcm9tIDAgdG8gX09fTk9JTkhFUklUICgweDgwKQorCisyLiBzcmMvcG9y dC9vcGVuLmMgKHBnd2luMzJfb3Blbl9oYW5kbGUpOgorICAgLSBBZGRlZCBPX0NMT0VYRUMg dG8gdGhlIGFzc2VydGlvbiBvZiBoYW5kbGVkIGZsYWdzCisgICAtIENoYW5nZWQgYkluaGVy aXRIYW5kbGUgZnJvbSBhbHdheXMgVFJVRSB0byBjb25kaXRpb25hbDoKKyAgICAgc2EuYklu aGVyaXRIYW5kbGUgPSAoZmlsZUZsYWdzICYgT19DTE9FWEVDKSA/IEZBTFNFIDogVFJVRTsK KworV2l0aG91dCB0aGVzZSBjaGFuZ2VzLCBib3RoIGhhbmRsZXMgd291bGQgYmUgaW5oZXJp dGVkIGJ5IHRoZSBjaGlsZCwKK2FuZCB0aGUgdGVzdCB3b3VsZCBmYWlsLgpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvbWVzb24uYnVpbGQgYi9zcmMvdGVz dC9tb2R1bGVzL3Rlc3RfY2xvZXhlYy9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwLi5mNmEzMDg3YmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvbWVzb24uYnVpbGQKQEAgLTAsMCArMSwyNyBA QAorIyBzcmMvdGVzdC9tb2R1bGVzL3Rlc3RfY2xvZXhlYy9tZXNvbi5idWlsZAorCisjIFRo aXMgdGVzdCBpcyBXaW5kb3dzLW9ubHkKK2lmIGhvc3Rfc3lzdGVtICE9ICd3aW5kb3dzJwor ICBzdWJkaXJfZG9uZSgpCitlbmRpZgorCit0ZXN0X2Nsb2V4ZWNfc291cmNlcyA9IGZpbGVz KCd0ZXN0X2Nsb2V4ZWMuYycpCisKK3Rlc3RfY2xvZXhlYyA9IGV4ZWN1dGFibGUoJ3Rlc3Rf Y2xvZXhlYycsCisgIHRlc3RfY2xvZXhlY19zb3VyY2VzLAorICBpbmNsdWRlX2RpcmVjdG9y aWVzOiBbcG9zdGdyZXNfaW5jXSwKKyAgbGlua193aXRoOiBbcGdwb3J0WycnXSwgcGdjb21t b25bJyddXSwKKyAgY19hcmdzOiBbJy1ERlJPTlRFTkQnXSwKKyAgaW5zdGFsbDogZmFsc2Us CispCisKK3Rlc3RzICs9IHsKKyAgJ25hbWUnOiAndGVzdF9jbG9leGVjJywKKyAgJ3NkJzog bWVzb24uY3VycmVudF9zb3VyY2VfZGlyKCksCisgICdiZCc6IG1lc29uLmN1cnJlbnRfYnVp bGRfZGlyKCksCisgICd0YXAnOiB7CisgICAgJ3Rlc3RzJzogWworICAgICAgJ3QvMDAxX2Ns b2V4ZWMucGwnLAorICAgIF0sCisgIH0sCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1 bGVzL3Rlc3RfY2xvZXhlYy90LzAwMV9jbG9leGVjLnBsIGIvc3JjL3Rlc3QvbW9kdWxlcy90 ZXN0X2Nsb2V4ZWMvdC8wMDFfY2xvZXhlYy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwLi40YzU2ZWIzYTRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3Qv bW9kdWxlcy90ZXN0X2Nsb2V4ZWMvdC8wMDFfY2xvZXhlYy5wbApAQCAtMCwwICsxLDYwIEBA CisjIFRlc3QgT19DTE9FWEVDIGZsYWcgaGFuZGxpbmcgb24gV2luZG93cworIworIyBUaGlz IHRlc3QgdmVyaWZpZXMgdGhhdCBmaWxlIGhhbmRsZXMgb3BlbmVkIHdpdGggT19DTE9FWEVD IGFyZSBub3QKKyMgaW5oZXJpdGVkIGJ5IGNoaWxkIHByb2Nlc3Nlcywgd2hpbGUgaGFuZGxl cyBvcGVuZWQgd2l0aG91dCBPX0NMT0VYRUMKKyMgYXJlIGluaGVyaXRlZC4KKwordXNlIHN0 cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBQb3N0Z3JlU1FMOjpU ZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOwordXNlIElQQzo6UnVuIHF3KHJ1bik7Cit1 c2UgRmlsZTo6U3BlYzsKK3VzZSBDd2QgJ2Fic19wYXRoJzsKKworaWYgKCEkUG9zdGdyZVNR TDo6VGVzdDo6VXRpbHM6OndpbmRvd3Nfb3MpCit7CisJcGxhbiBza2lwX2FsbCA9PiAndGVz dCBpcyBXaW5kb3dzLXNwZWNpZmljJzsKK30KKworcGxhbiB0ZXN0cyA9PiAxOworCitteSAk dGVzdF9wcm9nOworZm9yZWFjaCBteSAkZGlyIChzcGxpdCgvJENvbmZpZzo6Q29uZmlne3Bh dGhfc2VwfS8sICRFTlZ7UEFUSH0pKQoreworCW15ICRjYW5kaWRhdGUgPSBGaWxlOjpTcGVj LT5jYXRmaWxlKCRkaXIsICd0ZXN0X2Nsb2V4ZWMuZXhlJyk7CisJaWYgKC1mICRjYW5kaWRh dGUgJiYgLXggJGNhbmRpZGF0ZSkKKwl7CisJCSR0ZXN0X3Byb2cgPSAkY2FuZGlkYXRlOwor CQlsYXN0OworCX0KK30KKworaWYgKCEkdGVzdF9wcm9nKQoreworCSR0ZXN0X3Byb2cgPSAn Li90ZXN0X2Nsb2V4ZWMuZXhlJzsKK30KKworaWYgKCEtZiAkdGVzdF9wcm9nKQoreworCUJB SUxfT1VUKCJ0ZXN0IHByb2dyYW0gbm90IGZvdW5kOiAkdGVzdF9wcm9nIik7Cit9CisKK25v dGUoIlVzaW5nIHRlc3QgcHJvZ3JhbTogJHRlc3RfcHJvZyIpOworCitteSAoJHN0ZG91dCwg JHN0ZGVycik7CitteSAkcmVzdWx0ID0gcnVuIFsgJHRlc3RfcHJvZyBdLCAnPicsIFwkc3Rk b3V0LCAnMj4nLCBcJHN0ZGVycjsKKworbm90ZSgiVGVzdCBwcm9ncmFtIG91dHB1dDoiKTsK K25vdGUoJHN0ZG91dCkgaWYgJHN0ZG91dDsKKworaWYgKCRzdGRlcnIpCit7CisJZGlhZygi VGVzdCBwcm9ncmFtIHN0ZGVycjoiKTsKKwlkaWFnKCRzdGRlcnIpOworfQorCitvaygkcmVz dWx0ICYmICRzdGRvdXQgPX4gL1NVQ0NFU1MuKk9fQ0xPRVhFQyBiZWhhdmlvciB2ZXJpZmll ZC9zLAorICAgIk9fQ0xPRVhFQyBwcmV2ZW50cyBoYW5kbGUgaW5oZXJpdGFuY2UiKTsKKwor ZG9uZV90ZXN0aW5nKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0 IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvdGVzdF9jbG9leGVjLmMgYi9zcmMv dGVzdC9tb2R1bGVzL3Rlc3RfY2xvZXhlYy90ZXN0X2Nsb2V4ZWMuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi45NmNiZDljODBlCi0tLSAvZGV2L251bGwKKysr IGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Nsb2V4ZWMvdGVzdF9jbG9leGVjLmMKQEAgLTAs MCArMSwyNjcgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHRlc3RfY2xvZXhl Yy5jCisgKgkJVGVzdCBPX0NMT0VYRUMgZmxhZyBoYW5kbGluZyBvbiBXaW5kb3dzCisgKgor ICogVGhpcyBwcm9ncmFtIHRlc3RzIHRoYXQ6CisgKiAxLiBGaWxlIGhhbmRsZXMgb3BlbmVk IHdpdGggT19DTE9FWEVDIGFyZSBOT1QgaW5oZXJpdGVkIGJ5IGNoaWxkIHByb2Nlc3Nlcwor ICogMi4gRmlsZSBoYW5kbGVzIG9wZW5lZCB3aXRob3V0IE9fQ0xPRVhFQyBBUkUgaW5oZXJp dGVkIGJ5IGNoaWxkIHByb2Nlc3NlcworICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykg MTk5Ni0yMDI1LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisj aW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZkZWYgV0lO MzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNvbW1vbi9m aWxlX3V0aWxzLmgiCisjaW5jbHVkZSAicG9ydC5oIgorCitzdGF0aWMgdm9pZCBydW5fcGFy ZW50X3Rlc3RzKGNvbnN0IGNoYXIgKnRlc3RmaWxlMSwgY29uc3QgY2hhciAqdGVzdGZpbGUy KTsKK3N0YXRpYyB2b2lkIHJ1bl9jaGlsZF90ZXN0cyhjb25zdCBjaGFyICpoYW5kbGUxX3N0 ciwgY29uc3QgY2hhciAqaGFuZGxlMl9zdHIpOworc3RhdGljIGJvb2wgdHJ5X3dyaXRlX3Rv X2hhbmRsZShIQU5ETEUgaCwgY29uc3QgY2hhciAqbGFiZWwpOworCitpbnQKK21haW4oaW50 IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyCQl0ZXN0ZmlsZTFbTUFYUEdQQVRIXTsK KwljaGFyCQl0ZXN0ZmlsZTJbTUFYUEdQQVRIXTsKKworCS8qIFdpbmRvd3Mtb25seSB0ZXN0 ICovCisjaWZuZGVmIFdJTjMyCisJZnByaW50ZihzdGRlcnIsICJUaGlzIHRlc3Qgb25seSBy dW5zIG9uIFdpbmRvd3NcbiIpOworCXJldHVybiAwOworI2VuZGlmCisKKwlpZiAoYXJnYyA9 PSAzKQorCXsKKwkJLyoKKwkJICogQ2hpbGQgbW9kZTogcmVjZWl2ZXMgdHdvIGhhbmRsZSB2 YWx1ZXMgYXMgaGV4IHN0cmluZ3MKKwkJICogYW5kIGF0dGVtcHRzIHRvIHdyaXRlIHRvIHRo ZW0KKwkJICovCisJCXJ1bl9jaGlsZF90ZXN0cyhhcmd2WzFdLCBhcmd2WzJdKTsKKwkJcmV0 dXJuIDA7CisJfQorCWVsc2UgaWYgKGFyZ2MgPT0gMSkKKwl7CisJCS8qCisJCSAqIFBhcmVu dCBtb2RlOiBvcGVucyBmaWxlcyBhbmQgc3Bhd25zIGNoaWxkCisJCSAqLworCQlzbnByaW50 Zih0ZXN0ZmlsZTEsIHNpemVvZih0ZXN0ZmlsZTEpLCAidGVzdF9jbG9leGVjXzFfJWQudG1w IiwgKGludCkgZ2V0cGlkKCkpOworCQlzbnByaW50Zih0ZXN0ZmlsZTIsIHNpemVvZih0ZXN0 ZmlsZTIpLCAidGVzdF9jbG9leGVjXzJfJWQudG1wIiwgKGludCkgZ2V0cGlkKCkpOworCisJ CXJ1bl9wYXJlbnRfdGVzdHModGVzdGZpbGUxLCB0ZXN0ZmlsZTIpOworCisJCS8qIENsZWFu IHVwIHRlc3QgZmlsZXMgKi8KKwkJdW5saW5rKHRlc3RmaWxlMSk7CisJCXVubGluayh0ZXN0 ZmlsZTIpOworCisJCXJldHVybiAwOworCX0KKwllbHNlCisJeworCQlmcHJpbnRmKHN0ZGVy ciwgIlVzYWdlOiAlcyBbaGFuZGxlMV9oZXggaGFuZGxlMl9oZXhdXG4iLCBhcmd2WzBdKTsK KwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgdm9pZAorcnVuX3BhcmVudF90ZXN0cyhj b25zdCBjaGFyICp0ZXN0ZmlsZTEsIGNvbnN0IGNoYXIgKnRlc3RmaWxlMikKK3sKKyNpZmRl ZiBXSU4zMgorCWludAkJCWZkMSwKKwkJCQlmZDI7CisJSEFORExFCQloMSwKKwkJCQloMjsK KwljaGFyCQljbWRsaW5lWzEwMjRdOworCVNUQVJUVVBJTkZPIHNpOworCVBST0NFU1NfSU5G T1JNQVRJT04gcGk7CisJRFdPUkQJCWV4aXRfY29kZTsKKworCXByaW50ZigiUGFyZW50OiBP cGVuaW5nIHRlc3QgZmlsZXMuLi5cbiIpOworCisJLyoKKwkgKiBPcGVuIGZpcnN0IGZpbGUg V0lUSCBPX0NMT0VYRUMgLSBzaG91bGQgTk9UIGJlIGluaGVyaXRlZAorCSAqLworCWZkMSA9 IG9wZW4odGVzdGZpbGUxLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhF QywgMDYwMCk7CisJaWYgKGZkMSA8IDApCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxl ZCB0byBvcGVuICVzOiAlc1xuIiwgdGVzdGZpbGUxLCBzdHJlcnJvcihlcnJubykpOworCQll eGl0KDEpOworCX0KKworCS8qCisJICogT3BlbiBzZWNvbmQgZmlsZSBXSVRIT1VUIE9fQ0xP RVhFQyAtIHNob3VsZCBiZSBpbmhlcml0ZWQKKwkgKi8KKwlmZDIgPSBvcGVuKHRlc3RmaWxl MiwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2MDApOworCWlmIChmZDIgPCAwKQor CXsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiAlczogJXNcbiIsIHRlc3Rm aWxlMiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQxKTsKKwkJZXhpdCgxKTsKKwl9 CisKKwkvKiBHZXQgV2luZG93cyBIQU5ETEVzIGZyb20gZmlsZSBkZXNjcmlwdG9ycyAqLwor CWgxID0gKEhBTkRMRSkgX2dldF9vc2ZoYW5kbGUoZmQxKTsKKwloMiA9IChIQU5ETEUpIF9n ZXRfb3NmaGFuZGxlKGZkMik7CisKKwlpZiAoaDEgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUg fHwgaDIgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisJeworCQlmcHJpbnRmKHN0ZGVyciwg IkZhaWxlZCB0byBnZXQgT1MgaGFuZGxlc1xuIik7CisJCWNsb3NlKGZkMSk7CisJCWNsb3Nl KGZkMik7CisJCWV4aXQoMSk7CisJfQorCisJcHJpbnRmKCJQYXJlbnQ6IGZkMT0lZCAoT19D TE9FWEVDKSAtPiBIQU5ETEU9JXBcbiIsIGZkMSwgaDEpOworCXByaW50ZigiUGFyZW50OiBm ZDI9JWQgKG5vIE9fQ0xPRVhFQykgLT4gSEFORExFPSVwXG4iLCBmZDIsIGgyKTsKKworCS8q CisJICogU3Bhd24gY2hpbGQgcHJvY2VzcyB3aXRoIGJJbmhlcml0SGFuZGxlcz1UUlVFLCBw YXNzaW5nIGhhbmRsZSB2YWx1ZXMKKwkgKiBhcyBoZXggc3RyaW5ncworCSAqLworCXNucHJp bnRmKGNtZGxpbmUsIHNpemVvZihjbWRsaW5lKSwgIlwiJXNcIiAlcCAlcCIsCisJCQkgR2V0 Q29tbWFuZExpbmUoKSwgaDEsIGgyKTsKKworCS8qCisJICogRmluZCB0aGUgYWN0dWFsIGV4 ZWN1dGFibGUgcGF0aCBieSByZW1vdmluZyBhbnkgYXJndW1lbnRzIGZyb20KKwkgKiBHZXRD b21tYW5kTGluZSgpCisJICovCisJeworCQljaGFyCQlleGVfcGF0aFtNQVhfUEFUSF07CisJ CWNoYXIJICAgKnNwYWNlX3BvczsKKworCQlHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBleGVf cGF0aCwgc2l6ZW9mKGV4ZV9wYXRoKSk7CisJCXNucHJpbnRmKGNtZGxpbmUsIHNpemVvZihj bWRsaW5lKSwgIlwiJXNcIiAlcCAlcCIsCisJCQkJIGV4ZV9wYXRoLCBoMSwgaDIpOworCX0K KworCW1lbXNldCgmc2ksIDAsIHNpemVvZihzaSkpOworCXNpLmNiID0gc2l6ZW9mKHNpKTsK KwltZW1zZXQoJnBpLCAwLCBzaXplb2YocGkpKTsKKworCXByaW50ZigiUGFyZW50OiBTcGF3 bmluZyBjaGlsZCBwcm9jZXNzLi4uXG4iKTsKKwlwcmludGYoIlBhcmVudDogQ29tbWFuZCBs aW5lOiAlc1xuIiwgY21kbGluZSk7CisKKwlpZiAoIUNyZWF0ZVByb2Nlc3MoTlVMTCwJCS8q IGFwcGxpY2F0aW9uIG5hbWUgKi8KKwkJCQkJICAgY21kbGluZSwJCS8qIGNvbW1hbmQgbGlu ZSAqLworCQkJCQkgICBOVUxMLAkJLyogcHJvY2VzcyBzZWN1cml0eSBhdHRyaWJ1dGVzICov CisJCQkJCSAgIE5VTEwsCQkvKiB0aHJlYWQgc2VjdXJpdHkgYXR0cmlidXRlcyAqLworCQkJ CQkgICBUUlVFLAkJLyogYkluaGVyaXRIYW5kbGVzIC0gQ1JJVElDQUwhICovCisJCQkJCSAg IDAsCQkJLyogY3JlYXRpb24gZmxhZ3MgKi8KKwkJCQkJICAgTlVMTCwJCS8qIGVudmlyb25t ZW50ICovCisJCQkJCSAgIE5VTEwsCQkvKiBjdXJyZW50IGRpcmVjdG9yeSAqLworCQkJCQkg ICAmc2ksCQkJLyogc3RhcnR1cCBpbmZvICovCisJCQkJCSAgICZwaSkpCQkvKiBwcm9jZXNz IGluZm9ybWF0aW9uICovCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIkNyZWF0ZVByb2Nlc3Mg ZmFpbGVkOiAlbHVcbiIsIEdldExhc3RFcnJvcigpKTsKKwkJY2xvc2UoZmQxKTsKKwkJY2xv c2UoZmQyKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoIlBhcmVudDogV2FpdGluZyBm b3IgY2hpbGQgcHJvY2Vzcy4uLlxuIik7CisKKwkvKiBXYWl0IGZvciBjaGlsZCB0byBjb21w bGV0ZSAqLworCVdhaXRGb3JTaW5nbGVPYmplY3QocGkuaFByb2Nlc3MsIElORklOSVRFKTsK KwlHZXRFeGl0Q29kZVByb2Nlc3MocGkuaFByb2Nlc3MsICZleGl0X2NvZGUpOworCisJQ2xv c2VIYW5kbGUocGkuaFByb2Nlc3MpOworCUNsb3NlSGFuZGxlKHBpLmhUaHJlYWQpOworCisJ Y2xvc2UoZmQxKTsKKwljbG9zZShmZDIpOworCisJcHJpbnRmKCJQYXJlbnQ6IENoaWxkIGV4 aXQgY29kZTogJWx1XG4iLCBleGl0X2NvZGUpOworCisJaWYgKGV4aXRfY29kZSA9PSAwKQor CQlwcmludGYoIlBhcmVudDogU1VDQ0VTUyAtIE9fQ0xPRVhFQyBiZWhhdmlvciB2ZXJpZmll ZFxuIik7CisJZWxzZQorCXsKKwkJcHJpbnRmKCJQYXJlbnQ6IEZBSUxVUkUgLSBPX0NMT0VY RUMgbm90IHdvcmtpbmcgY29ycmVjdGx5XG4iKTsKKwkJZXhpdCgxKTsKKwl9CisjZW5kaWYK K30KKworc3RhdGljIHZvaWQKK3J1bl9jaGlsZF90ZXN0cyhjb25zdCBjaGFyICpoYW5kbGUx X3N0ciwgY29uc3QgY2hhciAqaGFuZGxlMl9zdHIpCit7CisjaWZkZWYgV0lOMzIKKwlIQU5E TEUJCWgxLAorCQkJCWgyOworCWJvb2wJCWgxX3dvcmtlZCwKKwkJCQloMl93b3JrZWQ7CisK KwkvKiBQYXJzZSBoYW5kbGUgdmFsdWVzIGZyb20gaGV4IHN0cmluZ3MgKi8KKwlpZiAoc3Nj YW5mKGhhbmRsZTFfc3RyLCAiJXAiLCAmaDEpICE9IDEgfHwKKwkJc3NjYW5mKGhhbmRsZTJf c3RyLCAiJXAiLCAmaDIpICE9IDEpCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIkNoaWxkOiBG YWlsZWQgdG8gcGFyc2UgaGFuZGxlIHZhbHVlc1xuIik7CisJCWV4aXQoMSk7CisJfQorCisJ cHJpbnRmKCJDaGlsZDogUmVjZWl2ZWQgSEFORExFMT0lcCAoc2hvdWxkIGZhaWwgLSBPX0NM T0VYRUMpXG4iLCBoMSk7CisJcHJpbnRmKCJDaGlsZDogUmVjZWl2ZWQgSEFORExFMj0lcCAo c2hvdWxkIHdvcmsgLSBubyBPX0NMT0VYRUMpXG4iLCBoMik7CisKKwkvKgorCSAqIFRyeSB0 byB3cml0ZSB0byBib3RoIGhhbmRsZXMKKwkgKi8KKwloMV93b3JrZWQgPSB0cnlfd3JpdGVf dG9faGFuZGxlKGgxLCAiSEFORExFMSIpOworCWgyX3dvcmtlZCA9IHRyeV93cml0ZV90b19o YW5kbGUoaDIsICJIQU5ETEUyIik7CisKKwlwcmludGYoIkNoaWxkOiBIQU5ETEUxIChPX0NM T0VYRUMpOiAlc1xuIiwKKwkJICAgaDFfd29ya2VkID8gIkFDQ0VTU0lCTEUgKEJBRCEpIiA6 ICJOT1QgQUNDRVNTSUJMRSAoR09PRCEpIik7CisJcHJpbnRmKCJDaGlsZDogSEFORExFMiAo bm8gT19DTE9FWEVDKTogJXNcbiIsCisJCSAgIGgyX3dvcmtlZCA/ICJBQ0NFU1NJQkxFIChH T09EISkiIDogIk5PVCBBQ0NFU1NJQkxFIChCQUQhKSIpOworCisJLyoKKwkgKiBGb3IgT19D TE9FWEVDIHRvIHdvcmsgY29ycmVjdGx5OgorCSAqIC0gaDEgc2hvdWxkIE5PVCBiZSBhY2Nl c3NpYmxlIChoMV93b3JrZWQgPT0gZmFsc2UpCisJICogLSBoMiBTSE9VTEQgYmUgYWNjZXNz aWJsZSAoaDJfd29ya2VkID09IHRydWUpCisJICovCisJaWYgKCFoMV93b3JrZWQgJiYgaDJf d29ya2VkKQorCXsKKwkJcHJpbnRmKCJDaGlsZDogVGVzdCBQQVNTRUQgLSBPX0NMT0VYRUMg d29ya2luZyBjb3JyZWN0bHlcbiIpOworCQlleGl0KDApOworCX0KKwllbHNlCisJeworCQlw cmludGYoIkNoaWxkOiBUZXN0IEZBSUxFRCAtIE9fQ0xPRVhFQyBub3Qgd29ya2luZyBjb3Jy ZWN0bHlcbiIpOworCQlleGl0KDEpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgYm9vbAor dHJ5X3dyaXRlX3RvX2hhbmRsZShIQU5ETEUgaCwgY29uc3QgY2hhciAqbGFiZWwpCit7Cisj aWZkZWYgV0lOMzIKKwljb25zdCBjaGFyICp0ZXN0X2RhdGEgPSAidGVzdFxuIjsKKwlEV09S RAkJYnl0ZXNfd3JpdHRlbjsKKwlCT09MCQlyZXN1bHQ7CisKKwlyZXN1bHQgPSBXcml0ZUZp bGUoaCwgdGVzdF9kYXRhLCBzdHJsZW4odGVzdF9kYXRhKSwgJmJ5dGVzX3dyaXR0ZW4sIE5V TEwpOworCisJaWYgKHJlc3VsdCAmJiBieXRlc193cml0dGVuID09IHN0cmxlbih0ZXN0X2Rh dGEpKQorCXsKKwkJcHJpbnRmKCJDaGlsZDogU3VjY2Vzc2Z1bGx5IHdyb3RlIHRvICVzXG4i LCBsYWJlbCk7CisJCXJldHVybiB0cnVlOworCX0KKwllbHNlCisJeworCQlwcmludGYoIkNo aWxkOiBGYWlsZWQgdG8gd3JpdGUgdG8gJXMgKGVycm9yICVsdSlcbiIsCisJCQkgICBsYWJl bCwgR2V0TGFzdEVycm9yKCkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorI2Vsc2UKKwlyZXR1 cm4gZmFsc2U7CisjZW5kaWYKK30KLS0gCjIuNDYuMC53aW5kb3dzLjEKCg== --------------UculB8fk7wiiMCLy5pTD2Gy9--