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 1r5Zht-00E3FW-Ag for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Nov 2023 22:59:02 +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 1r5Zhp-002vXy-S0 for pgsql-hackers@arkaria.postgresql.org; Tue, 21 Nov 2023 22:58:57 +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.94.2) (envelope-from ) id 1r5Zhp-002vVb-CE for pgsql-hackers@lists.postgresql.org; Tue, 21 Nov 2023 22:58:57 +0000 Received: from forward501b.mail.yandex.net ([178.154.239.145]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r5Zhm-007gL7-4N for pgsql-hackers@lists.postgresql.org; Tue, 21 Nov 2023 22:58:56 +0000 Received: from mail-nwsmtp-smtp-production-main-49.vla.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-49.vla.yp-c.yandex.net [IPv6:2a02:6b8:c18:4601:0:640:7543:0]) by forward501b.mail.yandex.net (Yandex) with ESMTP id 6E9F961572 for ; Wed, 22 Nov 2023 01:58:51 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-49.vla.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id mwWD69A5JSw0-1BgGhTVR; Wed, 22 Nov 2023 01:58:50 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1700607531; bh=N8edYoi9pRF4gOXNZv07tV28tPCJrisUDh3RY7sAlWQ=; h=To:Subject:Message-ID:Date:From; b=xEI3U01xcVXJe4lF+QlV0Y/iPwFJ3os8Zzdr6U0HwLIIfXkKiO7dQmCoc9GvWBPBf jIcBhVvi7T36mng/6qL3vAGOLli0U1Mjn3waJ8nnbV36SpD3W1ozFlSRLCFUl1vreJ ni4DLQ9YbfBs/+3mbEZ0tZQG9JJ6qjM/YMbC4JYo= Authentication-Results: mail-nwsmtp-smtp-production-main-49.vla.yp-c.yandex.net; dkim=pass header.i=@yandex.ru Content-Type: multipart/mixed; boundary="------------1V4Xp3B0l5i8SHY9nBJdrO71" Message-ID: <82c438b4-d91c-9009-65fc-593124d5a277@yandex.ru> Date: Wed, 22 Nov 2023 01:58:48 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Content-Language: en-US From: Ivan Trofimov Subject: WIP: libpq: add a possibility to not send D(escribe) when executing a prepared statement To: pgsql-hackers@lists.postgresql.org 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. --------------1V4Xp3B0l5i8SHY9nBJdrO71 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi! Currently libpq sends B(ind), D(escribe), E(execute), S(ync) when executing a prepared statement. The response for that D message is a RowDescription, which doesn't change during prepared statement lifetime (with the attributes format being an exception, as they aren't know before execution) . In a presumably very common case of repeatedly executing the same statement, this leads to both client and server parsing/sending exactly the same RowDescritpion data over and over again. Instead, library user could acquire a statement result RowDescription once (via PQdescribePrepared), and reuse it in subsequent calls to PQexecPrepared and/or its async friends. Doing it this way saves a measurable amount of CPU for both client and server and saves a lot of network traffic, for example: when selecting a single row from a table with 30 columns, where each column has 10-symbols name, and every value in a row is a 10-symbols TEXT, i'm seeing an amount of bytes sent to client decreased by a factor of 2.8, and the CPU time client spends in userland decreased by a factor of ~1.5. The patch attached adds a family of functions PQsendQueryPreparedPredescribed, PQgetResultPredescribed, PQisBusyPredescribed, which allow a user to do just that. If the idea seems reasonable i'd be happy to extend these to PQexecPrepared as well and cover it with tests. P.S. This is my first time ever sending a patch via email, so please don't hesitate to point at mistakes i'm doing in the process. --------------1V4Xp3B0l5i8SHY9nBJdrO71 Content-Type: text/x-patch; charset=UTF-8; name="PQsendQueryPreparedPredescribed.patch" Content-Disposition: attachment; filename="PQsendQueryPreparedPredescribed.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0IGIvc3JjL2lu dGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKaW5kZXggODUwNzM0YWM5Ni4uOTg5MzU0Y2Ew NiAxMDA2NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKKysrIGIv c3JjL2ludGVyZmFjZXMvbGlicHEvZXhwb3J0cy50eHQKQEAgLTE5MSwzICsxOTEsNiBAQCBQ UWNsb3NlUHJlcGFyZWQgICAgICAgICAgIDE4OAogUFFjbG9zZVBvcnRhbCAgICAgICAgICAg ICAxODkKIFBRc2VuZENsb3NlUHJlcGFyZWQgICAgICAgMTkwCiBQUXNlbmRDbG9zZVBvcnRh bCAgICAgICAgIDE5MQorUFFzZW5kUXVlcnlQcmVwYXJlZFByZWRlc2NyaWJlZCAgICAgMTky CitQUWdldFJlc3VsdFByZWRlc2NyaWJlZCAgICAgICAgICAgICAxOTMKK1BRaXNCdXN5UHJl ZGVzY3JpYmVkICAgICAgICAgICAgICAgIDE5NApkaWZmIC0tZ2l0IGEvc3JjL2ludGVyZmFj ZXMvbGlicHEvZmUtZXhlYy5jIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvZmUtZXhlYy5jCmlu ZGV4IDA0NjEwY2NmNWUuLmExOGJlYWQ5ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2Vz L2xpYnBxL2ZlLWV4ZWMuYworKysgYi9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1leGVjLmMK QEAgLTcyLDggKzcyLDE5IEBAIHN0YXRpYyBpbnQJUFFzZW5kUXVlcnlHdXRzKFBHY29ubiAq Y29ubiwKIAkJCQkJCQljb25zdCBjaGFyICpjb25zdCAqcGFyYW1WYWx1ZXMsCiAJCQkJCQkJ Y29uc3QgaW50ICpwYXJhbUxlbmd0aHMsCiAJCQkJCQkJY29uc3QgaW50ICpwYXJhbUZvcm1h dHMsCi0JCQkJCQkJaW50IHJlc3VsdEZvcm1hdCk7Ci1zdGF0aWMgdm9pZCBwYXJzZUlucHV0 KFBHY29ubiAqY29ubik7CisJCQkJCQkJaW50IHJlc3VsdEZvcm1hdCwKKwkJCQkJCQlib29s IHNlbmREZXNjcmliZSk7CitzdGF0aWMgaW50CVBRc2VuZFF1ZXJ5UHJlcGFyZWRJbnRlcm5h bChQR2Nvbm4gKmNvbm4sCisJCQkJCQkJCQkJY29uc3QgY2hhciAqc3RtdE5hbWUsCisJCQkJ CQkJCQkJaW50IG5QYXJhbXMsCisJCQkJCQkJCQkJY29uc3QgY2hhciAqY29uc3QgKnBhcmFt VmFsdWVzLAorCQkJCQkJCQkJCWNvbnN0IGludCAqcGFyYW1MZW5ndGhzLAorCQkJCQkJCQkJ CWNvbnN0IGludCAqcGFyYW1Gb3JtYXRzLAorCQkJCQkJCQkJCWludCByZXN1bHRGb3JtYXQs CisJCQkJCQkJCQkJYm9vbCBzZW5kRGVzY3JpYmUpOworc3RhdGljIGludAlQUWlzQnVzeUlu dGVybmFsKFBHY29ubiAqY29ubiwgUEdyZXN1bHQgKmRlc2NyaXB0aW9uKTsKK3N0YXRpYyBQ R3Jlc3VsdCAqUFFnZXRSZXN1bHRJbnRlcm5hbChQR2Nvbm4gKmNvbm4sIFBHcmVzdWx0ICpk ZXNjcmlwdGlvbik7CitzdGF0aWMgdm9pZCBwYXJzZUlucHV0KFBHY29ubiAqY29ubiwgUEdy ZXN1bHQgKmRlc2NyaXB0aW9uKTsKIHN0YXRpYyBQR3Jlc3VsdCAqZ2V0Q29weVJlc3VsdChQ R2Nvbm4gKmNvbm4sIEV4ZWNTdGF0dXNUeXBlIGNvcHl0eXBlKTsKIHN0YXRpYyBib29sIFBR ZXhlY1N0YXJ0KFBHY29ubiAqY29ubik7CiBzdGF0aWMgUEdyZXN1bHQgKlBRZXhlY0Zpbmlz aChQR2Nvbm4gKmNvbm4pOwpAQCAtMTUyOCw3ICsxNTM5LDggQEAgUFFzZW5kUXVlcnlQYXJh bXMoUEdjb25uICpjb25uLAogCQkJCQkJICAgcGFyYW1WYWx1ZXMsCiAJCQkJCQkgICBwYXJh bUxlbmd0aHMsCiAJCQkJCQkgICBwYXJhbUZvcm1hdHMsCi0JCQkJCQkgICByZXN1bHRGb3Jt YXQpOworCQkJCQkJICAgcmVzdWx0Rm9ybWF0LAorCQkJCQkJICAgdHJ1ZSAvKiBzZW5kIERl c2NyaWJlICovICk7CiB9CiAKIC8qCkBAIC0xNjQzLDYgKzE2NTUsMjYgQEAgUFFzZW5kUXVl cnlQcmVwYXJlZChQR2Nvbm4gKmNvbm4sCiAJCQkJCWNvbnN0IGludCAqcGFyYW1MZW5ndGhz LAogCQkJCQljb25zdCBpbnQgKnBhcmFtRm9ybWF0cywKIAkJCQkJaW50IHJlc3VsdEZvcm1h dCkKK3sKKwlyZXR1cm4gUFFzZW5kUXVlcnlQcmVwYXJlZEludGVybmFsKGNvbm4sCisJCQkJ CQkJCQkgICBzdG10TmFtZSwKKwkJCQkJCQkJCSAgIG5QYXJhbXMsCisJCQkJCQkJCQkgICBw YXJhbVZhbHVlcywKKwkJCQkJCQkJCSAgIHBhcmFtTGVuZ3RocywKKwkJCQkJCQkJCSAgIHBh cmFtRm9ybWF0cywKKwkJCQkJCQkJCSAgIHJlc3VsdEZvcm1hdCwKKwkJCQkJCQkJCSAgIHRy dWUgLyogc2VuZCBEZXNjcmliZSAqLyApOworfQorCitpbnQKK1BRc2VuZFF1ZXJ5UHJlcGFy ZWRJbnRlcm5hbChQR2Nvbm4gKmNvbm4sCisJCQkJCQkJY29uc3QgY2hhciAqc3RtdE5hbWUs CisJCQkJCQkJaW50IG5QYXJhbXMsCisJCQkJCQkJY29uc3QgY2hhciAqY29uc3QgKnBhcmFt VmFsdWVzLAorCQkJCQkJCWNvbnN0IGludCAqcGFyYW1MZW5ndGhzLAorCQkJCQkJCWNvbnN0 IGludCAqcGFyYW1Gb3JtYXRzLAorCQkJCQkJCWludCByZXN1bHRGb3JtYXQsCisJCQkJCQkJ Ym9vbCBzZW5kRGVzY3JpYmUpCiB7CiAJaWYgKCFQUXNlbmRRdWVyeVN0YXJ0KGNvbm4sIHRy dWUpKQogCQlyZXR1cm4gMDsKQEAgLTE2NjgsNyArMTcwMCw1MCBAQCBQUXNlbmRRdWVyeVBy ZXBhcmVkKFBHY29ubiAqY29ubiwKIAkJCQkJCSAgIHBhcmFtVmFsdWVzLAogCQkJCQkJICAg cGFyYW1MZW5ndGhzLAogCQkJCQkJICAgcGFyYW1Gb3JtYXRzLAotCQkJCQkJICAgcmVzdWx0 Rm9ybWF0KTsKKwkJCQkJCSAgIHJlc3VsdEZvcm1hdCwKKwkJCQkJCSAgIHNlbmREZXNjcmli ZSk7Cit9CisKK2ludAorUFFzZW5kUXVlcnlQcmVwYXJlZFByZWRlc2NyaWJlZChQR2Nvbm4g KmNvbm4sCisJCQkJCQkJCWNvbnN0IGNoYXIgKnN0bXROYW1lLAorCQkJCQkJCQlpbnQgblBh cmFtcywKKwkJCQkJCQkJY29uc3QgY2hhciAqY29uc3QgKnBhcmFtVmFsdWVzLAorCQkJCQkJ CQljb25zdCBpbnQgKnBhcmFtTGVuZ3RocywKKwkJCQkJCQkJY29uc3QgaW50ICpwYXJhbUZv cm1hdHMsCisJCQkJCQkJCWludCByZXN1bHRGb3JtYXQsCisJCQkJCQkJCVBHcmVzdWx0ICpk ZXNjcmlwdGlvbikKK3sKKwlpbnQJCQlpOworCWludAkJCW5GaWVsZHM7CisJaW50CQkJc2Vu ZF9yZXN1bHQ7CisKKwlpZiAoIWRlc2NyaXB0aW9uKQorCXsKKwkJbGlicHFfYXBwZW5kX2Nv bm5fZXJyb3IoY29ubiwgInF1ZXJ5IHJlc3VsdCBkZXNjcmlwdGlvbiBpcyBhIG51bGwgcG9p bnRlciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZW5kX3Jlc3VsdCA9IFBRc2VuZFF1ZXJ5 UHJlcGFyZWRJbnRlcm5hbChjb25uLAorCQkJCQkJCQkJCQkgIHN0bXROYW1lLAorCQkJCQkJ CQkJCQkgIG5QYXJhbXMsCisJCQkJCQkJCQkJCSAgcGFyYW1WYWx1ZXMsCisJCQkJCQkJCQkJ CSAgcGFyYW1MZW5ndGhzLAorCQkJCQkJCQkJCQkgIHBhcmFtRm9ybWF0cywKKwkJCQkJCQkJ CQkJICByZXN1bHRGb3JtYXQsCisJCQkJCQkJCQkJCSAgZmFsc2UgLyogc2VuZCBEZXNjcmli ZSAqLyApOworCisJLyogV2Ugb25seSBuZWVkIHRvIGFkanVzdCBhdHRyaWJ1dGVzIGZvcm1h dCBpZiBzZW5kIHN1Y2NlZWRlZCAqLworCWlmIChzZW5kX3Jlc3VsdCAmJiBkZXNjcmlwdGlv bi0+YXR0RGVzY3MgIT0gTlVMTCkKKwl7CisJCW5GaWVsZHMgPSBkZXNjcmlwdGlvbi0+bnVt QXR0cmlidXRlczsKKwkJZm9yIChpID0gMDsgaSA8IG5GaWVsZHM7IGkrKykKKwkJeworCQkJ ZGVzY3JpcHRpb24tPmF0dERlc2NzW2ldLmZvcm1hdCA9IHJlc3VsdEZvcm1hdDsKKwkJfQor CX0KKworCXJldHVybiBzZW5kX3Jlc3VsdDsKIH0KIAogLyoKQEAgLTE3NjYsNyArMTg0MSw4 IEBAIFBRc2VuZFF1ZXJ5R3V0cyhQR2Nvbm4gKmNvbm4sCiAJCQkJY29uc3QgY2hhciAqY29u c3QgKnBhcmFtVmFsdWVzLAogCQkJCWNvbnN0IGludCAqcGFyYW1MZW5ndGhzLAogCQkJCWNv bnN0IGludCAqcGFyYW1Gb3JtYXRzLAotCQkJCWludCByZXN1bHRGb3JtYXQpCisJCQkJaW50 IHJlc3VsdEZvcm1hdCwKKwkJCQlib29sIHNlbmREZXNjcmliZSkKIHsKIAlpbnQJCQlpOwog CVBHY21kUXVldWVFbnRyeSAqZW50cnk7CkBAIC0xODczLDEyICsxOTQ5LDE1IEBAIFBRc2Vu ZFF1ZXJ5R3V0cyhQR2Nvbm4gKmNvbm4sCiAJaWYgKHBxUHV0TXNnRW5kKGNvbm4pIDwgMCkK IAkJZ290byBzZW5kRmFpbGVkOwogCi0JLyogY29uc3RydWN0IHRoZSBEZXNjcmliZSBQb3J0 YWwgbWVzc2FnZSAqLwotCWlmIChwcVB1dE1zZ1N0YXJ0KFBxTXNnX0Rlc2NyaWJlLCBjb25u KSA8IDAgfHwKLQkJcHFQdXRjKCdQJywgY29ubikgPCAwIHx8Ci0JCXBxUHV0cygiIiwgY29u bikgPCAwIHx8Ci0JCXBxUHV0TXNnRW5kKGNvbm4pIDwgMCkKLQkJZ290byBzZW5kRmFpbGVk OworCWlmIChzZW5kRGVzY3JpYmUpCisJeworCQkvKiBjb25zdHJ1Y3QgdGhlIERlc2NyaWJl IFBvcnRhbCBtZXNzYWdlICovCisJCWlmIChwcVB1dE1zZ1N0YXJ0KFBxTXNnX0Rlc2NyaWJl LCBjb25uKSA8IDAgfHwKKwkJCXBxUHV0YygnUCcsIGNvbm4pIDwgMCB8fAorCQkJcHFQdXRz KCIiLCBjb25uKSA8IDAgfHwKKwkJCXBxUHV0TXNnRW5kKGNvbm4pIDwgMCkKKwkJCWdvdG8g c2VuZEZhaWxlZDsKKwl9CiAKIAkvKiBjb25zdHJ1Y3QgdGhlIEV4ZWN1dGUgbWVzc2FnZSAq LwogCWlmIChwcVB1dE1zZ1N0YXJ0KFBxTXNnX0V4ZWN1dGUsIGNvbm4pIDwgMCB8fApAQCAt MTk5MCw5ICsyMDY5LDkgQEAgUFFjb25zdW1lSW5wdXQoUEdjb25uICpjb25uKQogICogTm90 ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBOT1QgYXR0ZW1wdCB0byByZWFkIG1vcmUgZGF0 YSBmcm9tIHRoZSBiYWNrZW5kLgogICovCiBzdGF0aWMgdm9pZAotcGFyc2VJbnB1dChQR2Nv bm4gKmNvbm4pCitwYXJzZUlucHV0KFBHY29ubiAqY29ubiwgUEdyZXN1bHQgKmRlc2NyaXB0 aW9uKQogewotCXBxUGFyc2VJbnB1dDMoY29ubik7CisJcHFQYXJzZUlucHV0M1ByZWRlc2Ny aWJlZChjb25uLCBkZXNjcmlwdGlvbik7CiB9CiAKIC8qCkBAIC0yMDAyLDEyICsyMDgxLDE4 IEBAIHBhcnNlSW5wdXQoUEdjb25uICpjb25uKQogCiBpbnQKIFBRaXNCdXN5KFBHY29ubiAq Y29ubikKK3sKKwlyZXR1cm4gUFFpc0J1c3lJbnRlcm5hbChjb25uLCBOVUxMKTsKK30KKwor c3RhdGljIGludAorUFFpc0J1c3lJbnRlcm5hbChQR2Nvbm4gKmNvbm4sIFBHcmVzdWx0ICpk ZXNjcmlwdGlvbikKIHsKIAlpZiAoIWNvbm4pCiAJCXJldHVybiBmYWxzZTsKIAogCS8qIFBh cnNlIGFueSBhdmFpbGFibGUgZGF0YSwgaWYgb3VyIHN0YXRlIHBlcm1pdHMuICovCi0JcGFy c2VJbnB1dChjb25uKTsKKwlwYXJzZUlucHV0KGNvbm4sIGRlc2NyaXB0aW9uKTsKIAogCS8q CiAJICogUFFnZXRSZXN1bHQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgaW4gYWxsIHN0YXRl cyBleGNlcHQgQlVTWS4gIEFsc28sCkBAIC0yMDIwLDYgKzIxMDUsMTIgQEAgUFFpc0J1c3ko UEdjb25uICpjb25uKQogCXJldHVybiBjb25uLT5hc3luY1N0YXR1cyA9PSBQR0FTWU5DX0JV U1kgJiYgY29ubi0+c3RhdHVzICE9IENPTk5FQ1RJT05fQkFEOwogfQogCitpbnQKK1BRaXNC dXN5UHJlZGVzY3JpYmVkKFBHY29ubiAqY29ubiwgUEdyZXN1bHQgKmRlc2NyaXB0aW9uKQor eworCXJldHVybiBQUWlzQnVzeUludGVybmFsKGNvbm4sIGRlc2NyaXB0aW9uKTsKK30KKwog LyoKICAqIFBRZ2V0UmVzdWx0CiAgKgkgIEdldCB0aGUgbmV4dCBQR3Jlc3VsdCBwcm9kdWNl ZCBieSBhIHF1ZXJ5LiAgUmV0dXJucyBOVUxMIGlmIG5vCkBAIC0yMDMzLDYgKzIxMjQsMTIg QEAgUFFpc0J1c3koUEdjb25uICpjb25uKQogICovCiBQR3Jlc3VsdCAqCiBQUWdldFJlc3Vs dChQR2Nvbm4gKmNvbm4pCit7CisJcmV0dXJuIFBRZ2V0UmVzdWx0SW50ZXJuYWwoY29ubiwg TlVMTCk7Cit9CisKK3N0YXRpYyBQR3Jlc3VsdCAqCitQUWdldFJlc3VsdEludGVybmFsKFBH Y29ubiAqY29ubiwgUEdyZXN1bHQgKmRlc2NyaXB0aW9uKQogewogCVBHcmVzdWx0ICAgKnJl czsKIApAQCAtMjA0MCw3ICsyMTM3LDcgQEAgUFFnZXRSZXN1bHQoUEdjb25uICpjb25uKQog CQlyZXR1cm4gTlVMTDsKIAogCS8qIFBhcnNlIGFueSBhdmFpbGFibGUgZGF0YSwgaWYgb3Vy IHN0YXRlIHBlcm1pdHMuICovCi0JcGFyc2VJbnB1dChjb25uKTsKKwlwYXJzZUlucHV0KGNv bm4sIGRlc2NyaXB0aW9uKTsKIAogCS8qIElmIG5vdCByZWFkeSB0byByZXR1cm4gc29tZXRo aW5nLCBibG9jayB1bnRpbCB3ZSBhcmUuICovCiAJd2hpbGUgKGNvbm4tPmFzeW5jU3RhdHVz ID09IFBHQVNZTkNfQlVTWSkKQEAgLTIwNzgsNyArMjE3NSw3IEBAIFBRZ2V0UmVzdWx0KFBH Y29ubiAqY29ubikKIAkJfQogCiAJCS8qIFBhcnNlIGl0LiAqLwotCQlwYXJzZUlucHV0KGNv bm4pOworCQlwYXJzZUlucHV0KGNvbm4sIGRlc2NyaXB0aW9uKTsKIAogCQkvKgogCQkgKiBJ ZiB3ZSBoYWQgYSB3cml0ZSBlcnJvciwgYnV0IG5vdGhpbmcgYWJvdmUgb2J0YWluZWQgYSBx dWVyeSByZXN1bHQKQEAgLTIxODIsNiArMjI3OSwxMiBAQCBQUWdldFJlc3VsdChQR2Nvbm4g KmNvbm4pCiAJcmV0dXJuIHJlczsKIH0KIAorUEdyZXN1bHQgKgorUFFnZXRSZXN1bHRQcmVk ZXNjcmliZWQoUEdjb25uICpjb25uLCBQR3Jlc3VsdCAqZGVzY3JpcHRpb24pCit7CisJcmV0 dXJuIFBRZ2V0UmVzdWx0SW50ZXJuYWwoY29ubiwgZGVzY3JpcHRpb24pOworfQorCiAvKgog ICogZ2V0Q29weVJlc3VsdAogICoJICBIZWxwZXIgZm9yIFBRZ2V0UmVzdWx0OiBnZW5lcmF0 ZSByZXN1bHQgZm9yIENPUFktaW4tcHJvZ3Jlc3MgY2FzZXMKQEAgLTI2MzgsNyArMjc0MSw3 IEBAIFBRbm90aWZpZXMoUEdjb25uICpjb25uKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIFBh cnNlIGFueSBhdmFpbGFibGUgZGF0YSB0byBzZWUgaWYgd2UgY2FuIGV4dHJhY3QgTk9USUZZ IG1lc3NhZ2VzLiAqLwotCXBhcnNlSW5wdXQoY29ubik7CisJcGFyc2VJbnB1dChjb25uLCBO VUxMKTsKIAogCWV2ZW50ID0gY29ubi0+bm90aWZ5SGVhZDsKIAlpZiAoZXZlbnQpCkBAIC0y Njc3LDcgKzI3ODAsNyBAQCBQUXB1dENvcHlEYXRhKFBHY29ubiAqY29ubiwgY29uc3QgY2hh ciAqYnVmZmVyLCBpbnQgbmJ5dGVzKQogCSAqIGlucHV0IGRhdGEgaW50byB0aGUgaW5wdXQg YnVmZmVyIGhhcHBlbnMgZG93biBpbnNpZGUgcHFTZW5kU29tZSwgYnV0CiAJICogaXQncyBu b3QgYXV0aG9yaXplZCB0byBnZXQgcmlkIG9mIHRoZSBkYXRhIGFnYWluLikKIAkgKi8KLQlw YXJzZUlucHV0KGNvbm4pOworCXBhcnNlSW5wdXQoY29ubiwgTlVMTCk7CiAKIAlpZiAobmJ5 dGVzID4gMCkKIAl7CmRpZmYgLS1naXQgYS9zcmMvaW50ZXJmYWNlcy9saWJwcS9mZS1wcm90 b2NvbDMuYyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLXByb3RvY29sMy5jCmluZGV4IDU2 MTNjNTZiMTQuLjhmYTU4NTNmODQgMTAwNjQ0Ci0tLSBhL3NyYy9pbnRlcmZhY2VzL2xpYnBx L2ZlLXByb3RvY29sMy5jCisrKyBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLXByb3RvY29s My5jCkBAIC01NSw2ICs1NSw3IEBAIHN0YXRpYyB2b2lkIHJlcG9ydEVycm9yUG9zaXRpb24o UFFFeHBCdWZmZXIgbXNnLCBjb25zdCBjaGFyICpxdWVyeSwKIAkJCQkJCQkJaW50IGxvYywg aW50IGVuY29kaW5nKTsKIHN0YXRpYyBpbnQJYnVpbGRfc3RhcnR1cF9wYWNrZXQoY29uc3Qg UEdjb25uICpjb25uLCBjaGFyICpwYWNrZXQsCiAJCQkJCQkJCSBjb25zdCBQUUVudmlyb25t ZW50T3B0aW9uICpvcHRpb25zKTsKK3N0YXRpYyB2b2lkIHBxUGFyc2VJbnB1dDNJbnRlcm5h bChQR2Nvbm4gKmNvbm4sIFBHcmVzdWx0ICpkZXNjcmlwdGlvbik7CiAKIAogLyoKQEAgLTYy LDggKzYzLDggQEAgc3RhdGljIGludAlidWlsZF9zdGFydHVwX3BhY2tldChjb25zdCBQR2Nv bm4gKmNvbm4sIGNoYXIgKnBhY2tldCwKICAqIHVudGlsIGlucHV0IGlzIGV4aGF1c3RlZCBv ciBhIHN0b3BwaW5nIHN0YXRlIGlzIHJlYWNoZWQuCiAgKiBOb3RlIHRoYXQgdGhpcyBmdW5j dGlvbiB3aWxsIE5PVCBhdHRlbXB0IHRvIHJlYWQgbW9yZSBkYXRhIGZyb20gdGhlIGJhY2tl bmQuCiAgKi8KLXZvaWQKLXBxUGFyc2VJbnB1dDMoUEdjb25uICpjb25uKQorc3RhdGljIHZv aWQKK3BxUGFyc2VJbnB1dDNJbnRlcm5hbChQR2Nvbm4gKmNvbm4sIFBHcmVzdWx0ICpkZXNj cmlwdGlvbikKIHsKIAljaGFyCQlpZDsKIAlpbnQJCQltc2dMZW5ndGg7CkBAIC00MDIsMTEg KzQwMywzOCBAQCBwcVBhcnNlSW5wdXQzKFBHY29ubiAqY29ubikKIAkJCQkJfQogCQkJCQll bHNlCiAJCQkJCXsKLQkJCQkJCS8qIFNldCB1cCB0byByZXBvcnQgZXJyb3IgYXQgZW5kIG9m IHF1ZXJ5ICovCi0JCQkJCQlsaWJwcV9hcHBlbmRfY29ubl9lcnJvcihjb25uLCAic2VydmVy IHNlbnQgZGF0YSAoXCJEXCIgbWVzc2FnZSkgd2l0aG91dCBwcmlvciByb3cgZGVzY3JpcHRp b24gKFwiVFwiIG1lc3NhZ2UpIik7Ci0JCQkJCQlwcVNhdmVFcnJvclJlc3VsdChjb25uKTsK LQkJCQkJCS8qIERpc2NhcmQgdGhlIHVuZXhwZWN0ZWQgbWVzc2FnZSAqLwotCQkJCQkJY29u bi0+aW5DdXJzb3IgKz0gbXNnTGVuZ3RoOworCQkJCQkJaWYgKCFkZXNjcmlwdGlvbikKKwkJ CQkJCXsKKwkJCQkJCQkvKiBTZXQgdXAgdG8gcmVwb3J0IGVycm9yIGF0IGVuZCBvZiBxdWVy eSAqLworCQkJCQkJCWxpYnBxX2FwcGVuZF9jb25uX2Vycm9yKGNvbm4sCisJCQkJCQkJCQkJ CQkJInNlcnZlciBzZW50IGRhdGEgKFwiRFwiIG1lc3NhZ2UpIHdpdGhvdXQgcHJpb3Igcm93 IGRlc2NyaXB0aW9uIChcIlRcIiBtZXNzYWdlKSIpOworCQkJCQkJCXBxU2F2ZUVycm9yUmVz dWx0KGNvbm4pOworCQkJCQkJCS8qIERpc2NhcmQgdGhlIHVuZXhwZWN0ZWQgbWVzc2FnZSAq LworCQkJCQkJCWNvbm4tPmluQ3Vyc29yICs9IG1zZ0xlbmd0aDsKKwkJCQkJCX0KKwkJCQkJ CWVsc2UKKwkJCQkJCXsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIFdlIGRpZG4ndCByZWNlaXZl IHJvdyBkZXNjcmlwdGlvbiBmcm9tIHRoZQorCQkJCQkJCSAqIHNlcnZlciwgYnV0IHdlIGhh dmUgZXh0ZXJuYWxseSBwcm92aWRlZAorCQkJCQkJCSAqIGRlc2NyaXB0aW9uLCB1c2UgdGhh dC4KKwkJCQkJCQkgKi8KKwkJCQkJCQlpZiAoY29ubi0+cmVzdWx0ID09IE5VTEwpCisJCQkJ CQkJeworCQkJCQkJCQljb25uLT5yZXN1bHQgPSBQUW1ha2VFbXB0eVBHcmVzdWx0KGNvbm4s IFBHUkVTX1RVUExFU19PSyk7CisJCQkJCQkJfQorCQkJCQkJCWlmICghY29ubi0+cmVzdWx0 KQorCQkJCQkJCXsKKwkJCQkJCQkJbGlicHFfYXBwZW5kX2Nvbm5fZXJyb3IoY29ubiwgIm91 dCBvZiBtZW1vcnkiKTsKKwkJCQkJCQkJcHFTYXZlRXJyb3JSZXN1bHQoY29ubik7CisJCQkJ CQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCVBRc2V0UmVzdWx0QXR0cnMo Y29ubi0+cmVzdWx0LCBkZXNjcmlwdGlvbi0+bnVtQXR0cmlidXRlcywgZGVzY3JpcHRpb24t PmF0dERlc2NzKTsKKwkJCQkJCQkJaWYgKGdldEFub3RoZXJUdXBsZShjb25uLCBtc2dMZW5n dGgpKQorCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCX0KKwkJCQkJCX0KIAkJCQkJfQogCQkJ CQlicmVhazsKIAkJCQljYXNlIFBxTXNnX0NvcHlJblJlc3BvbnNlOgpAQCAtNDc4LDYgKzUw NiwxOCBAQCBwcVBhcnNlSW5wdXQzKFBHY29ubiAqY29ubikKIAl9CiB9CiAKK3ZvaWQKK3Bx UGFyc2VJbnB1dDMoUEdjb25uICpjb25uKQoreworCXBxUGFyc2VJbnB1dDNJbnRlcm5hbChj b25uLCBOVUxMKTsKK30KKwordm9pZAorcHFQYXJzZUlucHV0M1ByZWRlc2NyaWJlZChQR2Nv bm4gKmNvbm4sIFBHcmVzdWx0ICpkZXNjcmlwdGlvbikKK3sKKwlwcVBhcnNlSW5wdXQzSW50 ZXJuYWwoY29ubiwgZGVzY3JpcHRpb24pOworfQorCiAvKgogICogaGFuZGxlU3luY0xvc3M6 IGNsZWFuIHVwIGFmdGVyIGxvc3Mgb2YgbWVzc2FnZS1ib3VuZGFyeSBzeW5jCiAgKgpkaWZm IC0tZ2l0IGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtZmUuaCBiL3NyYy9pbnRlcmZh Y2VzL2xpYnBxL2xpYnBxLWZlLmgKaW5kZXggOTc3NjJkNTZmNS4uNTczYjY4ZmVhMiAxMDA2 NDQKLS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtZmUuaAorKysgYi9zcmMvaW50 ZXJmYWNlcy9saWJwcS9saWJwcS1mZS5oCkBAIC00NjIsMTEgKzQ2MiwyMSBAQCBleHRlcm4g aW50CVBRc2VuZFF1ZXJ5UHJlcGFyZWQoUEdjb25uICpjb25uLAogCQkJCQkJCQljb25zdCBp bnQgKnBhcmFtTGVuZ3RocywKIAkJCQkJCQkJY29uc3QgaW50ICpwYXJhbUZvcm1hdHMsCiAJ CQkJCQkJCWludCByZXN1bHRGb3JtYXQpOworZXh0ZXJuIGludAlQUXNlbmRRdWVyeVByZXBh cmVkUHJlZGVzY3JpYmVkKFBHY29ubiAqY29ubiwKKwkJCQkJCQkJCQkJY29uc3QgY2hhciAq c3RtdE5hbWUsCisJCQkJCQkJCQkJCWludCBuUGFyYW1zLAorCQkJCQkJCQkJCQljb25zdCBj aGFyICpjb25zdCAqcGFyYW1WYWx1ZXMsCisJCQkJCQkJCQkJCWNvbnN0IGludCAqcGFyYW1M ZW5ndGhzLAorCQkJCQkJCQkJCQljb25zdCBpbnQgKnBhcmFtRm9ybWF0cywKKwkJCQkJCQkJ CQkJaW50IHJlc3VsdEZvcm1hdCwKKwkJCQkJCQkJCQkJUEdyZXN1bHQgKmRlc2NyaXB0aW9u KTsKIGV4dGVybiBpbnQJUFFzZXRTaW5nbGVSb3dNb2RlKFBHY29ubiAqY29ubik7CiBleHRl cm4gUEdyZXN1bHQgKlBRZ2V0UmVzdWx0KFBHY29ubiAqY29ubik7CitleHRlcm4gUEdyZXN1 bHQgKlBRZ2V0UmVzdWx0UHJlZGVzY3JpYmVkKFBHY29ubiAqY29ubiwgUEdyZXN1bHQgKmRl c2NyaXB0aW9uKTsKIAogLyogUm91dGluZXMgZm9yIG1hbmFnaW5nIGFuIGFzeW5jaHJvbm91 cyBxdWVyeSAqLwogZXh0ZXJuIGludAlQUWlzQnVzeShQR2Nvbm4gKmNvbm4pOworZXh0ZXJu IGludAlQUWlzQnVzeVByZWRlc2NyaWJlZChQR2Nvbm4gKmNvbm4sIFBHcmVzdWx0ICpkZXNj cmlwdGlvbik7CiBleHRlcm4gaW50CVBRY29uc3VtZUlucHV0KFBHY29ubiAqY29ubik7CiAK IC8qIFJvdXRpbmVzIGZvciBwaXBlbGluZSBtb2RlIG1hbmFnZW1lbnQgKi8KZGlmZiAtLWdp dCBhL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2xpYnBxLWludC5oIGIvc3JjL2ludGVyZmFjZXMv bGlicHEvbGlicHEtaW50LmgKaW5kZXggYzc0NWZhY2ZlYy4uZGY5MWMzOWZiZSAxMDA2NDQK LS0tIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgKKysrIGIvc3JjL2ludGVy ZmFjZXMvbGlicHEvbGlicHEtaW50LmgKQEAgLTcwNiw2ICs3MDYsNyBAQCBleHRlcm4gaW50 CVBRc2VuZFF1ZXJ5Q29udGludWUoUEdjb25uICpjb25uLCBjb25zdCBjaGFyICpxdWVyeSk7 CiBleHRlcm4gY2hhciAqcHFCdWlsZFN0YXJ0dXBQYWNrZXQzKFBHY29ubiAqY29ubiwgaW50 ICpwYWNrZXRsZW4sCiAJCQkJCQkJCSAgIGNvbnN0IFBRRW52aXJvbm1lbnRPcHRpb24gKm9w dGlvbnMpOwogZXh0ZXJuIHZvaWQgcHFQYXJzZUlucHV0MyhQR2Nvbm4gKmNvbm4pOworZXh0 ZXJuIHZvaWQgcHFQYXJzZUlucHV0M1ByZWRlc2NyaWJlZChQR2Nvbm4gKmNvbm4sIFBHcmVz dWx0ICpkZXNjcmlwdGlvbik7CiBleHRlcm4gaW50CXBxR2V0RXJyb3JOb3RpY2UzKFBHY29u biAqY29ubiwgYm9vbCBpc0Vycm9yKTsKIGV4dGVybiB2b2lkIHBxQnVpbGRFcnJvck1lc3Nh Z2UzKFBRRXhwQnVmZmVyIG1zZywgY29uc3QgUEdyZXN1bHQgKnJlcywKIAkJCQkJCQkJIFBH VmVyYm9zaXR5IHZlcmJvc2l0eSwgUEdDb250ZXh0VmlzaWJpbGl0eSBzaG93X2NvbnRleHQp Owo= --------------1V4Xp3B0l5i8SHY9nBJdrO71--