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.96) (envelope-from ) id 1x4HUV-0072yh-0q for pgsql-hackers@arkaria.postgresql.org; Wed, 09 Sep 2026 12:33:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1x4HUU-00Edaj-0P for pgsql-hackers@arkaria.postgresql.org; Wed, 09 Sep 2026 12:33:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1x4HUT-00EdaZ-2O for pgsql-hackers@lists.postgresql.org; Wed, 09 Sep 2026 12:33:25 +0000 Received: from mail-vs2-x10.google.com ([2a00:1450:4864:3a::10]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1x4HUR-00000003l49-0Y1F for pgsql-hackers@lists.postgresql.org; Wed, 09 Sep 2026 12:33:25 +0000 Received: by mail-vs2-x10.google.com with SMTP id 71dfb90a1353d-5c7bd056863so711807e0c.0 for ; Wed, 09 Sep 2026 05:33:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788957201; x=1789562001; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:content-type:from:to:cc :subject:date:message-id:reply-to:content-type; bh=dclmyR5Wpqd38q+nfMIb3G2WhK3wAZaodeAyLJxIDE4=; b=NkWrTVcK9ndmnc9rcxrikoKfc/sN5V1G8LEdmYk6R8/ezPOmyn6F7z0JMThS4GD3WB cJcgEOFqw03Ba3UfBQcp6dzscUE7uhRabQ4HPe8my5XZXs7m4uLmkJur7Pi0GQFYA9S7 U9F8+spmeWWmzRpOn0v0XDETk46W6Z/1vOcVesR/LNV1dJgcjeMYFjmVXVyUZ0XBfIYV zDf9jnYRBUoz7nesTEx+h1tIDR/inMvTkD0G/qxRVNiMGggk9xWl3+oCFsy66Py5Rfqx vlYDCGlE/qkoJWhKlI3wudtxjooYiAeiuSL3preAZ2ci3uS21ulacF54xVM+rRQbxdRG mzMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788957201; x=1789562001; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:content-type:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=dclmyR5Wpqd38q+nfMIb3G2WhK3wAZaodeAyLJxIDE4=; b=W0akO1fBsWcdmbeLErocaz+e6Nk7h7GqsVDLKEuPQRGdgecwYXMtJnSDVUkCpbPSCa TZSuOfWL112wa3czkM53Lm/LMf0rXSOCVRaqbog6mnb11b+zOsxtLgbw5rMdtxAyLQMo BtbOOtz/He5Ed9Ybquc4hPb+4VEtJM18LJYaz/WYiK2NNibiVhYgjiM6vb9f9gPaTVwG KQzWL9CiBstikJe6chPZRPaEt0S4qbO3iO245ntgFuYecLzaY6smYovEE3qvC6zabJic t5JKMCQINMJzGSbQD4ToobK354dW59ig6dKxWyINQiNTVPmg0/nJRL5E+nSLqy+j2Za9 g39Q== X-Forwarded-Encrypted: i=1; AKwUvByVrRMI5bO/rA0t5w6TLIoOjz1y/b+KwgGE6lNe1lsMLTq0tdis8GbhehfN5DDz+LXFd592G+1CtetwliV5@lists.postgresql.org X-Gm-Message-State: AFuF++mAtkseNdn+6iC91S92+WavEU+293gIWPrQL/VuGME+5YiDZYoP vo0sZQlUO3oJTaoRkJAyMzIdMKVgu2gVGF0GZ0DPKNM8hPeqDgkFjA+s X-Gm-Gg: AYBFou0h3T2AhY2T2Q9B065DyeWS8x8iahxmHzeYkf+oxvk3W5qWZlt9/eMe5B+eBgX 0qwEJaI20XhVXeKVaisqq5vbbfufZUDwRUWiPiIXAcuWdhj+b0A88xGU5CwAGXKlxgc7e/RxihG /cSSnvjwQiJxwn8Im+EKXCRuXENGhu6BX/ZL1kIFNa4e4dmWLazlu1ZZQdhmMlMmoo2wumLOWf7 cIDPXuFOYaZOgna9iDV63GBZ7SiR5HehP+8MsVDmTI94ulBNpWS623N4tynpi4BXGwkJNJMpm2n l/mQzS0PTRNQ2wCMOfVEbbFtxCKw1N1W01oBIiPXMM8lTONx9efLK+PoEcp5r/99j5diaizdUYX 0sEqAz4iU4ZaxtsPWKMP3rt+ZeeQpSRtdlBzwNkEI4z1vlxcbtLDqqfRwf3dA86bjsmlG0TNBb8 7++cYUKdFUjPAq0249/P3evJgphPJyTNH8TNb3Bt06nsRNDHDv3h8/n/X71867X87SW4VIEljjM 408qDyEMw== X-Received: by 2002:a05:6122:8ca:b0:5c7:f1ba:aa12 with SMTP id 71dfb90a1353d-5c81a890efemr4386714e0c.4.1788957201117; Wed, 09 Sep 2026 05:33:21 -0700 (PDT) Received: from [192.168.88.177] ([201.180.218.72]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5c7ec1ef7a5sm12714423e0c.5.2026.09.09.05.33.18 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 09 Sep 2026 05:33:19 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------2of02KxmSaVuVeEIdRnJWfOS" Message-ID: <00e741a7-8dc1-4993-87f4-8976e9c3b6ba@gmail.com> Date: Wed, 9 Sep 2026 09:33:16 -0300 MIME-Version: 1.0 User-Agent: Betterbird (Linux) Subject: Re: [PATCH] libpq: Add PQpassfileLookup() To: Grigorev Jurij Cc: Denis Smirnov , Jacob Champion , "pgsql-hackers@lists.postgresql.org" References: <56a73ea31de54ebea53877367cdd6abf@localhost.localdomain> Content-Language: en-US From: Diego In-Reply-To: <56a73ea31de54ebea53877367cdd6abf@localhost.localdomain> 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. --------------2of02KxmSaVuVeEIdRnJWfOS Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Jurij, Thanks for the great review! v2 attached: all your points addressed, plus a rebase onto current master. > I think the simplest option is to keep the proposed public signature > and document that NULL is returned if no matching password is found or > if the lookup cannot be completed, for example because of an allocation > failure. Alternatively, the public API would need an error output > parameter. Done the simple way: the docs and the function's comment now say NULL means no matching password was found or the lookup could not be completed. I also took your other suggestion and made passwordFromFile() accept a NULL error pointer, so the wrapper no longer needs a dummy variable. > There is no need to copy the environment value here. passfile can > point directly to pgpassenv; the local buffer is needed only when > constructing the default path. Done exactly that way, the truncation is gone. > * NULL and empty port should use DEF_PGPORT_STR. The current > localhost test uses a wildcard port, so it does not test that > default. The test should account for a non-standard compiled-in > port rather than assuming 5432. Added. The test client grew a --passfile-defaults mode that prints DEF_PGPORT_STR and DEFAULT_PGSOCKET_DIR, and the TAP test writes its passfile entry under whatever port that reports, so no 5432 assumption anywhere. NULL and empty port are both covered. I tried it against a build configured with -Dpgport=5499 and it passes there too. > * NULL dbname and username are tested, but their empty-string forms > are not. Added both. Small deviation here: the test client maps an argument of "=" to an empty string instead of taking a real empty argument. No TAP test in the tree passes an empty argv element today, and I did not want to find out on the Windows CI whether one survives process spawning there. > * NULL passfile with PGPASSFILE is tested, but empty passfile and the > fallback to the default password file location are not. Added both: an empty passfile falling back to PGPASSFILE, and a NULL passfile with no PGPASSFILE falling back to ~/.pgpass, by pointing HOME at a temporary directory (skipped on Windows, where the default location does not come from the environment). > * The documented default-socket-directory-to-localhost rule is not > currently tested. Added, using the socket directory reported by --passfile-defaults (skipped if the platform reports none). > Testing that trailing fields are silently ignored appears to preserve > an undocumented parser behaviour. Since that behaviour is inherited > from passwordFromFile() rather than introduced by this API, I would > prefer to leave it out of this patch. Agreed, I removed the test case and its passfile line. > * test_passfile_lookup() checks argc < 7 and silently accepts extra > arguments. argc != 7 would match the usage string more closely. Changed. > * The C comment describing hostname defaults does not mention the > default socket directory rule that is described in the SGML docs. Added. > * The returned allocation contains a plaintext password. > PQfreemem() does not erase it, whereas libpq explicitly clears > passwords stored in PGconn before freeing them. It would be useful > for the documentation to mention that callers are responsible for > securely clearing the result where appropriate. Added a paragraph to the docs: the result is a cleartext password, PQfreemem() does not erase it, and callers that do not want it lingering in memory should overwrite it before freeing. v2 also wraps the doc synopsis like the neighboring entries do, and now spells out that PGPASSFILE is the only environment variable the function looks at (PGHOST and PGPORT are not applied to the lookup keys). I'll move the CF entry back to Needs review. Thank you, BR, Diego --------------2of02KxmSaVuVeEIdRnJWfOS Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-libpq-Add-PQpassfileLookup.patch" Content-Disposition: attachment; filename="v2-0001-libpq-Add-PQpassfileLookup.patch" Content-Transfer-Encoding: base64 RnJvbSA3ZjZjMjUxZmNiMDYzZmRkNzI1MzNjNzIzMDY1ZmYwNTc2ZGZlODM2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEaWVnbyA8bXJzdGVwaGVuYW1lbGxAZ21haWwuY29t PgpEYXRlOiBNb24sIDMxIEF1ZyAyMDI2IDE2OjM4OjUzIC0wMzAwClN1YmplY3Q6IFtQQVRD SCB2Ml0gbGlicHE6IEFkZCBQUXBhc3NmaWxlTG9va3VwKCkKCkFuIGFwcGxpY2F0aW9uIHRo YXQgY29ubmVjdHMgdGhyb3VnaCBhbiBpbnRlcm1lZGlhcnksIHN1Y2ggYXMgYSBsb2NhbApT U0ggdHVubmVsLCBjb25uZWN0cyB0byBhIGhvc3QgYW5kIHBvcnQgdGhhdCBubyBsb25nZXIg bWF0Y2ggdGhlCnBhc3N3b3JkIGZpbGUgZW50cnkgd3JpdHRlbiBmb3IgdGhlIHJlYWwgc2Vy dmVyLCBzbyBsaWJwcSdzIHBhc3N3b3JkCmZpbGUgbG9va3VwIGNvbWVzIHVwIGVtcHR5IGR1 cmluZyBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuICBVbnRpbCBub3csCnN1Y2ggYW4gYXBw bGljYXRpb24gaGFkIHRvIHJlaW1wbGVtZW50IHRoZSBwYXNzd29yZCBmaWxlIHBhcnNlciBv biBpdHMKc2lkZSB0byBrZWVwIC5wZ3Bhc3Mgd29ya2luZy4KCkV4cG9zZSB0aGUgZXhpc3Rp bmcgbG9va3VwIGFzIGEgcHVibGljIGZ1bmN0aW9uLCBQUXBhc3NmaWxlTG9va3VwKCksIHNv CnRoYXQgYSBjbGllbnQgY2FuIGxvb2sgdXAgdGhlIHBhc3N3b3JkIHVuZGVyIHRoZSByZWFs IHNlcnZlcidzIGhvc3QgYW5kCnBvcnQgYW5kIHBhc3MgdGhlIHJlc3VsdCBhcyB0aGUgcGFz c3dvcmQgY29ubmVjdGlvbiBwYXJhbWV0ZXIgd2hpbGUKY29ubmVjdGluZyB0byB0aGUgaW50 ZXJtZWRpYXJ5J3MgYWRkcmVzcy4gIFRoZSBmdW5jdGlvbiBhcHBsaWVzIHRoZQpzYW1lIHJ1 bGVzIGFzIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudDogdGhlIHNhbWUgZmllbGQgbWF0Y2hp bmcgYW5kCmRlLWVzY2FwaW5nLCB0aGUgc2FtZSBsb2NhbGhvc3QgYW5kIGRlZmF1bHQtcG9y dCBzdWJzdGl0dXRpb25zIGZvcgptaXNzaW5nIHZhbHVlcywgdGhlIHNhbWUgcGVybWlzc2lv biBjaGVja3MsIGFuZCB0aGUgc2FtZSBmYWxsYmFjayB0bwpQR1BBU1NGSUxFIGFuZCB0aGUg ZGVmYXVsdCBwYXNzd29yZCBmaWxlIGxvY2F0aW9uIHdoZW4gbm8gZmlsZSBpcwpnaXZlbi4g IFBHUEFTU0ZJTEUgaXMgdGhlIG9ubHkgZW52aXJvbm1lbnQgdmFyaWFibGUgY29uc3VsdGVk OyB0aGUKbG9va3VwIGtleXMgYXJlIHVzZWQgYXMgZ2l2ZW4uCgpBbHNvIGFkZCAtLXBhc3Nm aWxlIGFuZCAtLXBhc3NmaWxlLWRlZmF1bHRzIG1vZGVzIHRvIGxpYnBxX3Rlc3RjbGllbnQs CmFuZCBhIFRBUCB0ZXN0IGV4ZXJjaXNpbmcgdGhlIGxvb2t1cDsgaXQgbmVlZHMgbm8gc2Vy dmVyLgoKQXV0aG9yOiBEaWVnbyA8bXJzdGVwaGVuYW1lbGxAZ21haWwuY29tPgpSZXZpZXdl ZC1ieTogWXVyaXkgR3JpZ29yeWV2IDxqdS5ncmlnb3JldkBmdGRhdGEucnU+ClN1Z2dlc3Rl ZC1ieTogRGVuaXMgU21pcm5vdiA8ZGFydGh1bml4QGdtYWlsLmNvbT4KRGlzY3Vzc2lvbjog aHR0cHM6Ly9wb3N0Z3IuZXMvbS9CMkVEQjVBRS0yN0Y3LTQ1ODAtODcxRS0xQzI0MzNCQUVG MThAZ21haWwuY29tCi0tLQogZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwgICAgICAgICAgICAg ICAgICAgICAgfCAgNzMgKysrKysrKwogc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50 eHQgICAgICAgICAgICAgfCAgIDEgKwogc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtY29ubmVj dC5jICAgICAgICAgICAgfCAgNjMgKysrKystCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9saWJw cS1mZS5oICAgICAgICAgICAgICB8ICAgOSArCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9tZXNv bi5idWlsZCAgICAgICAgICAgICB8ICAgMSArCiBzcmMvaW50ZXJmYWNlcy9saWJwcS90LzAw N19wYXNzZmlsZS5wbCAgICAgICB8IDIwMSArKysrKysrKysrKysrKysrKysrCiBzcmMvaW50 ZXJmYWNlcy9saWJwcS90ZXN0L2xpYnBxX3Rlc3RjbGllbnQuYyB8ICA2MCArKysrKy0KIDcg ZmlsZXMgY2hhbmdlZCwgNDAzIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCiBjcmVh dGUgbW9kZSAxMDA2NDQgc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDdfcGFzc2ZpbGUucGwK CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbCBiL2RvYy9zcmMvc2dtbC9s aWJwcS5zZ21sCmluZGV4IDY4NDg3YTM5NTRmLi40YjM3ZmFmNzc0MSAxMDA2NDQKLS0tIGEv ZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwK QEAgLTc5NzYsNiArNzk3Niw3MyBAQCBjaGFyICpQUWVuY3J5cHRQYXNzd29yZChjb25zdCBj aGFyICpwYXNzd2QsIGNvbnN0IGNoYXIgKnVzZXIpOwogICAgIDwvbGlzdGl0ZW0+CiAgICA8 L3Zhcmxpc3RlbnRyeT4KIAorICAgPHZhcmxpc3RlbnRyeSBpZD0ibGlicHEtUFFwYXNzZmls ZUxvb2t1cCI+CisgICAgPHRlcm0+PGZ1bmN0aW9uPlBRcGFzc2ZpbGVMb29rdXA8L2Z1bmN0 aW9uPjxpbmRleHRlcm0+PHByaW1hcnk+UFFwYXNzZmlsZUxvb2t1cDwvcHJpbWFyeT48L2lu ZGV4dGVybT48L3Rlcm0+CisKKyAgICA8bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAg TG9va3MgdXAgYSBwYXNzd29yZCBpbiBhIHBhc3N3b3JkIGZpbGUKKyAgICAgIChzZWUgPHhy ZWYgbGlua2VuZD0ibGlicHEtcGdwYXNzIi8+KS4KKzxzeW5vcHNpcz4KK2NoYXIgKlBRcGFz c2ZpbGVMb29rdXAoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQsCisg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRibmFtZSwgY29uc3QgY2hhciAq dXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhc3NmaWxl KTsKKzwvc3lub3BzaXM+CisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIFRo aXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIHNhbWUgcGFzc3dvcmQgZmlsZSBsb29rdXAgdGhh dCBjb25uZWN0aW9uCisgICAgICBlc3RhYmxpc2htZW50IHBlcmZvcm1zIHdoZW4gbm8gcGFz c3dvcmQgaGFzIGJlZW4gc3BlY2lmaWVkLCBhbmQKKyAgICAgIHJldHVybnMgdGhlIHBhc3N3 b3JkIGZyb20gdGhlIGZpcnN0IG1hdGNoaW5nIGxpbmUuICBJdCBpcyBpbnRlbmRlZAorICAg ICAgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGNvbm5lY3QgdGhyb3VnaCBhbiBpbnRlcm1lZGlh cnksIGZvciBleGFtcGxlIGEKKyAgICAgIGxvY2FsIFNTSCB0dW5uZWw6IHN1Y2ggYW4gYXBw bGljYXRpb24gY2FuIGxvb2sgdXAgdGhlIHBhc3N3b3JkIHVuZGVyCisgICAgICB0aGUgcmVh bCBzZXJ2ZXIncyBob3N0IGFuZCBwb3J0LCBhbmQgdGhlbiBwYXNzIHRoZSByZXN1bHQgYXMg dGhlCisgICAgICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uZWN0LXBhc3N3b3JkIi8+IGNv bm5lY3Rpb24gcGFyYW1ldGVyIHdoaWxlCisgICAgICBjb25uZWN0aW5nIHRvIHRoZSBpbnRl cm1lZGlhcnkncyBhZGRyZXNzLgorICAgICA8L3BhcmE+CisKKyAgICAgPHBhcmE+CisgICAg ICBUaGUgPHBhcmFtZXRlcj5ob3N0bmFtZTwvcGFyYW1ldGVyPiwgPHBhcmFtZXRlcj5wb3J0 PC9wYXJhbWV0ZXI+LAorICAgICAgPHBhcmFtZXRlcj5kYm5hbWU8L3BhcmFtZXRlcj4gYW5k IDxwYXJhbWV0ZXI+dXNlcm5hbWU8L3BhcmFtZXRlcj4KKyAgICAgIGFyZ3VtZW50cyBjb3Jy ZXNwb25kIHRvIHRoZSBmaXJzdCBmb3VyIGZpZWxkcyBvZiBhIHBhc3N3b3JkIGZpbGUKKyAg ICAgIGxpbmUuICBJZiA8cGFyYW1ldGVyPmhvc3RuYW1lPC9wYXJhbWV0ZXI+IGlzIDxzeW1i b2w+TlVMTDwvc3ltYm9sPiBvcgorICAgICAgZW1wdHksIG9yIG1hdGNoZXMgPGFwcGxpY2F0 aW9uPmxpYnBxPC9hcHBsaWNhdGlvbj4ncyBkZWZhdWx0IHNvY2tldAorICAgICAgZGlyZWN0 b3J5IHBhdGgsIHRoZSBob3N0IG5hbWUgPGxpdGVyYWw+bG9jYWxob3N0PC9saXRlcmFsPiBp cworICAgICAgc2VhcmNoZWQgZm9yOyBpZiA8cGFyYW1ldGVyPnBvcnQ8L3BhcmFtZXRlcj4g aXMgPHN5bWJvbD5OVUxMPC9zeW1ib2w+CisgICAgICBvciBlbXB0eSwgdGhlIGNvbXBpbGVk LWluIGRlZmF1bHQgcG9ydCBpcyB1c2VkLiAgTm8gZGVmYXVsdHMgYXJlCisgICAgICBhcHBs aWVkIGZvciA8cGFyYW1ldGVyPmRibmFtZTwvcGFyYW1ldGVyPiBhbmQKKyAgICAgIDxwYXJh bWV0ZXI+dXNlcm5hbWU8L3BhcmFtZXRlcj47IGlmIGVpdGhlciBpcyA8c3ltYm9sPk5VTEw8 L3N5bWJvbD4KKyAgICAgIG9yIGVtcHR5LCBubyBwYXNzd29yZCBpcyByZXR1cm5lZC4KKyAg ICAgIDxwYXJhbWV0ZXI+cGFzc2ZpbGU8L3BhcmFtZXRlcj4gaXMgdGhlIHBhc3N3b3JkIGZp bGUgdG8gdXNlOyBpZiBpdCBpcworICAgICAgPHN5bWJvbD5OVUxMPC9zeW1ib2w+IG9yIGVt cHR5LCB0aGUgZmlsZSBuYW1lZCBieSB0aGUKKyAgICAgIDxlbnZhcj5QR1BBU1NGSUxFPC9l bnZhcj4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZCBpZiBzZXQsIGVsc2UKKyAgICAg IHRoZSBkZWZhdWx0IHBhc3N3b3JkIGZpbGUgbG9jYXRpb24uCisgICAgICA8ZW52YXI+UEdQ QVNTRklMRTwvZW52YXI+IGlzIHRoZSBvbmx5IGVudmlyb25tZW50IHZhcmlhYmxlIHRoaXMK KyAgICAgIGZ1bmN0aW9uIGNvbnN1bHRzOyBpbiBwYXJ0aWN1bGFyLCA8ZW52YXI+UEdIT1NU PC9lbnZhcj4gYW5kCisgICAgICA8ZW52YXI+UEdQT1JUPC9lbnZhcj4gYXJlIG5vdCBhcHBs aWVkIHRvIHRoZSBsb29rdXAga2V5cy4KKyAgICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgor ICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyBhbGxvY2F0ZWQgYnkgPGZ1bmN0 aW9uPm1hbGxvYzwvZnVuY3Rpb24+LAorICAgICAgb3IgPHN5bWJvbD5OVUxMPC9zeW1ib2w+ IGlmIG5vIG1hdGNoaW5nIHBhc3N3b3JkIHdhcyBmb3VuZCBvciB0aGUKKyAgICAgIGxvb2t1 cCBjb3VsZCBub3QgYmUgY29tcGxldGVkLCBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGEgbWVt b3J5CisgICAgICBhbGxvY2F0aW9uIGZhaWx1cmUuICBVc2UgPHhyZWYgbGlua2VuZD0ibGli cHEtUFFmcmVlbWVtIi8+IHRvIGZyZWUKKyAgICAgIHRoZSByZXN1bHQgd2hlbiBkb25lIHdp dGggaXQuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIE5vdGUgdGhhdCB0 aGUgcmVzdWx0IGNvbnRhaW5zIGEgY2xlYXJ0ZXh0IHBhc3N3b3JkLCBhbmQgdGhhdAorICAg ICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFmcmVlbWVtIi8+IGRvZXMgbm90IGVyYXNlIGl0 LiAgQ2FsbGVycyB0aGF0CisgICAgICBkbyBub3Qgd2FudCB0byBrZWVwIHRoZSBwYXNzd29y ZCBhcm91bmQgaW4gbWVtb3J5IGFyZSByZXNwb25zaWJsZQorICAgICAgZm9yIG92ZXJ3cml0 aW5nIHRoZSByZXN1bHQgYmVmb3JlIGZyZWVpbmcgaXQuICBUaGUgcGFzc3dvcmQgZmlsZQor ICAgICAgcGVybWlzc2lvbiByZXF1aXJlbWVudHMgZGVzY3JpYmVkIGluCisgICAgICA8eHJl ZiBsaW5rZW5kPSJsaWJwcS1wZ3Bhc3MiLz4gYXBwbHksIGFuZCwgYXMgZHVyaW5nIGNvbm5l Y3Rpb24KKyAgICAgIGVzdGFibGlzaG1lbnQsIGEgd2FybmluZyBpcyB3cml0dGVuIHRvIDxm aWxlbmFtZT5zdGRlcnI8L2ZpbGVuYW1lPgorICAgICAgaWYgdGhlIGZpbGUgaXMgaWdub3Jl ZCBiZWNhdXNlIG9mIHRoZW0uCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAg PC92YXJsaXN0ZW50cnk+CisKICAgIDx2YXJsaXN0ZW50cnkgaWQ9ImxpYnBxLVBRbWFrZUVt cHR5UEdyZXN1bHQiPgogICAgIDx0ZXJtPjxmdW5jdGlvbj5QUW1ha2VFbXB0eVBHcmVzdWx0 PC9mdW5jdGlvbj48aW5kZXh0ZXJtPjxwcmltYXJ5PlBRbWFrZUVtcHR5UEdyZXN1bHQ8L3By aW1hcnk+PC9pbmRleHRlcm0+PC90ZXJtPgogCkBAIC05NDYyLDYgKzk1MjksMTIgQEAgbXlF dmVudFByb2MoUEdFdmVudElkIGV2dElkLCB2b2lkICpldnRJbmZvLCB2b2lkICpwYXNzVGhy b3VnaCkKICAgIGlzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBpcyBzdG9yZWQgaW4gYSBkaXJl Y3RvcnkgdGhhdCBpcyBzZWN1cmUsIHNvCiAgICBubyBzcGVjaWFsIHBlcm1pc3Npb25zIGNo ZWNrIGlzIG1hZGUuCiAgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIEFuIGFwcGxpY2F0aW9u IGNhbiBwZXJmb3JtIHRoZSBzYW1lIHBhc3N3b3JkIGZpbGUgbG9va3VwIHRoYXQKKyAgIGNv bm5lY3Rpb24gZXN0YWJsaXNobWVudCBwZXJmb3JtcyBieSBjYWxsaW5nCisgICA8eHJlZiBs aW5rZW5kPSJsaWJwcS1QUXBhc3NmaWxlTG9va3VwIi8+LgorICA8L3BhcmE+CiAgPC9zZWN0 MT4KIAogCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4dCBi L3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0CmluZGV4IDFlM2Q1YmQ1ODY3Li5k ZWY2MWQ2MzcyNCAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50 eHQKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKQEAgLTIxMSwzICsy MTEsNCBAQCBQUWRlZmF1bHRBdXRoRGF0YUhvb2sgICAgIDIwOAogUFFmdWxsUHJvdG9jb2xW ZXJzaW9uICAgICAyMDkKIGFwcGVuZFBRRXhwQnVmZmVyVkEgICAgICAgMjEwCiBQUWdldFRo cmVhZExvY2sgICAgICAgICAgIDIxMQorUFFwYXNzZmlsZUxvb2t1cCAgICAgICAgICAyMTIK ZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYyBiL3NyYy9p bnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwppbmRleCAyY2UxMjhkYTE1Ny4uZTE2ZmYx N2NiNDYgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwor KysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKQEAgLTgwMDEsNyArODAw MSw4IEBAIHB3ZGZNYXRjaGVzU3RyaW5nKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqdG9rZW4p CiAgKiBHZXQgYSBwYXNzd29yZCBmcm9tIHRoZSBwYXNzd29yZCBmaWxlLiBSZXR1cm4gdmFs dWUgaXMgbWFsbG9jJ2QuCiAgKgogICogT24gZmFpbHVyZSwgKmVycm1zZyBpcyBzZXQgdG8g YW4gZXJyb3IgdG8gYmUgcmV0dXJuZWQuICBJdCBpcwotICogbGVmdCBOVUxMIG9uIHN1Y2Nl c3MsIG9yIGlmIG5vIHBhc3N3b3JkIGNvdWxkIGJlIGZvdW5kLgorICogbGVmdCBOVUxMIG9u IHN1Y2Nlc3MsIG9yIGlmIG5vIHBhc3N3b3JkIGNvdWxkIGJlIGZvdW5kLiAgQ2FsbGVycwor ICogdGhhdCBkbyBub3QgY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24gY2FuIHBhc3MgZXJy bXNnIGFzIE5VTEwuCiAgKi8KIHN0YXRpYyBjaGFyICoKIHBhc3N3b3JkRnJvbUZpbGUoY29u c3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQsCkBAIC04MDE0LDcgKzgwMTUs OCBAQCBwYXNzd29yZEZyb21GaWxlKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFy ICpwb3J0LAogI2VuZGlmCiAJUFFFeHBCdWZmZXJEYXRhIGJ1ZjsKIAotCSplcnJtc2cgPSBO VUxMOworCWlmIChlcnJtc2cpCisJCSplcnJtc2cgPSBOVUxMOwogCiAJaWYgKGRibmFtZSA9 PSBOVUxMIHx8IGRibmFtZVswXSA9PSAnXDAnKQogCQlyZXR1cm4gTlVMTDsKQEAgLTgwODMs NyArODA4NSw4IEBAIHBhc3N3b3JkRnJvbUZpbGUoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNv bnN0IGNoYXIgKnBvcnQsCiAJCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGEgcmVhc29uYWJsZSBh bW91bnQgb2Ygcm9vbSBpbiB0aGUgYnVmZmVyICovCiAJCWlmICghZW5sYXJnZVBRRXhwQnVm ZmVyKCZidWYsIDEyOCkpCiAJCXsKLQkJCSplcnJtc2cgPSBsaWJwcV9nZXR0ZXh0KCJvdXQg b2YgbWVtb3J5Iik7CisJCQlpZiAoZXJybXNnKQorCQkJCSplcnJtc2cgPSBsaWJwcV9nZXR0 ZXh0KCJvdXQgb2YgbWVtb3J5Iik7CiAJCQlicmVhazsKIAkJfQogCkBAIC04MTI0LDcgKzgx MjcsOCBAQCBwYXNzd29yZEZyb21GaWxlKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBj aGFyICpwb3J0LAogCiAJCQkJaWYgKCFyZXQpCiAJCQkJewotCQkJCQkqZXJybXNnID0gbGli cHFfZ2V0dGV4dCgib3V0IG9mIG1lbW9yeSIpOworCQkJCQlpZiAoZXJybXNnKQorCQkJCQkJ KmVycm1zZyA9IGxpYnBxX2dldHRleHQoIm91dCBvZiBtZW1vcnkiKTsKIAkJCQkJcmV0dXJu IE5VTEw7CiAJCQkJfQogCkBAIC04MTUyLDYgKzgxNTYsNTcgQEAgcGFzc3dvcmRGcm9tRmls ZShjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqcG9ydCwKIH0KIAogCisvKgor ICogUFFwYXNzZmlsZUxvb2t1cAorICoKKyAqIExvb2sgdXAgYSBwYXNzd29yZCBpbiBhIHBh c3N3b3JkIGZpbGUsIGFwcGx5aW5nIHRoZSBzYW1lIHJ1bGVzIHRoYXQKKyAqIGNvbm5lY3Rp b24gZXN0YWJsaXNobWVudCBhcHBsaWVzIHdoZW4gbm8gcGFzc3dvcmQgaGFzIGJlZW4gc3Bl Y2lmaWVkLgorICogVGhpcyBsZXRzIGFwcGxpY2F0aW9ucyB0aGF0IGNvbm5lY3QgdGhyb3Vn aCBhbiBpbnRlcm1lZGlhcnkgKGZvcgorICogZXhhbXBsZSwgYSBsb2NhbCBTU0ggdHVubmVs KSBsb29rIHVwIHRoZSBwYXNzd29yZCB1bmRlciB0aGUgcmVhbAorICogc2VydmVyJ3MgaG9z dCBhbmQgcG9ydCB3aGlsZSBjb25uZWN0aW5nIGVsc2V3aGVyZS4KKyAqCisgKiBUaGUgZmly c3QgZm91ciBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIGEgcGFzc3dv cmQgZmlsZQorICogbGluZSwgYW5kIE5VTEwgb3IgZW1wdHkgdmFsdWVzIGFyZSB0cmVhdGVk IHRoZSBzYW1lIHdheSBhcyBkdXJpbmcKKyAqIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudDog aG9zdG5hbWUgaXMgbWF0Y2hlZCBhcyAibG9jYWxob3N0IiAoYXMgaXMKKyAqIGEgaG9zdG5h bWUgZXF1YWwgdG8gdGhlIGRlZmF1bHQgVW5peC1zb2NrZXQgZGlyZWN0b3J5KSwgcG9ydAor ICogZGVmYXVsdHMgdG8gREVGX1BHUE9SVF9TVFIsIHdoaWxlIGRibmFtZSBhbmQgdXNlcm5h bWUgbXVzdCBiZQorICogc3VwcGxpZWQuICBJZiBwYXNzZmlsZSBpcyBOVUxMIG9yIGVtcHR5 LCBQR1BBU1NGSUxFIG9yIHRoZSBkZWZhdWx0CisgKiBwYXNzd29yZCBmaWxlIGxvY2F0aW9u IGlzIHVzZWQuCisgKgorICogUmV0dXJucyBhIG1hbGxvYydkIHN0cmluZyB0aGUgY2FsbGVy IG11c3QgZnJlZSB3aXRoIFBRZnJlZW1lbSgpLCBvcgorICogTlVMTCBpZiBubyBtYXRjaGlu ZyBwYXNzd29yZCB3YXMgZm91bmQgb3IgdGhlIGxvb2t1cCBjb3VsZCBub3QgYmUKKyAqIGNv bXBsZXRlZC4KKyAqLworY2hhciAqCitQUXBhc3NmaWxlTG9va3VwKGNvbnN0IGNoYXIgKmhv c3RuYW1lLCBjb25zdCBjaGFyICpwb3J0LAorCQkJCSBjb25zdCBjaGFyICpkYm5hbWUsIGNv bnN0IGNoYXIgKnVzZXJuYW1lLAorCQkJCSBjb25zdCBjaGFyICpwYXNzZmlsZSkKK3sKKwlj aGFyCQlwZ3Bhc3NmaWxlW01BWFBHUEFUSF07CisKKwlpZiAocGFzc2ZpbGUgPT0gTlVMTCB8 fCBwYXNzZmlsZVswXSA9PSAnXDAnKQorCXsKKwkJY29uc3QgY2hhciAqcGdwYXNzZW52ID0g Z2V0ZW52KCJQR1BBU1NGSUxFIik7CisKKwkJaWYgKHBncGFzc2VudiAhPSBOVUxMICYmIHBn cGFzc2VudlswXSAhPSAnXDAnKQorCQkJcGFzc2ZpbGUgPSBwZ3Bhc3NlbnY7CisJCWVsc2UK KwkJeworCQkJY2hhcgkJaG9tZWRpcltNQVhQR1BBVEhdOworCisJCQlpZiAoIXBxR2V0SG9t ZURpcmVjdG9yeShob21lZGlyLCBzaXplb2YoaG9tZWRpcikpKQorCQkJCXJldHVybiBOVUxM OworCQkJc25wcmludGYocGdwYXNzZmlsZSwgc2l6ZW9mKHBncGFzc2ZpbGUpLCAiJXMvJXMi LAorCQkJCQkgaG9tZWRpciwgUEdQQVNTRklMRSk7CisJCQlwYXNzZmlsZSA9IHBncGFzc2Zp bGU7CisJCX0KKwl9CisKKwlyZXR1cm4gcGFzc3dvcmRGcm9tRmlsZShob3N0bmFtZSwgcG9y dCwgZGJuYW1lLCB1c2VybmFtZSwKKwkJCQkJCQlwYXNzZmlsZSwgTlVMTCk7Cit9CisKKwog LyoKICAqCUlmIHRoZSBjb25uZWN0aW9uIGZhaWxlZCBkdWUgdG8gYmFkIHBhc3N3b3JkLCB3 ZSBzaG91bGQgbWVudGlvbgogICoJaWYgd2UgZ290IHRoZSBwYXNzd29yZCBmcm9tIHRoZSBw Z3Bhc3NmaWxlLgpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtZmUu aCBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgKaW5kZXggZjUxZmQ2MjBiMGEu LmI2MzQ4OWEzYmZlIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1m ZS5oCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgKQEAgLTY5LDYgKzY5 LDEwIEBAIGV4dGVybiAiQyIKIC8qIEluZGljYXRlcyBwcmVzZW5jZSBvZiB0aGUgUFFBVVRI REFUQV9PQVVUSF9CRUFSRVJfVE9LRU5fVjIgYXV0aGRhdGEgaG9vayAqLwogI2RlZmluZSBM SUJQUV9IQVNfT0FVVEhfQkVBUkVSX1RPS0VOX1YyIDEKIAorLyogRmVhdHVyZXMgYWRkZWQg aW4gUG9zdGdyZVNRTCB2MjA6ICovCisvKiBJbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgUFFwYXNz ZmlsZUxvb2t1cCAqLworI2RlZmluZSBMSUJQUV9IQVNfUEFTU0ZJTEVfTE9PS1VQIDEKKwog LyoKICAqIE9wdGlvbiBmbGFncyBmb3IgUFFjb3B5UmVzdWx0CiAgKi8KQEAgLTM2Nyw2ICsz NzEsMTEgQEAgZXh0ZXJuIFBRY29ubmluZm9PcHRpb24gKlBRY29ubmluZm8oUEdjb25uICpj b25uKTsKIC8qIGZyZWUgdGhlIGRhdGEgc3RydWN0dXJlIHJldHVybmVkIGJ5IFBRY29ubmRl ZmF1bHRzKCkgb3IgUFFjb25uaW5mb1BhcnNlKCkgKi8KIGV4dGVybiB2b2lkIFBRY29ubmlu Zm9GcmVlKFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zKTsKIAorLyogbG9vayB1cCBh IHBhc3N3b3JkIGluIGEgcGFzc3dvcmQgZmlsZSAqLworZXh0ZXJuIGNoYXIgKlBRcGFzc2Zp bGVMb29rdXAoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQsCisJCQkJ CQkJICBjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorCQkJCQkJ CSAgY29uc3QgY2hhciAqcGFzc2ZpbGUpOworCiAvKgogICogY2xvc2UgdGhlIGN1cnJlbnQg Y29ubmVjdGlvbiBhbmQgcmVlc3RhYmxpc2ggYSBuZXcgb25lIHdpdGggdGhlIHNhbWUKICAq IHBhcmFtZXRlcnMKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL21lc29uLmJ1 aWxkIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvbWVzb24uYnVpbGQKaW5kZXggYjBhZTcyMTY3 YTEuLmI5ZjkzZGRiODUyIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9tZXNv bi5idWlsZAorKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9tZXNvbi5idWlsZApAQCAtMTYx LDYgKzE2MSw3IEBAIHRlc3RzICs9IHsKICAgICAgICd0LzAwNF9sb2FkX2JhbGFuY2VfZG5z LnBsJywKICAgICAgICd0LzAwNV9uZWdvdGlhdGVfZW5jcnlwdGlvbi5wbCcsCiAgICAgICAn dC8wMDZfc2VydmljZS5wbCcsCisgICAgICAndC8wMDdfcGFzc2ZpbGUucGwnLAogICAgIF0s CiAgICAgJ2Vudic6IHsKICAgICAgICd3aXRoX3NzbCc6IHNzbF9saWJyYXJ5LApkaWZmIC0t Z2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDdfcGFzc2ZpbGUucGwgYi9zcmMvaW50 ZXJmYWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uMmJkMTY1ZTQ5OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv aW50ZXJmYWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5wbApAQCAtMCwwICsxLDIwMSBAQAor IyBDb3B5cmlnaHQgKGMpIDIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdy b3VwCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwordXNlIEZp bGU6OkNvcHk7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9y ZTsKKworIyBUZXN0IFBRcGFzc2ZpbGVMb29rdXAoKSwgdmlhIGxpYnBxX3Rlc3RjbGllbnQg LS1wYXNzZmlsZS4gIFRoZSBsb29rdXAgaXMKKyMgcHVyZWx5IGNsaWVudC1zaWRlLCBzbyBu byBzZXJ2ZXIgaXMgaW52b2x2ZWQuICBBbiBhcmd1bWVudCBvZiAiLSIgaXMKKyMgcGFzc2Vk IHRvIHRoZSBmdW5jdGlvbiBhcyBOVUxMLCBhbmQgYW4gYXJndW1lbnQgb2YgIj0iIGFzIGFu IGVtcHR5CisjIHN0cmluZyAoYW4gZW1wdHkgYXJndiBlbGVtZW50IGlzIG5vdCBwb3J0YWJs ZSkuCisKK215ICR0ZCA9IFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOjp0ZW1wZGlyOworbXkg JHBhc3NmaWxlID0gIiR0ZC9wZ3Bhc3MiOworCitkZWxldGUgJEVOVntQR1BBU1NGSUxFfTsK KworIyBUaGUgY29tcGlsZWQtaW4gZGVmYXVsdHMgdGhhdCB0aGUgbG9va3VwIGZhbGxzIGJh Y2sgdG8uCitteSAoJGRlZmF1bHRzKSA9IHJ1bl9jb21tYW5kKFsgJ2xpYnBxX3Rlc3RjbGll bnQnLCAnLS1wYXNzZmlsZS1kZWZhdWx0cycgXSk7CiskZGVmYXVsdHMgPX4gcy9cci8vZzsK K215ICgkZGVmcG9ydCwgJHNvY2tldGRpcikgPSBzcGxpdCAvXG4vLCAkZGVmYXVsdHM7CisK K2FwcGVuZF90b19maWxlKCRwYXNzZmlsZSwgPDwnRU9GJyk7CisjIGEgY29tbWVudCBsaW5l CitzZXJ2ZXIuZXhhbXBsZS5jb206NTQzMjpwcm9kZGI6ZGllZ286c2VjcmV0MQorc2VydmVy LmV4YW1wbGUuY29tOjU0MzM6KjpkaWVnbzpzZWNyZXQyCitsb2NhbGhvc3Q6KjpteWRiOm1l OmxvY2FscHcKK3NwZWNpYWwuZXhhbXBsZS5jb206NTQzMjpkYlw6Y29sb246dXNcXGVyOnBh XFxzc1w6d29yZAorc2VydmVyLmV4YW1wbGUuY29tOjU0MzI6cHJvZGRiOmRpZWdvOnNoYWRv d2VkCitFT0YKK2FwcGVuZF90b19maWxlKCRwYXNzZmlsZSwKKwkiZGVmcG9ydC5leGFtcGxl LmNvbTokZGVmcG9ydDpkZWZkYjpkZWZ1c2VyOmRlZnBvcnRwd1xuIik7CitjaG1vZCAwNjAw LCAkcGFzc2ZpbGUgb3IgZGllICJjaG1vZDogJCEiOworCitteSAoJG91dCwgJGVycik7CisK Kygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQn LCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1 NDMyJywgJ3Byb2RkYicsICdkaWVnbycKKwldKTsKK2lzKCRvdXQsICdzZWNyZXQxJywgJ2V4 YWN0IG1hdGNoIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoaW5nIHBhc3N3b3JkJyk7CisKKygk b3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAn LS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1NDMz JywgJ2FueWRiJywgJ2RpZWdvJworCV0pOworaXMoJG91dCwgJ3NlY3JldDInLCAnd2lsZGNh cmQgZmllbGQgbWF0Y2hlcyBhbnkgdmFsdWUnKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2Nv bW1hbmQoCisJWyAnbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxl LCAnLScsICctJywgJ215ZGInLCAnbWUnIF0pOworaXMoJG91dCwgJ2xvY2FscHcnLCAnTlVM TCBob3N0bmFtZSBhbmQgcG9ydCBtYXRjaCBhIGxvY2FsaG9zdCBlbnRyeScpOworCisoJG91 dCwgJGVycikgPSBydW5fY29tbWFuZCgKKwlbICdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFz c2ZpbGUnLCAkcGFzc2ZpbGUsICc9JywgJy0nLCAnbXlkYicsICdtZScgXSk7Citpcygkb3V0 LCAnbG9jYWxwdycsICdlbXB0eSBob3N0bmFtZSBtYXRjaGVzIGEgbG9jYWxob3N0IGVudHJ5 Jyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3Rj bGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ2RlZnBvcnQuZXhhbXBsZS5j b20nLCAnLScsICdkZWZkYicsICdkZWZ1c2VyJworCV0pOworaXMoJG91dCwgJ2RlZnBvcnRw dycsICdOVUxMIHBvcnQgbWF0Y2hlcyBhbiBlbnRyeSBmb3IgdGhlIGRlZmF1bHQgcG9ydCcp OworCisoJG91dCwgJGVycikgPSBydW5fY29tbWFuZCgKKwlbCisJCSdsaWJwcV90ZXN0Y2xp ZW50JywgJy0tcGFzc2ZpbGUnLCAkcGFzc2ZpbGUsCisJCSdkZWZwb3J0LmV4YW1wbGUuY29t JywgJz0nLCAnZGVmZGInLCAnZGVmdXNlcicKKwldKTsKK2lzKCRvdXQsICdkZWZwb3J0cHcn LCAnZW1wdHkgcG9ydCBtYXRjaGVzIGFuIGVudHJ5IGZvciB0aGUgZGVmYXVsdCBwb3J0Jyk7 CisKK1NLSVA6Cit7CisJc2tpcCAnbm8gZGVmYXVsdCBVbml4LXNvY2tldCBkaXJlY3Rvcnkg b24gdGhpcyBwbGF0Zm9ybScsIDEKKwkgIHVubGVzcyBkZWZpbmVkICRzb2NrZXRkaXIgJiYg JHNvY2tldGRpciA9fiBte14vfTsKKworCSgkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAor CQlbCisJCQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAor CQkJJHNvY2tldGRpciwgJy0nLCAnbXlkYicsICdtZScKKwkJXSk7CisJaXMoJG91dCwgJ2xv Y2FscHcnLAorCQknZGVmYXVsdCBzb2NrZXQgZGlyZWN0b3J5IG1hdGNoZXMgYSBsb2NhbGhv c3QgZW50cnknKTsKK30KKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWworCQkn bGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknc3BlY2lh bC5leGFtcGxlLmNvbScsICc1NDMyJywgJ2RiOmNvbG9uJywgJ3VzXFxlcicKKwldKTsKK2lz KCRvdXQsICdwYVxcc3M6d29yZCcsICdlc2NhcGVkIGNoYXJhY3RlcnMgYXJlIG1hdGNoZWQg YW5kIGRlLWVzY2FwZWQnKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWwor CQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknc2Vy dmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAnb3RoZXJkYicsICdkaWVnbycKKwldKTsKK2lz KCRlcnIsICdubyBwYXNzd29yZCBmb3VuZCcsICdubyBtYXRjaGluZyBsaW5lIHJldHVybnMg bm8gcGFzc3dvcmQnKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWworCQkn bGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgIiR0ZC9kb2VzX25vdF9leGlzdCIs CisJCSdzZXJ2ZXIuZXhhbXBsZS5jb20nLCAnNTQzMicsICdwcm9kZGInLCAnZGllZ28nCisJ XSk7CitpcygkZXJyLCAnbm8gcGFzc3dvcmQgZm91bmQnLCAnbWlzc2luZyBwYXNzd29yZCBm aWxlIHJldHVybnMgbm8gcGFzc3dvcmQnKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1h bmQoCisJWworCQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxl LAorCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAnLScsICdkaWVnbycKKwldKTsK K2lzKCRlcnIsICdubyBwYXNzd29yZCBmb3VuZCcsICdOVUxMIGRibmFtZSByZXR1cm5zIG5v IHBhc3N3b3JkJyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xp YnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5l eGFtcGxlLmNvbScsICc1NDMyJywgJz0nLCAnZGllZ28nCisJXSk7CitpcygkZXJyLCAnbm8g cGFzc3dvcmQgZm91bmQnLCAnZW1wdHkgZGJuYW1lIHJldHVybnMgbm8gcGFzc3dvcmQnKTsK KworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWworCQknbGlicHFfdGVzdGNsaWVu dCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknc2VydmVyLmV4YW1wbGUuY29tJywg JzU0MzInLCAncHJvZGRiJywgJy0nCisJXSk7CitpcygkZXJyLCAnbm8gcGFzc3dvcmQgZm91 bmQnLCAnTlVMTCB1c2VybmFtZSByZXR1cm5zIG5vIHBhc3N3b3JkJyk7CisKKygkb3V0LCAk ZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNz ZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1NDMyJywgJ3By b2RkYicsICc9JworCV0pOworaXMoJGVyciwgJ25vIHBhc3N3b3JkIGZvdW5kJywgJ2VtcHR5 IHVzZXJuYW1lIHJldHVybnMgbm8gcGFzc3dvcmQnKTsKKworIyBBIE5VTEwgb3IgZW1wdHkg cGFzc2ZpbGUgZmFsbHMgYmFjayB0byB0aGUgUEdQQVNTRklMRSBlbnZpcm9ubWVudAorIyB2 YXJpYWJsZS4KK3sKKwlsb2NhbCAkRU5We1BHUEFTU0ZJTEV9ID0gJHBhc3NmaWxlOworCisJ KCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJCVsKKwkJCSdsaWJwcV90ZXN0Y2xpZW50 JywgJy0tcGFzc2ZpbGUnLCAnLScsCisJCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzIn LCAncHJvZGRiJywgJ2RpZWdvJworCQldKTsKKwlpcygkb3V0LCAnc2VjcmV0MScsICdOVUxM IHBhc3NmaWxlIGZhbGxzIGJhY2sgdG8gUEdQQVNTRklMRScpOworCisJKCRvdXQsICRlcnIp ID0gcnVuX2NvbW1hbmQoCisJCVsKKwkJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2Zp bGUnLCAnPScsCisJCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAncHJvZGRiJywg J2RpZWdvJworCQldKTsKKwlpcygkb3V0LCAnc2VjcmV0MScsICdlbXB0eSBwYXNzZmlsZSBm YWxscyBiYWNrIHRvIFBHUEFTU0ZJTEUnKTsKK30KKworU0tJUDoKK3sKKwlza2lwICdkZWZh dWx0IHBhc3N3b3JkIGZpbGUgbG9jYXRpb24gY2Fubm90IGJlIHJlZGlyZWN0ZWQgb24gV2lu ZG93cycsIDEKKwkgIGlmICR3aW5kb3dzX29zOworCisJIyBXaXRob3V0IFBHUEFTU0ZJTEUs IHRoZSBsb29rdXAgZmFsbHMgYmFjayB0byB+Ly5wZ3Bhc3MuCisJbXkgJGhvbWVkaXIgPSBQ b3N0Z3JlU1FMOjpUZXN0OjpVdGlsczo6dGVtcGRpcjsKKwlteSAkaG9tZXBhc3NmaWxlID0g IiRob21lZGlyLy5wZ3Bhc3MiOworCisJYXBwZW5kX3RvX2ZpbGUoJGhvbWVwYXNzZmlsZSwK KwkJImhvbWUuZXhhbXBsZS5jb206NTQzMjpob21lZGI6aG9tZXVzZXI6aG9tZXB3XG4iKTsK KwljaG1vZCAwNjAwLCAkaG9tZXBhc3NmaWxlIG9yIGRpZSAiY2htb2Q6ICQhIjsKKworCWxv Y2FsICRFTlZ7SE9NRX0gPSAkaG9tZWRpcjsKKworCSgkb3V0LCAkZXJyKSA9IHJ1bl9jb21t YW5kKAorCQlbCisJCQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJy0nLAor CQkJJ2hvbWUuZXhhbXBsZS5jb20nLCAnNTQzMicsICdob21lZGInLCAnaG9tZXVzZXInCisJ CV0pOworCWlzKCRvdXQsICdob21lcHcnLCAnTlVMTCBwYXNzZmlsZSBmYWxscyBiYWNrIHRv IH4vLnBncGFzcycpOworfQorCitTS0lQOgoreworCXNraXAgJ3Bhc3N3b3JkIGZpbGUgcGVy bWlzc2lvbnMgYXJlIG5vdCBjaGVja2VkIG9uIFdpbmRvd3MnLCAyCisJICBpZiAkd2luZG93 c19vczsKKworCW15ICRwYXNzZmlsZV9pbnNlY3VyZSA9ICIkdGQvcGdwYXNzX2luc2VjdXJl IjsKKwljb3B5KCRwYXNzZmlsZSwgJHBhc3NmaWxlX2luc2VjdXJlKQorCSAgb3IgZGllICJj b3VsZCBub3QgY29weSAkcGFzc2ZpbGUgdG8gJHBhc3NmaWxlX2luc2VjdXJlOiAkISI7CisJ Y2htb2QgMDY0NCwgJHBhc3NmaWxlX2luc2VjdXJlIG9yIGRpZSAiY2htb2Q6ICQhIjsKKwor CSgkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCQlbCisJCQknbGlicHFfdGVzdGNsaWVu dCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlX2luc2VjdXJlLAorCQkJJ3NlcnZlci5leGFt cGxlLmNvbScsICc1NDMyJywgJ3Byb2RkYicsICdkaWVnbycKKwkJXSk7CisJbGlrZSgKKwkJ JGVyciwKKwkJcXIvaGFzIGdyb3VwIG9yIHdvcmxkIGFjY2Vzcy8sCisJCSdpbnNlY3VyZSBw YXNzd29yZCBmaWxlIGRyYXdzIGEgd2FybmluZycpOworCWxpa2UoJGVyciwgcXIvbm8gcGFz c3dvcmQgZm91bmQvLCAnaW5zZWN1cmUgcGFzc3dvcmQgZmlsZSBpcyBpZ25vcmVkJyk7Cit9 CisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEv dGVzdC9saWJwcV90ZXN0Y2xpZW50LmMgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0L2xp YnBxX3Rlc3RjbGllbnQuYwppbmRleCAyMDczMDcwOWVlNy4uODczMDk4Mzc0ODkgMTAwNjQ0 Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvbGlicHFfdGVzdGNsaWVudC5jCisr KyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvbGlicHFfdGVzdGNsaWVudC5jCkBAIC0y Myw2ICsyMyw1NyBAQCBwcmludF9zc2xfbGlicmFyeSh2b2lkKQogCQlwcmludGYoIiVzXG4i LCBsaWIpOwogfQogCisvKgorICogUHJpbnQgdGhlIGNvbXBpbGVkLWluIGRlZmF1bHRzIHRo YXQgdGhlIHBhc3NmaWxlIGxvb2t1cCBmYWxscyBiYWNrIHRvLAorICogZm9yIHVzZSBieSB0 aGUgVEFQIHRlc3QuCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9wYXNzZmlsZV9kZWZhdWx0 cyh2b2lkKQoreworCXByaW50ZigiJXNcbiVzXG4iLCBERUZfUEdQT1JUX1NUUiwgREVGQVVM VF9QR1NPQ0tFVF9ESVIpOworfQorCisvKgorICogTG9vayB1cCBhIHBhc3N3b3JkIHdpdGgg UFFwYXNzZmlsZUxvb2t1cCgpLiAgVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2ZpbGUsCisgKiBo b3N0bmFtZSwgcG9ydCwgZGJuYW1lIGFuZCB1c2VybmFtZTsgYW4gYXJndW1lbnQgb2YgIi0i IGlzIHBhc3NlZCBhcworICogTlVMTCwgYW5kIGFuIGFyZ3VtZW50IG9mICI9IiBhcyBhbiBl bXB0eSBzdHJpbmcgKGFuIGVtcHR5IGNvbW1hbmQtbGluZQorICogYXJndW1lbnQgY2Fubm90 IGJlIHJlbGllZCBvbiB0byBzdXJ2aXZlIHByb2Nlc3Mgc3Bhd25pbmcgZXZlcnl3aGVyZSku CisgKi8KK3N0YXRpYyBpbnQKK3Rlc3RfcGFzc2ZpbGVfbG9va3VwKGludCBhcmdjLCBjaGFy ICphcmd2W10pCit7CisJY29uc3QgY2hhciAqYXJnc1s1XTsKKwljaGFyCSAgICpwYXNzd29y ZDsKKworCWlmIChhcmdjICE9IDcpCisJeworCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBs aWJwcV90ZXN0Y2xpZW50IC0tcGFzc2ZpbGUgUEFTU0ZJTEUgSE9TVE5BTUUgUE9SVCBEQk5B TUUgVVNFUk5BTUVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3IgKGludCBpID0gMDsg aSA8IDU7IGkrKykKKwl7CisJCWlmIChzdHJjbXAoYXJndltpICsgMl0sICItIikgPT0gMCkK KwkJCWFyZ3NbaV0gPSBOVUxMOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpICsgMl0sICI9 IikgPT0gMCkKKwkJCWFyZ3NbaV0gPSAiIjsKKwkJZWxzZQorCQkJYXJnc1tpXSA9IGFyZ3Zb aSArIDJdOworCX0KKworCXBhc3N3b3JkID0gUFFwYXNzZmlsZUxvb2t1cChhcmdzWzFdLCBh cmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzBdKTsKKworCWlmICghcGFzc3dvcmQp CisJeworCQlmcHJpbnRmKHN0ZGVyciwgIm5vIHBhc3N3b3JkIGZvdW5kXG4iKTsKKwkJcmV0 dXJuIDE7CisJfQorCisJcHJpbnRmKCIlc1xuIiwgcGFzc3dvcmQpOworCVBRZnJlZW1lbShw YXNzd29yZCk7CisJcmV0dXJuIDA7Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAq YXJndltdKQogewpAQCAtMzEsNyArODIsMTQgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqYXJn dltdKQogCQlwcmludF9zc2xfbGlicmFyeSgpOwogCQlyZXR1cm4gMDsKIAl9CisJZWxzZSBp ZiAoKGFyZ2MgPiAxKSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItLXBhc3NmaWxlIikpCisJCXJl dHVybiB0ZXN0X3Bhc3NmaWxlX2xvb2t1cChhcmdjLCBhcmd2KTsKKwllbHNlIGlmICgoYXJn YyA+IDEpICYmICFzdHJjbXAoYXJndlsxXSwgIi0tcGFzc2ZpbGUtZGVmYXVsdHMiKSkKKwl7 CisJCXByaW50X3Bhc3NmaWxlX2RlZmF1bHRzKCk7CisJCXJldHVybiAwOworCX0KIAotCXBy aW50ZigiY3VycmVudGx5IG9ubHkgLS1zc2wgaXMgc3VwcG9ydGVkXG4iKTsKKwlwcmludGYo ImN1cnJlbnRseSBvbmx5IC0tc3NsLCAtLXBhc3NmaWxlIGFuZCAtLXBhc3NmaWxlLWRlZmF1 bHRzIGFyZSBzdXBwb3J0ZWRcbiIpOwogCXJldHVybiAxOwogfQoKYmFzZS1jb21taXQ6IDEx ZmI4OWZkYmQzMTlhNTNlMzJkY2U3NzY4NTExODk3OWNhZmFjMGUKLS0gCjIuNDMuMAoK --------------2of02KxmSaVuVeEIdRnJWfOS--