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 1x2UYy-005nZs-38 for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Sep 2026 14:06:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1x2UYx-00759M-38 for pgsql-hackers@arkaria.postgresql.org; Fri, 04 Sep 2026 14:06:39 +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 1x2UYd-0071w3-2Y for pgsql-hackers@lists.postgresql.org; Fri, 04 Sep 2026 14:06:19 +0000 Received: from mail-yw1-x112b.google.com ([2607:f8b0:4864:20::112b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1x2UYb-00000002vGs-0AXC for pgsql-hackers@lists.postgresql.org; Fri, 04 Sep 2026 14:06:19 +0000 Received: by mail-yw1-x112b.google.com with SMTP id 00721157ae682-8664769db58so5263527b3.3 for ; Fri, 04 Sep 2026 07:06:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788530775; x=1789135575; darn=lists.postgresql.org; h=cc:to:subject:from:content-language:user-agent:mime-version:date :message-id:content-type:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Vj+1XFNYJ3GOD/vqG587tI8UxypHaDbYtPRL0dsgGxw=; b=C0fYFgFJkASeK64Uz2VeILmmKdXhtRrJHRlwcnOYMLQB85Ey61tisXJeZbrmLzEwQB nTxBTkr4lEbMLJkn5VuYSN1STkl0Pzd+bljR283qpS/Pk2RQ9qAatVWt4mJcZ/wPq4Qr bpp0GDmxc7n60S1li33GdqPRAWiKPiT7N3bmvFOuAcILKsotcoNBksAO/NneiK0oua4L MsclZwZN5+V/penE9QOJ9CBPyNRPt1m4M9Q6ra6eCIN3iGDabCX0QIR75TVeNSyrfmNM h/Ru1J01SS5M6Xqpwh6tND/4h06kEiSvMu7U/ZD+Bj0ULiWGZqSDeByLyuvum7JN2PAy /lOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788530775; x=1789135575; h=cc:to:subject:from:content-language: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=Vj+1XFNYJ3GOD/vqG587tI8UxypHaDbYtPRL0dsgGxw=; b=Z8HmhX6+1+UOYg3Fdedzne8xg7YtRL47uEO4XYj65FOLVC8mdMqF9hekq6uwuMjZhA e1QVVcY8E9FWRpf5LM62qiLaheV1QFGUpJeZ/Hd+rPSXCbW9e1R3/k3996wGvoevVQUH fQpeZfIFi0xzbbi23UCTs+kotpGDNIn7FhJ5pyvwi4ofGGjhVmcUvn43dvlUNB2ZRVbq wS14/Q/pdHA4231NuD23W4xxULhG58ZERvnT/SdUveMzjSLqsGAxoQ8D8F1K5BwgU4TN i5QYmBS0E4ZPx5qmtTF7/H2tKnsowZ3ezpnrAEkr1ueUR/98mRBbP0XIcGHBeoA2AGwc rkNQ== X-Gm-Message-State: AFuF++klyFSVpn3AqUFnJVkNmWYeq3SSB+Kk9E3MiO+s24yM49Gfj4/K O4O5FYxHsHVOZXlxR/fESZrSfE7SU0Z4WTEf2Ov/mpnjnu9rumHtvfGNUQJiHTBVOzE= X-Gm-Gg: AYBFou1pv0LGZljysbuu4iNoRFD4NygXN1qOxb4IxtqL2iWhQ/GKCNlgABjl2RwdJp2 hKQfYxwtU4gDVNJWuSsHg1Knv62Hbfh1HkBR2B1TEjaR1ZlDg9CDdGtn4R4tsykwDRghK8pqcnA cC+hbMvyXE29jztLI4rm+TFBXEgWK+m0FUAsrimTCvvtBpTCXDCZNnShbyary7hN7bkjIaSljIv XcrKNT8ypPwqWPLOV6G97HoJxw4t0T3N5aKcYC8hxJvJgKDtLTsFp80EoTV2GrwC93/7fH7N5O/ J0WTuBiPWnZSv9qOTo+GycRGMqFR9t6ag5AyYdOUTFB6vcbcWTyhXx2IatV26Fn6LSGat/0A/WY fnQa0mcEeCEZ9VfgAdSQnxeTsEEYaK+bDRttD5VejJzSF2tGbMuXdHu5+RTzsIGJHz2oEV7Y7dP ww8LhauPrsO8FoM78Kyg9vDEOX+I88V8trsF+8Fn9gYefT4mJWp1R3QEFvlHPzFqVd03Mg5iUeb +wL3JO0KjD2 X-Received: by 2002:a05:690c:a785:b0:855:f387:98c0 with SMTP id 00721157ae682-87127d27776mr30946277b3.29.1788530770414; Fri, 04 Sep 2026 07:06:10 -0700 (PDT) Received: from [192.168.88.177] ([201.180.204.81]) by smtp.gmail.com with ESMTPSA id 00721157ae682-8714b720d82sm18505807b3.41.2026.09.04.07.06.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 04 Sep 2026 07:06:09 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------nWoy2oPOgo0owtsmtY0GurlJ" Message-ID: Date: Fri, 4 Sep 2026 11:06:06 -0300 MIME-Version: 1.0 User-Agent: Betterbird (Linux) Content-Language: en-US From: Diego Subject: [PATCH] libpq: Add PQpassfileLookup() To: pgsql-hackers@lists.postgresql.org Cc: Denis Smirnov , Jacob Champion 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. --------------nWoy2oPOgo0owtsmtY0GurlJ Content-Type: multipart/alternative; boundary="------------N94Ofz3M5E8KIUK9dJBZpBH8" --------------N94Ofz3M5E8KIUK9dJBZpBH8 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi hackers, This grew out of the portaddr thread [1]. The problem: an application that connects through an intermediary, such as a local SSH tunnel on a dynamic port, connects to a host and port that no longer match the password file entry written for the real server, so the .pgpass lookup comes up empty — and the only way out today is to reimplement the passfile parser on the client side. After portaddr was withdrawn, Denis Smirnov suggested exposing the existing lookup as a public API instead [2]: > I think a better solution would be to expose the existing > passwordFromFile() code through a new public libpq API, perhaps > PQpassfileLookup(). > > Then pgcli could look up the password using the original host and > port, and connect to the local tunnel port with that password. This > would avoid both a new connection parameter and a separate .pgpass > parser in each client. The attached patch does exactly that. The function is a thin wrapper around the existing passwordFromFile():     char *PQpassfileLookup(const char *hostname, const char *port,                            const char *dbname, const char *username,                            const char *passfile); The first four arguments correspond to the fields of a passfile line and behave as they do during connection establishment: a NULL or empty hostname is matched as "localhost" (including the default socket directory rule), and a NULL or empty port becomes the compiled-in default. dbname and username get no defaults — resolving those belongs to the conninfo layer, and a caller of this function already knows them. If passfile is NULL or empty, PGPASSFILE and then the default location are used, as for a connection. The return value is malloc'd (to be freed with PQfreemem), or NULL when no password could be found. The permission check also behaves exactly as during connection establishment: warn on stderr and ignore the file. For tests, I added a --passfile mode to libpq_testclient and a new TAP test (t/007_passfile.pl) covering matching, wildcards, escaping and de-escaping, the localhost rule, PGPASSFILE, and the permission check. The lookup is purely client-side, so none of it needs a server. To show it end to end, a small PoC is attached too (poc-passfilelookup.c). The setup: a server on 127.0.0.1:5440, this passfile line, written before any tunnel exists:     127.0.0.1:5440:postgres:tuser:sekret and a "tunnel" (a TCP relay) that binds port 0, so the kernel picks the local port at that moment — 41395 on this run. The connection through the tunnel cannot use the passfile today, with or without this patch applied (nothing changes in connection establishment):     $ psql -w "host=127.0.0.1 port=41395 user=tuser dbname=postgres"     psql: error: connection to server at "127.0.0.1", port 41395 failed: fe_sendauth: no password supplied With the patch, the client makes the two calls — look up under the real host and port, connect to the local one:     $ ./poc-passfilelookup 127.0.0.1 5440 postgres tuser 41395     PQpassfileLookup("127.0.0.1", "5440", "postgres", "tuser", NULL) = "sekret"     connected to 127.0.0.1:41395 as tuser -> OK Against an unpatched libpq the PoC does not even link (undefined reference to `PQpassfileLookup'), which is a fair summary of the status quo: the only way a client can do this today is by parsing the passfile itself. I'll register this in the next open CommitFest. [1] https://postgr.es/m/70436540-9d77-4014-89af-462881ed18d9@gmail.com [2] https://postgr.es/m/B2EDB5AE-27F7-4580-871E-1C2433BAEF18@gmail.com Thank you, BR, Diego --------------N94Ofz3M5E8KIUK9dJBZpBH8 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi hackers,

This grew out of the portaddr thread [1]. The problem: an application
that connects through an intermediary, such as a local SSH tunnel on a
dynamic port, connects to a host and port that no longer match the
password file entry written for the real server, so the .pgpass lookup
comes up empty — and the only way out today is to reimplement the
passfile parser on the client side.

After portaddr was withdrawn, Denis Smirnov suggested exposing the
existing lookup as a public API instead [2]:

> I think a better solution would be to expose the existing
> passwordFromFile() code through a new public libpq API, perhaps
> PQpassfileLookup().
>
> Then pgcli could look up the password using the original host and
> port, and connect to the local tunnel port with that password. This
> would avoid both a new connection parameter and a separate .pgpass
> parser in each client.

The attached patch does exactly that. The function is a thin wrapper
around the existing passwordFromFile():

    char *PQpassfileLookup(const char *hostname, const char *port,
                           const char *dbname, const char *username,
                           const char *passfile);

The first four arguments correspond to the fields of a passfile line
and behave as they do during connection establishment: a NULL or empty
hostname is matched as "localhost" (including the default socket
directory rule), and a NULL or empty port becomes the compiled-in
default. dbname and username get no defaults — resolving those belongs
to the conninfo layer, and a caller of this function already knows
them. If passfile is NULL or empty, PGPASSFILE and then the default
location are used, as for a connection.

The return value is malloc'd (to be freed with PQfreemem), or NULL
when no password could be found. The permission check also behaves
exactly as during connection establishment: warn on stderr and ignore
the file.

For tests, I added a --passfile mode to libpq_testclient and a new TAP
test (t/007_passfile.pl) covering matching, wildcards, escaping and
de-escaping, the localhost rule, PGPASSFILE, and the permission check.
The lookup is purely client-side, so none of it needs a server.

To show it end to end, a small PoC is attached too
(poc-passfilelookup.c). The setup: a server on 127.0.0.1:5440, this
passfile line, written before any tunnel exists:

    127.0.0.1:5440:postgres:tuser:sekret

and a "tunnel" (a TCP relay) that binds port 0, so the kernel picks
the local port at that moment — 41395 on this run. The connection
through the tunnel cannot use the passfile today, with or without this
patch applied (nothing changes in connection establishment):

    $ psql -w "host=127.0.0.1 port=41395 user=tuser dbname=postgres"
    psql: error: connection to server at "127.0.0.1", port 41395 failed: fe_sendauth: no password supplied

With the patch, the client makes the two calls — look up under the
real host and port, connect to the local one:

    $ ./poc-passfilelookup 127.0.0.1 5440 postgres tuser 41395
    PQpassfileLookup("127.0.0.1", "5440", "postgres", "tuser", NULL) = "sekret"
    connected to 127.0.0.1:41395 as tuser -> OK

Against an unpatched libpq the PoC does not even link (undefined
reference to `PQpassfileLookup'), which is a fair summary of the
status quo: the only way a client can do this today is by parsing the
passfile itself.

I'll register this in the next open CommitFest.

[1] https://postgr.es/m/70436540-9d77-4014-89af-462881ed18d9@gmail.com
[2] https://postgr.es/m/B2EDB5AE-27F7-4580-871E-1C2433BAEF18@gmail.com

Thank you,
BR,
Diego

--------------N94Ofz3M5E8KIUK9dJBZpBH8-- --------------nWoy2oPOgo0owtsmtY0GurlJ Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-libpq-Add-PQpassfileLookup.patch" Content-Disposition: attachment; filename="v1-0001-libpq-Add-PQpassfileLookup.patch" Content-Transfer-Encoding: base64 RnJvbSAxMTlhMGNkN2RmYTcyZmVkY2UxYmVkYTRlYTYxNzJkNWM5MzU3MDhjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEaWVnbyA8bXJzdGVwaGVuYW1lbGxAZ21haWwuY29t PgpEYXRlOiBNb24sIDMxIEF1ZyAyMDI2IDE2OjM4OjUzIC0wMzAwClN1YmplY3Q6IFtQQVRD SCB2MV0gbGlicHE6IEFkZCBQUXBhc3NmaWxlTG9va3VwKCkKCkFuIGFwcGxpY2F0aW9uIHRo YXQgY29ubmVjdHMgdGhyb3VnaCBhbiBpbnRlcm1lZGlhcnksIHN1Y2ggYXMgYSBsb2NhbApT U0ggdHVubmVsLCBjb25uZWN0cyB0byBhIGhvc3QgYW5kIHBvcnQgdGhhdCBubyBsb25nZXIg bWF0Y2ggdGhlCnBhc3N3b3JkIGZpbGUgZW50cnkgd3JpdHRlbiBmb3IgdGhlIHJlYWwgc2Vy dmVyLCBzbyBsaWJwcSdzIHBhc3N3b3JkCmZpbGUgbG9va3VwIGNvbWVzIHVwIGVtcHR5IGR1 cmluZyBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuICBVbnRpbCBub3csCnN1Y2ggYW4gYXBw bGljYXRpb24gaGFkIHRvIHJlaW1wbGVtZW50IHRoZSBwYXNzd29yZCBmaWxlIHBhcnNlciBv biBpdHMKc2lkZSB0byBrZWVwIC5wZ3Bhc3Mgd29ya2luZy4KCkV4cG9zZSB0aGUgZXhpc3Rp bmcgbG9va3VwIGFzIGEgcHVibGljIGZ1bmN0aW9uLCBQUXBhc3NmaWxlTG9va3VwKCksIHNv CnRoYXQgYSBjbGllbnQgY2FuIGxvb2sgdXAgdGhlIHBhc3N3b3JkIHVuZGVyIHRoZSByZWFs IHNlcnZlcidzIGhvc3QgYW5kCnBvcnQgYW5kIHBhc3MgdGhlIHJlc3VsdCBhcyB0aGUgcGFz c3dvcmQgY29ubmVjdGlvbiBwYXJhbWV0ZXIgd2hpbGUKY29ubmVjdGluZyB0byB0aGUgaW50 ZXJtZWRpYXJ5J3MgYWRkcmVzcy4gIFRoZSBmdW5jdGlvbiBhcHBsaWVzIHRoZQpzYW1lIHJ1 bGVzIGFzIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudDogdGhlIHNhbWUgZmllbGQgbWF0Y2hp bmcgYW5kCmRlLWVzY2FwaW5nLCB0aGUgc2FtZSBsb2NhbGhvc3QgYW5kIGRlZmF1bHQtcG9y dCBoYW5kbGluZywgdGhlIHNhbWUKcGVybWlzc2lvbiBjaGVja3MsIGFuZCB0aGUgc2FtZSBm YWxsYmFjayB0byBQR1BBU1NGSUxFIGFuZCB0aGUgZGVmYXVsdApwYXNzd29yZCBmaWxlIGxv Y2F0aW9uIHdoZW4gbm8gZmlsZSBpcyBnaXZlbi4KCkFsc28gYWRkIGEgLS1wYXNzZmlsZSBt b2RlIHRvIGxpYnBxX3Rlc3RjbGllbnQsIGFuZCBhIFRBUCB0ZXN0CmV4ZXJjaXNpbmcgdGhl IGxvb2t1cDsgaXQgbmVlZHMgbm8gc2VydmVyLgoKQXV0aG9yOiBEaWVnbyA8bXJzdGVwaGVu YW1lbGxAZ21haWwuY29tPgpTdWdnZXN0ZWQtYnk6IERlbmlzIFNtaXJub3YgPGRhcnRodW5p eEBnbWFpbC5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQjJFREI1QUUt MjdGNy00NTgwLTg3MUUtMUMyNDMzQkFFRjE4QGdtYWlsLmNvbQotLS0KIGRvYy9zcmMvc2dt bC9saWJwcS5zZ21sICAgICAgICAgICAgICAgICAgICAgIHwgIDU5ICsrKysrKysrKwogc3Jj L2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQgICAgICAgICAgICAgfCAgIDEgKwogc3Jj L2ludGVyZmFjZXMvbGlicHEvZmUtY29ubmVjdC5jICAgICAgICAgICAgfCAgNTAgKysrKysr KysKIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmggICAgICAgICAgICAgIHwgICA5 ICsrCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9tZXNvbi5idWlsZCAgICAgICAgICAgICB8ICAg MSArCiBzcmMvaW50ZXJmYWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5wbCAgICAgICB8IDEy OCArKysrKysrKysrKysrKysrKysrCiBzcmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0L2xpYnBx X3Rlc3RjbGllbnQuYyB8ICAzNiArKysrKy0KIDcgZmlsZXMgY2hhbmdlZCwgMjgzIGluc2Vy dGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvaW50ZXJm YWNlcy9saWJwcS90LzAwN19wYXNzZmlsZS5wbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dt bC9saWJwcS5zZ21sIGIvZG9jL3NyYy9zZ21sL2xpYnBxLnNnbWwKaW5kZXggNjg0ODdhMzk1 NGYuLjVhNDM5ZDU1ZjgzIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbAor KysgYi9kb2Mvc3JjL3NnbWwvbGlicHEuc2dtbApAQCAtNzk3Niw2ICs3OTc2LDU5IEBAIGNo YXIgKlBRZW5jcnlwdFBhc3N3b3JkKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgY2hhciAq dXNlcik7CiAgICAgPC9saXN0aXRlbT4KICAgIDwvdmFybGlzdGVudHJ5PgogCisgICA8dmFy bGlzdGVudHJ5IGlkPSJsaWJwcS1QUXBhc3NmaWxlTG9va3VwIj4KKyAgICA8dGVybT48ZnVu Y3Rpb24+UFFwYXNzZmlsZUxvb2t1cDwvZnVuY3Rpb24+PGluZGV4dGVybT48cHJpbWFyeT5Q UXBhc3NmaWxlTG9va3VwPC9wcmltYXJ5PjwvaW5kZXh0ZXJtPjwvdGVybT4KKworICAgIDxs aXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICBMb29rcyB1cCBhIHBhc3N3b3JkIGluIGEg cGFzc3dvcmQgZmlsZQorICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJsaWJwcS1wZ3Bhc3Mi Lz4pLgorPHN5bm9wc2lzPgorY2hhciAqUFFwYXNzZmlsZUxvb2t1cChjb25zdCBjaGFyICpo b3N0bmFtZSwgY29uc3QgY2hhciAqcG9ydCwgY29uc3QgY2hhciAqZGJuYW1lLCBjb25zdCBj aGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqcGFzc2ZpbGUpOworPC9zeW5vcHNpcz4KKyAg ICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgorICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3Jt cyB0aGUgc2FtZSBwYXNzd29yZCBmaWxlIGxvb2t1cCB0aGF0IGNvbm5lY3Rpb24KKyAgICAg IGVzdGFibGlzaG1lbnQgcGVyZm9ybXMgd2hlbiBubyBwYXNzd29yZCBoYXMgYmVlbiBzcGVj aWZpZWQsIGFuZAorICAgICAgcmV0dXJucyB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgZmlyc3Qg bWF0Y2hpbmcgbGluZS4gIEl0IGlzIGludGVuZGVkCisgICAgICBmb3IgYXBwbGljYXRpb25z IHRoYXQgY29ubmVjdCB0aHJvdWdoIGFuIGludGVybWVkaWFyeSwgZm9yIGV4YW1wbGUgYQor ICAgICAgbG9jYWwgU1NIIHR1bm5lbDogc3VjaCBhbiBhcHBsaWNhdGlvbiBjYW4gbG9vayB1 cCB0aGUgcGFzc3dvcmQgdW5kZXIKKyAgICAgIHRoZSByZWFsIHNlcnZlcidzIGhvc3QgYW5k IHBvcnQsIGFuZCB0aGVuIHBhc3MgdGhlIHJlc3VsdCBhcyB0aGUKKyAgICAgIDx4cmVmIGxp bmtlbmQ9ImxpYnBxLWNvbm5lY3QtcGFzc3dvcmQiLz4gY29ubmVjdGlvbiBwYXJhbWV0ZXIg d2hpbGUKKyAgICAgIGNvbm5lY3RpbmcgdG8gdGhlIGludGVybWVkaWFyeSdzIGFkZHJlc3Mu CisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSA8cGFyYW1ldGVyPmhv c3RuYW1lPC9wYXJhbWV0ZXI+LCA8cGFyYW1ldGVyPnBvcnQ8L3BhcmFtZXRlcj4sCisgICAg ICA8cGFyYW1ldGVyPmRibmFtZTwvcGFyYW1ldGVyPiBhbmQgPHBhcmFtZXRlcj51c2VybmFt ZTwvcGFyYW1ldGVyPgorICAgICAgYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpcnN0 IGZvdXIgZmllbGRzIG9mIGEgcGFzc3dvcmQgZmlsZQorICAgICAgbGluZS4gIElmIDxwYXJh bWV0ZXI+aG9zdG5hbWU8L3BhcmFtZXRlcj4gaXMgPHN5bWJvbD5OVUxMPC9zeW1ib2w+IG9y CisgICAgICBlbXB0eSwgb3IgbWF0Y2hlcyA8YXBwbGljYXRpb24+bGlicHE8L2FwcGxpY2F0 aW9uPidzIGRlZmF1bHQgc29ja2V0CisgICAgICBkaXJlY3RvcnkgcGF0aCwgdGhlIGhvc3Qg bmFtZSA8bGl0ZXJhbD5sb2NhbGhvc3Q8L2xpdGVyYWw+IGlzCisgICAgICBzZWFyY2hlZCBm b3I7IGlmIDxwYXJhbWV0ZXI+cG9ydDwvcGFyYW1ldGVyPiBpcyA8c3ltYm9sPk5VTEw8L3N5 bWJvbD4KKyAgICAgIG9yIGVtcHR5LCB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCBwb3J0IGlz IHVzZWQuICBObyBkZWZhdWx0cyBhcmUKKyAgICAgIGFwcGxpZWQgZm9yIDxwYXJhbWV0ZXI+ ZGJuYW1lPC9wYXJhbWV0ZXI+IGFuZAorICAgICAgPHBhcmFtZXRlcj51c2VybmFtZTwvcGFy YW1ldGVyPjsgaWYgZWl0aGVyIGlzIDxzeW1ib2w+TlVMTDwvc3ltYm9sPgorICAgICAgb3Ig ZW1wdHksIG5vIHBhc3N3b3JkIGlzIHJldHVybmVkLgorICAgICAgPHBhcmFtZXRlcj5wYXNz ZmlsZTwvcGFyYW1ldGVyPiBpcyB0aGUgcGFzc3dvcmQgZmlsZSB0byB1c2U7IGlmIGl0IGlz CisgICAgICA8c3ltYm9sPk5VTEw8L3N5bWJvbD4gb3IgZW1wdHksIHRoZSBmaWxlIG5hbWVk IGJ5IHRoZQorICAgICAgPGVudmFyPlBHUEFTU0ZJTEU8L2VudmFyPiBlbnZpcm9ubWVudCB2 YXJpYWJsZSBpcyB1c2VkIGlmIHNldCwgZWxzZQorICAgICAgdGhlIGRlZmF1bHQgcGFzc3dv cmQgZmlsZSBsb2NhdGlvbi4KKyAgICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgorICAgICAg VGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyBhbGxvY2F0ZWQgYnkgPGZ1bmN0aW9uPm1h bGxvYzwvZnVuY3Rpb24+LAorICAgICAgb3IgPHN5bWJvbD5OVUxMPC9zeW1ib2w+IGlmIG5v IHBhc3N3b3JkIGNvdWxkIGJlIGZvdW5kLiAgVXNlCisgICAgICA8eHJlZiBsaW5rZW5kPSJs aWJwcS1QUWZyZWVtZW0iLz4gdG8gZnJlZSB0aGUgcmVzdWx0IHdoZW4gZG9uZSB3aXRoCisg ICAgICBpdC4gIFRoZSBwYXNzd29yZCBmaWxlIHBlcm1pc3Npb24gcmVxdWlyZW1lbnRzIGRl c2NyaWJlZCBpbgorICAgICAgPHhyZWYgbGlua2VuZD0ibGlicHEtcGdwYXNzIi8+IGFwcGx5 LCBhbmQsIGFzIGR1cmluZyBjb25uZWN0aW9uCisgICAgICBlc3RhYmxpc2htZW50LCBhIHdh cm5pbmcgaXMgd3JpdHRlbiB0byA8ZmlsZW5hbWU+c3RkZXJyPC9maWxlbmFtZT4KKyAgICAg IGlmIHRoZSBmaWxlIGlzIGlnbm9yZWQgYmVjYXVzZSBvZiB0aGVtLgorICAgICA8L3BhcmE+ CisgICAgPC9saXN0aXRlbT4KKyAgIDwvdmFybGlzdGVudHJ5PgorCiAgICA8dmFybGlzdGVu dHJ5IGlkPSJsaWJwcS1QUW1ha2VFbXB0eVBHcmVzdWx0Ij4KICAgICA8dGVybT48ZnVuY3Rp b24+UFFtYWtlRW1wdHlQR3Jlc3VsdDwvZnVuY3Rpb24+PGluZGV4dGVybT48cHJpbWFyeT5Q UW1ha2VFbXB0eVBHcmVzdWx0PC9wcmltYXJ5PjwvaW5kZXh0ZXJtPjwvdGVybT4KIApAQCAt OTQ2Miw2ICs5NTE1LDEyIEBAIG15RXZlbnRQcm9jKFBHRXZlbnRJZCBldnRJZCwgdm9pZCAq ZXZ0SW5mbywgdm9pZCAqcGFzc1Rocm91Z2gpCiAgICBpcyBhc3N1bWVkIHRoYXQgdGhlIGZp bGUgaXMgc3RvcmVkIGluIGEgZGlyZWN0b3J5IHRoYXQgaXMgc2VjdXJlLCBzbwogICAgbm8g c3BlY2lhbCBwZXJtaXNzaW9ucyBjaGVjayBpcyBtYWRlLgogICA8L3BhcmE+CisKKyAgPHBh cmE+CisgICBBbiBhcHBsaWNhdGlvbiBjYW4gcGVyZm9ybSB0aGUgc2FtZSBwYXNzd29yZCBm aWxlIGxvb2t1cCB0aGF0CisgICBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgcGVyZm9ybXMg YnkgY2FsbGluZworICAgPHhyZWYgbGlua2VuZD0ibGlicHEtUFFwYXNzZmlsZUxvb2t1cCIv Pi4KKyAgPC9wYXJhPgogIDwvc2VjdDE+CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFj ZXMvbGlicHEvZXhwb3J0cy50eHQgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4 dAppbmRleCAxZTNkNWJkNTg2Ny4uZGVmNjFkNjM3MjQgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRl cmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0CisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4 cG9ydHMudHh0CkBAIC0yMTEsMyArMjExLDQgQEAgUFFkZWZhdWx0QXV0aERhdGFIb29rICAg ICAyMDgKIFBRZnVsbFByb3RvY29sVmVyc2lvbiAgICAgMjA5CiBhcHBlbmRQUUV4cEJ1ZmZl clZBICAgICAgIDIxMAogUFFnZXRUaHJlYWRMb2NrICAgICAgICAgICAyMTEKK1BRcGFzc2Zp bGVMb29rdXAgICAgICAgICAgMjEyCmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJw cS9mZS1jb25uZWN0LmMgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1jb25uZWN0LmMKaW5k ZXggZWM5OGM1OGE0MDcuLmU2YmVkYThjMDAyIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNl cy9saWJwcS9mZS1jb25uZWN0LmMKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtY29u bmVjdC5jCkBAIC04MTQyLDYgKzgxNDIsNTYgQEAgcGFzc3dvcmRGcm9tRmlsZShjb25zdCBj aGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqcG9ydCwKIH0KIAogCisvKgorICogUFFwYXNz ZmlsZUxvb2t1cAorICoKKyAqIExvb2sgdXAgYSBwYXNzd29yZCBpbiBhIHBhc3N3b3JkIGZp bGUsIGFwcGx5aW5nIHRoZSBzYW1lIHJ1bGVzIHRoYXQKKyAqIGNvbm5lY3Rpb24gZXN0YWJs aXNobWVudCBhcHBsaWVzIHdoZW4gbm8gcGFzc3dvcmQgaGFzIGJlZW4gc3BlY2lmaWVkLgor ICogVGhpcyBsZXRzIGFwcGxpY2F0aW9ucyB0aGF0IGNvbm5lY3QgdGhyb3VnaCBhbiBpbnRl cm1lZGlhcnkgKGZvcgorICogZXhhbXBsZSwgYSBsb2NhbCBTU0ggdHVubmVsKSBsb29rIHVw IHRoZSBwYXNzd29yZCB1bmRlciB0aGUgcmVhbAorICogc2VydmVyJ3MgaG9zdCBhbmQgcG9y dCB3aGlsZSBjb25uZWN0aW5nIGVsc2V3aGVyZS4KKyAqCisgKiBUaGUgZmlyc3QgZm91ciBh cmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgZmllbGRzIG9mIGEgcGFzc3dvcmQgZmlsZQor ICogbGluZSwgYW5kIE5VTEwgb3IgZW1wdHkgdmFsdWVzIGFyZSB0cmVhdGVkIHRoZSBzYW1l IHdheSBhcyBkdXJpbmcKKyAqIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudDogaG9zdG5hbWUg aXMgbWF0Y2hlZCBhcyAibG9jYWxob3N0IiwgcG9ydAorICogZGVmYXVsdHMgdG8gREVGX1BH UE9SVF9TVFIsIHdoaWxlIGRibmFtZSBhbmQgdXNlcm5hbWUgbXVzdCBiZQorICogc3VwcGxp ZWQuICBJZiBwYXNzZmlsZSBpcyBOVUxMIG9yIGVtcHR5LCBQR1BBU1NGSUxFIG9yIHRoZSBk ZWZhdWx0CisgKiBwYXNzd29yZCBmaWxlIGxvY2F0aW9uIGlzIHVzZWQuCisgKgorICogUmV0 dXJucyBhIG1hbGxvYydkIHN0cmluZyB0aGUgY2FsbGVyIG11c3QgZnJlZSB3aXRoIFBRZnJl ZW1lbSgpLCBvcgorICogTlVMTCBpZiBubyBwYXNzd29yZCBjb3VsZCBiZSBmb3VuZC4KKyAq LworY2hhciAqCitQUXBhc3NmaWxlTG9va3VwKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25z dCBjaGFyICpwb3J0LAorCQkJCSBjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKnVz ZXJuYW1lLAorCQkJCSBjb25zdCBjaGFyICpwYXNzZmlsZSkKK3sKKwljaGFyCQlwZ3Bhc3Nm aWxlW01BWFBHUEFUSF07CisJY29uc3QgY2hhciAqZXJybXNnOworCisJaWYgKHBhc3NmaWxl ID09IE5VTEwgfHwgcGFzc2ZpbGVbMF0gPT0gJ1wwJykKKwl7CisJCWNvbnN0IGNoYXIgKnBn cGFzc2VudiA9IGdldGVudigiUEdQQVNTRklMRSIpOworCisJCWlmIChwZ3Bhc3NlbnYgIT0g TlVMTCAmJiBwZ3Bhc3NlbnZbMF0gIT0gJ1wwJykKKwkJCXN0cmxjcHkocGdwYXNzZmlsZSwg cGdwYXNzZW52LCBzaXplb2YocGdwYXNzZmlsZSkpOworCQllbHNlCisJCXsKKwkJCWNoYXIJ CWhvbWVkaXJbTUFYUEdQQVRIXTsKKworCQkJaWYgKCFwcUdldEhvbWVEaXJlY3RvcnkoaG9t ZWRpciwgc2l6ZW9mKGhvbWVkaXIpKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXNucHJpbnRm KHBncGFzc2ZpbGUsIHNpemVvZihwZ3Bhc3NmaWxlKSwgIiVzLyVzIiwKKwkJCQkJIGhvbWVk aXIsIFBHUEFTU0ZJTEUpOworCQl9CisJCXBhc3NmaWxlID0gcGdwYXNzZmlsZTsKKwl9CisK KwlyZXR1cm4gcGFzc3dvcmRGcm9tRmlsZShob3N0bmFtZSwgcG9ydCwgZGJuYW1lLCB1c2Vy bmFtZSwKKwkJCQkJCQlwYXNzZmlsZSwgJmVycm1zZyk7Cit9CisKKwogLyoKICAqCUlmIHRo ZSBjb25uZWN0aW9uIGZhaWxlZCBkdWUgdG8gYmFkIHBhc3N3b3JkLCB3ZSBzaG91bGQgbWVu dGlvbgogICoJaWYgd2UgZ290IHRoZSBwYXNzd29yZCBmcm9tIHRoZSBwZ3Bhc3NmaWxlLgpk aWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtZmUuaCBiL3NyYy9pbnRl cmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgKaW5kZXggZjUxZmQ2MjBiMGEuLmI2MzQ4OWEzYmZl IDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oCisrKyBiL3Ny Yy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgKQEAgLTY5LDYgKzY5LDEwIEBAIGV4dGVy biAiQyIKIC8qIEluZGljYXRlcyBwcmVzZW5jZSBvZiB0aGUgUFFBVVRIREFUQV9PQVVUSF9C RUFSRVJfVE9LRU5fVjIgYXV0aGRhdGEgaG9vayAqLwogI2RlZmluZSBMSUJQUV9IQVNfT0FV VEhfQkVBUkVSX1RPS0VOX1YyIDEKIAorLyogRmVhdHVyZXMgYWRkZWQgaW4gUG9zdGdyZVNR TCB2MjA6ICovCisvKiBJbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgUFFwYXNzZmlsZUxvb2t1cCAq LworI2RlZmluZSBMSUJQUV9IQVNfUEFTU0ZJTEVfTE9PS1VQIDEKKwogLyoKICAqIE9wdGlv biBmbGFncyBmb3IgUFFjb3B5UmVzdWx0CiAgKi8KQEAgLTM2Nyw2ICszNzEsMTEgQEAgZXh0 ZXJuIFBRY29ubmluZm9PcHRpb24gKlBRY29ubmluZm8oUEdjb25uICpjb25uKTsKIC8qIGZy ZWUgdGhlIGRhdGEgc3RydWN0dXJlIHJldHVybmVkIGJ5IFBRY29ubmRlZmF1bHRzKCkgb3Ig UFFjb25uaW5mb1BhcnNlKCkgKi8KIGV4dGVybiB2b2lkIFBRY29ubmluZm9GcmVlKFBRY29u bmluZm9PcHRpb24gKmNvbm5PcHRpb25zKTsKIAorLyogbG9vayB1cCBhIHBhc3N3b3JkIGlu IGEgcGFzc3dvcmQgZmlsZSAqLworZXh0ZXJuIGNoYXIgKlBRcGFzc2ZpbGVMb29rdXAoY29u c3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKnBvcnQsCisJCQkJCQkJICBjb25zdCBj aGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorCQkJCQkJCSAgY29uc3QgY2hh ciAqcGFzc2ZpbGUpOworCiAvKgogICogY2xvc2UgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBh bmQgcmVlc3RhYmxpc2ggYSBuZXcgb25lIHdpdGggdGhlIHNhbWUKICAqIHBhcmFtZXRlcnMK ZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL21lc29uLmJ1aWxkIGIvc3JjL2lu dGVyZmFjZXMvbGlicHEvbWVzb24uYnVpbGQKaW5kZXggYjBhZTcyMTY3YTEuLmI5ZjkzZGRi ODUyIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9tZXNvbi5idWlsZAorKysg Yi9zcmMvaW50ZXJmYWNlcy9saWJwcS9tZXNvbi5idWlsZApAQCAtMTYxLDYgKzE2MSw3IEBA IHRlc3RzICs9IHsKICAgICAgICd0LzAwNF9sb2FkX2JhbGFuY2VfZG5zLnBsJywKICAgICAg ICd0LzAwNV9uZWdvdGlhdGVfZW5jcnlwdGlvbi5wbCcsCiAgICAgICAndC8wMDZfc2Vydmlj ZS5wbCcsCisgICAgICAndC8wMDdfcGFzc2ZpbGUucGwnLAogICAgIF0sCiAgICAgJ2Vudic6 IHsKICAgICAgICd3aXRoX3NzbCc6IHNzbF9saWJyYXJ5LApkaWZmIC0tZ2l0IGEvc3JjL2lu dGVyZmFjZXMvbGlicHEvdC8wMDdfcGFzc2ZpbGUucGwgYi9zcmMvaW50ZXJmYWNlcy9saWJw cS90LzAwN19wYXNzZmlsZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uZDVjODM5ZmY1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW50ZXJmYWNlcy9s aWJwcS90LzAwN19wYXNzZmlsZS5wbApAQCAtMCwwICsxLDEyOCBAQAorIyBDb3B5cmlnaHQg KGMpIDIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCit1c2Ugc3Ry aWN0OwordXNlIHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOwordXNlIEZpbGU6OkNvcHk7Cit1 c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsKKworIyBUZXN0 IFBRcGFzc2ZpbGVMb29rdXAoKSwgdmlhIGxpYnBxX3Rlc3RjbGllbnQgLS1wYXNzZmlsZS4g IFRoZSBsb29rdXAgaXMKKyMgcHVyZWx5IGNsaWVudC1zaWRlLCBzbyBubyBzZXJ2ZXIgaXMg aW52b2x2ZWQuICBBbiBhcmd1bWVudCBvZiAiLSIgaXMKKyMgcGFzc2VkIHRvIHRoZSBmdW5j dGlvbiBhcyBOVUxMLgorCitteSAkdGQgPSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczo6dGVt cGRpcjsKK215ICRwYXNzZmlsZSA9ICIkdGQvcGdwYXNzIjsKKworZGVsZXRlICRFTlZ7UEdQ QVNTRklMRX07CisKK2FwcGVuZF90b19maWxlKCRwYXNzZmlsZSwgPDwnRU9GJyk7CisjIGEg Y29tbWVudCBsaW5lCitzZXJ2ZXIuZXhhbXBsZS5jb206NTQzMjpwcm9kZGI6ZGllZ286c2Vj cmV0MQorc2VydmVyLmV4YW1wbGUuY29tOjU0MzM6KjpkaWVnbzpzZWNyZXQyCitsb2NhbGhv c3Q6KjpteWRiOm1lOmxvY2FscHcKK3NwZWNpYWwuZXhhbXBsZS5jb206NTQzMjpkYlw6Y29s b246dXNcXGVyOnBhXFxzc1w6d29yZAorKjoqOio6ZmFsbGJhY2s6ZmFsbHB3OmFueXRoaW5n IGFmdGVyIGFuIHVuZXNjYXBlZCBjb2xvbiBpcyBpZ25vcmVkCitzZXJ2ZXIuZXhhbXBsZS5j b206NTQzMjpwcm9kZGI6ZGllZ286c2hhZG93ZWQKK0VPRgorY2htb2QgMDYwMCwgJHBhc3Nm aWxlIG9yIGRpZSAiY2htb2Q6ICQhIjsKKworbXkgKCRvdXQsICRlcnIpOworCisoJG91dCwg JGVycikgPSBydW5fY29tbWFuZCgKKwlbCisJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFz c2ZpbGUnLCAkcGFzc2ZpbGUsCisJCSdzZXJ2ZXIuZXhhbXBsZS5jb20nLCAnNTQzMicsICdw cm9kZGInLCAnZGllZ28nCisJXSk7Citpcygkb3V0LCAnc2VjcmV0MScsICdleGFjdCBtYXRj aCByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyBwYXNzd29yZCcpOworCisoJG91dCwgJGVy cikgPSBydW5fY29tbWFuZCgKKwlbCisJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2Zp bGUnLCAkcGFzc2ZpbGUsCisJCSdzZXJ2ZXIuZXhhbXBsZS5jb20nLCAnNTQzMycsICdhbnlk YicsICdkaWVnbycKKwldKTsKK2lzKCRvdXQsICdzZWNyZXQyJywgJ3dpbGRjYXJkIGZpZWxk IG1hdGNoZXMgYW55IHZhbHVlJyk7CisKKygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAor CVsgJ2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwgJy0nLCAn LScsICdteWRiJywgJ21lJyBdKTsKK2lzKCRvdXQsICdsb2NhbHB3JywgJ05VTEwgaG9zdG5h bWUgYW5kIHBvcnQgbWF0Y2ggYSBsb2NhbGhvc3QgZW50cnknKTsKKworKCRvdXQsICRlcnIp ID0gcnVuX2NvbW1hbmQoCisJWyAnbGlicHFfdGVzdGNsaWVudCcsICctLXBhc3NmaWxlJywg JHBhc3NmaWxlLCAnJywgJy0nLCAnbXlkYicsICdtZScgXSk7Citpcygkb3V0LCAnbG9jYWxw dycsICdlbXB0eSBob3N0bmFtZSBtYXRjaGVzIGEgbG9jYWxob3N0IGVudHJ5Jyk7CisKKygk b3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAn LS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NwZWNpYWwuZXhhbXBsZS5jb20nLCAnNTQz MicsICdkYjpjb2xvbicsICd1c1xcZXInCisJXSk7Citpcygkb3V0LCAncGFcXHNzOndvcmQn LCAnZXNjYXBlZCBjaGFyYWN0ZXJzIGFyZSBtYXRjaGVkIGFuZCBkZS1lc2NhcGVkJyk7CisK Kygkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQn LCAnLS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ2FueWhvc3QnLCAnMTIzNCcsICdhbnlk YicsICdmYWxsYmFjaycKKwldKTsKK2lzKCRvdXQsICdmYWxscHcnLCAncGFzc3dvcmQgZmll bGQgZW5kcyBhdCB0aGUgZmlyc3QgdW5lc2NhcGVkIGNvbG9uJyk7CisKKygkb3V0LCAkZXJy KSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmls ZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1NDMyJywgJ290aGVy ZGInLCAnZGllZ28nCisJXSk7CitpcygkZXJyLCAnbm8gcGFzc3dvcmQgZm91bmQnLCAnbm8g bWF0Y2hpbmcgbGluZSByZXR1cm5zIG5vIHBhc3N3b3JkJyk7CisKKygkb3V0LCAkZXJyKSA9 IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAnLS1wYXNzZmlsZScs ICIkdGQvZG9lc19ub3RfZXhpc3QiLAorCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzIn LCAncHJvZGRiJywgJ2RpZWdvJworCV0pOworaXMoJGVyciwgJ25vIHBhc3N3b3JkIGZvdW5k JywgJ21pc3NpbmcgcGFzc3dvcmQgZmlsZSByZXR1cm5zIG5vIHBhc3N3b3JkJyk7CisKKygk b3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCVsKKwkJJ2xpYnBxX3Rlc3RjbGllbnQnLCAn LS1wYXNzZmlsZScsICRwYXNzZmlsZSwKKwkJJ3NlcnZlci5leGFtcGxlLmNvbScsICc1NDMy JywgJy0nLCAnZGllZ28nCisJXSk7CitpcygkZXJyLCAnbm8gcGFzc3dvcmQgZm91bmQnLCAn TlVMTCBkYm5hbWUgcmV0dXJucyBubyBwYXNzd29yZCcpOworCisoJG91dCwgJGVycikgPSBy dW5fY29tbWFuZCgKKwlbCisJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2ZpbGUnLCAk cGFzc2ZpbGUsCisJCSdzZXJ2ZXIuZXhhbXBsZS5jb20nLCAnNTQzMicsICdwcm9kZGInLCAn LScKKwldKTsKK2lzKCRlcnIsICdubyBwYXNzd29yZCBmb3VuZCcsICdOVUxMIHVzZXJuYW1l IHJldHVybnMgbm8gcGFzc3dvcmQnKTsKKworIyBBIE5VTEwgcGFzc2ZpbGUgZmFsbHMgYmFj ayB0byB0aGUgUEdQQVNTRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3sKKwlsb2NhbCAk RU5We1BHUEFTU0ZJTEV9ID0gJHBhc3NmaWxlOworCisJKCRvdXQsICRlcnIpID0gcnVuX2Nv bW1hbmQoCisJCVsKKwkJCSdsaWJwcV90ZXN0Y2xpZW50JywgJy0tcGFzc2ZpbGUnLCAnLScs CisJCQknc2VydmVyLmV4YW1wbGUuY29tJywgJzU0MzInLCAncHJvZGRiJywgJ2RpZWdvJwor CQldKTsKKwlpcygkb3V0LCAnc2VjcmV0MScsICdOVUxMIHBhc3NmaWxlIGZhbGxzIGJhY2sg dG8gUEdQQVNTRklMRScpOworfQorCitTS0lQOgoreworCXNraXAgJ3Bhc3N3b3JkIGZpbGUg cGVybWlzc2lvbnMgYXJlIG5vdCBjaGVja2VkIG9uIFdpbmRvd3MnLCAyCisJICBpZiAkd2lu ZG93c19vczsKKworCW15ICRwYXNzZmlsZV9pbnNlY3VyZSA9ICIkdGQvcGdwYXNzX2luc2Vj dXJlIjsKKwljb3B5KCRwYXNzZmlsZSwgJHBhc3NmaWxlX2luc2VjdXJlKQorCSAgb3IgZGll ICJjb3VsZCBub3QgY29weSAkcGFzc2ZpbGUgdG8gJHBhc3NmaWxlX2luc2VjdXJlOiAkISI7 CisJY2htb2QgMDY0NCwgJHBhc3NmaWxlX2luc2VjdXJlIG9yIGRpZSAiY2htb2Q6ICQhIjsK KworCSgkb3V0LCAkZXJyKSA9IHJ1bl9jb21tYW5kKAorCQlbCisJCQknbGlicHFfdGVzdGNs aWVudCcsICctLXBhc3NmaWxlJywgJHBhc3NmaWxlX2luc2VjdXJlLAorCQkJJ3NlcnZlci5l eGFtcGxlLmNvbScsICc1NDMyJywgJ3Byb2RkYicsICdkaWVnbycKKwkJXSk7CisJbGlrZSgK KwkJJGVyciwKKwkJcXIvaGFzIGdyb3VwIG9yIHdvcmxkIGFjY2Vzcy8sCisJCSdpbnNlY3Vy ZSBwYXNzd29yZCBmaWxlIGRyYXdzIGEgd2FybmluZycpOworCWxpa2UoJGVyciwgcXIvbm8g cGFzc3dvcmQgZm91bmQvLCAnaW5zZWN1cmUgcGFzc3dvcmQgZmlsZSBpcyBpZ25vcmVkJyk7 Cit9CisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGli cHEvdGVzdC9saWJwcV90ZXN0Y2xpZW50LmMgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0 L2xpYnBxX3Rlc3RjbGllbnQuYwppbmRleCAyMDczMDcwOWVlNy4uYmZkY2U5ODllMzMgMTAw NjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvbGlicHFfdGVzdGNsaWVudC5j CisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvbGlicHFfdGVzdGNsaWVudC5jCkBA IC0yMyw2ICsyMywzOCBAQCBwcmludF9zc2xfbGlicmFyeSh2b2lkKQogCQlwcmludGYoIiVz XG4iLCBsaWIpOwogfQogCisvKgorICogTG9vayB1cCBhIHBhc3N3b3JkIHdpdGggUFFwYXNz ZmlsZUxvb2t1cCgpLiAgVGhlIGFyZ3VtZW50cyBhcmUgcGFzc2ZpbGUsCisgKiBob3N0bmFt ZSwgcG9ydCwgZGJuYW1lIGFuZCB1c2VybmFtZTsgYW4gYXJndW1lbnQgb2YgIi0iIGlzIHBh c3NlZCBhcyBOVUxMLgorICovCitzdGF0aWMgaW50Cit0ZXN0X3Bhc3NmaWxlX2xvb2t1cChp bnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNvbnN0IGNoYXIgKmFyZ3NbNV07CisJY2hh cgkgICAqcGFzc3dvcmQ7CisKKwlpZiAoYXJnYyA8IDcpCisJeworCQlmcHJpbnRmKHN0ZGVy ciwgInVzYWdlOiBsaWJwcV90ZXN0Y2xpZW50IC0tcGFzc2ZpbGUgUEFTU0ZJTEUgSE9TVE5B TUUgUE9SVCBEQk5BTUUgVVNFUk5BTUVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmb3Ig KGludCBpID0gMDsgaSA8IDU7IGkrKykKKwkJYXJnc1tpXSA9IHN0cmNtcChhcmd2W2kgKyAy XSwgIi0iKSA9PSAwID8gTlVMTCA6IGFyZ3ZbaSArIDJdOworCisJcGFzc3dvcmQgPSBQUXBh c3NmaWxlTG9va3VwKGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3Nb MF0pOworCisJaWYgKCFwYXNzd29yZCkKKwl7CisJCWZwcmludGYoc3RkZXJyLCAibm8gcGFz c3dvcmQgZm91bmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGYoIiVzXG4iLCBw YXNzd29yZCk7CisJUFFmcmVlbWVtKHBhc3N3b3JkKTsKKwlyZXR1cm4gMDsKK30KKwogaW50 CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0zMSw3ICs2Myw5IEBAIG1h aW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAkJcHJpbnRfc3NsX2xpYnJhcnkoKTsKIAkJ cmV0dXJuIDA7CiAJfQorCWVsc2UgaWYgKChhcmdjID4gMSkgJiYgIXN0cmNtcChhcmd2WzFd LCAiLS1wYXNzZmlsZSIpKQorCQlyZXR1cm4gdGVzdF9wYXNzZmlsZV9sb29rdXAoYXJnYywg YXJndik7CiAKLQlwcmludGYoImN1cnJlbnRseSBvbmx5IC0tc3NsIGlzIHN1cHBvcnRlZFxu Iik7CisJcHJpbnRmKCJjdXJyZW50bHkgb25seSAtLXNzbCBhbmQgLS1wYXNzZmlsZSBhcmUg c3VwcG9ydGVkXG4iKTsKIAlyZXR1cm4gMTsKIH0KCmJhc2UtY29tbWl0OiA2YTg1NzE1Njgy N2I2YTkzOGJkMDJiOWJmNzI4MWU3YjcxZGZkMDg4Ci0tIAoyLjQzLjAKCg== --------------nWoy2oPOgo0owtsmtY0GurlJ Content-Type: text/x-csrc; charset=UTF-8; name="poc-passfilelookup.c" Content-Disposition: attachment; filename="poc-passfilelookup.c" Content-Transfer-Encoding: base64 LyoKICogcG9jLXBhc3NmaWxlbG9va3VwLmMKICoKICogUG9DIGZvciBQUXBhc3NmaWxlTG9v a3VwKCk6IGEgY2xpZW50IHRoYXQgY29ubmVjdHMgdGhyb3VnaCBhIGxvY2FsCiAqIHR1bm5l bCBsb29rcyB1cCB0aGUgcGFzc3dvcmQgdW5kZXIgdGhlIFJFQUwgc2VydmVyJ3MgaG9zdCBh bmQgcG9ydAogKiAodGhlIGVudHJ5IHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHBhc3Nm aWxlKSwgdGhlbiBjb25uZWN0cyB0bwogKiB0aGUgdHVubmVsJ3MgbG9jYWwgcG9ydCBwYXNz aW5nIHRoYXQgcGFzc3dvcmQgZXhwbGljaXRseS4KICoKICogQ29tcGlsZTogIGNjIHBvYy1w YXNzZmlsZWxvb2t1cC5jIC1vIHBvYy1wYXNzZmlsZWxvb2t1cCAtbHBxCiAqIFVzYWdlOiAg ICBwb2MtcGFzc2ZpbGVsb29rdXAgUkVBTEhPU1QgUkVBTFBPUlQgREJOQU1FIFVTRVIgTE9D QUxQT1JUCiAqCiAqIFRoZSBwYXNzZmlsZSBpcyBub3QgbmFtZWQgaGVyZTogcGFzc2luZyBO VUxMIG1ha2VzIHRoZSBsb29rdXAgdXNlCiAqIFBHUEFTU0ZJTEUgb3Igfi8ucGdwYXNzLCBl eGFjdGx5IGFzIGEgY29ubmVjdGlvbiB3b3VsZC4KICovCiNpbmNsdWRlIDxzdGRpby5oPgoj aW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAibGlicHEtZmUuaCIKCmludAptYWluKGlu dCBhcmdjLCBjaGFyICphcmd2W10pCnsKCWNoYXIJICAgKnBhc3N3b3JkOwoJUEdjb25uCSAg ICpjb25uOwoJUEdyZXN1bHQgICAqcmVzOwoKCWlmIChhcmdjICE9IDYpCgl7CgkJZnByaW50 ZihzdGRlcnIsICJ1c2FnZTogJXMgUkVBTEhPU1QgUkVBTFBPUlQgREJOQU1FIFVTRVIgTE9D QUxQT1JUXG4iLAoJCQkJYXJndlswXSk7CgkJcmV0dXJuIDI7Cgl9CgoJLyogU3RlcCAxOiBs b29rIHVwIHRoZSBwYXNzd29yZCB1bmRlciB0aGUgUkVBTCBob3N0IGFuZCBwb3J0LiAqLwoJ cGFzc3dvcmQgPSBQUXBhc3NmaWxlTG9va3VwKGFyZ3ZbMV0sIGFyZ3ZbMl0sIGFyZ3ZbM10s IGFyZ3ZbNF0sIE5VTEwpOwoJaWYgKHBhc3N3b3JkID09IE5VTEwpCgl7CgkJZnByaW50Zihz dGRlcnIsICJubyBwYXNzd29yZCBmb3VuZCBmb3IgJXM6JXM6JXM6JXNcbiIsCgkJCQlhcmd2 WzFdLCBhcmd2WzJdLCBhcmd2WzNdLCBhcmd2WzRdKTsKCQlyZXR1cm4gMTsKCX0KCXByaW50 ZigiUFFwYXNzZmlsZUxvb2t1cChcIiVzXCIsIFwiJXNcIiwgXCIlc1wiLCBcIiVzXCIsIE5V TEwpID0gXCIlc1wiXG4iLAoJCSAgIGFyZ3ZbMV0sIGFyZ3ZbMl0sIGFyZ3ZbM10sIGFyZ3Zb NF0sIHBhc3N3b3JkKTsKCgkvKiBTdGVwIDI6IGNvbm5lY3QgdG8gdGhlIExPQ0FMIHR1bm5l bCBwb3J0IHdpdGggdGhhdCBwYXNzd29yZC4gKi8KCXsKCQljb25zdCBjaGFyICprZXl3b3Jk c1tdID0geyJob3N0IiwgInBvcnQiLCAiZGJuYW1lIiwgInVzZXIiLAoJCSJwYXNzd29yZCIs IE5VTEx9OwoJCWNvbnN0IGNoYXIgKnZhbHVlc1tdID0geyIxMjcuMC4wLjEiLCBhcmd2WzVd LCBhcmd2WzNdLCBhcmd2WzRdLAoJCXBhc3N3b3JkLCBOVUxMfTsKCgkJY29ubiA9IFBRY29u bmVjdGRiUGFyYW1zKGtleXdvcmRzLCB2YWx1ZXMsIDApOwoJfQoJUFFmcmVlbWVtKHBhc3N3 b3JkKTsKCglpZiAoUFFzdGF0dXMoY29ubikgIT0gQ09OTkVDVElPTl9PSykKCXsKCQlmcHJp bnRmKHN0ZGVyciwgImNvbm5lY3Rpb24gZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNv bm4pKTsKCQlQUWZpbmlzaChjb25uKTsKCQlyZXR1cm4gMTsKCX0KCglyZXMgPSBQUWV4ZWMo Y29ubiwgInNlbGVjdCBjdXJyZW50X3VzZXIiKTsKCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMp ID09IFBHUkVTX1RVUExFU19PSykKCQlwcmludGYoImNvbm5lY3RlZCB0byAxMjcuMC4wLjE6 JXMgYXMgJXMgLT4gT0tcbiIsCgkJCSAgIGFyZ3ZbNV0sIFBRZ2V0dmFsdWUocmVzLCAwLCAw KSk7CgoJUFFjbGVhcihyZXMpOwoJUFFmaW5pc2goY29ubik7CglyZXR1cm4gMDsKfQo= --------------nWoy2oPOgo0owtsmtY0GurlJ--