Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1uYxxw-00E7xx-Nq for pgpool-hackers@arkaria.postgresql.org; Tue, 08 Jul 2025 02:21:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1uYxxt-005lAI-Pd for pgpool-hackers@arkaria.postgresql.org; Tue, 08 Jul 2025 02:21: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.94.2) (envelope-from ) id 1uYxxt-005lA7-6E for pgpool-hackers@lists.postgresql.org; Tue, 08 Jul 2025 02:21:50 +0000 Received: from meldrar.postgresql.org ([2a02:c0:301:0:ffff::31]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1uYxxq-0068zh-0L for pgpool-hackers@lists.postgresql.org; Tue, 08 Jul 2025 02:21:48 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=postgresql.org; s=20171124; h=Content-Transfer-Encoding:Content-Type: Mime-Version:From:Subject:To:Message-Id:Date:Sender:Reply-To:Cc:Content-ID: Content-Description:In-Reply-To:References; bh=MwQMRwDPIif/zZ2C6/2TDC6I1oEsLMDhjUwqhmOMiHk=; b=LtUYs/FbNiR3VY9cilwG8cQh4J hyS5zItEN/AjRYm7tYLBYQBqXxLoaGxJnL5jsHuek6Fi4STsFXYxfHcFDQIeXM3u9WaEtBDSbJDUi pWhZAFeitu+R5GP1uymYW2MGhFERkvU8TROnWZORKSKysfG+rdWG5DfvMV9v6HqNm0PmK7yxPgnzk VIikvhtStd/SE5kjRcB20fSIwJwZ2xCLtPWDO+1CQMudpwWorezEfh/XtL9eySacpB+GLZtQ6PiGF TUpVPDYCp/89XzP4wiNc23KmGOCx5GduK1oOMGwI3PK11X6r0nmj7H/p1wLEOUA7aYcBsPtn83O4j EHQA7Azw==; Received: from [2409:11:4120:300:69a5:3409:1603:3d0b] (helo=localhost) by meldrar.postgresql.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (Exim 4.96) (envelope-from ) id 1uYxxm-006MBw-0K for pgpool-hackers@lists.postgresql.org; Tue, 08 Jul 2025 02:21:44 +0000 Date: Tue, 08 Jul 2025 11:21:33 +0900 (JST) Message-Id: <20250708.112133.1324153277751075866.ishii@postgresql.org> To: pgpool-hackers@lists.postgresql.org Subject: Feature: implement NegotiateProtocolVersion message From: Tatsuo Ishii X-Mailer: Mew version 6.8 on Emacs 26.3 Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Tue_Jul__8_11_21_33_2025_770)--" Content-Transfer-Encoding: 7bit X-Host-Lookup-Failed: Reverse DNS lookup failed for 2409:11:4120:300:69a5:3409:1603:3d0b (failed) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk ----Next_Part(Tue_Jul__8_11_21_33_2025_770)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit NegotiateProtocolVersion message is a message sent from backend to frontend. After a startup message is sent from frontend to backend, and the minor protocol version in the startup message is not supported by the backend, the backend sends back a NegotiateProtocolVersion message along with the latest minor protocol version it supports. For example, PostgreSQL 18 client could request a protocol version 3.2 against PostgreSQL 17 server, then the PG17 server sends back the NegotiateProtocolVersion message with protocol version 3.0 since it does not support 3.2. If the PG18 client accepts it, then from now on the protocol version 3.0 is used for the communication. At this point, as PG18's psql (or libpq) uses protocol version 3.0 by default, PG18 (or before) server will not send back the NegotiateProtocolVersion message because the versions support 3.0. The only case when 3.2 is used, is PG18's psql (or libpq) uses a connection option max_protocol_version (or environment variable PGMAXPROTOCOLVERSION) being set to "3.2". I don't know if the case happen in the wild after PG18 is released, but I would like to prepare for the situation by implementing NegotiateProtocolVersion message in Pgpool-II 4.7. Attached patch does followings for the purpose. - Add ProcessNegotiateProtocol() to pool_do_auth() to process the message while handling a startup message. It reads the message from all backend, then forward it to frontend. The message is saved in ConnectionInfo for the case below. It also save the major and minor protocol version after negotiation to POOL_CONNECTION_POOL_SLOT for later use. The version numbers are also saved to ConnectionInfo so that pcp_proc_info shows them. - When a client connects to pgpool, it looks for cached connections in the connection: pgpool tries to match the startup message with the one in the connection pool. Since the startup message in the connection pool is saved at the time when the client connects to pgpool, it is possible that two connection cache are created with same user and database. Suppose there's a connection cache with a startup message having protocol version 3.0, and a new client tries to connect to pgpool using protocol version 3.2. Pgpool looks for a connection cache with the startup message having protocol version 3.2, not 3.0. As a result a new connection cache entry is created with protocol version 3.2. - When a client uses the connection pool, the saved NegotiateProtocolVersion message is sent to frontend to emulate the protocol negotiation. - The frontend/backend protocol 3.2 changes the BackendKeyData message format but it's not implemented in this patch yet. I will work on it later on. Best regards, -- Tatsuo Ishii SRA OSS K.K. English: http://www.sraoss.co.jp/index_en/ Japanese:http://www.sraoss.co.jp ----Next_Part(Tue_Jul__8_11_21_33_2025_770)-- Content-Type: Application/Octet-Stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v1-0001-Feature-implement-NegotiateProtocolVersion-messag.patch" RnJvbSA1NDA5N2Y0M2Q2MWQzNDA3MTc0OGVjNWNmYzBlZDQ5NDY5ZmRmMTQ5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUYXRzdW8gSXNoaWkgPGlzaGlpQHBvc3RncmVzcWwub3JnPgpE YXRlOiBUdWUsIDggSnVsIDIwMjUgMTE6MTk6MjkgKzA5MDAKU3ViamVjdDogW1BBVENIIHYxXSBG ZWF0dXJlOiBpbXBsZW1lbnQgTmVnb3RpYXRlUHJvdG9jb2xWZXJzaW9uIG1lc3NhZ2UuCgpJbXBs ZW1lbnRpbmcgdGhlIG1lc3NhZ2UgaXMgbmVjZXNzYXJ5IHdoZW4gZnJvbnRlbmQgcmVxdWVzdHMg dGhlCnByb3RvY29sIHZlcnNpb24gMy4yIChpLmUuIFBvc3RncmVTUUwgMTgrIG9yIGNvbXBhdGli bGUgY2xpZW50cyksCndoaWxlIGJhY2tlbmQgc3RpbGwgb25seSBzdXBwb3J0cyAzLjAgKGkuZS4g YmFja2VuZCBpcyBQb3N0Z3JlU1FMIDE3Cm9yIGJlZm9yZSkuCgpUaGlzIGNvbW1pdCBoYW5kbGVz IHRoZSBtZXNzYWdlIHNvIHRoYXQgdGhlIG1lc3NhZ2UgaXMgZm9yd2FyZGVkIGZyb20KYmFja2Vu ZCB0byBmcm9udGVuZCB3aGVuIHRoZXJlJ3Mgbm8gY29ubmVjdGlvbiBjYWNoZSBleGlzdHMuCgpJ ZiBjb25uZWN0aW9uIGNhY2hlIGV4aXN0cywgcGdwb29sIHNlbmRzIHRoZSBtZXNzYWdlLCB3aGlj aCBoYXMgYmVlbgpzYXZlZCBhdCB0aGUgdGltZSB3aGVuIHRoZSBjb25uZWN0aW9uIGNhY2hlIHdh cyBjcmVhdGVkLCB0byBmcm9udGVuZC4KCk5vdGUgdGhhdCB0aGUgZnJvbnRlbmQvYmFja2VuZCBw cm90b2NvbCAzLjIgY2hhbmdlcyB0aGUgQmFja2VuZEtleURhdGEKbWVzc2FnZSBmb3JtYXQsIGJ1 dCBpdCdzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIGNvbW1pdCB5ZXQuIFRoaXMKbWVhbnMgdGhh dCBzdGlsbCBwZ3Bvb2wgY2Fubm90IGhhbmRsZSAzLjIgcHJvdG9jb2wuCi0tLQogc3JjL2F1dGgv cG9vbF9hdXRoLmMgICAgICAgICAgICAgICAgfCAxMTYgKysrKysrKysrKysrKysrKysrKysrKysr KysrLQogc3JjL2luY2x1ZGUvcG9vbC5oICAgICAgICAgICAgICAgICAgfCAgIDkgKysrCiBzcmMv cHJvdG9jb2wvcG9vbF9jb25uZWN0aW9uX3Bvb2wuYyB8ICAgMiArCiAzIGZpbGVzIGNoYW5nZWQs IDEyMyBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9hdXRo L3Bvb2xfYXV0aC5jIGIvc3JjL2F1dGgvcG9vbF9hdXRoLmMKaW5kZXggYmU5ZjMzNDM0Li5mMGEz NzZjMjcgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRoL3Bvb2xfYXV0aC5jCisrKyBiL3NyYy9hdXRoL3Bv b2xfYXV0aC5jCkBAIC03OSw2ICs3OSw3IEBAIHN0YXRpYyB2b2lkIGF1dGhlbnRpY2F0ZV9mcm9u dGVuZF9TQ1JBTShQT09MX0NPTk5FQ1RJT04gKiBiYWNrZW5kLCBQT09MX0NPTk5FQ1RJCiBzdGF0 aWMgdm9pZCBhdXRoZW50aWNhdGVfZnJvbnRlbmRfY2xlYXJfdGV4dChQT09MX0NPTk5FQ1RJT04g KiBmcm9udGVuZCk7CiBzdGF0aWMgYm9vbCBnZXRfYXV0aF9wYXNzd29yZChQT09MX0NPTk5FQ1RJ T04gKiBiYWNrZW5kLCBQT09MX0NPTk5FQ1RJT04gKiBmcm9udGVuZCwgaW50IHJlYXV0aCwKIAkJ CQkgIGNoYXIgKipwYXNzd29yZCwgUGFzc3dvcmRUeXBlICpwYXNzd29yZFR5cGUpOworc3RhdGlj IHZvaWQgUHJvY2Vzc05lZ290aWF0ZVByb3RvY29sKFBPT0xfQ09OTkVDVElPTiAqIGZyb250ZW5k LCBQT09MX0NPTk5FQ1RJT05fUE9PTCAqIGNwKTsKIAogLyoKICAqIERvIGF1dGhlbnRpY2F0aW9u LiBBc3N1bWluZyB0aGUgb25seSBjYWxsZXIgaXMKQEAgLTM0Miw2ICszNDMsNyBAQCBwb29sX2Rv X2F1dGgoUE9PTF9DT05ORUNUSU9OICogZnJvbnRlbmQsIFBPT0xfQ09OTkVDVElPTl9QT09MICog Y3ApCiAKIAlwcm90b01ham9yID0gTUFJTl9DT05ORUNUSU9OKGNwKS0+c3AtPm1ham9yOwogCity ZWFkX2tpbmQ6CiAJa2luZCA9IHBvb2xfcmVhZF9raW5kKGNwKTsKIAlpZiAoa2luZCA8IDApCiAJ CWVyZXBvcnQoRVJST1IsCkBAIC0zNjUsNiArMzY3LDEyIEBAIHBvb2xfZG9fYXV0aChQT09MX0NP Tk5FQ1RJT04gKiBmcm9udGVuZCwgUE9PTF9DT05ORUNUSU9OX1BPT0wgKiBjcCkKIAkJCQkgZXJy ZGV0YWlsKCJiYWNrZW5kIHJlc3BvbnNlIHdpdGgga2luZCBcJ0VcJyB3aGVuIGV4cGVjdGluZyBc J1JcJyIpLAogCQkJCSBlcnJoaW50KCJUaGlzIGlzc3VlIGNhbiBiZSBjYXVzZWQgYnkgdmVyc2lv biBtaXNtYXRjaCAoY3VycmVudCB2ZXJzaW9uICVkKSIsIHByb3RvTWFqb3IpKSk7CiAJfQorCWVs c2UgaWYgKGtpbmQgPT0gJ3YnKQorCXsKKwkJLyogTmVnb3RpYXRlUHJvdG9jb2xWZXJzaW9uIHJl Y2VpdmVkICovCisJCVByb2Nlc3NOZWdvdGlhdGVQcm90b2NvbChmcm9udGVuZCwgY3ApOworCQln b3RvIHJlYWRfa2luZDsKKwl9CiAJZWxzZSBpZiAoa2luZCAhPSAnUicpCiAJCWVyZXBvcnQoRVJS T1IsCiAJCQkJKGVycm1zZygiYmFja2VuZCBhdXRoZW50aWNhdGlvbiBmYWlsZWQiKSwKQEAgLTU5 Nyw4ICs2MDUsMTEgQEAgcG9vbF9kb19hdXRoKFBPT0xfQ09OTkVDVElPTiAqIGZyb250ZW5kLCBQ T09MX0NPTk5FQ1RJT05fUE9PTCAqIGNwKQogCiAJCX0KIAotCQlzZW5kX2F1dGhfb2soZnJvbnRl bmQsIHByb3RvTWFqb3IpOwotCQlhdXRoa2luZCA9IDA7CisJCWlmIChraW5kID09ICdSJykKKwkJ eworCQkJc2VuZF9hdXRoX29rKGZyb250ZW5kLCBwcm90b01ham9yKTsKKwkJCWF1dGhraW5kID0g MDsKKwkJfQogCX0KIAogCWVsc2UKQEAgLTc1Niw3ICs3NjcsMTYgQEAgcG9vbF9kb19hdXRoKFBP T0xfQ09OTkVDVElPTiAqIGZyb250ZW5kLCBQT09MX0NPTk5FQ1RJT05fUE9PTCAqIGNwKQogCQkJ Q09OTkVDVElPTl9TTE9UKGNwLCBpKS0+a2V5ID0gY3AtPmluZm9baV0ua2V5ID0ga2V5OwogCiAJ CQljcC0+aW5mb1tpXS5tYWpvciA9IHNwLT5tYWpvcjsKLQkJCWNwLT5pbmZvW2ldLm1pbm9yID0g c3AtPm1pbm9yOworCisJCQkvKgorCQkJICogSWYgTmVnb3RpYXRlUHJvdG9jb2wgbWVzc2FnZSBo YXMgYmVlbiByZWNlaXZlZCwgc2V0IHRoZSBtaW5vcgorCQkJICogdmVyc2lvbi4gT3RoZXdpc2Ug dXNlIHRoZSB2ZXJzaW9uIGluIHRoZSBTdGFydHVwTWVzc2FnZS4KKwkJCSAqLworCQkJaWYgKENP Tk5FQ1RJT05fU0xPVChjcCwgaSktPm5lZ290aWF0ZWRfbWlub3IgPj0gMCkKKwkJCQljcC0+aW5m b1tpXS5taW5vciA9IENPTk5FQ1RJT05fU0xPVChjcCwgaSktPm5lZ290aWF0ZWRfbWlub3I7CisJ CQllbHNlCisJCQkJY3AtPmluZm9baV0ubWlub3IgPSBzcC0+bWlub3I7CisKIAkJCXN0cmxjcHko Y3AtPmluZm9baV0uZGF0YWJhc2UsIHNwLT5kYXRhYmFzZSwgc2l6ZW9mKGNwLT5pbmZvW2ldLmRh dGFiYXNlKSk7CiAJCQlzdHJsY3B5KGNwLT5pbmZvW2ldLnVzZXIsIHNwLT51c2VyLCBzaXplb2Yo Y3AtPmluZm9baV0udXNlcikpOwogCQkJY3AtPmluZm9baV0uY291bnRlciA9IDE7CkBAIC03Nzks MTYgKzc5OSwzMSBAQCBwb29sX2RvX2F1dGgoUE9PTF9DT05ORUNUSU9OICogZnJvbnRlbmQsIFBP T0xfQ09OTkVDVElPTl9QT09MICogY3ApCiB9CiAKIC8qCi0qIGRvIHJlLWF1dGhlbnRpY2F0aW9u IGZvciByZXVzZWQgY29ubmVjdGlvbi4gaWYgc3VjY2VzcyByZXR1cm4gMCBvdGhlcndpc2UgdGhy b3dzIGVyZXBvcnQuCisqIGRvIHJlLWF1dGhlbnRpY2F0aW9uIGZvciByZXVzZWQgY29ubmVjdGlv bi4gaWYgc3VjY2VzcyByZXR1cm4gMCBvdGhlcndpc2UKKyogdGhyb3dzIGVyZXBvcnQuCiAqLwog aW50CiBwb29sX2RvX3JlYXV0aChQT09MX0NPTk5FQ1RJT04gKiBmcm9udGVuZCwgUE9PTF9DT05O RUNUSU9OX1BPT0wgKiBjcCkKIHsKIAlpbnQJCQlwcm90b01ham9yOwogCWludAkJCW1zZ2xlbjsK KwlQT09MX0NPTk5FQ1RJT05fUE9PTF9TTE9UCSpzcDsKIAogCXByb3RvTWFqb3IgPSBNQUpPUihj cCk7CiAKKwkvKgorCSAqIElmIE5lZ290aWF0ZVByb3RvY29sTXNnIGhhcyBiZWVuIHJlY2VpdmVk IGZyb20gYmFja2VuZCwgZm9yd2FyZCBpdCB0bworCSAqIGZyb250ZW5kLiBJZiB0aGUgZnJvbnRl bmQgZGlzbGlrZSBpdCwgaXQgd2lsbCBkaXNjb25uZWN0IHRoZQorCSAqIGNvbm5lY3Rpb24uIE90 aGVyd2lzZSBpdCB3aWxsIHNpbGVudGx5IGNvbnRpbnVlLgorCSAqLworCXNwID0gQ09OTkVDVElP Tl9TTE9UKGNwLCBNQUlOX05PREVfSUQpOworCWlmIChwcm90b01ham9yID09IFBST1RPX01BSk9S X1YzICYmIHNwLT5uZWdvdGlhdGVQcm90b2NvbE1zZykKKwl7CisJCWVsb2coREVCVUcxLCAibmVn b3RpYXRlUHJvdG9jb2wgbWVzc2FnZSBpcyBmb3J3YXJkZWQgdG8gZnJvbnRlbmQgYXQgcmVhdXRo Iik7CisJCXBvb2xfd3JpdGVfYW5kX2ZsdXNoKGZyb250ZW5kLCBzcC0+bmVnb3RpYXRlUHJvdG9j b2xNc2csCisJCQkJCQkJIHNwLT5ucGxlbik7CisJfQorCiAJLyoKIAkgKiBpZiBoYmEgaXMgZW5h YmxlZCB3ZSB3b3VsZCBhbHJlYWR5IGhhdmUgcGFzc2VkIGF1dGhlbnRpY2F0aW9uCiAJICovCkBA IC04MjIsNiArODU3LDkgQEAgcG9vbF9kb19yZWF1dGgoUE9PTF9DT05ORUNUSU9OICogZnJvbnRl bmQsIFBPT0xfQ09OTkVDVElPTl9QT09MICogY3ApCiAJCX0KIAl9CiAKKwkvKgorCSAqIFNlbmQg YXV0aCBvaworCSAqLwogCXBvb2xfd3JpdGUoZnJvbnRlbmQsICJSIiwgMSk7CiAKIAlpZiAocHJv dG9NYWpvciA9PSBQUk9UT19NQUpPUl9WMykKQEAgLTgzMiw3ICs4NzAsMTAgQEAgcG9vbF9kb19y ZWF1dGgoUE9PTF9DT05ORUNUSU9OICogZnJvbnRlbmQsIFBPT0xfQ09OTkVDVElPTl9QT09MICog Y3ApCiAKIAltc2dsZW4gPSBodG9ubCgwKTsKIAlwb29sX3dyaXRlX2FuZF9mbHVzaChmcm9udGVu ZCwgJm1zZ2xlbiwgc2l6ZW9mKG1zZ2xlbikpOworCisJLyogc2VuZCBCYWNrZW5kS2V5RGF0YSAq LwogCXBvb2xfc2VuZF9iYWNrZW5kX2tleV9kYXRhKGZyb250ZW5kLCBNQUlOX0NPTk5FQ1RJT04o Y3ApLT5waWQsIE1BSU5fQ09OTkVDVElPTihjcCktPmtleSwgcHJvdG9NYWpvcik7CisKIAlyZXR1 cm4gMDsKIH0KIApAQCAtMjA3NCwzICsyMTE1LDcwIEBAIHBnX1NBU0xfY29udGludWUoUE9PTF9D T05ORUNUSU9OICogYmFja2VuZCwgY2hhciAqcGF5bG9hZCwgaW50IHBheWxvYWRsZW4sIHZvaWQK IAogCXJldHVybiAwOwogfQorCisvKgorICogRm9yd2FyZCBOZWdvdGlhdGVQcm90b2NvbCBtZXNz YWdlIHRvIGZyb250ZW5kLgorICoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIG1l c3NhZ2Uga2luZCBoYXMgYmVlbiBhbHJlYWR5IHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkCitQcm9j ZXNzTmVnb3RpYXRlUHJvdG9jb2woUE9PTF9DT05ORUNUSU9OICpmcm9udGVuZCwgUE9PTF9DT05O RUNUSU9OX1BPT0wgKmNwKQoreworCWludDMyCWxlbjsKKwlpbnQzMglzYXZlbGVuOworCWludDMy CXByb3RvTWFqb3I7CisJaW50MzIJcHJvdG9NaW5vcjsKKwlpbnQzMglwcm90b3Y7CisJYm9vbAlm b3J3YXJkTXNnID0gZmFsc2U7CisJaW50CQlpOworCisJZWxvZyhERUJVRzEsICJGb3J3YXJkaW5n IE5lZ290aWF0ZVByb3RvY29sIG1lc3NhZ2UgdG8gZnJvbnRlbmQiKTsKKwlwb29sX3dyaXRlKGZy b250ZW5kLCAidiIsIDEpOwkvKiBmb3J3YXJkIG1lc3NhZ2Uga2luZCAqLworCXNhdmVsZW4gPSBs ZW4gPSBwb29sX3JlYWRfaW50KGNwKTsJCS8qIG1lc3NhZ2UgbGVuZ3RoIGluY2x1ZGluZyBzZWxm ICovCisJcG9vbF93cml0ZShmcm9udGVuZCwgJmxlbiwgNCk7CS8qIGZvcndhcmQgbWVzc2FnZSBs ZW5ndGggKi8KKwlsZW4gPSBudG9obChsZW4pIC0gNDsJCQkvKiBsZW5ndGggb2YgcmVzdCBvZiB0 aGUgbWVzc2FnZSAqLworCXByb3RvdiA9IHBvb2xfcmVhZF9pbnQoY3ApOwkvKiByZWFkIHByb3Rv Y29sIHZlcnNpb24gKi8KKwlwcm90b01ham9yID0gbnRvaGwocHJvdG92KSA+PiAxNjsJCS8qIHBy b3RvY29sIG1ham9yIHZlcnNpb24gKi8KKwlwcm90b01pbm9yID0gbnRvaGwocHJvdG92KSAmIDB4 MDAwMGZmZmY7CS8qIHByb3RvY29sIG1pbm9yIHZlcnNpb24gKi8KKwlwb29sX3dyaXRlKGZyb250 ZW5kLCAmcHJvdG92LCA0KTsJLyogZm9yd2FyZCBwcm90b2NvbCB2ZXJzaW9uICovCisJZWxvZyhE RUJVRzEsICJwcm90b2NvbCB2ZXJpb24gb2ZmZXJlZDogbWFqb3I6ICVkIG1pbm9yOiAlZCIsIHBy b3RvTWFqb3IsIHByb3RvTWlub3IpOworCWxlbiAtPSA0OworCWZvciAoaSA9IDA7IGkgPCBOVU1f QkFDS0VORFM7IGkrKykKKwl7CisJCWlmIChWQUxJRF9CQUNLRU5EKGkpKQorCQl7CisJCQlQT09M X0NPTk5FQ1RJT05fUE9PTF9TTE9UCSpzcDsKKwkJCWNoYXIJKnA7CisJCQljaGFyCSpucDsKKwkJ CVNpemUJbnBsZW47CisKKwkJCXAgPSBwb29sX3JlYWQyKENPTk5FQ1RJT04oY3AsIGkpLCBsZW4p OworCQkJaWYgKCFmb3J3YXJkTXNnKQorCQkJeworCQkJCXBvb2xfd3JpdGVfYW5kX2ZsdXNoKGZy b250ZW5kLCBwLCBsZW4pOwkvKiBmb3J3YXJkIHJlc3Qgb2YgbWVzc2FnZSAqLworCQkJCWZvcndh cmRNc2cgPSB0cnVlOworCQkJfQorCQkJLyogc2F2ZSBuZWdhdGlhdGUgcHJvdG9jb2wgdmVyc2lv biAqLworCQkJc3AgPSBDT05ORUNUSU9OX1NMT1QoY3AsIGkpOworCQkJc3AtPm5lZ290aWF0ZWRf bWFqb3IgPSBwcm90b01ham9yOworCQkJc3AtPm5lZ290aWF0ZWRfbWlub3IgPSBwcm90b01pbm9y OworCisJCQkvKiBzYXZlIG5lZ2F0aWF0ZSBwcm90b2NvbCBtZXNzYWdlICovCisJCQlucGxlbiA9 IDEgKwkvKiBtZXNzYWdlIGtpbmQgKi8KKwkJCQlzaXplb2Yoc2F2ZWxlbikgKwkvKiBtZXNzYWdl IGxlbmd0aCAqLworCQkJCXNpemVvZihwcm90b3YpICsJLyogcHJvdG9jb2wgdmVyc2lvbiAqLwor CQkJCWxlbjsJCQkJLyogcmVzdCBvZiBtZXNzYWdlICovCisJCQkvKiBhbGxvY2F0ZSBtZXNzYWdl IGFyZWEgKi8KKwkJCXNwLT5uZWdvdGlhdGVQcm90b2NvbE1zZyA9IE1lbW9yeUNvbnRleHRBbGxv YyhUb3BNZW1vcnlDb250ZXh0LCBucGxlbik7CisJCQlucCA9IHNwLT5uZWdvdGlhdGVQcm90b2Nv bE1zZzsKKwkJCXNwLT5ucGxlbiA9IG5wbGVuOwkvKiBzZXQgbWVzc2FnZSBsZW5ndGggKi8KKwor CQkJKm5wKysgPSAndic7CisJCQltZW1jcHkobnAsICZzYXZlbGVuLCBzaXplb2Yoc2F2ZWxlbikp OworCQkJbnAgKz0gc2l6ZW9mKHNhdmVsZW4pOworCQkJbWVtY3B5KG5wLCAmcHJvdG92LCBzaXpl b2YocHJvdG92KSk7CisJCQlucCArPSBzaXplb2YocHJvdG92KTsKKwkJCW1lbWNweShucCwgcCwg bGVuKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3Bvb2wuaCBiL3NyYy9p bmNsdWRlL3Bvb2wuaAppbmRleCBjOWI0ZGMyN2UuLmNmOGFmZjA3MyAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvcG9vbC5oCisrKyBiL3NyYy9pbmNsdWRlL3Bvb2wuaApAQCAtMjYyLDYgKzI2Miwx NSBAQCB0eXBlZGVmIHN0cnVjdAogCXRpbWVfdAkJY2xvc2V0aW1lOwkJLyogYWJzb2x1dGUgdGlt ZSBpbiBzZWNvbmQgd2hlbiB0aGUgY29ubmVjdGlvbgogCQkJCQkJCQkgKiBjbG9zZWQgaWYgMCwg dGhhdCBtZWFucyB0aGUgY29ubmVjdGlvbiBpcwogCQkJCQkJCQkgKiB1bmRlciB1c2UuICovCisJ LyoKKwkgKiBQcm90b2NvbCB2ZXJzaW9uIGFmdGVyIG5lZ290aWF0aW9uLiBOZWdhdGl2ZSB2YWx1 ZSBtZWFucyBubyBuZWdvdGlhdGlvbgorCSAqIGhhcyBiZWVuIGRvbmUuCisJICovCisJaW50CQkJ bmVnb3RpYXRlZF9tYWpvcjsKKwlpbnQJCQluZWdvdGlhdGVkX21pbm9yOworCWNoYXIJCSpuZWdv dGlhdGVQcm90b2NvbE1zZzsJLyogUmF3IE5lZ290aWF0ZVByb3RvY29sIG1lc3NhZyAqLworCWlu dDMyCQlucGxlbjsJCQkvKiBtZXNzYWdlIGxlbmd0aCBvZiBOZWdvdGlhdGVQcm90b2NvbCBtZXNz YWcgKi8KKwogfQkJCVBPT0xfQ09OTkVDVElPTl9QT09MX1NMT1Q7CiAKIHR5cGVkZWYgc3RydWN0 CmRpZmYgLS1naXQgYS9zcmMvcHJvdG9jb2wvcG9vbF9jb25uZWN0aW9uX3Bvb2wuYyBiL3NyYy9w cm90b2NvbC9wb29sX2Nvbm5lY3Rpb25fcG9vbC5jCmluZGV4IDIyNTI5NGExYi4uMDAwNDZlNjg3 IDEwMDY0NAotLS0gYS9zcmMvcHJvdG9jb2wvcG9vbF9jb25uZWN0aW9uX3Bvb2wuYworKysgYi9z cmMvcHJvdG9jb2wvcG9vbF9jb25uZWN0aW9uX3Bvb2wuYwpAQCAtMjM1LDYgKzIzNSw4IEBAIHBv b2xfZGlzY2FyZF9jcChjaGFyICp1c2VyLCBjaGFyICpkYXRhYmFzZSwgaW50IHByb3RvTWFqb3Ip CiAJCX0KIAkJQ09OTkVDVElPTl9TTE9UKHAsIGkpLT5zcCA9IE5VTEw7CiAJCXBvb2xfY2xvc2Uo Q09OTkVDVElPTihwLCBpKSk7CisJCWlmIChDT05ORUNUSU9OX1NMT1QocCwgaSktPm5lZ290aWF0 ZVByb3RvY29sTXNnKQorCQkJcGZyZWUoQ09OTkVDVElPTl9TTE9UKHAsIGkpLT5uZWdvdGlhdGVQ cm90b2NvbE1zZyk7CiAJCXBmcmVlKENPTk5FQ1RJT05fU0xPVChwLCBpKSk7CiAJfQogCi0tIAoy LjI1LjEKCg== ----Next_Part(Tue_Jul__8_11_21_33_2025_770)----