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 1vOMUN-004NBl-39 for pgsql-hackers@arkaria.postgresql.org; Wed, 26 Nov 2025 20:51:48 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vOMUL-001Yc2-1g for pgsql-hackers@arkaria.postgresql.org; Wed, 26 Nov 2025 20:51:45 +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 1vOMUL-001Ybu-0I for pgsql-hackers@lists.postgresql.org; Wed, 26 Nov 2025 20:51:45 +0000 Received: from mail-pf1-x431.google.com ([2607:f8b0:4864:20::431]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vOMUI-001fRm-2c for pgsql-hackers@postgresql.org; Wed, 26 Nov 2025 20:51:45 +0000 Received: by mail-pf1-x431.google.com with SMTP id d2e1a72fcca58-7b9c17dd591so111992b3a.3 for ; Wed, 26 Nov 2025 12:51:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764190300; x=1764795100; darn=postgresql.org; h=in-reply-to:references:mime-version:from:subject:cc:to:message-id :date:from:to:cc:subject:date:message-id:reply-to; bh=Wvm7xcX91dK0MNenb/fP49MbVmzK059evassH2KkcdQ=; b=gyxMfRueWNaYNFScZ/GeNEcoEr9wuPLNPnS0j/2xwBeA4HamdC36IQOHJMxxRLZvIJ PZK2EG/gd18etSX5D+r0gx0gw1AZKYMz91EgE7NTUXBirn7RUF2OtGi/1F27Mg3+Tz+I O1u7ZPdLOmvzIhnO8+i8KdbuZ/YlCHgF5WmBWf9aHOXbMrHHB0fMLXSYxI2Y5tPeV83v hVh5DLdTRGAAOYcKCNdVOA6bqxQemnicVPMOtooxCrqc4ajD9wUU2HFF6NwdVnLG3CGM +fL2FLBurLyT9sCBisL+jfHdlMdQe01EbBlz+u/4WB78ODZiZyQlm2h27AWE8KErhdq0 3BeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764190300; x=1764795100; h=in-reply-to:references:mime-version:from:subject:cc:to:message-id :date:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Wvm7xcX91dK0MNenb/fP49MbVmzK059evassH2KkcdQ=; b=pN/h5q81v/8TaTNv9rxgifz23jY7LgGPMkU476lOLEp/R4X/MAJmIqXI3gLSl39f9M bileA4CmSyd4E11s6Sicl9y1ayOH5c+TJAGQ70ddpsHYhckUgCflpqJ3dO1xHoerThky GSHX1bd2O3KpUrFwXLWpIsaK9I4DW8yOQ4ER9reGeBdVTG42vKpbFl9mjkNcbkYqtoZF 3H9/3wHrjgskEc7Yyn8zyuxzWZ4bJKu4ElmnISL7yQsreVqN16Qz1A3vHCODx1gznVPo vfnVxF3nvvDd8m0ZqSryWzO878E9oldgnrpcw+/Phe+7ERNTmk6BkrbiXMTWobZijEEm mp4A== X-Forwarded-Encrypted: i=1; AJvYcCWk0QW8mXSD0f1Y1kkn7X7MgKETwcwY6j3Rp2ogCTTe05E4vzk5dukjgGGbzw6Ju0wr73w9pRT05VWfBgel@postgresql.org X-Gm-Message-State: AOJu0YyZQ9UUI2UYt/aFAFgeHzRaJWSsh9N0TZ0ZrIQERDavfdrSQv9k ej9cP/BVkyv8jOjvL8lRKttwjkxzbf899I7scFWWo9HGu1Q2fG1pcJsL X-Gm-Gg: ASbGnctdhDKOdbtTdbiv6fe4g++QtvXBW4YI965HjhRXU/V70N5c5hfZ4rcLi1NAvAN vqwFF/NNnulkt/yVGtin21iIiPGJHczOb6loacpO7Tk9vqhxfRc0OaZL0SfTQyoynLU8b2lMRmL llTdOWvDaKDCy/WDliPqnLwwMgU7gFJ3uI7i1z2YI/mx25x2vT6SXjFSWA+MBzxjclqqUlz5gBy pLIG9VOfXkded3T++faLhDWciEKVynHAFpXM6CbCHHeTQLS+G1hV6OhQj4YIe9Uf5ubiy6ORtvt O/vYnxcc81s6K70LVIXBNdXY4mQ89oo3eG2oX32sjEUHmBDGkTEpNUo8L9XIHMCM1MTRV35J9KN 33gRUjir35Pi/syOQcfpe57sIoyg7MG/2hsXdGBckr4hTvlAwviqk/OH6xUGHcIfh9meDLEHgt7 Q74s4FQ2hlZsiVjHM1ynSJM4rQzOs3+3bw8w== X-Google-Smtp-Source: AGHT+IFKavW2ZjzcOK8ckRSMxWDgtjKMstP/fcFsn+mToS+At0vwkluAUV4LLWHQnSmn97M5qIrcbw== X-Received: by 2002:a05:7022:7a5:b0:11b:7dcd:ca9a with SMTP id a92af1059eb24-11cbba523cbmr6876808c88.34.1764190300108; Wed, 26 Nov 2025 12:51:40 -0800 (PST) Received: from localhost ([2804:14d:328a:a59c:4135:83af:9a66:dc3f]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-11c93e6dbc8sm101439639c88.10.2025.11.26.12.51.37 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 26 Nov 2025 12:51:39 -0800 (PST) Content-Type: multipart/mixed; boundary=b2c6c27a4b52dfdccf6336ab72ea76c5a0aeadb4ea846f58b7c3539ef803 Date: Wed, 26 Nov 2025 17:51:36 -0300 Message-Id: To: "Masahiko Sawada" , "Matheus Alcantara" Cc: "Andrew Dunstan" , "jian he" , "Tomas Vondra" , Subject: Re: postgres_fdw: Use COPY to speed up batch inserts From: "Matheus Alcantara" Mime-Version: 1.0 X-Mailer: aerc 0.21.0 References: <5c52f4c7-74fa-4594-8378-53fd49f39329@dunslane.net> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --b2c6c27a4b52dfdccf6336ab72ea76c5a0aeadb4ea846f58b7c3539ef803 Content-Type: multipart/alternative; boundary=89cb30ecd2c8ac22ad81748e30d1f9021d65eb6aa72ef2a29c8c51d7d8c9 --89cb30ecd2c8ac22ad81748e30d1f9021d65eb6aa72ef2a29c8c51d7d8c9 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Wed Nov 19, 2025 at 8:32 PM -03, Masahiko Sawada wrote: > I think one key point in the patch is whether or not it's okay to > switch using COPY based on the actual number of tuples inserted. While > it should be okay from the performance perspective, it might be an > issue that the remote query shown in EXPLAIN (without ANALYZE) might > be different from the actual query sent. If there is a way to > distinguish the batch insertion between INSERT and COPY in > postgres_fdw, it might be a good idea to use COPY command for the > remote query only when the COPY FROM comes. > Yeah, I agree that this EXPLAIN inconsistency is an issue that for now it doesn't seems easy to fix. That being said I've take a step back and tried to reduce the scope of the patch to implement this idea of using COPY as a remote sql when the user is executing a COPY FROM on a foreign table. My initial idea was to use the COPY as a remote SQL whenever an user execute a COPY FROM on a foreign table but this can cause breaking changes because the table on the foreign server may have triggers for INSERT's and changing to use only the COPY FROM as remote sql would break these cases. We have some test cases for this scenario. So on this new version I introduced two new foreign table and server options: - use_copy_for_batch_insert: Enable the usage of COPY when appropriate - copy_for_batch_insert_threshold: The number of rows necessary to switch to use the COPY command instead of an INSERT. I think that the threshold option is necessary because it can be configured for a different value than batch_size option based on the user needs. The default value is 1, so once "use_copy_for_batch_insert" is set to true, the COPY will start to be used. Note that this option is set to false by default. Speeking about the implementation, the CopyFrom() calls BeginForeignInsert() fdw routine. The postgres_fdw implementation of this routine create the PgFdwModifyState that is used by execute_foreign_modify() so I thought that it could be a good idea to get the table options of COPY usage on this function and save it on PgFdwModifyState struct and when execute_foreign_modify() is executed we can just access the table options previously stored and check if the COPY can be actually be used based on the number of tuples being batch inserted. The BeginForeignInsert() routine is also called when inserting tuples into table partitions, so saving the COPY usage options on this stage can make it possible to use the COPY command to speed up batch inserts into partition tables that are postgres_fdw tables. I'm not sure if we should keep the patch scope only for COPY FROM on foreign table but I don't see any issue of using the COPY to speed up batch inserts of postgres_fdw table partitions too since we don't expose the remote sql being used on this case, and benchmarks shows that we can have a good performance improvement. I've implemented this idea on the attached v7 and here it is some benchmarks that I've run. Scenario: COPY FROM use_copy_for_batch_insert =3D false rows being inserted =3D 100 batch_size =3D 100 copy_for_batch_insert_threshold =3D 50 tps =3D 6500.133253 Scenario: COPY FROM use_copy_for_batch_insert =3D true rows being inserted =3D 100 batch_size =3D 100 copy_for_batch_insert_threshold =3D 50 tps =3D 13116.474292 Scenario: COPY FROM use_copy_for_batch_insert =3D false rows being inserted =3D 140 batch_size =3D 100 copy_for_batch_insert_threshold =3D 50 tps =3D 4654.865032 Scenario: COPY FROM use_copy_for_batch_insert =3D true rows being inserted =3D 140 batch_size =3D 100 copy_for_batch_insert_threshold =3D 50 tps =3D 7441.694325 ------------------------------------- Scenario: INSERT INTO use_copy_for_batch_insert =3D false rows being inserted per partition =3D 100 number of partitions: 3 tps =3D 3176.872369 Scenario: INSERT INTO use_copy_for_batch_insert =3D true rows being inserted per partition =3D 100 number of partitions: 3 tps =3D 6993.544958 ------------------------------------- Note that for the "copy_for_batch_insert_threshold =3D 50" and "rows being inserted=3D140" the behaviour is to use the COPY for the first batch iteration of 100 rows and then fallback to use INSERT for the 40 rows remaining. Summary of v7 changes: - Introduce "use_copy_for_batch_insert" foreign server/table option to enable the usage of COPY command - Introduce "copy_for_batch_insert_threshold" option to use the COPY command if the number of rows being inserted is >=3D of the configured value. Default is 1. - COPY command can only be used if the user is executing a COPY FROM on a postgres_fdw table or an INSERT into a partitioned table that has postgres_fdw as table partitions. - COPY and INSERT can be used for the same execution if there is no sufficient rows remaining (based on copy_usage_threshold) after the first batch execution. -- Matheus Alcantara EDB: http://www.enterprisedb.com --89cb30ecd2c8ac22ad81748e30d1f9021d65eb6aa72ef2a29c8c51d7d8c9-- --b2c6c27a4b52dfdccf6336ab72ea76c5a0aeadb4ea846f58b7c3539ef803 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v7-0001-postgres_fdw-speed-up-batch-inserts-using-COPY.patch Content-Type: text/plain; charset=utf-8; name=v7-0001-postgres_fdw-speed-up-batch-inserts-using-COPY.patch RnJvbSAxN2JiYjBiMTI5YWRjOTZmNTk1ZTJlYjQ2NDFiNGI2MDFmOWZiZjZiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjYgTm92IDIwMjUgMTY6MzQ6NDYgLTAzMDAKU3ViamVjdDogW1BBVENIIHY3XSBw b3N0Z3Jlc19mZHc6IHNwZWVkIHVwIGJhdGNoIGluc2VydHMgdXNpbmcgQ09QWQoKUHJldmlvdXNs eSB3aGVuIHRoZSB1c2VyIGV4ZWN1dGUgYSBDT1BZIGludG8gYSBmb3JlaWduIHRhYmxlIHRoZQpz dGF0ZW1lbnQgd2FzIHRyYW5zbGF0ZWQgaW50byBhIElOU0VSVCBzdGF0ZW1lbnQgdG8gYmUgZXhl Y3V0ZWQgb24gdGhlCmZvcmVpZ24gc2VydmVyLiBUaGlzIGNvbW1pdCBpbnRyb2R1Y2UgYSBuZXcg Zm9yZWlnbiB0YWJsZS9zZXJ2ZXIgb3B0aW9uCiJ1c2VfY29weV9mb3JfYmF0Y2hfaW5zZXJ0IiB0 byBlbmFibGUgdGhlIHVzYWdlIG9mIHRoZSBDT1BZIGNvbW1hbmQKaW5zdGVhZCBvZiBhbiBJTlNF UlQuIEFub3RoZXIgb3B0aW9uICJjb3B5X2Zvcl9iYXRjaF9pbnNlcnRfdGhyZXNob2xkIgp3YXMg YWxzbyBhZGRlZCB0byBzd2l0Y2ggdG8gdXNlIHRoZSBDT1BZIGNvbW1hbmQgd2hlbiB0aGUgbnVt YmVyIG9mIHJvd3MKYmVpbmcgaW5zZXJ0ZWQgaXMgPj0gdGhhbiB0aGUgY29uZmlndXJlZCB2YWx1 ZS4KClRoaXMgbG9naWMgd2FzIGltcGxlbWVudCBvbiBwb3N0Z3Jlc0JlZ2luRm9yZWlnbkluc2Vy dCgpIHRoYXQgaXMgdGhlCmltcGxlbWVudGF0aW9uIG9mIEJlZ2luRm9yZWlnbkluc2VydCgpIGZk dyByb3V0aW5lLiBBcyB0aGlzIGZ1bmN0aW9uIGlzCmFsc28gY2FsbGVkIHdoZW4gaW5zZXJ0aW5n IHR1cGxlcyBpbnRvIHBhcnRpdGlvbnMgdGhlIENPUFkgY2FuIGFsc28gYmUKdXNlZCB0byBzcGVl ZCB1cCBiYXRjaCBpbnNlcnRzIGZvciB0YWJsZSBwYXJ0aXRpb25zIHRoYXQgYXJlCnBvc3RncmVz X2ZkdyB0YWJsZXMuCi0tLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jICAgICAgICAg ICAgICAgIHwgIDMwICsrKwogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcu b3V0ICAgIHwgIDEzICsKIGNvbnRyaWIvcG9zdGdyZXNfZmR3L29wdGlvbi5jICAgICAgICAgICAg ICAgICB8ICAxMyArLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMgICAgICAg ICAgIHwgMjM3ICsrKysrKysrKysrKysrKysrLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdy ZXNfZmR3LmggICAgICAgICAgIHwgICAxICsKIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0 Z3Jlc19mZHcuc3FsICAgICB8ICAxMyArCiA2IGZpbGVzIGNoYW5nZWQsIDMwNCBpbnNlcnRpb25z KCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2Rl cGFyc2UuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYwppbmRleCBmMmZiMDA1MTg0 My4uMWNkZjFkOGNjOGQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2Uu YworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKQEAgLTIyMzYsNiArMjIzNiwz NiBAQCByZWJ1aWxkSW5zZXJ0U3FsKFN0cmluZ0luZm8gYnVmLCBSZWxhdGlvbiByZWwsCiAJYXBw ZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsIG9yaWdfcXVlcnkgKyB2YWx1ZXNfZW5kX2xlbik7CiB9 CiAKKy8qCisgKiAgQnVpbGQgYSBDT1BZIEZST00gU1RESU4gc3RhdGVtZW50IHVzaW5nIHRoZSBU RVhUIGZvcm1hdAorICovCit2b2lkCitkZXBhcnNlQ29weVNxbChTdHJpbmdJbmZvIGJ1ZiwgUmVs YXRpb24gcmVsLCBMaXN0ICp0YXJnZXRfYXR0cnMpCit7CisJVHVwbGVEZXNjCXR1cGRlc2MgPSBS ZWxhdGlvbkdldERlc2NyKHJlbCk7CisJYm9vbAkJZmlyc3QgPSB0cnVlOworCisJYXBwZW5kU3Ry aW5nSW5mbyhidWYsICJDT1BZICIpOworCWRlcGFyc2VSZWxhdGlvbihidWYsIHJlbCk7CisJYXBw ZW5kU3RyaW5nSW5mbyhidWYsICIoIik7CisKKwlmb3JlYWNoX2ludChhdHRudW0sIHRhcmdldF9h dHRycykKKwl7CisJCUZvcm1fcGdfYXR0cmlidXRlIGF0dHIgPSBUdXBsZURlc2NBdHRyKHR1cGRl c2MsIGF0dG51bSAtIDEpOworCisJCWlmIChhdHRyLT5hdHRnZW5lcmF0ZWQpCisJCQljb250aW51 ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIsICIp OworCisJCWZpcnN0ID0gZmFsc2U7CisKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsIHF1 b3RlX2lkZW50aWZpZXIoTmFtZVN0cihhdHRyLT5hdHRuYW1lKSkpOworCX0KKwlhcHBlbmRTdHJp bmdJbmZvU3RyaW5nKGJ1ZiwgIikgRlJPTSBTVERJTiIpOworfQorCiAvKgogICogZGVwYXJzZSBy ZW1vdGUgVVBEQVRFIHN0YXRlbWVudAogICoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNf ZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBl Y3RlZC9wb3N0Z3Jlc19mZHcub3V0CmluZGV4IGNkMjgxMjYwNDlkLi45ZDA2ZDliNmViMCAxMDA2 NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAor KysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CkBAIC05 NTI0LDYgKzk1MjQsMTkgQEAgc2VsZWN0ICogZnJvbSByZW0yOwogICAyIHwgYmFyCiAoMiByb3dz KQogCitkZWxldGUgZnJvbSByZW0yOworLS0gVGVzdCBDT1BZIHdpdGggY2FuX3VzZV9jb3B5ID0g dHJ1ZQorYWx0ZXIgZm9yZWlnbiB0YWJsZSByZW0yIG9wdGlvbnMgKGFkZCB1c2VfY29weV9mb3Jf YmF0Y2hfaW5zZXJ0ICd0cnVlJywgY29weV9mb3JfYmF0Y2hfaW5zZXJ0X3RocmVzaG9sZCAnMicp OworLS0gSW5zZXJ0IDMgcm93cyBzbyB0aGF0IHRoZSB0aGlyZCByb3cgZmFsbGJhY2sgdG8gbm9y bWFsIElOU0VSVCBzdGF0ZW1lbnQgcGF0aAorY29weSByZW0yIGZyb20gc3RkaW47CitzZWxlY3Qg KiBmcm9tIHJlbTI7CisgZjEgfCBmMiAgCistLS0tKy0tLS0tCisgIDEgfCBmb28KKyAgMiB8IGJh cgorICAzIHwgYmF6CisoMyByb3dzKQorCiBkZWxldGUgZnJvbSByZW0yOwogLS0gVGVzdCBjaGVj ayBjb25zdHJhaW50cwogYWx0ZXIgdGFibGUgbG9jMiBhZGQgY29uc3RyYWludCBsb2MyX2YxcG9z aXRpdmUgY2hlY2sgKGYxID49IDApOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcv b3B0aW9uLmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9vcHRpb24uYwppbmRleCAwNDc4OGI3ZThi My4uZDU2YjZjYzE0MmQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L29wdGlvbi5j CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L29wdGlvbi5jCkBAIC0xNTcsNyArMTU3LDggQEAg cG9zdGdyZXNfZmR3X3ZhbGlkYXRvcihQR19GVU5DVElPTl9BUkdTKQogCQkJKHZvaWQpIEV4dHJh Y3RFeHRlbnNpb25MaXN0KGRlZkdldFN0cmluZyhkZWYpLCB0cnVlKTsKIAkJfQogCQllbHNlIGlm IChzdHJjbXAoZGVmLT5kZWZuYW1lLCAiZmV0Y2hfc2l6ZSIpID09IDAgfHwKLQkJCQkgc3RyY21w KGRlZi0+ZGVmbmFtZSwgImJhdGNoX3NpemUiKSA9PSAwKQorCQkJCSBzdHJjbXAoZGVmLT5kZWZu YW1lLCAiYmF0Y2hfc2l6ZSIpID09IDAgfHwKKwkJCQkgc3RyY21wKGRlZi0+ZGVmbmFtZSwgImNv cHlfZm9yX2JhdGNoX2luc2VydF90aHJlc2hvbGQiKSA9PSAwKQogCQl7CiAJCQljaGFyCSAgICp2 YWx1ZTsKIAkJCWludAkJCWludF92YWw7CkBAIC0yNjMsNiArMjY0LDE2IEBAIEluaXRQZ0Zkd09w dGlvbnModm9pZCkKIAkJLyogYmF0Y2hfc2l6ZSBpcyBhdmFpbGFibGUgb24gYm90aCBzZXJ2ZXIg YW5kIHRhYmxlICovCiAJCXsiYmF0Y2hfc2l6ZSIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCBm YWxzZX0sCiAJCXsiYmF0Y2hfc2l6ZSIsIEZvcmVpZ25UYWJsZVJlbGF0aW9uSWQsIGZhbHNlfSwK KwkJLyogdXNlX2NvcHlfZm9yX2JhdGNoX2luc2VydCBpcyBhdmFpbGFibGUgb24gYm90aCBzZXJ2 ZXIgYW5kIHRhYmxlICovCisJCXsidXNlX2NvcHlfZm9yX2JhdGNoX2luc2VydCIsIEZvcmVpZ25T ZXJ2ZXJSZWxhdGlvbklkLCBmYWxzZX0sCisJCXsidXNlX2NvcHlfZm9yX2JhdGNoX2luc2VydCIs IEZvcmVpZ25UYWJsZVJlbGF0aW9uSWQsIGZhbHNlfSwKKworCQkvKgorCQkgKiBjb3B5X2Zvcl9i YXRjaF9pbnNlcnRfdGhyZXNob2xkIGlzIGF2YWlsYWJsZSBvbiBib3RoIHNlcnZlciBhbmQKKwkJ ICogdGFibGUKKwkJICovCisJCXsiY29weV9mb3JfYmF0Y2hfaW5zZXJ0X3RocmVzaG9sZCIsIEZv cmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCBmYWxzZX0sCisJCXsiY29weV9mb3JfYmF0Y2hfaW5zZXJ0 X3RocmVzaG9sZCIsIEZvcmVpZ25UYWJsZVJlbGF0aW9uSWQsIGZhbHNlfSwKIAkJLyogYXN5bmNf Y2FwYWJsZSBpcyBhdmFpbGFibGUgb24gYm90aCBzZXJ2ZXIgYW5kIHRhYmxlICovCiAJCXsiYXN5 bmNfY2FwYWJsZSIsIEZvcmVpZ25TZXJ2ZXJSZWxhdGlvbklkLCBmYWxzZX0sCiAJCXsiYXN5bmNf Y2FwYWJsZSIsIEZvcmVpZ25UYWJsZVJlbGF0aW9uSWQsIGZhbHNlfSwKZGlmZiAtLWdpdCBhL2Nv bnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcv cG9zdGdyZXNfZmR3LmMKaW5kZXggMDZiNTJjNjUzMDAuLjAyYzYzMTJhNjU1IDEwMDY0NAotLS0g YS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYworKysgYi9jb250cmliL3Bvc3Rn cmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYwpAQCAtNjMsNiArNjMsOSBAQCBQR19NT0RVTEVfTUFHSUNf RVhUKAogLyogSWYgbm8gcmVtb3RlIGVzdGltYXRlcywgYXNzdW1lIGEgc29ydCBjb3N0cyAyMCUg ZXh0cmEgKi8KICNkZWZpbmUgREVGQVVMVF9GRFdfU09SVF9NVUxUSVBMSUVSIDEuMgogCisvKiBC dWZmZXIgc2l6ZSB0byBzZW5kIENPUFkgSU4gZGF0YSovCisjZGVmaW5lIENPUFlCVUZTSVogODE5 MgorCiAvKgogICogSW5kZXhlcyBvZiBGRFctcHJpdmF0ZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4g ZmR3X3ByaXZhdGUgbGlzdHMuCiAgKgpAQCAtMTk4LDYgKzIwMSwxMiBAQCB0eXBlZGVmIHN0cnVj dCBQZ0Zkd01vZGlmeVN0YXRlCiAJYm9vbAkJaGFzX3JldHVybmluZzsJLyogaXMgdGhlcmUgYSBS RVRVUk5JTkcgY2xhdXNlPyAqLwogCUxpc3QJICAgKnJldHJpZXZlZF9hdHRyczsJLyogYXR0ciBu dW1iZXJzIHJldHJpZXZlZCBieSBSRVRVUk5JTkcgKi8KIAorCS8qIENPUFkgdXNhZ2Ugc3R1ZmYg Ki8KKwlib29sCQl1c2VfY29weV9mb3JfYmF0Y2hfaW5zZXJ0OwkvKiBDT1BZIGNvbW1hbmQgaXMg ZW5hYmxlZCB0byB1c2U/ICovCisJaW50CQkJY29weV9mb3JfYmF0Y2hfaW5zZXJ0X3RocmVzaG9s ZDsJLyogIyBvZiByb3dzIHRvIHN3aXRjaCB0bworCQkJCQkJCQkJCQkJCSAqIHVzZSBDT1BZICov CisJYm9vbAkJdXNpbmdjb3B5OwkJLyogaXMgQ09QWSBiZWluZyB1c2VkID8gKi8KKwogCS8qIGlu Zm8gYWJvdXQgcGFyYW1ldGVycyBmb3IgcHJlcGFyZWQgc3RhdGVtZW50ICovCiAJQXR0ck51bWJl cgljdGlkQXR0bm87CQkvKiBhdHRudW0gb2YgaW5wdXQgcmVzanVuayBjdGlkIGNvbHVtbiAqLwog CWludAkJCXBfbnVtczsJCQkvKiBudW1iZXIgb2YgcGFyYW1ldGVycyB0byB0cmFuc21pdCAqLwpA QCAtNTQ1LDYgKzU1NCwxMSBAQCBzdGF0aWMgdm9pZCBtZXJnZV9mZHdfb3B0aW9ucyhQZ0Zkd1Jl bGF0aW9uSW5mbyAqZnBpbmZvLAogCQkJCQkJCSAgY29uc3QgUGdGZHdSZWxhdGlvbkluZm8gKmZw aW5mb19vLAogCQkJCQkJCSAgY29uc3QgUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mb19pKTsKIHN0 YXRpYyBpbnQJZ2V0X2JhdGNoX3NpemVfb3B0aW9uKFJlbGF0aW9uIHJlbCk7CitzdGF0aWMgYm9v bCBnZXRfdXNlX2NvcHlfZm9yX2JhdGNoX2luc2VydChSZWxhdGlvbiByZWwpOworc3RhdGljIGlu dAlnZXRfY29weV9mb3JfYmF0Y2hfaW5zZXJ0X3RocmVzaG9sZChSZWxhdGlvbiByZWwpOworc3Rh dGljIFR1cGxlVGFibGVTbG90ICoqZXhlY3V0ZV9mb3JlaWduX2luc2VydF91c2luZ19jb3B5KFBn RmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkJCQkJCQkJCSAgVHVwbGVUYWJsZVNsb3Qg KipzbG90cywKKwkJCQkJCQkJCQkJCQkJICBpbnQgKm51bVNsb3RzKTsKIAogCiAvKgpAQCAtMjI2 NSw2ICsyMjc5LDEwIEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5zZXJ0KE1vZGlmeVRhYmxlU3Rh dGUgKm10c3RhdGUsCiAJCQkJCQkJCQlyZXRyaWV2ZWRfYXR0cnMgIT0gTklMLAogCQkJCQkJCQkJ cmV0cmlldmVkX2F0dHJzKTsKIAorCWZtc3RhdGUtPnVzZV9jb3B5X2Zvcl9iYXRjaF9pbnNlcnQg PSBnZXRfdXNlX2NvcHlfZm9yX2JhdGNoX2luc2VydChyZWwpOworCWlmIChmbXN0YXRlLT51c2Vf Y29weV9mb3JfYmF0Y2hfaW5zZXJ0KQorCQlmbXN0YXRlLT5jb3B5X2Zvcl9iYXRjaF9pbnNlcnRf dGhyZXNob2xkID0gZ2V0X2NvcHlfZm9yX2JhdGNoX2luc2VydF90aHJlc2hvbGQocmVsKTsKKwog CS8qCiAJICogSWYgdGhlIGdpdmVuIHJlc3VsdFJlbEluZm8gYWxyZWFkeSBoYXMgUGdGZHdNb2Rp ZnlTdGF0ZSBzZXQsIGl0IG1lYW5zCiAJICogdGhlIGZvcmVpZ24gdGFibGUgaXMgYW4gVVBEQVRF IHN1YnBsYW4gcmVzdWx0IHJlbDsgaW4gd2hpY2ggY2FzZSwgc3RvcmUKQEAgLTQwNjYsNiArNDA4 NCw1MCBAQCBjcmVhdGVfZm9yZWlnbl9tb2RpZnkoRVN0YXRlICplc3RhdGUsCiAJcmV0dXJuIGZt c3RhdGU7CiB9CiAKKy8qCisgKiAgV3JpdGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBm bXN0YXRlIGludG8gYnVmIGJ1ZmZlciB0byBiZSBzZW50IGFzCisgKiAgQ09QWSBGUk9NIFNURElO IGRhdGEKKyAqLworc3RhdGljIHZvaWQKK2NvbnZlcnRfc2xvdF90b19jb3B5X3RleHQoU3RyaW5n SW5mbyBidWYsCisJCQkJCQkgIFBnRmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkgIFR1 cGxlVGFibGVTbG90ICpzbG90KQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihmbXN0YXRlLT5yZWwpOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQlpID0gMDsK KworCWZvcmVhY2hfaW50KGF0dG51bSwgZm1zdGF0ZS0+dGFyZ2V0X2F0dHJzKQorCXsKKwkJQ29t cGFjdEF0dHJpYnV0ZSAqYXR0ciA9IFR1cGxlRGVzY0NvbXBhY3RBdHRyKHR1cGRlc2MsIGF0dG51 bSAtIDEpOworCQlEYXR1bQkJZGF0dW07CisJCWJvb2wJCWlzbnVsbDsKKworCQkvKiBJZ25vcmUg Z2VuZXJhdGVkIGNvbHVtbnM7IHRoZXkgYXJlIHNldCB0byBERUZBVUxUICovCisJCWlmIChhdHRy LT5hdHRnZW5lcmF0ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5k U3RyaW5nSW5mb0NoYXJNYWNybyhidWYsICdcdCcpOworCQlmaXJzdCA9IGZhbHNlOworCisJCWRh dHVtID0gc2xvdF9nZXRhdHRyKHNsb3QsIGF0dG51bSwgJmlzbnVsbCk7CisKKwkJaWYgKGlzbnVs bCkKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiXFxOIik7CisJCWVsc2UKKwkJewor CQkJY29uc3QgY2hhciAqdmFsdWUgPSBPdXRwdXRGdW5jdGlvbkNhbGwoJmZtc3RhdGUtPnBfZmxp bmZvW2ldLAorCQkJCQkJCQkJCQkJICAgZGF0dW0pOworCisJCQlhcHBlbmRTdHJpbmdJbmZvU3Ry aW5nKGJ1ZiwgdmFsdWUpOworCQl9CisJCWkrKzsKKwl9CisKKwlhcHBlbmRTdHJpbmdJbmZvQ2hh ck1hY3JvKGJ1ZiwgJ1xuJyk7Cit9CisKIC8qCiAgKiBleGVjdXRlX2ZvcmVpZ25fbW9kaWZ5CiAg KgkJUGVyZm9ybSBmb3JlaWduLXRhYmxlIG1vZGlmaWNhdGlvbiBhcyByZXF1aXJlZCwgYW5kIGZl dGNoIFJFVFVSTklORwpAQCAtNDA5NywxMSArNDE1OSwzNCBAQCBleGVjdXRlX2ZvcmVpZ25fbW9k aWZ5KEVTdGF0ZSAqZXN0YXRlLAogCWlmIChmbXN0YXRlLT5jb25uX3N0YXRlLT5wZW5kaW5nQXJl cSkKIAkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3QoZm1zdGF0ZS0+Y29ubl9zdGF0ZS0+cGVuZGlu Z0FyZXEpOwogCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgQ09QWSBjb21tYW5kIGNhbiBiZSB1c2Vk IHRvIHNwZWVkIHVwIGluc2VydHMuIFRoZSBDT1BZCisJICogY29tbWFuZCBjYW4gbm90IGJlIHVz ZWQgaWYgdGhlIG9yaWdpbmFsIHF1ZXJ5IGhhcyBhIFJFVFVSTklORyBjbGF1c2UuCisJICovCisJ aWYgKG9wZXJhdGlvbiA9PSBDTURfSU5TRVJUICYmCisJCWZtc3RhdGUtPnVzZV9jb3B5X2Zvcl9i YXRjaF9pbnNlcnQgJiYKKwkJIWZtc3RhdGUtPmhhc19yZXR1cm5pbmcgJiYKKwkJKm51bVNsb3Rz ID49IGZtc3RhdGUtPmNvcHlfZm9yX2JhdGNoX2luc2VydF90aHJlc2hvbGQpCisJeworCisJCS8q IEJ1aWxkIHRoZSBDT1BZIGNvbW1hbmQgaWYgaXQncyBub3QgYWxyZWFkeSBidWlsdCAqLworCQlp ZiAoIWZtc3RhdGUtPnVzaW5nY29weSkKKwkJeworCQkJcGZyZWUoZm1zdGF0ZS0+cXVlcnkpOwor CQkJaW5pdFN0cmluZ0luZm8oJnNxbCk7CisJCQlkZXBhcnNlQ29weVNxbCgmc3FsLCBmbXN0YXRl LT5yZWwsIGZtc3RhdGUtPnRhcmdldF9hdHRycyk7CisJCQlmbXN0YXRlLT5xdWVyeSA9IHNxbC5k YXRhOworCQkJZm1zdGF0ZS0+dXNpbmdjb3B5ID0gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZXhlY3V0 ZV9mb3JlaWduX2luc2VydF91c2luZ19jb3B5KGZtc3RhdGUsIHNsb3RzLCBudW1TbG90cyk7CisJ fQorCiAJLyoKIAkgKiBJZiB0aGUgZXhpc3RpbmcgcXVlcnkgd2FzIGRlcGFyc2VkIGFuZCBwcmVw YXJlZCBmb3IgYSBkaWZmZXJlbnQgbnVtYmVyCi0JICogb2Ygcm93cywgcmVidWlsZCBpdCBmb3Ig dGhlIHByb3BlciBudW1iZXIuCisJICogb2Ygcm93cyBvciBpZiBDT1BZIHdhcyBiZWluZyB1c2Vk IG9uIHRoZSBwcmV2aW91cyBleGVjdXRpb24sIHJlYnVpbGQKKwkgKiB0aGUgSU5TRVJUIHN0YXRl bWVudCBhbmQgdXNlIHRoZSBwcm9wZXIgbnVtYmVyLgogCSAqLwotCWlmIChvcGVyYXRpb24gPT0g Q01EX0lOU0VSVCAmJiBmbXN0YXRlLT5udW1fc2xvdHMgIT0gKm51bVNsb3RzKQorCWlmICgob3Bl cmF0aW9uID09IENNRF9JTlNFUlQgJiYgZm1zdGF0ZS0+bnVtX3Nsb3RzICE9ICpudW1TbG90cykg fHwgZm1zdGF0ZS0+dXNpbmdjb3B5KQogCXsKIAkJLyogRGVzdHJveSB0aGUgcHJlcGFyZWQgc3Rh dGVtZW50IGNyZWF0ZWQgcHJldmlvdXNseSAqLwogCQlpZiAoZm1zdGF0ZS0+cF9uYW1lKQpAQCAt Nzg4NiwzICs3OTcxLDE1MSBAQCBnZXRfYmF0Y2hfc2l6ZV9vcHRpb24oUmVsYXRpb24gcmVsKQog CiAJcmV0dXJuIGJhdGNoX3NpemU7CiB9CisKKy8qCisgKiBEZXRlcm1pbmUgaWYgdGhlIHVzYWdl IG9mIHRoZSBDT1BZIGNvbW1hbmQgdG8gZXhlY3V0ZSBhIElOU0VSVCBpbnRvIGEgZm9yZWlnbgor ICogdGFibGUgaXMgZW5hYmxlZC4gVGhlIG9wdGlvbiBzcGVjaWZpZWQgZm9yIGEgdGFibGUgaGFz IHByZWNlZGVuY2UuCisgKi8KK3N0YXRpYyBib29sCitnZXRfdXNlX2NvcHlfZm9yX2JhdGNoX2lu c2VydChSZWxhdGlvbiByZWwpCit7CisJT2lkCQkJZm9yZWlnbnRhYmxlaWQgPSBSZWxhdGlvbkdl dFJlbGlkKHJlbCk7CisJTGlzdAkgICAqb3B0aW9ucyA9IE5JTDsKKwlMaXN0Q2VsbCAgICpsYzsK KwlGb3JlaWduVGFibGUgKnRhYmxlOworCUZvcmVpZ25TZXJ2ZXIgKnNlcnZlcjsKKwlib29sCQlj YW5fdXNlX2NvcHkgPSBmYWxzZTsKKworCS8qCisJICogTG9hZCBvcHRpb25zIGZvciB0YWJsZSBh bmQgc2VydmVyLiBXZSBhcHBlbmQgc2VydmVyIG9wdGlvbnMgYWZ0ZXIgdGFibGUKKwkgKiBvcHRp b25zLCBiZWNhdXNlIHRhYmxlIG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlLgorCSAqLworCXRhYmxl ID0gR2V0Rm9yZWlnblRhYmxlKGZvcmVpZ250YWJsZWlkKTsKKwlzZXJ2ZXIgPSBHZXRGb3JlaWdu U2VydmVyKHRhYmxlLT5zZXJ2ZXJpZCk7CisKKwlvcHRpb25zID0gbGlzdF9jb25jYXQob3B0aW9u cywgdGFibGUtPm9wdGlvbnMpOworCW9wdGlvbnMgPSBsaXN0X2NvbmNhdChvcHRpb25zLCBzZXJ2 ZXItPm9wdGlvbnMpOworCisJLyogU2VlIGlmIGVpdGhlciB0YWJsZSBvciBzZXJ2ZXIgc3BlY2lm aWVzIGVuYWJsZV9iYXRjaF93aXRoX2NvcHkuICovCisJZm9yZWFjaChsYywgb3B0aW9ucykKKwl7 CisJCURlZkVsZW0gICAgKmRlZiA9IChEZWZFbGVtICopIGxmaXJzdChsYyk7CisKKwkJaWYgKHN0 cmNtcChkZWYtPmRlZm5hbWUsICJ1c2VfY29weV9mb3JfYmF0Y2hfaW5zZXJ0IikgPT0gMCkKKwkJ eworCQkJKHZvaWQpIHBhcnNlX2Jvb2woZGVmR2V0U3RyaW5nKGRlZiksICZjYW5fdXNlX2NvcHkp OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNhbl91c2VfY29weTsKK30KKworc3RhdGlj IGludAorZ2V0X2NvcHlfZm9yX2JhdGNoX2luc2VydF90aHJlc2hvbGQoUmVsYXRpb24gcmVsKQor eworCU9pZAkJCWZvcmVpZ250YWJsZWlkID0gUmVsYXRpb25HZXRSZWxpZChyZWwpOworCUxpc3QJ ICAgKm9wdGlvbnMgPSBOSUw7CisJTGlzdENlbGwgICAqbGM7CisJRm9yZWlnblRhYmxlICp0YWJs ZTsKKwlGb3JlaWduU2VydmVyICpzZXJ2ZXI7CisKKwkvKgorCSAqIFdlIHVzZSAxIGFzIGRlZmF1 bHQsIHdoaWNoIG1lYW5zIHRoYXQgQ09QWSB3aWxsIGJlIHVzZWQgb25jZQorCSAqICJjYW5fdXNl X2NvcHkiIGlzIHNldCB0byB0cnVlLgorCSAqLworCWludAkJCWNvcHlfZm9yX2JhdGNoX2luc2Vy dF90aHJlc2hvbGQgPSAxOworCisJLyoKKwkgKiBMb2FkIG9wdGlvbnMgZm9yIHRhYmxlIGFuZCBz ZXJ2ZXIuIFdlIGFwcGVuZCBzZXJ2ZXIgb3B0aW9ucyBhZnRlciB0YWJsZQorCSAqIG9wdGlvbnMs IGJlY2F1c2UgdGFibGUgb3B0aW9ucyB0YWtlIHByZWNlZGVuY2UuCisJICovCisJdGFibGUgPSBH ZXRGb3JlaWduVGFibGUoZm9yZWlnbnRhYmxlaWQpOworCXNlcnZlciA9IEdldEZvcmVpZ25TZXJ2 ZXIodGFibGUtPnNlcnZlcmlkKTsKKworCW9wdGlvbnMgPSBsaXN0X2NvbmNhdChvcHRpb25zLCB0 YWJsZS0+b3B0aW9ucyk7CisJb3B0aW9ucyA9IGxpc3RfY29uY2F0KG9wdGlvbnMsIHNlcnZlci0+ b3B0aW9ucyk7CisKKwkvKiBTZWUgaWYgZWl0aGVyIHRhYmxlIG9yIHNlcnZlciBzcGVjaWZpZXMg ZW5hYmxlX2JhdGNoX3dpdGhfY29weS4gKi8KKwlmb3JlYWNoKGxjLCBvcHRpb25zKQorCXsKKwkJ RGVmRWxlbSAgICAqZGVmID0gKERlZkVsZW0gKikgbGZpcnN0KGxjKTsKKworCQlpZiAoc3RyY21w KGRlZi0+ZGVmbmFtZSwgImNvcHlfZm9yX2JhdGNoX2luc2VydF90aHJlc2hvbGQiKSA9PSAwKQor CQl7CisJCQkodm9pZCkgcGFyc2VfaW50KGRlZkdldFN0cmluZyhkZWYpLCAmY29weV9mb3JfYmF0 Y2hfaW5zZXJ0X3RocmVzaG9sZCwgMCwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1 cm4gY29weV9mb3JfYmF0Y2hfaW5zZXJ0X3RocmVzaG9sZDsKK30KKworLyogRXhlY3V0ZSBhbiBp bnNlcnQgaW50byBhIGZvcmVpZ24gdGFibGUgdXNpbmcgdGhlIENPUFkgY29tbWFuZCAqLworc3Rh dGljIFR1cGxlVGFibGVTbG90ICoqCitleGVjdXRlX2ZvcmVpZ25faW5zZXJ0X3VzaW5nX2NvcHko UGdGZHdNb2RpZnlTdGF0ZSAqZm1zdGF0ZSwKKwkJCQkJCQkJICBUdXBsZVRhYmxlU2xvdCAqKnNs b3RzLAorCQkJCQkJCQkgIGludCAqbnVtU2xvdHMpCit7CisJUEdyZXN1bHQgICAqcmVzOworCVN0 cmluZ0luZm9EYXRhIGNvcHlfZGF0YTsKKwlpbnQJCQluX3Jvd3M7CisJaW50CQkJaTsKKworCS8q IFNlbmQgQ09QWSBjb21tYW5kICovCisJaWYgKCFQUXNlbmRRdWVyeShmbXN0YXRlLT5jb25uLCBm bXN0YXRlLT5xdWVyeSkpCisJCXBnZmR3X3JlcG9ydF9lcnJvcihOVUxMLCBmbXN0YXRlLT5jb25u LCBmbXN0YXRlLT5xdWVyeSk7CisKKwkvKiBnZXQgdGhlIENPUFkgcmVzdWx0ICovCisJcmVzID0g cGdmZHdfZ2V0X3Jlc3VsdChmbXN0YXRlLT5jb25uKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVz KSAhPSBQR1JFU19DT1BZX0lOKQorCQlwZ2Zkd19yZXBvcnRfZXJyb3IocmVzLCBmbXN0YXRlLT5j b25uLCBmbXN0YXRlLT5xdWVyeSk7CisKKwkvKiBDb252ZXJ0IHRoZSBUdXBsZVRhYmxlU2xvdCBk YXRhIGludG8gYSBURVhULWZvcm1hdHRlZCBsaW5lICovCisJaW5pdFN0cmluZ0luZm8oJmNvcHlf ZGF0YSk7CisJZm9yIChpID0gMDsgaSA8ICpudW1TbG90czsgaSsrKQorCXsKKwkJY29udmVydF9z bG90X3RvX2NvcHlfdGV4dCgmY29weV9kYXRhLCBmbXN0YXRlLCBzbG90c1tpXSk7CisKKwkJLyoK KwkJICogU2VuZCBpbml0aWFsIENPUFkgZGF0YSBpZiB0aGUgYnVmZmVyIHJlYWNoIHRoZSBsaW1p dCB0byBhdm9pZCBsYXJnZQorCQkgKiBtZW1vcnkgdXNhZ2UuCisJCSAqLworCQlpZiAoY29weV9k YXRhLmxlbiA+PSBDT1BZQlVGU0laKQorCQl7CisJCQlpZiAoUFFwdXRDb3B5RGF0YShmbXN0YXRl LT5jb25uLCBjb3B5X2RhdGEuZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkKKwkJCQlwZ2Zkd19y ZXBvcnRfZXJyb3IoTlVMTCwgZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+cXVlcnkpOworCQkJcmVz ZXRTdHJpbmdJbmZvKCZjb3B5X2RhdGEpOworCQl9CisJfQorCisJLyogU2VuZCB0aGUgcmVtYWlu aW5nIENPUFkgZGF0YSAqLworCWlmIChjb3B5X2RhdGEubGVuID4gMCkKKwl7CisJCWlmIChQUXB1 dENvcHlEYXRhKGZtc3RhdGUtPmNvbm4sIGNvcHlfZGF0YS5kYXRhLCBjb3B5X2RhdGEubGVuKSA8 PSAwKQorCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUt PnF1ZXJ5KTsKKwl9CisKKwkvKiBFbmQgdGhlIENPUFkgb3BlcmF0aW9uICovCisJaWYgKFBRcHV0 Q29weUVuZChmbXN0YXRlLT5jb25uLCBOVUxMKSA8IDAgfHwgUFFmbHVzaChmbXN0YXRlLT5jb25u KSkKKwkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1 ZXJ5KTsKKworCS8qCisJICogR2V0IHRoZSByZXN1bHQsIGFuZCBjaGVjayBmb3Igc3VjY2Vzcy4K KwkgKi8KKwlyZXMgPSBwZ2Zkd19nZXRfcmVzdWx0KGZtc3RhdGUtPmNvbm4pOworCWlmIChQUXJl c3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCXBnZmR3X3JlcG9ydF9lcnJv cihyZXMsIGZtc3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKworCW5fcm93cyA9IGF0b2ko UFFjbWRUdXBsZXMocmVzKSk7CisKKwkvKiBBbmQgY2xlYW4gdXAgKi8KKwlQUWNsZWFyKHJlcyk7 CisKKwlNZW1vcnlDb250ZXh0UmVzZXQoZm1zdGF0ZS0+dGVtcF9jeHQpOworCisJKm51bVNsb3Rz ID0gbl9yb3dzOworCisJLyoKKwkgKiBSZXR1cm4gTlVMTCBpZiBub3RoaW5nIHdhcyBpbnNlcnRl ZCBvbiB0aGUgcmVtb3RlIGVuZAorCSAqLworCXJldHVybiAobl9yb3dzID4gMCkgPyBzbG90cyA6 IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcu aCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCmluZGV4IGU2OTczNTI5OGQ3 Li5hYTU0ZDZiYmE1MyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNf ZmR3LmgKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKQEAgLTIwNCw2 ICsyMDQsNyBAQCBleHRlcm4gdm9pZCByZWJ1aWxkSW5zZXJ0U3FsKFN0cmluZ0luZm8gYnVmLCBS ZWxhdGlvbiByZWwsCiAJCQkJCQkJIGNoYXIgKm9yaWdfcXVlcnksIExpc3QgKnRhcmdldF9hdHRy cywKIAkJCQkJCQkgaW50IHZhbHVlc19lbmRfbGVuLCBpbnQgbnVtX3BhcmFtcywKIAkJCQkJCQkg aW50IG51bV9yb3dzKTsKK2V4dGVybiB2b2lkIGRlcGFyc2VDb3B5U3FsKFN0cmluZ0luZm8gYnVm LCBSZWxhdGlvbiByZWwsIExpc3QgKnRhcmdldF9hdHRycyk7CiBleHRlcm4gdm9pZCBkZXBhcnNl VXBkYXRlU3FsKFN0cmluZ0luZm8gYnVmLCBSYW5nZVRibEVudHJ5ICpydGUsCiAJCQkJCQkJIElu ZGV4IHJ0aW5kZXgsIFJlbGF0aW9uIHJlbCwKIAkJCQkJCQkgTGlzdCAqdGFyZ2V0QXR0cnMsCmRp ZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCBiL2Nv bnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IDlhOGY5ZTI4MTM1 Li5mYWMwMGM1NTU1MyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3Rn cmVzX2Zkdy5zcWwKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5z cWwKQEAgLTI4MDcsNiArMjgwNywxOSBAQCBzZWxlY3QgKiBmcm9tIHJlbTI7CiAKIGRlbGV0ZSBm cm9tIHJlbTI7CiAKKy0tIFRlc3QgQ09QWSB3aXRoIGNhbl91c2VfY29weSA9IHRydWUKK2FsdGVy IGZvcmVpZ24gdGFibGUgcmVtMiBvcHRpb25zIChhZGQgdXNlX2NvcHlfZm9yX2JhdGNoX2luc2Vy dCAndHJ1ZScsIGNvcHlfZm9yX2JhdGNoX2luc2VydF90aHJlc2hvbGQgJzInKTsKKworLS0gSW5z ZXJ0IDMgcm93cyBzbyB0aGF0IHRoZSB0aGlyZCByb3cgZmFsbGJhY2sgdG8gbm9ybWFsIElOU0VS VCBzdGF0ZW1lbnQgcGF0aAorY29weSByZW0yIGZyb20gc3RkaW47CisxCWZvbworMgliYXIKKzMJ YmF6CitcLgorc2VsZWN0ICogZnJvbSByZW0yOworCitkZWxldGUgZnJvbSByZW0yOworCiAtLSBU ZXN0IGNoZWNrIGNvbnN0cmFpbnRzCiBhbHRlciB0YWJsZSBsb2MyIGFkZCBjb25zdHJhaW50IGxv YzJfZjFwb3NpdGl2ZSBjaGVjayAoZjEgPj0gMCk7CiBhbHRlciBmb3JlaWduIHRhYmxlIHJlbTIg YWRkIGNvbnN0cmFpbnQgcmVtMl9mMXBvc2l0aXZlIGNoZWNrIChmMSA+PSAwKTsKLS0gCjIuNTEu MgoK --b2c6c27a4b52dfdccf6336ab72ea76c5a0aeadb4ea846f58b7c3539ef803--