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 1x6pra-000T9K-2h for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Sep 2026 13:39:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1x6pra-007ez5-0j for pgsql-hackers@arkaria.postgresql.org; Wed, 16 Sep 2026 13:39:50 +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.96) (envelope-from ) id 1x6prZ-007eyu-1q for pgsql-hackers@lists.postgresql.org; Wed, 16 Sep 2026 13:39:49 +0000 Received: from mail-vs2-x10.google.com ([2a00:1450:4864:3a::10]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1x6prV-00000000OOS-0sD0 for pgsql-hackers@lists.postgresql.org; Wed, 16 Sep 2026 13:39:48 +0000 Received: by mail-vs2-x10.google.com with SMTP id 71dfb90a1353d-5c7e8a17839so118372e0c.1 for ; Wed, 16 Sep 2026 06:39:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789565983; x=1790170783; 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=ILo28Co7iiaOvxeyBAbBUJsLGIM++wKjcTbHiIoRr1c=; b=dZJoBfHTmCDGoIxiOm5NX2Krl8Bp4Fth5JQqyvn+vWPMcphFls1jjquNdJaTzjAokp H/0oNkZ4kkVVZ+THTUyTTtZnz5m8YBmD94QB0JiUW37D9/19fKdoNFHuNAIE+gPRufSJ L3uw9v7mKtjbxz53zZq2raZ/n727/uwhM2ZxywiBWcEvMem1/q5Zfq7RhPsy1PnRO6EE OaRkm8wwWHqIsw4stKLObv9HUc+KJBpDxgc8aWnoIOVjVbJpEkX8figayfs7WOl38FfD Nwkv3YW44AyXQVvaAe6vjxiD41A3BIpVVMU9wmygSL2EbNNkpFaAap3Ftt1OiG/k3ug1 A4vQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789565983; x=1790170783; 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=ILo28Co7iiaOvxeyBAbBUJsLGIM++wKjcTbHiIoRr1c=; b=sSd23vxNAwWXrFtAqq7H8Tp07MnwKLYEXQRbAmdL85UlHVe1NR5bxHabic45epX6N/ k3Fa3QlYNIa+9mAzYyRQS4fkn7ej4wMxRK8s7P4nd2+t2+QZCdCnGsMV5VuV/Cn4PKMk smheQTF89InIFH6h9ekYak+sinajbo5l+0GYCawgwjXJNkxxjgMB0LbMr7yTmKoI6nCk TEH9J09e5/qPauOp2c1WOkhUSmeZhmYbu5SQKvecRcdY5STcORRLZhSONcDQViOf9Qnl x3qepJ5zsDfUHjZWng4cVoDtrtW3w0DtCO8FafSZ5hDOMxzTt/qxYlDFK8aRW/sExWoG k1lg== X-Forwarded-Encrypted: i=1; AKwUvBzmM35AJ5ftNAZ9ktLreow3lgIbcMtzNPB/eEVl9LVNx7SuV3oO0iBQMwiltYfQfvHieuqAVpNHfOzexJAs@lists.postgresql.org X-Gm-Message-State: AFuF++kgFUjqCSXj08np16VrhvONgbPJcRVqIG5HLhpsDNpFY2hkHygf wrv0uFfFOZd2IOAB5cpwdoBRlgCIy+klxMpBtBAXRkKGigUsK+QDQRsZ X-Gm-Gg: AYBFou3VXeXW9eewePSa2qxW2JBKiTHmXwLjseP8rdTS9mOSG2jGBGoiL1JnhEqlGPM bPrqK3/6PrenGBOpfydl+4++lJ3+sVRrcYqSt5mJoAVMFEU+1JR4mQofu8fC+q1Cr3y1Vyt229s aIocXVau78u4RqPgR2MrDLXmgg3Y+1tkg8HxlgLsRq27Te0fhrDxifKCQACCXnGNt6t1QoXNc0Z VO+s0kx04R8F8f+p0/a7KUlV3TsBeVVkWrcpT33+2cMkYxJXOow0rnuU2jg82iho+SlCYtayuRJ PnzQLULRVd+P9nTPRo01HhpOSDuLr+Nvsivp81DgyKavsrt8MM66O5h2VQpAR+aFlN+gbqfV8nk Hjp0PUYfc0be9HiMKHvVHPYsLYsHOXlfSCp/O1OIa8kvmeGnQm/6TnWitv2sDeiOwQ5/2UXqsQx NUtcaRNXdWhbKgXMLlM/25cSTFdbcdlMVHUdYIaJHssBtgUN2GUOHTyaXkv+3YD8SGbnUtl0LIG 3vTpVNrY90= X-Received: by 2002:a05:6102:161f:b0:779:328:8a2e with SMTP id ada2fe7eead31-7a0518d9229mr891766137.5.1789565983460; Wed, 16 Sep 2026 06:39:43 -0700 (PDT) Received: from [192.168.88.177] ([201.176.245.118]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-79fb2fd68f7sm2983249137.12.2026.09.16.06.39.41 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 16 Sep 2026 06:39:42 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------wN5dNT201JJ1FgRLUQ9DCL0V" Message-ID: <5b8e0436-853d-4b5e-8546-1862faf84cc6@gmail.com> Date: Wed, 16 Sep 2026 10:39:39 -0300 MIME-Version: 1.0 User-Agent: Betterbird (Linux) Subject: Re: [PATCH] libpq: Add PQpassfileLookup() To: Denis Smirnov , Grigorev Jurij Cc: Jacob Champion , "pgsql-hackers@lists.postgresql.org" References: <56a73ea31de54ebea53877367cdd6abf@localhost.localdomain> <00e741a7-8dc1-4993-87f4-8976e9c3b6ba@gmail.com> <8b93e9c7642b47b49d5b287ed032b00a@localhost.localdomain> Content-Language: en-US From: Diego In-Reply-To: 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. --------------wN5dNT201JJ1FgRLUQ9DCL0V Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi Denis, hi Yuriy, Thanks to both of you.v3 attached, now as a series of two patches: - v3-0001 fixes the residue Denis found, in passwordFromFile() itself. - v3-0002 is the API patch, rebased on 0001, with Yuriy's wording. > The new docs now say this, but passwordFromFile() leaves part of the > original password after removing escapes in place: > Password in .pgpass: pa\\ss\:word > Returned buffer:pa\ss:word\0d\0 > A caller using explicit_bzero(password, strlen(password)) before > PQfreemem() leaves the final 'd' untouched. Could we zero this tail in > passwordFromFile() before returning? The caller does not know the > original allocation size. Confirmed, and it is a bit wider than the last character: strdup(t) copies the rest of the line, and the in-place loop only overwrites the de-escaped length, so everything after that point -- the tail of the escaped password and any further fields on the line -- survives past the terminator.With a line such as host:5432:db:user:pw:extra:fields:here the allocation ends up as "pw\0extra:fields:here\0". It is also not specific to the new function.Connection establishment stores the same allocation in conn->connhost[i].password, and pqReleaseConnHosts() clears it with explicit_bzero(p, strlen(p)), so the same bytes have been left behind in libpq's own cleanup: they have been there since the de-escaping was added in 8d15e3ec4fc (2011), and the explicit_bzero() that fails to reach them dates from 74a308cf522 (2019). That is why 0001 is a separate patch: it stands on its own against master, touches only passwordFromFile(), and could be back-patched if a committer thinks that is worth it -- I have no strong opinion either way.For what it is worth, it cherry-picks cleanly onto REL_19_STABLE; on REL_18_STABLE down to REL_14_STABLE the only conflict is the function's header comment, which is a single line there, and the code hunks apply. Rather than zeroing the tail after the fact, 0001 moves the existing de-escape loop above the strdup(), so it runs in place on the line buffer -- which is already cleared with explicit_bzero(buf.data, buf.maxlen) on every exit -- and strdup() then copies only the de-escaped password.The loop body is unchanged, the returned string is byte-identical, and the allocation is exactly strlen() + 1 by construction, so there is nothing a caller needs to know.If you would rather have a one-line explicit_bzero() of the tail instead, that is easy to do, but it keeps the oversized copy around and the documentation could not promise anything about strlen(). 0002 depends on 0001: it does not apply on bare master, and the sentence in its docs and commit message about overwriting strlen() bytes is only true on top of it.Squashing the two is fine by me if a committer prefers that; if 0001 is dropped, those sentences go with it. How I checked it, on master @ bd124434333: * the libpq TAP suite and authentication/001_password, on 0001 alone and on the full series: all green (007_passfile now has 20 subtests), no new compiler warnings, pgindent clean. * an out-of-tree corpus of 21 lookups against a password file that covers the escaping corners (your example, a lone trailing backslash, an escaped colon as the last character, an empty password, fields after the password, a 10 kB password, 3000 escaped colons, a CRLF line, a four-field line, a wildcard line) run through v2 and v3: identical output and exit code for all 21. * a small harness that searches for the expected leftover bytes past the terminator, within malloc_usable_size() and under MALLOC_PERTURB_ so untouched slack cannot be mistaken for data: on v2 it finds them in 5 of the 21 lines ("d" in your example, "extra:fields:here", 2999 bytes of the escaped-colon case); on v3 it finds them in none. There is no in-tree test for this, because nothing public can observe bytes past the terminator without undefined behaviour; the corpus and the harness are outside the tree. With that, the sentence in the docs about clearing the result became a real contract: the string holds nothing but the password and libpq writes nothing past its terminating zero byte, so overwriting strlen() bytes before freeing it is sufficient.The comment above PQpassfileLookup() says the same. > Noticed one small wording issue in both the commit message and the > documentation.They say that PGPASSFILE is the only environment > variable consulted by PQpassfileLookup().Strictly speaking, when the > default password file location is used, pqGetHomeDirectory() consults > HOME on Unix.The new TAP test relies on this behavior as well. > Perhaps this could instead say: > Other libpq connection-parameter environment variables are not > applied to the lookup keys; in particular, PGHOST and PGPORT are > ignored. Right -- fixed with your sentence, verbatim, in both the docs and the commit message, and "the default password file location" in the docs now points at the pgpass section, which already covers HOME (and %APPDATA% on Windows).I also added a TAP case for an escaped colon at the end of the password.I did not add one for fields after the password, per your earlier point about not testing undocumented parser behaviour; the out-of-tree corpus above includes that line. One thing I expect to be asked, so let me say it up front: the new function has no error channel.A lookup that finds nothing, a missing or badly-permissioned file, no home directory, and an allocation failure all come back as NULL.That mirrors what connection establishment does when the password file yields nothing -- the connect path only turns the out-of-memory case into a hard error -- and it keeps the function a plain wrapper around the existing lookup.If an error out-parameter is preferred I can add one; I did not want to design more API than the use case needs.Relatedly, the default-file fallback in PQpassfileLookup() repeats a few lines of the connect path; I can factor a small static helper if that is wanted. Both patches apply on master in order, most recently checked against a4f18fd8f28.I'll leave the CF entry at Needs review. Thanks, Diego --------------wN5dNT201JJ1FgRLUQ9DCL0V Content-Type: text/x-patch; charset=UTF-8; name="v3-0002-libpq-Add-PQpassfileLookup.patch" Content-Disposition: attachment; filename="v3-0002-libpq-Add-PQpassfileLookup.patch" Content-Transfer-Encoding: base64 RnJvbSAyODM4M2EzZDI4YjM1ZmFmNWFmZTMxM2EyZWJlOThmNmE1MTY4OTI2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEaWVnbyA8bXJzdGVwaGVuYW1lbGxAZ21haWwuY29t PgpEYXRlOiBNb24sIDMxIEF1ZyAyMDI2IDE2OjM4OjUzIC0wMzAwClN1YmplY3Q6IFtQQVRD SCB2MyAyLzJdIGxpYnBxOiBBZGQgUFFwYXNzZmlsZUxvb2t1cCgpCgpBbiBhcHBsaWNhdGlv biB0aGF0IGNvbm5lY3RzIHRocm91Z2ggYW4gaW50ZXJtZWRpYXJ5LCBzdWNoIGFzIGEgbG9j YWwKU1NIIHR1bm5lbCwgY29ubmVjdHMgdG8gYSBob3N0IGFuZCBwb3J0IHRoYXQgbm8gbG9u Z2VyIG1hdGNoIHRoZQpwYXNzd29yZCBmaWxlIGVudHJ5IHdyaXR0ZW4gZm9yIHRoZSByZWFs IHNlcnZlciwgc28gbGlicHEncyBwYXNzd29yZApmaWxlIGxvb2t1cCBjb21lcyB1cCBlbXB0 eSBkdXJpbmcgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50LiAgVW50aWwgbm93LApzdWNoIGFu IGFwcGxpY2F0aW9uIGhhZCB0byByZWltcGxlbWVudCB0aGUgcGFzc3dvcmQgZmlsZSBwYXJz ZXIgb24gaXRzCnNpZGUgdG8ga2VlcCAucGdwYXNzIHdvcmtpbmcuCgpFeHBvc2UgdGhlIGV4 aXN0aW5nIGxvb2t1cCBhcyBhIHB1YmxpYyBmdW5jdGlvbiwgUFFwYXNzZmlsZUxvb2t1cCgp LCBzbwp0aGF0IGEgY2xpZW50IGNhbiBsb29rIHVwIHRoZSBwYXNzd29yZCB1bmRlciB0aGUg cmVhbCBzZXJ2ZXIncyBob3N0IGFuZApwb3J0IGFuZCBwYXNzIHRoZSByZXN1bHQgYXMgdGhl IHBhc3N3b3JkIGNvbm5lY3Rpb24gcGFyYW1ldGVyIHdoaWxlCmNvbm5lY3RpbmcgdG8gdGhl IGludGVybWVkaWFyeSdzIGFkZHJlc3MuICBUaGUgZnVuY3Rpb24gYXBwbGllcyB0aGUKc2Ft ZSBydWxlcyBhcyBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQ6IHRoZSBzYW1lIGZpZWxkIG1h dGNoaW5nIGFuZApkZS1lc2NhcGluZywgdGhlIHNhbWUgbG9jYWxob3N0IGFuZCBkZWZhdWx0 LXBvcnQgc3Vic3RpdHV0aW9ucyBmb3IKbWlzc2luZyB2YWx1ZXMsIHRoZSBzYW1lIHBlcm1p c3Npb24gY2hlY2tzLCBhbmQgdGhlIHNhbWUgZmFsbGJhY2sgdG8KUEdQQVNTRklMRSBhbmQg dGhlIGRlZmF1bHQgcGFzc3dvcmQgZmlsZSBsb2NhdGlvbiB3aGVuIG5vIGZpbGUgaXMKZ2l2 ZW4uICBPdGhlciBsaWJwcSBjb25uZWN0aW9uLXBhcmFtZXRlciBlbnZpcm9ubWVudCB2YXJp YWJsZXMgYXJlIG5vdAphcHBsaWVkIHRvIHRoZSBsb29rdXAga2V5czsgaW4gcGFydGljdWxh ciwgUEdIT1NUIGFuZCBQR1BPUlQgYXJlCmlnbm9yZWQuICBUaGUgcmVzdWx0IGhvbGRzIG5v dGhpbmcgYnV0IHRoZSBwYXNzd29yZCwgc28gY2FsbGVycyBjYW4KY2xlYXIgaXQgd2l0aCBl eHBsaWNpdF9iemVybygpIG92ZXIgc3RybGVuKCkgYnl0ZXMgYmVmb3JlIGZyZWVpbmcgaXQu CgpBbHNvIGFkZCAtLXBhc3NmaWxlIGFuZCAtLXBhc3NmaWxlLWRlZmF1bHRzIG1vZGVzIHRv IGxpYnBxX3Rlc3RjbGllbnQsCmFuZCBhIFRBUCB0ZXN0IGV4ZXJjaXNpbmcgdGhlIGxvb2t1 cDsgaXQgbmVlZHMgbm8gc2VydmVyLgoKQXV0aG9yOiBEaWVnbyA8bXJzdGVwaGVuYW1lbGxA Z21haWwuY29tPgpSZXZpZXdlZC1ieTogWXVyaXkgR3JpZ29yeWV2IDxqdS5ncmlnb3JldkBm dGRhdGEucnU+ClJldmlld2VkLWJ5OiBEZW5pcyBTbWlybm92IDxkYXJ0aHVuaXhAZ21haWwu Y29tPgpTdWdnZXN0ZWQtYnk6IERlbmlzIFNtaXJub3YgPGRhcnRodW5peEBnbWFpbC5jb20+ CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQjJFREI1QUUtMjdGNy00NTgwLTg3 MUUtMUMyNDMzQkFFRjE4QGdtYWlsLmNvbQpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5l cy9tL2I2NTBlNTU1LTExYzctNDE1ZC04YmRhLWM3NDdjNDkyYWI0YUBnbWFpbC5jb20KLS0t CiBkb2Mvc3JjL3NnbWwvbGlicHEuc2dtbCAgICAgICAgICAgICAgICAgICAgICB8ICA3NyAr KysrKysrCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4dCAgICAgICAgICAgICB8 ICAgMSArCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMgICAgICAgICAgICB8 ICA2NSArKysrKy0KIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmggICAgICAgICAg ICAgIHwgICA5ICsKIHNyYy9pbnRlcmZhY2VzL2xpYnBxL21lc29uLmJ1aWxkICAgICAgICAg ICAgIHwgICAxICsKIHNyYy9pbnRlcmZhY2VzL2xpYnBxL3QvMDA3X3Bhc3NmaWxlLnBsICAg ICAgIHwgMjA5ICsrKysrKysrKysrKysrKysrKysKIHNyYy9pbnRlcmZhY2VzL2xpYnBxL3Rl c3QvbGlicHFfdGVzdGNsaWVudC5jIHwgIDYwICsrKysrLQogNyBmaWxlcyBjaGFuZ2VkLCA0 MTcgaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBz cmMvaW50ZXJmYWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5wbAoKZGlmZiAtLWdpdCBhL2Rv Yy9zcmMvc2dtbC9saWJwcS5zZ21sIGIvZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwKaW5kZXgg Njg0ODdhMzk1NGYuLjI1NTdhYmZhYjZkIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvbGli cHEuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbApAQCAtNzk3Niw2ICs3OTc2 LDc3IEBAIGNoYXIgKlBRZW5jcnlwdFBhc3N3b3JkKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29u c3QgY2hhciAqdXNlcik7CiAgICAgPC9saXN0aXRlbT4KICAgIDwvdmFybGlzdGVudHJ5Pgog CisgICA8dmFybGlzdGVudHJ5IGlkPSJsaWJwcS1QUXBhc3NmaWxlTG9va3VwIj4KKyAgICA8 dGVybT48ZnVuY3Rpb24+UFFwYXNzZmlsZUxvb2t1cDwvZnVuY3Rpb24+PGluZGV4dGVybT48 cHJpbWFyeT5QUXBhc3NmaWxlTG9va3VwPC9wcmltYXJ5PjwvaW5kZXh0ZXJtPjwvdGVybT4K KworICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICBMb29rcyB1cCBhIHBhc3N3 b3JkIGluIGEgcGFzc3dvcmQgZmlsZQorICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJsaWJw cS1wZ3Bhc3MiLz4pLgorPHN5bm9wc2lzPgorY2hhciAqUFFwYXNzZmlsZUxvb2t1cChjb25z dCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqcG9ydCwKKyAgICAgICAgICAgICAgICAg ICAgICAgY29uc3QgY2hhciAqZGJuYW1lLCBjb25zdCBjaGFyICp1c2VybmFtZSwKKyAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGFzc2ZpbGUpOworPC9zeW5vcHNpcz4K KyAgICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgorICAgICAgVGhpcyBmdW5jdGlvbiBwZXJm b3JtcyB0aGUgc2FtZSBwYXNzd29yZCBmaWxlIGxvb2t1cCB0aGF0IGNvbm5lY3Rpb24KKyAg ICAgIGVzdGFibGlzaG1lbnQgcGVyZm9ybXMgd2hlbiBubyBwYXNzd29yZCBoYXMgYmVlbiBz cGVjaWZpZWQsIGFuZAorICAgICAgcmV0dXJucyB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgZmly c3QgbWF0Y2hpbmcgbGluZS4gIEl0IGlzIGludGVuZGVkCisgICAgICBmb3IgYXBwbGljYXRp b25zIHRoYXQgY29ubmVjdCB0aHJvdWdoIGFuIGludGVybWVkaWFyeSwgZm9yIGV4YW1wbGUg YQorICAgICAgbG9jYWwgU1NIIHR1bm5lbDogc3VjaCBhbiBhcHBsaWNhdGlvbiBjYW4gbG9v ayB1cCB0aGUgcGFzc3dvcmQgdW5kZXIKKyAgICAgIHRoZSByZWFsIHNlcnZlcidzIGhvc3Qg YW5kIHBvcnQsIGFuZCB0aGVuIHBhc3MgdGhlIHJlc3VsdCBhcyB0aGUKKyAgICAgIDx4cmVm IGxpbmtlbmQ9ImxpYnBxLWNvbm5lY3QtcGFzc3dvcmQiLz4gY29ubmVjdGlvbiBwYXJhbWV0 ZXIgd2hpbGUKKyAgICAgIGNvbm5lY3RpbmcgdG8gdGhlIGludGVybWVkaWFyeSdzIGFkZHJl c3MuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSA8cGFyYW1ldGVy Pmhvc3RuYW1lPC9wYXJhbWV0ZXI+LCA8cGFyYW1ldGVyPnBvcnQ8L3BhcmFtZXRlcj4sCisg ICAgICA8cGFyYW1ldGVyPmRibmFtZTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj51c2Vy bmFtZTwvcGFyYW1ldGVyPgorICAgICAgYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIGZp cnN0IGZvdXIgZmllbGRzIG9mIGEgcGFzc3dvcmQgZmlsZQorICAgICAgbGluZS4gIElmIDxw YXJhbWV0ZXI+aG9zdG5hbWU8L3BhcmFtZXRlcj4gaXMgPHN5bWJvbD5OVUxMPC9zeW1ib2w+ IG9yCisgICAgICBlbXB0eSwgb3IgbWF0Y2hlcyA8YXBwbGljYXRpb24+bGlicHE8L2FwcGxp Y2F0aW9uPidzIGRlZmF1bHQgc29ja2V0CisgICAgICBkaXJlY3RvcnkgcGF0aCwgdGhlIGhv c3QgbmFtZSA8bGl0ZXJhbD5sb2NhbGhvc3Q8L2xpdGVyYWw+IGlzCisgICAgICBzZWFyY2hl ZCBmb3I7IGlmIDxwYXJhbWV0ZXI+cG9ydDwvcGFyYW1ldGVyPiBpcyA8c3ltYm9sPk5VTEw8 L3N5bWJvbD4KKyAgICAgIG9yIGVtcHR5LCB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCBwb3J0 IGlzIHVzZWQuICBObyBkZWZhdWx0cyBhcmUKKyAgICAgIGFwcGxpZWQgZm9yIDxwYXJhbWV0 ZXI+ZGJuYW1lPC9wYXJhbWV0ZXI+IGFuZAorICAgICAgPHBhcmFtZXRlcj51c2VybmFtZTwv cGFyYW1ldGVyPjsgaWYgZWl0aGVyIGlzIDxzeW1ib2w+TlVMTDwvc3ltYm9sPgorICAgICAg b3IgZW1wdHksIG5vIHBhc3N3b3JkIGlzIHJldHVybmVkLgorICAgICAgPHBhcmFtZXRlcj5w YXNzZmlsZTwvcGFyYW1ldGVyPiBpcyB0aGUgcGFzc3dvcmQgZmlsZSB0byB1c2U7IGlmIGl0 IGlzCisgICAgICA8c3ltYm9sPk5VTEw8L3N5bWJvbD4gb3IgZW1wdHksIHRoZSBmaWxlIG5h bWVkIGJ5IHRoZQorICAgICAgPGVudmFyPlBHUEFTU0ZJTEU8L2VudmFyPiBlbnZpcm9ubWVu dCB2YXJpYWJsZSBpcyB1c2VkIGlmIHNldCwgZWxzZQorICAgICAgdGhlIGRlZmF1bHQgcGFz c3dvcmQgZmlsZSBsb2NhdGlvbiAoc2VlIDx4cmVmIGxpbmtlbmQ9ImxpYnBxLXBncGFzcyIv PikuCisgICAgICBPdGhlciA8YXBwbGljYXRpb24+bGlicHE8L2FwcGxpY2F0aW9uPiBjb25u ZWN0aW9uLXBhcmFtZXRlcgorICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3Qg YXBwbGllZCB0byB0aGUgbG9va3VwIGtleXM7IGluCisgICAgICBwYXJ0aWN1bGFyLCA8ZW52 YXI+UEdIT1NUPC9lbnZhcj4gYW5kIDxlbnZhcj5QR1BPUlQ8L2VudmFyPiBhcmUKKyAgICAg IGlnbm9yZWQuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSByZXR1 cm4gdmFsdWUgaXMgYSBzdHJpbmcgYWxsb2NhdGVkIGJ5IDxmdW5jdGlvbj5tYWxsb2M8L2Z1 bmN0aW9uPiwKKyAgICAgIG9yIDxzeW1ib2w+TlVMTDwvc3ltYm9sPiBpZiBubyBtYXRjaGlu ZyBwYXNzd29yZCB3YXMgZm91bmQgb3IgdGhlCisgICAgICBsb29rdXAgY291bGQgbm90IGJl IGNvbXBsZXRlZCwgZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBhIG1lbW9yeQorICAgICAgYWxs b2NhdGlvbiBmYWlsdXJlLiAgVXNlIDx4cmVmIGxpbmtlbmQ9ImxpYnBxLVBRZnJlZW1lbSIv PiB0byBmcmVlCisgICAgICB0aGUgcmVzdWx0IHdoZW4gZG9uZSB3aXRoIGl0LgorICAgICA8 L3BhcmE+CisKKyAgICAgPHBhcmE+CisgICAgICBOb3RlIHRoYXQgdGhlIHJlc3VsdCBjb250 YWlucyBhIGNsZWFydGV4dCBwYXNzd29yZCwgYW5kIHRoYXQKKyAgICAgIDx4cmVmIGxpbmtl bmQ9ImxpYnBxLVBRZnJlZW1lbSIvPiBkb2VzIG5vdCBlcmFzZSBpdC4gIFRoZSBzdHJpbmcK KyAgICAgIGhvbGRzIG5vdGhpbmcgYnV0IHRoZSBwYXNzd29yZDogPGFwcGxpY2F0aW9uPmxp YnBxPC9hcHBsaWNhdGlvbj4KKyAgICAgIHdyaXRlcyBub3RoaW5nIHBhc3QgaXRzIHRlcm1p bmF0aW5nIHplcm8gYnl0ZSwgc28gYSBjYWxsZXIgdGhhdAorICAgICAgZG9lcyBub3Qgd2Fu dCB0aGUgcGFzc3dvcmQgdG8gbGluZ2VyIGluIG1lbW9yeSBjYW4gb3ZlcndyaXRlCisgICAg ICA8ZnVuY3Rpb24+c3RybGVuPC9mdW5jdGlvbj4oPHJlcGxhY2VhYmxlPnJlc3VsdDwvcmVw bGFjZWFibGU+KQorICAgICAgYnl0ZXMgYmVmb3JlIGZyZWVpbmcgaXQuICBUaGUgcGFzc3dv cmQgZmlsZQorICAgICAgcGVybWlzc2lvbiByZXF1aXJlbWVudHMgZGVzY3JpYmVkIGluCisg ICAgICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1wZ3Bhc3MiLz4gYXBwbHksIGFuZCwgYXMgZHVy aW5nIGNvbm5lY3Rpb24KKyAgICAgIGVzdGFibGlzaG1lbnQsIGEgd2FybmluZyBpcyB3cml0 dGVuIHRvIDxmaWxlbmFtZT5zdGRlcnI8L2ZpbGVuYW1lPgorICAgICAgaWYgdGhlIGZpbGUg aXMgaWdub3JlZCBiZWNhdXNlIG9mIHRoZW0uCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3Rp dGVtPgorICAgPC92YXJsaXN0ZW50cnk+CisKICAgIDx2YXJsaXN0ZW50cnkgaWQ9ImxpYnBx LVBRbWFrZUVtcHR5UEdyZXN1bHQiPgogICAgIDx0ZXJtPjxmdW5jdGlvbj5QUW1ha2VFbXB0 eVBHcmVzdWx0PC9mdW5jdGlvbj48aW5kZXh0ZXJtPjxwcmltYXJ5PlBRbWFrZUVtcHR5UEdy ZXN1bHQ8L3ByaW1hcnk+PC9pbmRleHRlcm0+PC90ZXJtPgogCkBAIC05NDYyLDYgKzk1MzMs MTIgQEAgbXlFdmVudFByb2MoUEdFdmVudElkIGV2dElkLCB2b2lkICpldnRJbmZvLCB2b2lk ICpwYXNzVGhyb3VnaCkKICAgIGlzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBpcyBzdG9yZWQg aW4gYSBkaXJlY3RvcnkgdGhhdCBpcyBzZWN1cmUsIHNvCiAgICBubyBzcGVjaWFsIHBlcm1p c3Npb25zIGNoZWNrIGlzIG1hZGUuCiAgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIEFuIGFw cGxpY2F0aW9uIGNhbiBwZXJmb3JtIHRoZSBzYW1lIHBhc3N3b3JkIGZpbGUgbG9va3VwIHRo YXQKKyAgIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBwZXJmb3JtcyBieSBjYWxsaW5nCisg ICA8eHJlZiBsaW5rZW5kPSJsaWJwcS1QUXBhc3NmaWxlTG9va3VwIi8+LgorICA8L3BhcmE+ CiAgPC9zZWN0MT4KIAogCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9leHBv cnRzLnR4dCBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0CmluZGV4IDFlM2Q1 YmQ1ODY3Li5kZWY2MWQ2MzcyNCAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEv ZXhwb3J0cy50eHQKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKQEAg LTIxMSwzICsyMTEsNCBAQCBQUWRlZmF1bHRBdXRoRGF0YUhvb2sgICAgIDIwOAogUFFmdWxs UHJvdG9jb2xWZXJzaW9uICAgICAyMDkKIGFwcGVuZFBRRXhwQnVmZmVyVkEgICAgICAgMjEw CiBQUWdldFRocmVhZExvY2sgICAgICAgICAgIDIxMQorUFFwYXNzZmlsZUxvb2t1cCAgICAg ICAgICAyMTIKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3Qu YyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwppbmRleCBhODY1NjRlMTky YS4uZjY2MGU1MThjYjYgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNv bm5lY3QuYworKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKQEAgLTgw MDUsNyArODAwNSw4IEBAIHB3ZGZNYXRjaGVzU3RyaW5nKGNoYXIgKmJ1ZiwgY29uc3QgY2hh ciAqdG9rZW4pCiAgKiBleHBsaWNpdF9iemVybyhyZXQsIHN0cmxlbihyZXQpKTsgcHFSZWxl YXNlQ29ubkhvc3RzKCkgcmVsaWVzIG9uIHRoaXMuCiAgKgogICogT24gZmFpbHVyZSwgKmVy cm1zZyBpcyBzZXQgdG8gYW4gZXJyb3IgdG8gYmUgcmV0dXJuZWQuICBJdCBpcwotICogbGVm dCBOVUxMIG9uIHN1Y2Nlc3MsIG9yIGlmIG5vIHBhc3N3b3JkIGNvdWxkIGJlIGZvdW5kLgor ICogbGVmdCBOVUxMIG9uIHN1Y2Nlc3MsIG9yIGlmIG5vIHBhc3N3b3JkIGNvdWxkIGJlIGZv dW5kLiAgQ2FsbGVycworICogdGhhdCBkbyBub3QgY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rp b24gY2FuIHBhc3MgZXJybXNnIGFzIE5VTEwuCiAgKi8KIHN0YXRpYyBjaGFyICoKIHBhc3N3 b3JkRnJvbUZpbGUoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQsCkBA IC04MDE4LDcgKzgwMTksOCBAQCBwYXNzd29yZEZyb21GaWxlKGNvbnN0IGNoYXIgKmhvc3Ru YW1lLCBjb25zdCBjaGFyICpwb3J0LAogI2VuZGlmCiAJUFFFeHBCdWZmZXJEYXRhIGJ1ZjsK IAotCSplcnJtc2cgPSBOVUxMOworCWlmIChlcnJtc2cpCisJCSplcnJtc2cgPSBOVUxMOwog CiAJaWYgKGRibmFtZSA9PSBOVUxMIHx8IGRibmFtZVswXSA9PSAnXDAnKQogCQlyZXR1cm4g TlVMTDsKQEAgLTgwODcsNyArODA4OSw4IEBAIHBhc3N3b3JkRnJvbUZpbGUoY29uc3QgY2hh ciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQsCiAJCS8qIE1ha2Ugc3VyZSB0aGVyZSdz IGEgcmVhc29uYWJsZSBhbW91bnQgb2Ygcm9vbSBpbiB0aGUgYnVmZmVyICovCiAJCWlmICgh ZW5sYXJnZVBRRXhwQnVmZmVyKCZidWYsIDEyOCkpCiAJCXsKLQkJCSplcnJtc2cgPSBsaWJw cV9nZXR0ZXh0KCJvdXQgb2YgbWVtb3J5Iik7CisJCQlpZiAoZXJybXNnKQorCQkJCSplcnJt c2cgPSBsaWJwcV9nZXR0ZXh0KCJvdXQgb2YgbWVtb3J5Iik7CiAJCQlicmVhazsKIAkJfQog CkBAIC04MTQ1LDcgKzgxNDgsOCBAQCBwYXNzd29yZEZyb21GaWxlKGNvbnN0IGNoYXIgKmhv c3RuYW1lLCBjb25zdCBjaGFyICpwb3J0LAogCiAJCQkJaWYgKCFyZXQpCiAJCQkJewotCQkJ CQkqZXJybXNnID0gbGlicHFfZ2V0dGV4dCgib3V0IG9mIG1lbW9yeSIpOworCQkJCQlpZiAo ZXJybXNnKQorCQkJCQkJKmVycm1zZyA9IGxpYnBxX2dldHRleHQoIm91dCBvZiBtZW1vcnki KTsKIAkJCQkJcmV0dXJuIE5VTEw7CiAJCQkJfQogCkBAIC04MTY0LDYgKzgxNjgsNTkgQEAg cGFzc3dvcmRGcm9tRmlsZShjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqcG9y dCwKIH0KIAogCisvKgorICogUFFwYXNzZmlsZUxvb2t1cAorICoKKyAqIExvb2sgdXAgYSBw YXNzd29yZCBpbiBhIHBhc3N3b3JkIGZpbGUsIGFwcGx5aW5nIHRoZSBzYW1lIHJ1bGVzIHRo YXQKKyAqIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBhcHBsaWVzIHdoZW4gbm8gcGFzc3dv cmQgaGFzIGJlZW4gc3BlY2lmaWVkLgorICogVGhpcyBsZXRzIGFwcGxpY2F0aW9ucyB0aGF0 IGNvbm5lY3QgdGhyb3VnaCBhbiBpbnRlcm1lZGlhcnkgKGZvcgorICogZXhhbXBsZSwgYSBs b2NhbCBTU0ggdHVubmVsKSBsb29rIHVwIHRoZSBwYXNzd29yZCB1bmRlciB0aGUgcmVhbAor ICogc2VydmVyJ3MgaG9zdCBhbmQgcG9ydCB3aGlsZSBjb25uZWN0aW5nIGVsc2V3aGVyZS4K KyAqCisgKiBUaGUgZmlyc3QgZm91ciBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgZmll bGRzIG9mIGEgcGFzc3dvcmQgZmlsZQorICogbGluZSwgYW5kIE5VTEwgb3IgZW1wdHkgdmFs dWVzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIHdheSBhcyBkdXJpbmcKKyAqIGNvbm5lY3Rpb24g ZXN0YWJsaXNobWVudDogaG9zdG5hbWUgaXMgbWF0Y2hlZCBhcyAibG9jYWxob3N0IiAoYXMg aXMKKyAqIGEgaG9zdG5hbWUgZXF1YWwgdG8gdGhlIGRlZmF1bHQgVW5peC1zb2NrZXQgZGly ZWN0b3J5KSwgcG9ydAorICogZGVmYXVsdHMgdG8gREVGX1BHUE9SVF9TVFIsIHdoaWxlIGRi bmFtZSBhbmQgdXNlcm5hbWUgbXVzdCBiZQorICogc3VwcGxpZWQuICBJZiBwYXNzZmlsZSBp cyBOVUxMIG9yIGVtcHR5LCBQR1BBU1NGSUxFIG9yIHRoZSBkZWZhdWx0CisgKiBwYXNzd29y ZCBmaWxlIGxvY2F0aW9uIGlzIHVzZWQuCisgKgorICogUmV0dXJucyBhIG1hbGxvYydkIHN0 cmluZyB0aGUgY2FsbGVyIG11c3QgZnJlZSB3aXRoIFBRZnJlZW1lbSgpLCBvcgorICogTlVM TCBpZiBubyBtYXRjaGluZyBwYXNzd29yZCB3YXMgZm91bmQgb3IgdGhlIGxvb2t1cCBjb3Vs ZCBub3QgYmUKKyAqIGNvbXBsZXRlZC4gIFRoZSBzdHJpbmcgaG9sZHMgbm90aGluZyBidXQg dGhlIHBhc3N3b3JkIChzZWUKKyAqIHBhc3N3b3JkRnJvbUZpbGUoKSksIHNvIGEgY2FsbGVy IHRoYXQgd2FudHMgaXQgZ29uZSBmcm9tIG1lbW9yeSBjYW4KKyAqIG92ZXJ3cml0ZSBzdHJs ZW4oKSBieXRlcyBiZWZvcmUgZnJlZWluZyBpdC4KKyAqLworY2hhciAqCitQUXBhc3NmaWxl TG9va3VwKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpwb3J0LAorCQkJCSBj b25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorCQkJCSBjb25zdCBj aGFyICpwYXNzZmlsZSkKK3sKKwljaGFyCQlwZ3Bhc3NmaWxlW01BWFBHUEFUSF07CisKKwlp ZiAocGFzc2ZpbGUgPT0gTlVMTCB8fCBwYXNzZmlsZVswXSA9PSAnXDAnKQorCXsKKwkJY29u c3QgY2hhciAqcGdwYXNzZW52ID0gZ2V0ZW52KCJQR1BBU1NGSUxFIik7CisKKwkJaWYgKHBn cGFzc2VudiAhPSBOVUxMICYmIHBncGFzc2VudlswXSAhPSAnXDAnKQorCQkJcGFzc2ZpbGUg PSBwZ3Bhc3NlbnY7CisJCWVsc2UKKwkJeworCQkJY2hhcgkJaG9tZWRpcltNQVhQR1BBVEhd OworCisJCQlpZiAoIXBxR2V0SG9tZURpcmVjdG9yeShob21lZGlyLCBzaXplb2YoaG9tZWRp cikpKQorCQkJCXJldHVybiBOVUxMOworCQkJc25wcmludGYocGdwYXNzZmlsZSwgc2l6ZW9m KHBncGFzc2ZpbGUpLCAiJXMvJXMiLAorCQkJCQkgaG9tZWRpciwgUEdQQVNTRklMRSk7CisJ CQlwYXNzZmlsZSA9IHBncGFzc2ZpbGU7CisJCX0KKwl9CisKKwlyZXR1cm4gcGFzc3dvcmRG cm9tRmlsZShob3N0bmFtZSwgcG9ydCwgZGJuYW1lLCB1c2VybmFtZSwKKwkJCQkJCQlwYXNz ZmlsZSwgTlVMTCk7Cit9CisKKwogLyoKICAqCUlmIHRoZSBjb25uZWN0aW9uIGZhaWxlZCBk dWUgdG8gYmFkIHBhc3N3b3JkLCB3ZSBzaG91bGQgbWVudGlvbgogICoJaWYgd2UgZ290IHRo ZSBwYXNzd29yZCBmcm9tIHRoZSBwZ3Bhc3NmaWxlLgpkaWZmIC0tZ2l0IGEvc3JjL2ludGVy ZmFjZXMvbGlicHEvbGlicHEtZmUuaCBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZl LmgKaW5kZXggZjUxZmQ2MjBiMGEuLmI2MzQ4OWEzYmZlIDEwMDY0NAotLS0gYS9zcmMvaW50 ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xp YnBxLWZlLmgKQEAgLTY5LDYgKzY5LDEwIEBAIGV4dGVybiAiQyIKIC8qIEluZGljYXRlcyBw cmVzZW5jZSBvZiB0aGUgUFFBVVRIREFUQV9PQVVUSF9CRUFSRVJfVE9LRU5fVjIgYXV0aGRh dGEgaG9vayAqLwogI2RlZmluZSBMSUJQUV9IQVNfT0FVVEhfQkVBUkVSX1RPS0VOX1YyIDEK IAorLyogRmVhdHVyZXMgYWRkZWQgaW4gUG9zdGdyZVNRTCB2MjA6ICovCisvKiBJbmRpY2F0 ZXMgcHJlc2VuY2Ugb2YgUFFwYXNzZmlsZUxvb2t1cCAqLworI2RlZmluZSBMSUJQUV9IQVNf UEFTU0ZJTEVfTE9PS1VQIDEKKwogLyoKICAqIE9wdGlvbiBmbGFncyBmb3IgUFFjb3B5UmVz dWx0CiAgKi8KQEAgLTM2Nyw2ICszNzEsMTEgQEAgZXh0ZXJuIFBRY29ubmluZm9PcHRpb24g KlBRY29ubmluZm8oUEdjb25uICpjb25uKTsKIC8qIGZyZWUgdGhlIGRhdGEgc3RydWN0dXJl IHJldHVybmVkIGJ5IFBRY29ubmRlZmF1bHRzKCkgb3IgUFFjb25uaW5mb1BhcnNlKCkgKi8K IGV4dGVybiB2b2lkIFBRY29ubmluZm9GcmVlKFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRp b25zKTsKIAorLyogbG9vayB1cCBhIHBhc3N3b3JkIGluIGEgcGFzc3dvcmQgZmlsZSAqLwor ZXh0ZXJuIGNoYXIgKlBRcGFzc2ZpbGVMb29rdXAoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNv bnN0IGNoYXIgKnBvcnQsCisJCQkJCQkJICBjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNo YXIgKnVzZXJuYW1lLAorCQkJCQkJCSAgY29uc3QgY2hhciAqcGFzc2ZpbGUpOworCiAvKgog ICogY2xvc2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBhbmQgcmVlc3RhYmxpc2ggYSBuZXcg b25lIHdpdGggdGhlIHNhbWUKICAqIHBhcmFtZXRlcnMKZGlmZiAtLWdpdCBhL3NyYy9pbnRl cmZhY2VzL2xpYnBxL21lc29uLmJ1aWxkIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvbWVzb24u YnVpbGQKaW5kZXggYjBhZTcyMTY3YTEuLmI5ZjkzZGRiODUyIDEwMDY0NAotLS0gYS9zcmMv aW50ZXJmYWNlcy9saWJwcS9tZXNvbi5idWlsZAorKysgYi9zcmMvaW50ZXJmYWNlcy9saWJw cS9tZXNvbi5idWlsZApAQCAtMTYxLDYgKzE2MSw3IEBAIHRlc3RzICs9IHsKICAgICAgICd0 LzAwNF9sb2FkX2JhbGFuY2VfZG5zLnBsJywKICAgICAgICd0LzAwNV9uZWdvdGlhdGVfZW5j cnlwdGlvbi5wbCcsCiAgICAgICAndC8wMDZfc2VydmljZS5wbCcsCisgICAgICAndC8wMDdf cGFzc2ZpbGUucGwnLAogICAgIF0sCiAgICAgJ2Vudic6IHsKICAgICAgICd3aXRoX3NzbCc6 IHNzbF9saWJyYXJ5LApkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvdC8wMDdf cGFzc2ZpbGUucGwgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5wbApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMWE2MWMyYzQ4YzUKLS0t IC9kZXYvbnVsbAorKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5w bApAQCAtMCwwICsxLDIwOSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjYsIFBvc3RncmVTUUwg R2xvYmFsIERldmVsb3BtZW50IEdyb3VwCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzIEZB VEFMID0+ICdhbGwnOwordXNlIEZpbGU6OkNvcHk7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6 VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKworIyBUZXN0IFBRcGFzc2ZpbGVMb29rdXAoKSwg dmlhIGxpYnBxX3Rlc3RjbGllbnQgLS1wYXNzZmlsZS4gIFRoZSBsb29rdXAgaXMKKyMgcHVy ZWx5IGNsaWVudC1zaWRlLCBzbyBubyBzZXJ2ZXIgaXMgaW52b2x2ZWQuICBBbiBhcmd1bWVu dCBvZiAiLSIgaXMKKyMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBhcyBOVUxMLCBhbmQgYW4g YXJndW1lbnQgb2YgIj0iIGFzIGFuIGVtcHR5CisjIHN0cmluZyAoYW4gZW1wdHkgYXJndiBl bGVtZW50IGlzIG5vdCBwb3J0YWJsZSkuCisKK215ICR0ZCA9IFBvc3RncmVTUUw6OlRlc3Q6 OlV0aWxzOjp0ZW1wZGlyOworbXkgJHBhc3NmaWxlID0gIiR0ZC9wZ3Bhc3MiOworCitkZWxl dGUgJEVOVntQR1BBU1NGSUxFfTsKKworIyBUaGUgY29tcGlsZWQtaW4gZGVmYXVsdHMgdGhh dCB0aGUgbG9va3VwIGZhbGxzIGJhY2sgdG8uCitteSAoJGRlZmF1bHRzKSA9IHJ1bl9jb21t YW5kKFsgJ2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmlsZS1kZWZhdWx0cycgXSk7Cisk ZGVmYXVsdHMgPX4gcy9cci8vZzsKK215ICgkZGVmcG9ydCwgJHNvY2tldGRpcikgPSBzcGxp dCAvXG4vLCAkZGVmYXVsdHM7CisKK2FwcGVuZF90b19maWxlKCRwYXNzZmlsZSwgPDwnRU9G Jyk7CisjIGEgY29tbWVudCBsaW5lCitzZXJ2ZXIuZXhhbXBsZS5jb206NTQzMjpwcm9kZGI6 ZGllZ286c2VjcmV0MQorc2VydmVyLmV4YW1wbGUuY29tOjU0MzM6KjpkaWVnbzpzZWNyZXQy Citsb2NhbGhvc3Q6KjpteWRiOm1lOmxvY2FscHcKK3NwZWNpYWwuZXhhbXBsZS5jb206NTQz MjpkYlw6Y29sb246dXNcXGVyOnBhXFxzc1w6d29yZAorZW5kY29sb24uZXhhbXBsZS5jb206 NTQzMjplbmRkYjplbmR1c2VyOmVuZFw6CitzZXJ2ZXIuZXhhbXBsZS5jb206NTQzMjpwcm9k ZGI6ZGllZ286c2hhZG93ZWQKK0VPRgorYXBwZW5kX3RvX2ZpbGUoJHBhc3NmaWxlLAorCSJk ZWZwb3J0LmV4YW1wbGUuY29tOiRkZWZwb3J0OmRlZmRiOmRlZnVzZXI6ZGVmcG9ydHB3XG4i KTsKK2NobW9kIDA2MDAsICRwYXNzZmlsZSBvciBkaWUgImNobW9kOiAkISI7CisKK215ICgk b3V0LCAkZXJyKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWworCQknbGli cHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknc2VydmVyLmV4 YW1wbGUuY29tJywgJzU0MzInLCAncHJvZGRiJywgJ2RpZWdvJworCV0pOworaXMoJG91dCwg J3NlY3JldDEnLCAnZXhhY3QgbWF0Y2ggcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgcGFz c3dvcmQnKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWworCQknbGlicHFf dGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknc2VydmVyLmV4YW1w bGUuY29tJywgJzU0MzMnLCAnYW55ZGInLCAnZGllZ28nCisJXSk7Citpcygkb3V0LCAnc2Vj cmV0MicsICd3aWxkY2FyZCBmaWVsZCBtYXRjaGVzIGFueSB2YWx1ZScpOworCisoJG91dCwg JGVycikgPSBydW5fY29tbWFuZCgKKwlbICdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2Zp bGUnLCAkcGFzc2ZpbGUsICctJywgJy0nLCAnbXlkYicsICdtZScgXSk7Citpcygkb3V0LCAn bG9jYWxwdycsICdOVUxMIGhvc3RuYW1lIGFuZCBwb3J0IG1hdGNoIGEgbG9jYWxob3N0IGVu dHJ5Jyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsgJ2xpYnBxX3Rlc3Rj bGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwgJz0nLCAnLScsICdteWRiJywgJ21l JyBdKTsKK2lzKCRvdXQsICdsb2NhbHB3JywgJ2VtcHR5IGhvc3RuYW1lIG1hdGNoZXMgYSBs b2NhbGhvc3QgZW50cnknKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWwor CQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknZGVm cG9ydC5leGFtcGxlLmNvbScsICctJywgJ2RlZmRiJywgJ2RlZnVzZXInCisJXSk7Citpcygk b3V0LCAnZGVmcG9ydHB3JywgJ05VTEwgcG9ydCBtYXRjaGVzIGFuIGVudHJ5IGZvciB0aGUg ZGVmYXVsdCBwb3J0Jyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJ J2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ2RlZnBv cnQuZXhhbXBsZS5jb20nLCAnPScsICdkZWZkYicsICdkZWZ1c2VyJworCV0pOworaXMoJG91 dCwgJ2RlZnBvcnRwdycsICdlbXB0eSBwb3J0IG1hdGNoZXMgYW4gZW50cnkgZm9yIHRoZSBk ZWZhdWx0IHBvcnQnKTsKKworU0tJUDoKK3sKKwlza2lwICdubyBkZWZhdWx0IFVuaXgtc29j a2V0IGRpcmVjdG9yeSBvbiB0aGlzIHBsYXRmb3JtJywgMQorCSAgdW5sZXNzIGRlZmluZWQg JHNvY2tldGRpciAmJiAkc29ja2V0ZGlyID1+IG17Xi99OworCisJKCRvdXQsICRlcnIpID0g cnVuX2NvbW1hbmQoCisJCVsKKwkJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2ZpbGUn LCAkcGFzc2ZpbGUsCisJCQkkc29ja2V0ZGlyLCAnLScsICdteWRiJywgJ21lJworCQldKTsK Kwlpcygkb3V0LCAnbG9jYWxwdycsCisJCSdkZWZhdWx0IHNvY2tldCBkaXJlY3RvcnkgbWF0 Y2hlcyBhIGxvY2FsaG9zdCBlbnRyeScpOworfQorCisoJG91dCwgJGVycikgPSBydW5fY29t bWFuZCgKKwlbCisJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2ZpbGUnLCAkcGFzc2Zp bGUsCisJCSdzcGVjaWFsLmV4YW1wbGUuY29tJywgJzU0MzInLCAnZGI6Y29sb24nLCAndXNc XGVyJworCV0pOworaXMoJG91dCwgJ3BhXFxzczp3b3JkJywgJ2VzY2FwZWQgY2hhcmFjdGVy cyBhcmUgbWF0Y2hlZCBhbmQgZGUtZXNjYXBlZCcpOworCisoJG91dCwgJGVycikgPSBydW5f Y29tbWFuZCgKKwlbCisJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2ZpbGUnLCAkcGFz c2ZpbGUsCisJCSdlbmRjb2xvbi5leGFtcGxlLmNvbScsICc1NDMyJywgJ2VuZGRiJywgJ2Vu ZHVzZXInCisJXSk7Citpcygkb3V0LCAnZW5kOicsICdlc2NhcGVkIGNvbG9uIGF0IHRoZSBl bmQgb2YgdGhlIHBhc3N3b3JkIGlzIGRlLWVzY2FwZWQnKTsKKworKCRvdXQsICRlcnIpID0g cnVuX2NvbW1hbmQoCisJWworCQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywg JHBhc3NmaWxlLAorCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAnb3RoZXJkYics ICdkaWVnbycKKwldKTsKK2lzKCRlcnIsICdubyBwYXNzd29yZCBmb3VuZCcsICdubyBtYXRj aGluZyBsaW5lIHJldHVybnMgbm8gcGFzc3dvcmQnKTsKKworKCRvdXQsICRlcnIpID0gcnVu X2NvbW1hbmQoCisJWworCQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgIiR0 ZC9kb2VzX25vdF9leGlzdCIsCisJCSdzZXJ2ZXIuZXhhbXBsZS5jb20nLCAnNTQzMicsICdw cm9kZGInLCAnZGllZ28nCisJXSk7CitpcygkZXJyLCAnbm8gcGFzc3dvcmQgZm91bmQnLCAn bWlzc2luZyBwYXNzd29yZCBmaWxlIHJldHVybnMgbm8gcGFzc3dvcmQnKTsKKworKCRvdXQs ICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWworCQknbGlicHFfdGVzdGNsaWVudCcsICctLXBh c3NmaWxlJywgJHBhc3NmaWxlLAorCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAn LScsICdkaWVnbycKKwldKTsKK2lzKCRlcnIsICdubyBwYXNzd29yZCBmb3VuZCcsICdOVUxM IGRibmFtZSByZXR1cm5zIG5vIHBhc3N3b3JkJyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9j b21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNz ZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1NDMyJywgJz0nLCAnZGllZ28nCisJ XSk7CitpcygkZXJyLCAnbm8gcGFzc3dvcmQgZm91bmQnLCAnZW1wdHkgZGJuYW1lIHJldHVy bnMgbm8gcGFzc3dvcmQnKTsKKworKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJWwor CQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlLAorCQknc2Vy dmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAncHJvZGRiJywgJy0nCisJXSk7CitpcygkZXJy LCAnbm8gcGFzc3dvcmQgZm91bmQnLCAnTlVMTCB1c2VybmFtZSByZXR1cm5zIG5vIHBhc3N3 b3JkJyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rl c3RjbGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxl LmNvbScsICc1NDMyJywgJ3Byb2RkYicsICc9JworCV0pOworaXMoJGVyciwgJ25vIHBhc3N3 b3JkIGZvdW5kJywgJ2VtcHR5IHVzZXJuYW1lIHJldHVybnMgbm8gcGFzc3dvcmQnKTsKKwor IyBBIE5VTEwgb3IgZW1wdHkgcGFzc2ZpbGUgZmFsbHMgYmFjayB0byB0aGUgUEdQQVNTRklM RSBlbnZpcm9ubWVudAorIyB2YXJpYWJsZS4KK3sKKwlsb2NhbCAkRU5We1BHUEFTU0ZJTEV9 ID0gJHBhc3NmaWxlOworCisJKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJCVsKKwkJ CSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2ZpbGUnLCAnLScsCisJCQknc2VydmVyLmV4 YW1wbGUuY29tJywgJzU0MzInLCAncHJvZGRiJywgJ2RpZWdvJworCQldKTsKKwlpcygkb3V0 LCAnc2VjcmV0MScsICdOVUxMIHBhc3NmaWxlIGZhbGxzIGJhY2sgdG8gUEdQQVNTRklMRScp OworCisJKCRvdXQsICRlcnIpID0gcnVuX2NvbW1hbmQoCisJCVsKKwkJCSdsaWJwcV90ZXN0 Y2xpZW50JywgJy0tcGFzc2ZpbGUnLCAnPScsCisJCQknc2VydmVyLmV4YW1wbGUuY29tJywg JzU0MzInLCAncHJvZGRiJywgJ2RpZWdvJworCQldKTsKKwlpcygkb3V0LCAnc2VjcmV0MScs ICdlbXB0eSBwYXNzZmlsZSBmYWxscyBiYWNrIHRvIFBHUEFTU0ZJTEUnKTsKK30KKworU0tJ UDoKK3sKKwlza2lwICdkZWZhdWx0IHBhc3N3b3JkIGZpbGUgbG9jYXRpb24gY2Fubm90IGJl IHJlZGlyZWN0ZWQgb24gV2luZG93cycsIDEKKwkgIGlmICR3aW5kb3dzX29zOworCisJIyBX aXRob3V0IFBHUEFTU0ZJTEUsIHRoZSBsb29rdXAgZmFsbHMgYmFjayB0byB+Ly5wZ3Bhc3Mu CisJbXkgJGhvbWVkaXIgPSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczo6dGVtcGRpcjsKKwlt eSAkaG9tZXBhc3NmaWxlID0gIiRob21lZGlyLy5wZ3Bhc3MiOworCisJYXBwZW5kX3RvX2Zp bGUoJGhvbWVwYXNzZmlsZSwKKwkJImhvbWUuZXhhbXBsZS5jb206NTQzMjpob21lZGI6aG9t ZXVzZXI6aG9tZXB3XG4iKTsKKwljaG1vZCAwNjAwLCAkaG9tZXBhc3NmaWxlIG9yIGRpZSAi Y2htb2Q6ICQhIjsKKworCWxvY2FsICRFTlZ7SE9NRX0gPSAkaG9tZWRpcjsKKworCSgkb3V0 LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCQlbCisJCQknbGlicHFfdGVzdGNsaWVudCcsICct LXBhc3NmaWxlJywgJy0nLAorCQkJJ2hvbWUuZXhhbXBsZS5jb20nLCAnNTQzMicsICdob21l ZGInLCAnaG9tZXVzZXInCisJCV0pOworCWlzKCRvdXQsICdob21lcHcnLCAnTlVMTCBwYXNz ZmlsZSBmYWxscyBiYWNrIHRvIH4vLnBncGFzcycpOworfQorCitTS0lQOgoreworCXNraXAg J3Bhc3N3b3JkIGZpbGUgcGVybWlzc2lvbnMgYXJlIG5vdCBjaGVja2VkIG9uIFdpbmRvd3Mn LCAyCisJICBpZiAkd2luZG93c19vczsKKworCW15ICRwYXNzZmlsZV9pbnNlY3VyZSA9ICIk dGQvcGdwYXNzX2luc2VjdXJlIjsKKwljb3B5KCRwYXNzZmlsZSwgJHBhc3NmaWxlX2luc2Vj dXJlKQorCSAgb3IgZGllICJjb3VsZCBub3QgY29weSAkcGFzc2ZpbGUgdG8gJHBhc3NmaWxl X2luc2VjdXJlOiAkISI7CisJY2htb2QgMDY0NCwgJHBhc3NmaWxlX2luc2VjdXJlIG9yIGRp ZSAiY2htb2Q6ICQhIjsKKworCSgkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCQlbCisJ CQknbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlX2luc2VjdXJl LAorCQkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1NDMyJywgJ3Byb2RkYicsICdkaWVnbycK KwkJXSk7CisJbGlrZSgKKwkJJGVyciwKKwkJcXIvaGFzIGdyb3VwIG9yIHdvcmxkIGFjY2Vz cy8sCisJCSdpbnNlY3VyZSBwYXNzd29yZCBmaWxlIGRyYXdzIGEgd2FybmluZycpOworCWxp a2UoJGVyciwgcXIvbm8gcGFzc3dvcmQgZm91bmQvLCAnaW5zZWN1cmUgcGFzc3dvcmQgZmls ZSBpcyBpZ25vcmVkJyk7Cit9CisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3Jj L2ludGVyZmFjZXMvbGlicHEvdGVzdC9saWJwcV90ZXN0Y2xpZW50LmMgYi9zcmMvaW50ZXJm YWNlcy9saWJwcS90ZXN0L2xpYnBxX3Rlc3RjbGllbnQuYwppbmRleCAyMDczMDcwOWVlNy4u ODczMDk4Mzc0ODkgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvbGli cHFfdGVzdGNsaWVudC5jCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvbGlicHFf dGVzdGNsaWVudC5jCkBAIC0yMyw2ICsyMyw1NyBAQCBwcmludF9zc2xfbGlicmFyeSh2b2lk KQogCQlwcmludGYoIiVzXG4iLCBsaWIpOwogfQogCisvKgorICogUHJpbnQgdGhlIGNvbXBp bGVkLWluIGRlZmF1bHRzIHRoYXQgdGhlIHBhc3NmaWxlIGxvb2t1cCBmYWxscyBiYWNrIHRv LAorICogZm9yIHVzZSBieSB0aGUgVEFQIHRlc3QuCisgKi8KK3N0YXRpYyB2b2lkCitwcmlu dF9wYXNzZmlsZV9kZWZhdWx0cyh2b2lkKQoreworCXByaW50ZigiJXNcbiVzXG4iLCBERUZf UEdQT1JUX1NUUiwgREVGQVVMVF9QR1NPQ0tFVF9ESVIpOworfQorCisvKgorICogTG9vayB1 cCBhIHBhc3N3b3JkIHdpdGggUFFwYXNzZmlsZUxvb2t1cCgpLiAgVGhlIGFyZ3VtZW50cyBh cmUgcGFzc2ZpbGUsCisgKiBob3N0bmFtZSwgcG9ydCwgZGJuYW1lIGFuZCB1c2VybmFtZTsg YW4gYXJndW1lbnQgb2YgIi0iIGlzIHBhc3NlZCBhcworICogTlVMTCwgYW5kIGFuIGFyZ3Vt ZW50IG9mICI9IiBhcyBhbiBlbXB0eSBzdHJpbmcgKGFuIGVtcHR5IGNvbW1hbmQtbGluZQor ICogYXJndW1lbnQgY2Fubm90IGJlIHJlbGllZCBvbiB0byBzdXJ2aXZlIHByb2Nlc3Mgc3Bh d25pbmcgZXZlcnl3aGVyZSkuCisgKi8KK3N0YXRpYyBpbnQKK3Rlc3RfcGFzc2ZpbGVfbG9v a3VwKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY29uc3QgY2hhciAqYXJnc1s1XTsK KwljaGFyCSAgICpwYXNzd29yZDsKKworCWlmIChhcmdjICE9IDcpCisJeworCQlmcHJpbnRm KHN0ZGVyciwgInVzYWdlOiBsaWJwcV90ZXN0Y2xpZW50IC0tcGFzc2ZpbGUgUEFTU0ZJTEUg SE9TVE5BTUUgUE9SVCBEQk5BTUUgVVNFUk5BTUVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisK Kwlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKKwl7CisJCWlmIChzdHJjbXAoYXJndltp ICsgMl0sICItIikgPT0gMCkKKwkJCWFyZ3NbaV0gPSBOVUxMOworCQllbHNlIGlmIChzdHJj bXAoYXJndltpICsgMl0sICI9IikgPT0gMCkKKwkJCWFyZ3NbaV0gPSAiIjsKKwkJZWxzZQor CQkJYXJnc1tpXSA9IGFyZ3ZbaSArIDJdOworCX0KKworCXBhc3N3b3JkID0gUFFwYXNzZmls ZUxvb2t1cChhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzBdKTsK KworCWlmICghcGFzc3dvcmQpCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIm5vIHBhc3N3b3Jk IGZvdW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJpbnRmKCIlc1xuIiwgcGFzc3dv cmQpOworCVBRZnJlZW1lbShwYXNzd29yZCk7CisJcmV0dXJuIDA7Cit9CisKIGludAogbWFp bihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewpAQCAtMzEsNyArODIsMTQgQEAgbWFpbihp bnQgYXJnYywgY2hhciAqYXJndltdKQogCQlwcmludF9zc2xfbGlicmFyeSgpOwogCQlyZXR1 cm4gMDsKIAl9CisJZWxzZSBpZiAoKGFyZ2MgPiAxKSAmJiAhc3RyY21wKGFyZ3ZbMV0sICIt LXBhc3NmaWxlIikpCisJCXJldHVybiB0ZXN0X3Bhc3NmaWxlX2xvb2t1cChhcmdjLCBhcmd2 KTsKKwllbHNlIGlmICgoYXJnYyA+IDEpICYmICFzdHJjbXAoYXJndlsxXSwgIi0tcGFzc2Zp bGUtZGVmYXVsdHMiKSkKKwl7CisJCXByaW50X3Bhc3NmaWxlX2RlZmF1bHRzKCk7CisJCXJl dHVybiAwOworCX0KIAotCXByaW50ZigiY3VycmVudGx5IG9ubHkgLS1zc2wgaXMgc3VwcG9y dGVkXG4iKTsKKwlwcmludGYoImN1cnJlbnRseSBvbmx5IC0tc3NsLCAtLXBhc3NmaWxlIGFu ZCAtLXBhc3NmaWxlLWRlZmF1bHRzIGFyZSBzdXBwb3J0ZWRcbiIpOwogCXJldHVybiAxOwog fQotLSAKMi40My4wCgo= --------------wN5dNT201JJ1FgRLUQ9DCL0V Content-Type: text/x-patch; charset=UTF-8; name="v3-0001-libpq-Do-not-leave-password-residue-in-passwordFr.patch" Content-Disposition: attachment; filename*0="v3-0001-libpq-Do-not-leave-password-residue-in-passwordFr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBjOTdjZGJlNTdiNTRkODY3MDdmOTU4MGE2ZGM1MmUyNTY4OGZlZGQ2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEaWVnbyA8bXJzdGVwaGVuYW1lbGxAZ21haWwuY29t PgpEYXRlOiBNb24sIDE0IFNlcCAyMDI2IDExOjUzOjIyIC0wMzAwClN1YmplY3Q6IFtQQVRD SCB2MyAxLzJdIGxpYnBxOiBEbyBub3QgbGVhdmUgcGFzc3dvcmQgcmVzaWR1ZSBpbgogcGFz c3dvcmRGcm9tRmlsZSgpJ3MgcmVzdWx0CgpwYXNzd29yZEZyb21GaWxlKCkgY29waWVkIHRo ZSByZW1haW5kZXIgb2YgdGhlIG1hdGNoaW5nIHBhc3N3b3JkIGZpbGUKbGluZSB3aXRoIHN0 cmR1cCgpIGFuZCB0aGVuIGRlLWVzY2FwZWQgdGhlIGNvcHkgaW4gcGxhY2UuICBUaGUgY29w eQpoZWxkIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgYW5kIGV2ZXJ5 IGVzY2FwZSBzZXF1ZW5jZQpzaHJpbmtzIHRoZSBzdHJpbmcgYnkgb25lIGJ5dGUsIHNvIHRo ZSB0YWlsIG9mIHRoZSBlc2NhcGVkIHBhc3N3b3JkLAphbmQgYW55IGZ1cnRoZXIgZmllbGRz IG9uIHRoZSBsaW5lLCByZW1haW5lZCBpbiB0aGUgYWxsb2NhdGlvbiBwYXN0CnRoZSB0ZXJt aW5hdGluZyB6ZXJvIGJ5dGUuICBDYWxsZXJzIHRoYXQgY2xlYXIgdGhlIHBhc3N3b3JkIGJl Zm9yZQpmcmVlaW5nIGl0LCBzdWNoIGFzIHBxUmVsZWFzZUNvbm5Ib3N0cygpIHdpdGggZXhw bGljaXRfYnplcm8ocCwKc3RybGVuKHApKSwgY291bGQgbm90IHJlYWNoIHRob3NlIGJ5dGVz LgoKRGUtZXNjYXBlIHRoZSBwYXNzd29yZCB3aXRoaW4gdGhlIGxpbmUgYnVmZmVyIGluc3Rl YWQsIHdoaWNoIGlzCmNsZWFyZWQgd2l0aCBleHBsaWNpdF9iemVybygpIGJlZm9yZSBpdCBp cyBmcmVlZCwgYW5kIGNvcHkgb25seSB0aGUKZGUtZXNjYXBlZCBwYXNzd29yZC4gIFRoZSBy ZXR1cm5lZCBzdHJpbmcgaXMgdW5jaGFuZ2VkLCBhbmQgdGhlCmZ1bmN0aW9uIG5vdyB3cml0 ZXMgbm90aGluZyBwYXN0IGl0cyB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUuCgpUaGUgZGUtZXNj YXBpbmcgZGF0ZXMgZnJvbSA4ZDE1ZTNlYzRmYzsgdGhlIGV4cGxpY2l0X2J6ZXJvKCkgY2xl YXJpbmcKYWRkZWQgbGF0ZXIgYnkgNzRhMzA4Y2Y1MjIgZGlkIG5vdCBhY2NvdW50IGZvciBp dC4KClJlcG9ydGVkLWJ5OiBEZW5pcyBTbWlybm92IDxkYXJ0aHVuaXhAZ21haWwuY29tPgpE aXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0QzNUQwQUJCLTc1NUUtNEVERS1CNTM1 LTVDNzU3OEIzRDNEQ0BnbWFpbC5jb20KLS0tCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1j b25uZWN0LmMgfCAzMCArKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0KIDEgZmlsZSBj aGFuZ2VkLCAyMSBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYyBiL3NyYy9pbnRlcmZhY2VzL2xp YnBxL2ZlLWNvbm5lY3QuYwppbmRleCAyY2UxMjhkYTE1Ny4uYTg2NTY0ZTE5MmEgMTAwNjQ0 Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYworKysgYi9zcmMvaW50 ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKQEAgLTgwMDAsNiArODAwMCwxMCBAQCBwd2Rm TWF0Y2hlc1N0cmluZyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKnRva2VuKQogLyoKICAqIEdl dCBhIHBhc3N3b3JkIGZyb20gdGhlIHBhc3N3b3JkIGZpbGUuIFJldHVybiB2YWx1ZSBpcyBt YWxsb2MnZC4KICAqCisgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGhvbGRzIG5vdGhpbmcgYnV0 IHRoZSBkZS1lc2NhcGVkIHBhc3N3b3JkIGFuZCBpdHMKKyAqIHRlcm1pbmF0aW5nIHplcm8g Ynl0ZSwgc28gY2FsbGVycyBjYW4gY2xlYXIgaXQgd2l0aAorICogZXhwbGljaXRfYnplcm8o cmV0LCBzdHJsZW4ocmV0KSk7IHBxUmVsZWFzZUNvbm5Ib3N0cygpIHJlbGllcyBvbiB0aGlz LgorICoKICAqIE9uIGZhaWx1cmUsICplcnJtc2cgaXMgc2V0IHRvIGFuIGVycm9yIHRvIGJl IHJldHVybmVkLiAgSXQgaXMKICAqIGxlZnQgTlVMTCBvbiBzdWNjZXNzLCBvciBpZiBubyBw YXNzd29yZCBjb3VsZCBiZSBmb3VuZC4KICAqLwpAQCAtODExNiw2ICs4MTIwLDIzIEBAIHBh c3N3b3JkRnJvbUZpbGUoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQs CiAJCQkJCQkgICAqcDEsCiAJCQkJCQkgICAqcDI7CiAKKwkJCQkvKgorCQkJCSAqIERlLWVz Y2FwZSB0aGUgcGFzc3dvcmQgaW4gcGxhY2UsIHdpdGhpbiB0aGUgbGluZSBidWZmZXIsCisJ CQkJICogYmVmb3JlIGNvcHlpbmcgaXQgb3V0LiAgQ29weWluZyBmaXJzdCBhbmQgZGUtZXNj YXBpbmcgdGhlCisJCQkJICogY29weSB3b3VsZCBsZWF2ZSB0aGUgdGFpbCBvZiB0aGUgZXNj YXBlZCBwYXNzd29yZCwgYW5kCisJCQkJICogYW55dGhpbmcgZm9sbG93aW5nIGl0IG9uIHRo ZSBsaW5lLCBpbiB0aGUgcmVzdWx0IHBhc3QgdGhlCisJCQkJICogdGVybWluYXRpbmcgemVy byBieXRlLCB3aGVyZSBhIGNhbGxlciB0aGF0IGNsZWFycworCQkJCSAqIHN0cmxlbihyZXQp IGJ5dGVzIChhcyBwcVJlbGVhc2VDb25uSG9zdHMoKSBkb2VzKSBjYW5ub3QKKwkJCQkgKiBy ZWFjaCBpdC4gIFRoZSBsaW5lIGJ1ZmZlciBpdHNlbGYgaXMgY2xlYXJlZCBiZWxvdy4KKwkJ CQkgKi8KKwkJCQlmb3IgKHAxID0gcDIgPSB0OyAqcDEgIT0gJzonICYmICpwMSAhPSAnXDAn OyArK3AxLCArK3AyKQorCQkJCXsKKwkJCQkJaWYgKCpwMSA9PSAnXFwnICYmIHAxWzFdICE9 ICdcMCcpCisJCQkJCQkrK3AxOworCQkJCQkqcDIgPSAqcDE7CisJCQkJfQorCQkJCSpwMiA9 ICdcMCc7CisKIAkJCQlyZXQgPSBzdHJkdXAodCk7CiAKIAkJCQlmY2xvc2UoZnApOwpAQCAt ODEyOCwxNSArODE0OSw2IEBAIHBhc3N3b3JkRnJvbUZpbGUoY29uc3QgY2hhciAqaG9zdG5h bWUsIGNvbnN0IGNoYXIgKnBvcnQsCiAJCQkJCXJldHVybiBOVUxMOwogCQkJCX0KIAotCQkJ CS8qIERlLWVzY2FwZSBwYXNzd29yZC4gKi8KLQkJCQlmb3IgKHAxID0gcDIgPSByZXQ7ICpw MSAhPSAnOicgJiYgKnAxICE9ICdcMCc7ICsrcDEsICsrcDIpCi0JCQkJewotCQkJCQlpZiAo KnAxID09ICdcXCcgJiYgcDFbMV0gIT0gJ1wwJykKLQkJCQkJCSsrcDE7Ci0JCQkJCSpwMiA9 ICpwMTsKLQkJCQl9Ci0JCQkJKnAyID0gJ1wwJzsKLQogCQkJCXJldHVybiByZXQ7CiAJCQl9 CiAJCX0KCmJhc2UtY29tbWl0OiBiZDEyNDQzNDMzMzI0MTlkZjZiMzRiZTM4ODgzZWUwYWYz MjI3MDMwCi0tIAoyLjQzLjAKCg== --------------wN5dNT201JJ1FgRLUQ9DCL0V--