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 1vvkto-000FpJ-1Y for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Feb 2026 23:36:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvktn-00GHxX-1D for pgsql-hackers@arkaria.postgresql.org; Thu, 26 Feb 2026 23:36:03 +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 1vvktm-00GHxH-31 for pgsql-hackers@lists.postgresql.org; Thu, 26 Feb 2026 23:36:03 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vvktj-00000001TUK-2tJt for pgsql-hackers@lists.postgresql.org; Thu, 26 Feb 2026 23:36:02 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id 331E05790A6 for ; Fri, 27 Feb 2026 00:35:59 +0100 (CET) Received: from s979.loopia.se (unknown [172.22.191.6]) by s807.loopia.se (Postfix) with ESMTP id 1ECCF577A4B; Fri, 27 Feb 2026 00:35:59 +0100 (CET) Received: from localhost (unknown [172.22.191.5]) by s979.loopia.se (Postfix) with ESMTP id 1C55510BC414; Fri, 27 Feb 2026 00:35:59 +0100 (CET) X-Virus-Scanned: amavis at amavis.loopia.se X-Spam-Flag: NO X-Spam-Score: -1.2 X-Spam-Level: X-Spam-Status: No, score=-1.2 tagged_above=-999 required=6.2 tests=[ALL_TRUSTED=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1] autolearn=disabled Authentication-Results: s471.loopia.se (amavis); dkim=pass (2048-bit key) header.d=proxel.se Received: from s899.loopia.se ([172.22.191.6]) by localhost (s471.loopia.se [172.22.190.35]) (amavis, port 10024) with LMTP id NKwElDmZUnI4; Fri, 27 Feb 2026 00:35:33 +0100 (CET) X-Loopia-Auth: user X-Loopia-User: andreas@proxel.se X-Loopia-Originating-IP: 147.28.75.140 Received: from [192.168.0.121] (customer-147-28-75-140.stosn.net [147.28.75.140]) (Authenticated sender: andreas@proxel.se) by s899.loopia.se (Postfix) with ESMTPSA id 0895C2C8BA9E; Fri, 27 Feb 2026 00:35:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxel.se; s=loopiadkim1707418970; t=1772148932; bh=KSIrvDFCT1yWKK+3wGn2RigDito6iTsOPxLBF/kj9ZE=; h=Date:From:Subject:To:Cc; b=qAb9Kh6khHY6tQDDvqOwcabqIaCe+ScWGEsatlXQd+3ZlbIL9/xfd/yCgKWV+TTsb Oo+EaFH2gfR7lFTCeKv+/cQyXFhJFBr5nviMHv6YoVJRKBSTDWgikL2NHWlM/7XZaJ zP2xLcIQ219rfemA1aaiBY1bQbUkoPz5vVkVKFUonJ5TeUwkBLEFiLrJI9FzrqsmKI JDJGAWC3zE8P2bDa3jVUL36kH2w13+IpG5P5ZZbxazIJqHnsmNwtD5UDt84OMTAih8 sSUyY5nZ41a0JUVzvwI3I7JViIP6rR89DqFDGatc1nTcFWC7so07DZ0HvdlSA0Vrp1 pt0qh8m7yqylg== Content-Type: multipart/mixed; boundary="------------DzfHLoT6SSJghUogcBef1jEb" Message-ID: <19f9da27-295d-4194-b38c-8e5142dfae4b@proxel.se> Date: Fri, 27 Feb 2026 00:35:31 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Andreas Karlsson Content-Language: en-US Subject: [oauth] Per connection auth hooks in libpq To: PostgreSQL Hackers Cc: 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. --------------DzfHLoT6SSJghUogcBef1jEb Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, When implementing OAuth support in the PostgreSQL driver for Ruby[1] the main pain point I ran into was that the PQauthDataHook is global which does not work well at all given how Ruby supports multiple sub-instances of the Ruby runtime (so called Ractors) plus that if you would load e.g. Python and Ruby into the same process and both would use libpq they would have to fight over the global hook. So attached is a proof of concept patch which implements a per-connection hook. It is just a rough patch to start a discussion. If people like it I can clean it up and add tests and documentation. Notes 1. See these two PRs: one which uses a per-runtime map and one which uses a per-PGConn hash map. I am not a fan of either. - https://github.com/ged/ruby-pg/pull/693 - https://github.com/ged/ruby-pg/pull/700 -- Andreas Karlsson Percona --------------DzfHLoT6SSJghUogcBef1jEb Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-PoC-Add-support-for-per-connection-OAuth-hooks-to.patch" Content-Disposition: attachment; filename*0="v1-0001-PoC-Add-support-for-per-connection-OAuth-hooks-to.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3OWE2ZmZmYmI0ZWY5ZTFhZmQzOGE5Njg3NzQyOTQxYWI0ZDk5NDE3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzLmthcmxz c29uQHBlcmNvbmEuY29tPgpEYXRlOiBGcmksIDI3IEZlYiAyMDI2IDAwOjE5OjA5ICswMTAw ClN1YmplY3Q6IFtQQVRDSCB2MV0gUG9DOiBBZGQgc3VwcG9ydCBmb3IgcGVyLWNvbm5lY3Rp b24gT0F1dGggaG9va3MgdG8gbGlicHEKClRoZSBjdXJyZW50IGdsb2JhbCBob29rIG1ha2Vz IGxpZmUgaGFyZCBmb3IgYXV0aG9ycyBvZiBsYW5ndWFnZSBkcml2ZXJzCmJhc2VkIG9uIGxp YnBxLgoKVE9ETwoKLSBDbGVhbiB1cCBjb2RlCi0gV3JpdGUgZG9jdW1lbnRhdGlvbgotIFdy aXRlIHRlc3RzCi0tLQogc3JjL2ludGVyZmFjZXMvbGlicHEtb2F1dGgvb2F1dGgtY3VybC5j ICAgICAgIHwgIDMgKy0tCiBzcmMvaW50ZXJmYWNlcy9saWJwcS9leHBvcnRzLnR4dCAgICAg ICAgICAgICAgfCAgMiArKwogc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtYXV0aC1vYXV0aC5j ICAgICAgICAgIHwgIDYgKysrKy0KIHNyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWF1dGguYyAg ICAgICAgICAgICAgICB8IDI2ICsrKysrKysrKysrKysrKysrKysKIHNyYy9pbnRlcmZhY2Vz L2xpYnBxL2xpYnBxLWZlLmggICAgICAgICAgICAgICB8ICAzICsrKwogc3JjL2ludGVyZmFj ZXMvbGlicHEvbGlicHEtaW50LmggICAgICAgICAgICAgIHwgMTAgKysrKysrKwogLi4uL29h dXRoX3ZhbGlkYXRvci9vYXV0aF9ob29rX2NsaWVudC5jICAgICAgIHwgMTYgKysrKysrKysr LS0tCiA3IGZpbGVzIGNoYW5nZWQsIDYwIGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEtb2F1dGgvb2F1dGgtY3VybC5j IGIvc3JjL2ludGVyZmFjZXMvbGlicHEtb2F1dGgvb2F1dGgtY3VybC5jCmluZGV4IDY5MWU3 ZWMxZDlmLi4xOTY3ZGU0YTMxZiAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEt b2F1dGgvb2F1dGgtY3VybC5jCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxLW9hdXRoL29h dXRoLWN1cmwuYwpAQCAtMjYyMSw5ICsyNjIxLDggQEAgcHJvbXB0X3VzZXIoc3RydWN0IGFz eW5jX2N0eCAqYWN0eCwgUEdjb25uICpjb25uKQogCQkudmVyaWZpY2F0aW9uX3VyaV9jb21w bGV0ZSA9IGFjdHgtPmF1dGh6LnZlcmlmaWNhdGlvbl91cmlfY29tcGxldGUsCiAJCS5leHBp cmVzX2luID0gYWN0eC0+YXV0aHouZXhwaXJlc19pbiwKIAl9OwotCVBRYXV0aERhdGFIb29r X3R5cGUgaG9vayA9IFBRZ2V0QXV0aERhdGFIb29rKCk7CiAKLQlyZXMgPSBob29rKFBRQVVU SERBVEFfUFJPTVBUX09BVVRIX0RFVklDRSwgY29ubiwgJnByb21wdCk7CisJcmVzID0gUFFy dW5Db25uQXV0aERhdGFIb29rKFBRQVVUSERBVEFfUFJPTVBUX09BVVRIX0RFVklDRSwgY29u biwgJnByb21wdCk7CiAKIAlpZiAoIXJlcykKIAl7CmRpZmYgLS1naXQgYS9zcmMvaW50ZXJm YWNlcy9saWJwcS9leHBvcnRzLnR4dCBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMu dHh0CmluZGV4IGRiYmFlNjQyZDc2Li45OGM2MzBiMzBhOSAxMDA2NDQKLS0tIGEvc3JjL2lu dGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEv ZXhwb3J0cy50eHQKQEAgLTIxMCwzICsyMTAsNSBAQCBQUWdldEF1dGhEYXRhSG9vayAgICAg ICAgIDIwNwogUFFkZWZhdWx0QXV0aERhdGFIb29rICAgICAyMDgKIFBRZnVsbFByb3RvY29s VmVyc2lvbiAgICAgMjA5CiBhcHBlbmRQUUV4cEJ1ZmZlclZBICAgICAgIDIxMAorUFFzZXRD b25uQXV0aERhdGFIb29rICAgICAyMTEKK1BRcnVuQ29ubkF1dGhEYXRhSG9vayAgICAgMjEy CmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1hdXRoLW9hdXRoLmMgYi9z cmMvaW50ZXJmYWNlcy9saWJwcS9mZS1hdXRoLW9hdXRoLmMKaW5kZXggNjc4NzlkNjRiMzku LjNjYTdlNTk0MTExIDEwMDY0NAotLS0gYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1hdXRo LW9hdXRoLmMKKysrIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtYXV0aC1vYXV0aC5jCkBA IC05OTgsNyArOTk4LDExIEBAIHNldHVwX3Rva2VuX3JlcXVlc3QoUEdjb25uICpjb25uLCBm ZV9vYXV0aF9zdGF0ZSAqc3RhdGUpCiAJQXNzZXJ0KHJlcXVlc3Qub3BlbmlkX2NvbmZpZ3Vy YXRpb24pOwogCiAJLyogVGhlIGNsaWVudCBtYXkgaGF2ZSBvdmVycmlkZGVuIHRoZSBPQXV0 aCBmbG93LiAqLwotCXJlcyA9IFBRYXV0aERhdGFIb29rKFBRQVVUSERBVEFfT0FVVEhfQkVB UkVSX1RPS0VOLCBjb25uLCAmcmVxdWVzdCk7CisJaWYgKGNvbm4tPmF1dGhEYXRhSG9va3Mu cHJvYykKKwkJcmVzID0gY29ubi0+YXV0aERhdGFIb29rcy5wcm9jKGNvbm4tPmF1dGhEYXRh SG9va3MuYXJnLCBQUUFVVEhEQVRBX09BVVRIX0JFQVJFUl9UT0tFTiwgY29ubiwgJnJlcXVl c3QpOworCWVsc2UKKwkJcmVzID0gUFFhdXRoRGF0YUhvb2soUFFBVVRIREFUQV9PQVVUSF9C RUFSRVJfVE9LRU4sIGNvbm4sICZyZXF1ZXN0KTsKKwogCWlmIChyZXMgPiAwKQogCXsKIAkJ UEdvYXV0aEJlYXJlclJlcXVlc3QgKnJlcXVlc3RfY29weTsKZGlmZiAtLWdpdCBhL3NyYy9p bnRlcmZhY2VzL2xpYnBxL2ZlLWF1dGguYyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWF1 dGguYwppbmRleCBmMDVhYWVhOTY1MS4uMDUzM2M1NzJhZWIgMTAwNjQ0Ci0tLSBhL3NyYy9p bnRlcmZhY2VzL2xpYnBxL2ZlLWF1dGguYworKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9m ZS1hdXRoLmMKQEAgLTE2MDIsMyArMTYwMiwyOSBAQCBQUWRlZmF1bHRBdXRoRGF0YUhvb2so UEdhdXRoRGF0YSB0eXBlLCBQR2Nvbm4gKmNvbm4sIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJu IDA7CQkJCQkvKiBoYW5kbGUgbm90aGluZyAqLwogfQorCitQUUNvbm5BdXRoRGF0YUhvb2sK K1BRc2V0Q29ubkF1dGhEYXRhSG9vayhQR2Nvbm4gKmNvbm4sIFBRQ29ubkF1dGhEYXRhSG9v ayBwcm9jLCB2b2lkICphcmcpCit7CisJUFFDb25uQXV0aERhdGFIb29rIG9sZDsKKworCWlm IChjb25uID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJb2xkID0gY29ubi0+YXV0aERh dGFIb29rcy5wcm9jOworCWlmIChwcm9jKQorCXsKKwkJY29ubi0+YXV0aERhdGFIb29rcy5w cm9jID0gcHJvYzsKKwkJY29ubi0+YXV0aERhdGFIb29rcy5hcmcgPSBhcmc7CisJfQorCXJl dHVybiBvbGQ7Cit9CisKK2ludAorUFFydW5Db25uQXV0aERhdGFIb29rKFBHYXV0aERhdGEg dHlwZSwgUEdjb25uICpjb25uLCB2b2lkICpkYXRhKQoreworCWlmIChjb25uLT5hdXRoRGF0 YUhvb2tzLnByb2MpCisJCXJldHVybiBjb25uLT5hdXRoRGF0YUhvb2tzLnByb2MoY29ubi0+ YXV0aERhdGFIb29rcy5hcmcsIHR5cGUsIGNvbm4sIGRhdGEpOworCisJcmV0dXJuIFBRYXV0 aERhdGFIb29rKHR5cGUsIGNvbm4sIGRhdGEpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9m IGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWZlLmggYi9z cmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oCmluZGV4IDkwNWYyZjMzYWI4Li5lYTQ4 NzA2YjMxZSAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtZmUuaAor KysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oCkBAIC04MTIsOSArODEyLDEy IEBAIGV4dGVybiBjaGFyICpQUWVuY3J5cHRQYXNzd29yZENvbm4oUEdjb25uICpjb25uLCBj b25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IGNoYXIKIGV4dGVybiBQR3Jlc3VsdCAqUFFjaGFu Z2VQYXNzd29yZChQR2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKnVzZXIsIGNvbnN0IGNoYXIg KnBhc3N3ZCk7CiAKIHR5cGVkZWYgaW50ICgqUFFhdXRoRGF0YUhvb2tfdHlwZSkgKFBHYXV0 aERhdGEgdHlwZSwgUEdjb25uICpjb25uLCB2b2lkICpkYXRhKTsKK3R5cGVkZWYgaW50ICgq UFFDb25uQXV0aERhdGFIb29rKSAodm9pZCAqYXJnLCBQR2F1dGhEYXRhIHR5cGUsIFBHY29u biAqY29ubiwgdm9pZCAqZGF0YSk7CiBleHRlcm4gdm9pZCBQUXNldEF1dGhEYXRhSG9vayhQ UWF1dGhEYXRhSG9va190eXBlIGhvb2spOwogZXh0ZXJuIFBRYXV0aERhdGFIb29rX3R5cGUg UFFnZXRBdXRoRGF0YUhvb2sodm9pZCk7CiBleHRlcm4gaW50CVBRZGVmYXVsdEF1dGhEYXRh SG9vayhQR2F1dGhEYXRhIHR5cGUsIFBHY29ubiAqY29ubiwgdm9pZCAqZGF0YSk7CitleHRl cm4gUFFDb25uQXV0aERhdGFIb29rIFBRc2V0Q29ubkF1dGhEYXRhSG9vayhQR2Nvbm4gKmNv bm4sIFBRQ29ubkF1dGhEYXRhSG9vayBwcm9jLCB2b2lkICphcmcpOworZXh0ZXJuIGludAlQ UXJ1bkNvbm5BdXRoRGF0YUhvb2soUEdhdXRoRGF0YSB0eXBlLCBQR2Nvbm4gKmNvbm4sIHZv aWQgKmRhdGEpOwogCiAvKiA9PT0gaW4gZW5jbmFtZXMuYyA9PT0gKi8KIApkaWZmIC0tZ2l0 IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmggYi9zcmMvaW50ZXJmYWNlcy9s aWJwcS9saWJwcS1pbnQuaAppbmRleCBiZDdlYjU5ZjVmOC4uNmZjZTZmM2FkZDMgMTAwNjQ0 Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oCisrKyBiL3NyYy9pbnRl cmZhY2VzL2xpYnBxL2xpYnBxLWludC5oCkBAIC0xNTIsNiArMTUyLDEzIEBAIHR5cGVkZWYg c3RydWN0CiAJdm9pZAkgICAqbm90aWNlUHJvY0FyZzsKIH0gUEdOb3RpY2VIb29rczsKIAor LyogRmllbGRzIG5lZWRlZCBmb3IgT0F1dGggaGFuZGxpbmcgKi8KK3R5cGVkZWYgc3RydWN0 Cit7CisJUFFDb25uQXV0aERhdGFIb29rIHByb2M7CisJdm9pZAkgICAqYXJnOworfSBQR0F1 dGhEYXRhSG9va3M7CisKIHR5cGVkZWYgc3RydWN0IFBHRXZlbnQKIHsKIAlQR0V2ZW50UHJv YyBwcm9jOwkJCS8qIHRoZSBmdW5jdGlvbiB0byBjYWxsIG9uIGV2ZW50cyAqLwpAQCAtNDUz LDYgKzQ2MCw5IEBAIHN0cnVjdCBwZ19jb25uCiAJLyogQ2FsbGJhY2sgcHJvY2VkdXJlcyBm b3Igbm90aWNlIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwogCVBHTm90aWNlSG9va3Mgbm90aWNl SG9va3M7CiAKKwkvKiBDYWxsYmFjayBwcm9jZWR1cmVzIGZvciBPQXV0aCBhdXRoZW50aWNh dGlvbiAqLworCVBHQXV0aERhdGFIb29rcyBhdXRoRGF0YUhvb2tzOworCiAJLyogRXZlbnQg cHJvY3MgcmVnaXN0ZXJlZCB2aWEgUFFyZWdpc3RlckV2ZW50UHJvYyAqLwogCVBHRXZlbnQg ICAgKmV2ZW50czsJCQkvKiBleHBhbmRhYmxlIGFycmF5IG9mIGV2ZW50IGRhdGEgKi8KIAlp bnQJCQluRXZlbnRzOwkJLyogbnVtYmVyIG9mIGFjdGl2ZSBldmVudHMgKi8KZGlmZiAtLWdp dCBhL3NyYy90ZXN0L21vZHVsZXMvb2F1dGhfdmFsaWRhdG9yL29hdXRoX2hvb2tfY2xpZW50 LmMgYi9zcmMvdGVzdC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci9vYXV0aF9ob29rX2NsaWVu dC5jCmluZGV4IDYwZGQxZGNkYWEwLi42MTJkZDI1MDNhNSAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvbW9kdWxlcy9vYXV0aF92YWxpZGF0b3Ivb2F1dGhfaG9va19jbGllbnQuYworKysgYi9z cmMvdGVzdC9tb2R1bGVzL29hdXRoX3ZhbGlkYXRvci9vYXV0aF9ob29rX2NsaWVudC5jCkBA IC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAibGlicHEtZmUuaCIKIAogc3RhdGljIGludAlo YW5kbGVfYXV0aF9kYXRhKFBHYXV0aERhdGEgdHlwZSwgUEdjb25uICpjb25uLCB2b2lkICpk YXRhKTsKK3N0YXRpYyBpbnQJaGFuZGxlX2F1dGhfZGF0YV9hc3luYyh2b2lkICphcmcsIFBH YXV0aERhdGEgdHlwZSwgUEdjb25uICpjb25uLCB2b2lkICpkYXRhKTsKIHN0YXRpYyBQb3N0 Z3Jlc1BvbGxpbmdTdGF0dXNUeXBlIGFzeW5jX2NiKFBHY29ubiAqY29ubiwKIAkJCQkJCQkJ CQkgIFBHb2F1dGhCZWFyZXJSZXF1ZXN0ICpyZXEsCiAJCQkJCQkJCQkJICBwZ3NvY2tldCAq YWx0c29jayk7CkBAIC0xMjUsOSArMTI2LDYgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqYXJn dltdKQogCiAJY29ubmluZm8gPSBhcmd2W29wdGluZF07CiAKLQkvKiBTZXQgdXAgb3VyIE9B dXRoIGhvb2tzLiAqLwotCVBRc2V0QXV0aERhdGFIb29rKGhhbmRsZV9hdXRoX2RhdGEpOwot CiAJLyogQ29ubmVjdC4gKEFsbCB0aGUgYWN0dWFsIHdvcmsgaXMgaW4gdGhlIGhvb2suKSAq LwogCWlmIChzdHJlc3NfYXN5bmMpCiAJewpAQCAtMTQxLDYgKzEzOSw5IEBAIG1haW4oaW50 IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAogCQljb25uID0gUFFjb25uZWN0U3RhcnQoY29ubmlu Zm8pOwogCisJCS8qIFNldCB1cCBvdXIgT0F1dGggaG9va3MuICovCisJCVBRc2V0Q29ubkF1 dGhEYXRhSG9vayhjb25uLCBoYW5kbGVfYXV0aF9kYXRhX2FzeW5jLCBOVUxMKTsKKwogCQlk bwogCQl7CiAJCQlyZXMgPSBQUWNvbm5lY3RQb2xsKGNvbm4pOwpAQCAtMTQ4LDYgKzE0OSw5 IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAl9CiAJZWxzZQogCXsKKwkJLyog U2V0IHVwIG91ciBPQXV0aCBob29rcy4gKi8KKwkJUFFzZXRBdXRoRGF0YUhvb2soaGFuZGxl X2F1dGhfZGF0YSk7CisKIAkJLyogUGVyZm9ybSBhIHN0YW5kYXJkIHN5bmNocm9ub3VzIGNv bm5lY3Rpb24uICovCiAJCWNvbm4gPSBQUWNvbm5lY3RkYihjb25uaW5mbyk7CiAJfQpAQCAt MjI1LDYgKzIyOSwxMiBAQCBoYW5kbGVfYXV0aF9kYXRhKFBHYXV0aERhdGEgdHlwZSwgUEdj b25uICpjb25uLCB2b2lkICpkYXRhKQogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW50Cito YW5kbGVfYXV0aF9kYXRhX2FzeW5jKHZvaWQgKmFyZywgUEdhdXRoRGF0YSB0eXBlLCBQR2Nv bm4gKmNvbm4sIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGhhbmRsZV9hdXRoX2RhdGEodHlw ZSwgY29ubiwgZGF0YSk7Cit9CisKIHN0YXRpYyBQb3N0Z3Jlc1BvbGxpbmdTdGF0dXNUeXBl CiBhc3luY19jYihQR2Nvbm4gKmNvbm4sIFBHb2F1dGhCZWFyZXJSZXF1ZXN0ICpyZXEsIHBn c29ja2V0ICphbHRzb2NrKQogewotLSAKMi40Ny4zCgo= --------------DzfHLoT6SSJghUogcBef1jEb--