Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pcg08-0003J6-0t for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Mar 2023 05:18:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pcg06-0006b1-Td for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Mar 2023 05:18:06 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pcg06-0006ar-D1 for pgsql-hackers@lists.postgresql.org; Thu, 16 Mar 2023 05:18:06 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pcg03-0003Bu-GX for pgsql-hackers@postgresql.org; Thu, 16 Mar 2023 05:18:06 +0000 Received: from [192.168.28.200] (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 3D35F21CDBDC; Thu, 16 Mar 2023 08:18:02 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1678943882; bh=Nc8KZ2p5TsRv7++qKo4A8Zt7+wrYXp7t7ugD+LmopyU=; h=Subject:From:To:Cc:Date:In-Reply-To:References; b=ZwxhmsA5zU96RHkJ/6wZ6ZN1CnViBrPs436OMap926NCpjZBnbRCEmUFVsaUgDLjh b4Axbos+zq0NjXnC/kS+/cPlUcuzbWAQL4J8iwaFsQkbMCN7OCNYQ0lSIdEaYQfAf2 LmM4DY0aMhOw+tT0skMLwI/T2Xr72kI4DKsDuo4A= Message-ID: <23d202968dfbc84468cc9cf384819fc31eb10788.camel@postgrespro.ru> Subject: Re: Bug in jsonb_in function (14 & 15 version are affected) From: Yura Sokolov To: Tom Lane Cc: pgsql-hackers Date: Thu, 16 Mar 2023 08:18:01 +0300 In-Reply-To: <2000262.1678730282@sss.pgh.pa.us> References: <7332649.x5DLKWyVIX@thinkpad-pgpro> <2000262.1678730282@sss.pgh.pa.us> Organization: PostgresPro Content-Type: multipart/mixed; boundary="=-ns6cEYG1rpDVSU53O6Fy" User-Agent: Evolution 3.44.4-0ubuntu1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-ns6cEYG1rpDVSU53O6Fy Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable =D0=92 =D0=9F=D0=BD, 13/03/2023 =D0=B2 13:58 -0400, Tom Lane =D0=BF=D0=B8= =D1=88=D0=B5=D1=82: > Nikolay Shaplov writes: > > I found a bug in jsonb_in function (it converts json from sting represe= ntation > > =C2=A0into jsonb internal representation). >=20 > Yeah.=C2=A0 Looks like json_lex_string is failing to honor the invariant > that it needs to set token_terminator ... although the documentation > of the function certainly isn't helping.=C2=A0 I think we need the attach= ed. >=20 > A nice side benefit is that the error context reports get a lot more > useful --- somebody should have inquired before as to why they were > so bogus. >=20 > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0reg= ards, tom lane >=20 Good day, Tom and all. Merged patch looks like start of refactoring. Colleague (Nikita Glukhov) propose further refactoring of jsonapi.c: - use of inline functions instead of macroses, - more uniform their usage in token success or error reporting, - simplify json_lex_number and its usage a bit. Also he added tests for fixed bug. ----- Regards, Yura Sokolov. --=-ns6cEYG1rpDVSU53O6Fy Content-Disposition: attachment; filename="0001-Refactor-JSON-lexer-error-reporting.patch" Content-Type: text/x-patch; name="0001-Refactor-JSON-lexer-error-reporting.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA3NTdhMzE0ZDVmYTljNmJhODMzNDc2MmI0YTA4MDc2M2YwMjI0NGM1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOaWtpdGEgR2x1a2hvdiA8bi5nbHVob3ZAcG9zdGdyZXNwcm8u cnU+CkRhdGU6IFR1ZSwgMTQgTWFyIDIwMjMgMTI6MTU6NDggKzAzMDAKU3ViamVjdDogW1BBVENI XSBSZWZhY3RvciBKU09OIGxleGVyIGVycm9yIHJlcG9ydGluZwoKQWxzbyBhZGQgc3BlY2lhbCB0 ZXN0cyBmb3IgYWxyZWFkeSBmaXhlZCBidWcgYW5kIGZvciBtdWx0aWJ5dGUgc3ltYm9scyBhZnRl ciBzdXJyb2dhdGVzLgotLS0KIHNyYy9jb21tb24vanNvbmFwaS5jICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDI0NiArKysrKysrLS0tLS0tLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvanNvbl9lbmNvZGluZy5vdXQgICB8ICAyNSArKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9qc29uX2VuY29kaW5nXzEub3V0IHwgIDIzICsrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29u X2VuY29kaW5nLnNxbCAgICAgICAgfCAgIDcgKwogNCBmaWxlcyBjaGFuZ2VkLCAxNDkgaW5zZXJ0 aW9ucygrKSwgMTUyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vanNvbmFw aS5jIGIvc3JjL2NvbW1vbi9qc29uYXBpLmMKaW5kZXggMmU4NjU4OWNmZDguLmQ0YTlkOGYwMzc4 IDEwMDY0NAotLS0gYS9zcmMvY29tbW9uL2pzb25hcGkuYworKysgYi9zcmMvY29tbW9uL2pzb25h cGkuYwpAQCAtNDQsOCArNDQsNyBAQCB0eXBlZGVmIGVudW0JCQkJCS8qIGNvbnRleHRzIG9mIEpT T04gcGFyc2VyICovCiB9IEpzb25QYXJzZUNvbnRleHQ7CiAKIHN0YXRpYyBpbmxpbmUgSnNvblBh cnNlRXJyb3JUeXBlIGpzb25fbGV4X3N0cmluZyhKc29uTGV4Q29udGV4dCAqbGV4KTsKLXN0YXRp YyBpbmxpbmUgSnNvblBhcnNlRXJyb3JUeXBlIGpzb25fbGV4X251bWJlcihKc29uTGV4Q29udGV4 dCAqbGV4LCBjaGFyICpzLAotCQkJCQkJCQkJCQkJIGJvb2wgKm51bV9lcnIsIGludCAqdG90YWxf bGVuKTsKK3N0YXRpYyBpbmxpbmUgSnNvblBhcnNlRXJyb3JUeXBlIGpzb25fbGV4X251bWJlcihK c29uTGV4Q29udGV4dCAqbGV4LCBjaGFyICpzKTsKIHN0YXRpYyBpbmxpbmUgSnNvblBhcnNlRXJy b3JUeXBlIHBhcnNlX3NjYWxhcihKc29uTGV4Q29udGV4dCAqbGV4LCBKc29uU2VtQWN0aW9uICpz ZW0pOwogc3RhdGljIEpzb25QYXJzZUVycm9yVHlwZSBwYXJzZV9vYmplY3RfZmllbGQoSnNvbkxl eENvbnRleHQgKmxleCwgSnNvblNlbUFjdGlvbiAqc2VtKTsKIHN0YXRpYyBKc29uUGFyc2VFcnJv clR5cGUgcGFyc2Vfb2JqZWN0KEpzb25MZXhDb250ZXh0ICpsZXgsIEpzb25TZW1BY3Rpb24gKnNl bSk7CkBAIC0xMDQsOCArMTAzLDYgQEAgbGV4X2V4cGVjdChKc29uUGFyc2VDb250ZXh0IGN0eCwg SnNvbkxleENvbnRleHQgKmxleCwgSnNvblRva2VuVHlwZSB0b2tlbikKIGJvb2wKIElzVmFsaWRK c29uTnVtYmVyKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKIHsKLQlib29sCQludW1lcmljX2Vy cm9yOwotCWludAkJCXRvdGFsX2xlbjsKIAlKc29uTGV4Q29udGV4dCBkdW1teV9sZXg7CiAKIAlp ZiAobGVuIDw9IDApCkBAIC0xMjgsOSArMTI1LDggQEAgSXNWYWxpZEpzb25OdW1iZXIoY29uc3Qg Y2hhciAqc3RyLCBpbnQgbGVuKQogCQlkdW1teV9sZXguaW5wdXRfbGVuZ3RoID0gbGVuOwogCX0K IAotCWpzb25fbGV4X251bWJlcigmZHVtbXlfbGV4LCBkdW1teV9sZXguaW5wdXQsICZudW1lcmlj X2Vycm9yLCAmdG90YWxfbGVuKTsKLQotCXJldHVybiAoIW51bWVyaWNfZXJyb3IpICYmICh0b3Rh bF9sZW4gPT0gZHVtbXlfbGV4LmlucHV0X2xlbmd0aCk7CisJcmV0dXJuIGpzb25fbGV4X251bWJl cigmZHVtbXlfbGV4LCBkdW1teV9sZXguaW5wdXQpID09IEpTT05fU1VDQ0VTUyAmJgorCQlkdW1t eV9sZXgudG9rZW5fdGVybWluYXRvciA9PSBkdW1teV9sZXguaW5wdXQgKyBkdW1teV9sZXguaW5w dXRfbGVuZ3RoOwogfQogCiAvKgpAQCAtNTQ1LDYgKzU0MSwzNyBAQCBwYXJzZV9hcnJheShKc29u TGV4Q29udGV4dCAqbGV4LCBKc29uU2VtQWN0aW9uICpzZW0pCiAJcmV0dXJuIEpTT05fU1VDQ0VT UzsKIH0KIAorLyogQ29udmVuaWVuY2UgaW5saW5lIGZ1bmN0aW9ucyBmb3Igc3VjY2Vzcy9lcnJv ciBleGl0cyBmcm9tIGxleGVyICovCitzdGF0aWMgaW5saW5lIEpzb25QYXJzZUVycm9yVHlwZQor anNvbl9sZXhfc3VjY2VzcyhKc29uTGV4Q29udGV4dCAqbGV4LCBjaGFyICp0b2tlbl90ZXJtaW5h dG9yLAorCQkJCSBKc29uVG9rZW5UeXBlIHRva2VuX3R5cGUpCit7CisJbGV4LT5wcmV2X3Rva2Vu X3Rlcm1pbmF0b3IgPSBsZXgtPnRva2VuX3Rlcm1pbmF0b3I7CisJbGV4LT50b2tlbl90ZXJtaW5h dG9yID0gdG9rZW5fdGVybWluYXRvcjsKKwlsZXgtPnRva2VuX3R5cGUgPSB0b2tlbl90eXBlOwor CisJcmV0dXJuIEpTT05fU1VDQ0VTUzsKK30KKworc3RhdGljIGlubGluZSBKc29uUGFyc2VFcnJv clR5cGUKK2pzb25fbGV4X2ZhaWxfYXRfY2hhcl9zdGFydChKc29uTGV4Q29udGV4dCAqbGV4LCBj aGFyICpzLAorCQkJCQkJCUpzb25QYXJzZUVycm9yVHlwZSBjb2RlKQoreworCWxleC0+dG9rZW5f dGVybWluYXRvciA9IHM7CisKKwlyZXR1cm4gY29kZTsKK30KKworc3RhdGljIGlubGluZSBKc29u UGFyc2VFcnJvclR5cGUKK2pzb25fbGV4X2ZhaWxfYXRfY2hhcl9lbmQoSnNvbkxleENvbnRleHQg KmxleCwgY2hhciAqcywKKwkJCQkJCSAgSnNvblBhcnNlRXJyb3JUeXBlIGNvZGUpCit7CisJbGV4 LT50b2tlbl90ZXJtaW5hdG9yID0KKwkJcyArIHBnX2VuY29kaW5nX21ibGVuX2JvdW5kZWQobGV4 LT5pbnB1dF9lbmNvZGluZywgcyk7CisKKwlyZXR1cm4gY29kZTsKK30KKwogLyoKICAqIExleCBv bmUgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgogICovCkBAIC01NTMsNyArNTgwLDYgQEAg anNvbl9sZXgoSnNvbkxleENvbnRleHQgKmxleCkKIHsKIAljaGFyCSAgICpzOwogCWNoYXIJICAg KmNvbnN0IGVuZCA9IGxleC0+aW5wdXQgKyBsZXgtPmlucHV0X2xlbmd0aDsKLQlKc29uUGFyc2VF cnJvclR5cGUgcmVzdWx0OwogCiAJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCiAJcyA9 IGxleC0+dG9rZW5fdGVybWluYXRvcjsKQEAgLTU3MSw5ICs1OTcsNyBAQCBqc29uX2xleChKc29u TGV4Q29udGV4dCAqbGV4KQogCWlmIChzID49IGVuZCkKIAl7CiAJCWxleC0+dG9rZW5fc3RhcnQg PSBOVUxMOwotCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+dG9rZW5fdGVybWlu YXRvcjsKLQkJbGV4LT50b2tlbl90ZXJtaW5hdG9yID0gczsKLQkJbGV4LT50b2tlbl90eXBlID0g SlNPTl9UT0tFTl9FTkQ7CisJCXJldHVybiBqc29uX2xleF9zdWNjZXNzKGxleCwgcywgSlNPTl9U T0tFTl9FTkQpOwogCX0KIAllbHNlCiAJewpAQCAtNTgxLDQ5ICs2MDUsMzEgQEAganNvbl9sZXgo SnNvbkxleENvbnRleHQgKmxleCkKIAkJewogCQkJCS8qIFNpbmdsZS1jaGFyYWN0ZXIgdG9rZW4s IHNvbWUga2luZCBvZiBwdW5jdHVhdGlvbiBtYXJrLiAqLwogCQkJY2FzZSAneyc6Ci0JCQkJbGV4 LT5wcmV2X3Rva2VuX3Rlcm1pbmF0b3IgPSBsZXgtPnRva2VuX3Rlcm1pbmF0b3I7Ci0JCQkJbGV4 LT50b2tlbl90ZXJtaW5hdG9yID0gcyArIDE7Ci0JCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9U T0tFTl9PQkpFQ1RfU1RBUlQ7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIGpzb25fbGV4X3N1Y2Nl c3MobGV4LCBzICsgMSwgSlNPTl9UT0tFTl9PQkpFQ1RfU1RBUlQpOworCiAJCQljYXNlICd9JzoK LQkJCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+dG9rZW5fdGVybWluYXRvcjsK LQkJCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBzICsgMTsKLQkJCQlsZXgtPnRva2VuX3R5cGUg PSBKU09OX1RPS0VOX09CSkVDVF9FTkQ7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIGpzb25fbGV4 X3N1Y2Nlc3MobGV4LCBzICsgMSwgSlNPTl9UT0tFTl9PQkpFQ1RfRU5EKTsKKwogCQkJY2FzZSAn Wyc6Ci0JCQkJbGV4LT5wcmV2X3Rva2VuX3Rlcm1pbmF0b3IgPSBsZXgtPnRva2VuX3Rlcm1pbmF0 b3I7Ci0JCQkJbGV4LT50b2tlbl90ZXJtaW5hdG9yID0gcyArIDE7Ci0JCQkJbGV4LT50b2tlbl90 eXBlID0gSlNPTl9UT0tFTl9BUlJBWV9TVEFSVDsKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4ganNv bl9sZXhfc3VjY2VzcyhsZXgsIHMgKyAxLCBKU09OX1RPS0VOX0FSUkFZX1NUQVJUKTsKKwogCQkJ Y2FzZSAnXSc6Ci0JCQkJbGV4LT5wcmV2X3Rva2VuX3Rlcm1pbmF0b3IgPSBsZXgtPnRva2VuX3Rl cm1pbmF0b3I7Ci0JCQkJbGV4LT50b2tlbl90ZXJtaW5hdG9yID0gcyArIDE7Ci0JCQkJbGV4LT50 b2tlbl90eXBlID0gSlNPTl9UT0tFTl9BUlJBWV9FTkQ7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJu IGpzb25fbGV4X3N1Y2Nlc3MobGV4LCBzICsgMSwgSlNPTl9UT0tFTl9BUlJBWV9FTkQpOworCiAJ CQljYXNlICcsJzoKLQkJCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+dG9rZW5f dGVybWluYXRvcjsKLQkJCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBzICsgMTsKLQkJCQlsZXgt PnRva2VuX3R5cGUgPSBKU09OX1RPS0VOX0NPTU1BOwotCQkJCWJyZWFrOworCQkJCXJldHVybiBq c29uX2xleF9zdWNjZXNzKGxleCwgcyArIDEsIEpTT05fVE9LRU5fQ09NTUEpOworCiAJCQljYXNl ICc6JzoKLQkJCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+dG9rZW5fdGVybWlu YXRvcjsKLQkJCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBzICsgMTsKLQkJCQlsZXgtPnRva2Vu X3R5cGUgPSBKU09OX1RPS0VOX0NPTE9OOwotCQkJCWJyZWFrOworCQkJCXJldHVybiBqc29uX2xl eF9zdWNjZXNzKGxleCwgcyArIDEsIEpTT05fVE9LRU5fQ09MT04pOworCiAJCQljYXNlICciJzoK IAkJCQkvKiBzdHJpbmcgKi8KLQkJCQlyZXN1bHQgPSBqc29uX2xleF9zdHJpbmcobGV4KTsKLQkJ CQlpZiAocmVzdWx0ICE9IEpTT05fU1VDQ0VTUykKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQls ZXgtPnRva2VuX3R5cGUgPSBKU09OX1RPS0VOX1NUUklORzsKLQkJCQlicmVhazsKKwkJCQlyZXR1 cm4ganNvbl9sZXhfc3RyaW5nKGxleCk7CisKIAkJCWNhc2UgJy0nOgogCQkJCS8qIE5lZ2F0aXZl IG51bWJlci4gKi8KLQkJCQlyZXN1bHQgPSBqc29uX2xleF9udW1iZXIobGV4LCBzICsgMSwgTlVM TCwgTlVMTCk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBKU09OX1NVQ0NFU1MpCi0JCQkJCXJldHVybiBy ZXN1bHQ7Ci0JCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9OVU1CRVI7Ci0JCQkJYnJl YWs7CisJCQkJcmV0dXJuIGpzb25fbGV4X251bWJlcihsZXgsIHMgKyAxKTsKKwogCQkJY2FzZSAn MCc6CiAJCQljYXNlICcxJzoKIAkJCWNhc2UgJzInOgpAQCAtNjM1LDExICs2NDEsOCBAQCBqc29u X2xleChKc29uTGV4Q29udGV4dCAqbGV4KQogCQkJY2FzZSAnOCc6CiAJCQljYXNlICc5JzoKIAkJ CQkvKiBQb3NpdGl2ZSBudW1iZXIuICovCi0JCQkJcmVzdWx0ID0ganNvbl9sZXhfbnVtYmVyKGxl eCwgcywgTlVMTCwgTlVMTCk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBKU09OX1NVQ0NFU1MpCi0JCQkJ CXJldHVybiByZXN1bHQ7Ci0JCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9OVU1CRVI7 Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIGpzb25fbGV4X251bWJlcihsZXgsIHMpOworCiAJCQlk ZWZhdWx0OgogCQkJCXsKIAkJCQkJY2hhcgkgICAqcDsKQEAgLTY2MiwzNyArNjY1LDI3IEBAIGpz b25fbGV4KEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCQkJCSAqIHRoYXQgb25lIGNoYXJhY3Rlci4K IAkJCQkJICovCiAJCQkJCWlmIChwID09IHMpCi0JCQkJCXsKLQkJCQkJCWxleC0+cHJldl90b2tl bl90ZXJtaW5hdG9yID0gbGV4LT50b2tlbl90ZXJtaW5hdG9yOwotCQkJCQkJbGV4LT50b2tlbl90 ZXJtaW5hdG9yID0gcyArIDE7Ci0JCQkJCQlyZXR1cm4gSlNPTl9JTlZBTElEX1RPS0VOOwotCQkJ CQl9CisJCQkJCQlyZXR1cm4ganNvbl9sZXhfZmFpbF9hdF9jaGFyX3N0YXJ0KGxleCwgcyArIDEs IEpTT05fSU5WQUxJRF9UT0tFTik7CiAKIAkJCQkJLyoKIAkJCQkJICogV2UndmUgZ290IGEgcmVh bCBhbHBoYW51bWVyaWMgdG9rZW4gaGVyZS4gIElmIGl0CiAJCQkJCSAqIGhhcHBlbnMgdG8gYmUg dHJ1ZSwgZmFsc2UsIG9yIG51bGwsIGFsbCBpcyB3ZWxsLiAgSWYKIAkJCQkJICogbm90LCBlcnJv ciBvdXQuCiAJCQkJCSAqLwotCQkJCQlsZXgtPnByZXZfdG9rZW5fdGVybWluYXRvciA9IGxleC0+ dG9rZW5fdGVybWluYXRvcjsKLQkJCQkJbGV4LT50b2tlbl90ZXJtaW5hdG9yID0gcDsKIAkJCQkJ aWYgKHAgLSBzID09IDQpCiAJCQkJCXsKIAkJCQkJCWlmIChtZW1jbXAocywgInRydWUiLCA0KSA9 PSAwKQotCQkJCQkJCWxleC0+dG9rZW5fdHlwZSA9IEpTT05fVE9LRU5fVFJVRTsKKwkJCQkJCQly ZXR1cm4ganNvbl9sZXhfc3VjY2VzcyhsZXgsIHAsIEpTT05fVE9LRU5fVFJVRSk7CiAJCQkJCQll bHNlIGlmIChtZW1jbXAocywgIm51bGwiLCA0KSA9PSAwKQotCQkJCQkJCWxleC0+dG9rZW5fdHlw ZSA9IEpTT05fVE9LRU5fTlVMTDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gSlNPTl9JTlZB TElEX1RPS0VOOworCQkJCQkJCXJldHVybiBqc29uX2xleF9zdWNjZXNzKGxleCwgcCwgSlNPTl9U T0tFTl9OVUxMKTsKIAkJCQkJfQogCQkJCQllbHNlIGlmIChwIC0gcyA9PSA1ICYmIG1lbWNtcChz LCAiZmFsc2UiLCA1KSA9PSAwKQotCQkJCQkJbGV4LT50b2tlbl90eXBlID0gSlNPTl9UT0tFTl9G QUxTRTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIEpTT05fSU5WQUxJRF9UT0tFTjsKKwkJCQkJ CXJldHVybiBqc29uX2xleF9zdWNjZXNzKGxleCwgcCwgSlNPTl9UT0tFTl9GQUxTRSk7CisKKwkJ CQkJcmV0dXJuIGpzb25fbGV4X2ZhaWxfYXRfY2hhcl9zdGFydChsZXgsIHAsIEpTT05fSU5WQUxJ RF9UT0tFTik7CiAJCQkJfQogCQl9CQkJCQkJLyogZW5kIG9mIHN3aXRjaCAqLwogCX0KLQotCXJl dHVybiBKU09OX1NVQ0NFU1M7CiB9CiAKIC8qCkBAIC03MTMsMTkgKzcwNiw2IEBAIGpzb25fbGV4 X3N0cmluZyhKc29uTGV4Q29udGV4dCAqbGV4KQogCWNoYXIJICAgKmNvbnN0IGVuZCA9IGxleC0+ aW5wdXQgKyBsZXgtPmlucHV0X2xlbmd0aDsKIAlpbnQJCQloaV9zdXJyb2dhdGUgPSAtMTsKIAot CS8qIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgZXJyb3IgZXhpdHMgKi8KLSNkZWZpbmUgRkFJTF9B VF9DSEFSX1NUQVJUKGNvZGUpIFwKLQlkbyB7IFwKLQkJbGV4LT50b2tlbl90ZXJtaW5hdG9yID0g czsgXAotCQlyZXR1cm4gY29kZTsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIEZBSUxfQVRfQ0hB Ul9FTkQoY29kZSkgXAotCWRvIHsgXAotCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBcCi0JCQlz ICsgcGdfZW5jb2RpbmdfbWJsZW5fYm91bmRlZChsZXgtPmlucHV0X2VuY29kaW5nLCBzKTsgXAot CQlyZXR1cm4gY29kZTsgXAotCX0gd2hpbGUgKDApCi0KIAlpZiAobGV4LT5zdHJ2YWwgIT0gTlVM TCkKIAkJcmVzZXRTdHJpbmdJbmZvKGxleC0+c3RydmFsKTsKIApAQCAtNzM2LDcgKzcxNiw3IEBA IGpzb25fbGV4X3N0cmluZyhKc29uTGV4Q29udGV4dCAqbGV4KQogCQlzKys7CiAJCS8qIFByZW1h dHVyZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KIAkJaWYgKHMgPj0gZW5kKQotCQkJRkFJTF9BVF9D SEFSX1NUQVJUKEpTT05fSU5WQUxJRF9UT0tFTik7CisJCQlyZXR1cm4ganNvbl9sZXhfZmFpbF9h dF9jaGFyX3N0YXJ0KGxleCwgcywgSlNPTl9JTlZBTElEX1RPS0VOKTsKIAkJZWxzZSBpZiAoKnMg PT0gJyInKQogCQkJYnJlYWs7CiAJCWVsc2UgaWYgKCpzID09ICdcXCcpCkBAIC03NDQsNyArNzI0 LDcgQEAganNvbl9sZXhfc3RyaW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCQkvKiBPSywgd2Ug aGF2ZSBhbiBlc2NhcGUgY2hhcmFjdGVyLiAqLwogCQkJcysrOwogCQkJaWYgKHMgPj0gZW5kKQot CQkJCUZBSUxfQVRfQ0hBUl9TVEFSVChKU09OX0lOVkFMSURfVE9LRU4pOworCQkJCXJldHVybiBq c29uX2xleF9mYWlsX2F0X2NoYXJfc3RhcnQobGV4LCBzLCBKU09OX0lOVkFMSURfVE9LRU4pOwog CQkJZWxzZSBpZiAoKnMgPT0gJ3UnKQogCQkJewogCQkJCWludAkJCWk7CkBAIC03NTQsNyArNzM0 LDcgQEAganNvbl9sZXhfc3RyaW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCQkJewogCQkJCQlz Kys7CiAJCQkJCWlmIChzID49IGVuZCkKLQkJCQkJCUZBSUxfQVRfQ0hBUl9TVEFSVChKU09OX0lO VkFMSURfVE9LRU4pOworCQkJCQkJcmV0dXJuIGpzb25fbGV4X2ZhaWxfYXRfY2hhcl9zdGFydChs ZXgsIHMsIEpTT05fSU5WQUxJRF9UT0tFTik7CiAJCQkJCWVsc2UgaWYgKCpzID49ICcwJyAmJiAq cyA8PSAnOScpCiAJCQkJCQljaCA9IChjaCAqIDE2KSArICgqcyAtICcwJyk7CiAJCQkJCWVsc2Ug aWYgKCpzID49ICdhJyAmJiAqcyA8PSAnZicpCkBAIC03NjIsNyArNzQyLDcgQEAganNvbl9sZXhf c3RyaW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCQkJCWVsc2UgaWYgKCpzID49ICdBJyAmJiAq cyA8PSAnRicpCiAJCQkJCQljaCA9IChjaCAqIDE2KSArICgqcyAtICdBJykgKyAxMDsKIAkJCQkJ ZWxzZQotCQkJCQkJRkFJTF9BVF9DSEFSX0VORChKU09OX1VOSUNPREVfRVNDQVBFX0ZPUk1BVCk7 CisJCQkJCQlyZXR1cm4ganNvbl9sZXhfZmFpbF9hdF9jaGFyX2VuZChsZXgsIHMsIEpTT05fVU5J Q09ERV9FU0NBUEVfRk9STUFUKTsKIAkJCQl9CiAJCQkJaWYgKGxleC0+c3RydmFsICE9IE5VTEwp CiAJCQkJewpAQCAtNzcyLDIwICs3NTIsMjAgQEAganNvbl9sZXhfc3RyaW5nKEpzb25MZXhDb250 ZXh0ICpsZXgpCiAJCQkJCWlmIChpc191dGYxNl9zdXJyb2dhdGVfZmlyc3QoY2gpKQogCQkJCQl7 CiAJCQkJCQlpZiAoaGlfc3Vycm9nYXRlICE9IC0xKQotCQkJCQkJCUZBSUxfQVRfQ0hBUl9FTkQo SlNPTl9VTklDT0RFX0hJR0hfU1VSUk9HQVRFKTsKKwkJCQkJCQlyZXR1cm4ganNvbl9sZXhfZmFp bF9hdF9jaGFyX2VuZChsZXgsIHMsIEpTT05fVU5JQ09ERV9ISUdIX1NVUlJPR0FURSk7CiAJCQkJ CQloaV9zdXJyb2dhdGUgPSBjaDsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CiAJCQkJCWVsc2Ug aWYgKGlzX3V0ZjE2X3N1cnJvZ2F0ZV9zZWNvbmQoY2gpKQogCQkJCQl7CiAJCQkJCQlpZiAoaGlf c3Vycm9nYXRlID09IC0xKQotCQkJCQkJCUZBSUxfQVRfQ0hBUl9FTkQoSlNPTl9VTklDT0RFX0xP V19TVVJST0dBVEUpOworCQkJCQkJCXJldHVybiBqc29uX2xleF9mYWlsX2F0X2NoYXJfZW5kKGxl eCwgcywgSlNPTl9VTklDT0RFX0xPV19TVVJST0dBVEUpOwogCQkJCQkJY2ggPSBzdXJyb2dhdGVf cGFpcl90b19jb2RlcG9pbnQoaGlfc3Vycm9nYXRlLCBjaCk7CiAJCQkJCQloaV9zdXJyb2dhdGUg PSAtMTsKIAkJCQkJfQogCiAJCQkJCWlmIChoaV9zdXJyb2dhdGUgIT0gLTEpCi0JCQkJCQlGQUlM X0FUX0NIQVJfRU5EKEpTT05fVU5JQ09ERV9MT1dfU1VSUk9HQVRFKTsKKwkJCQkJCXJldHVybiBq c29uX2xleF9mYWlsX2F0X2NoYXJfZW5kKGxleCwgcywgSlNPTl9VTklDT0RFX0xPV19TVVJST0dB VEUpOwogCiAJCQkJCS8qCiAJCQkJCSAqIFJlamVjdCBpbnZhbGlkIGNhc2VzLiAgV2UgY2FuJ3Qg aGF2ZSBhIHZhbHVlIGFib3ZlCkBAIC03OTUsNyArNzc1LDcgQEAganNvbl9sZXhfc3RyaW5nKEpz b25MZXhDb250ZXh0ICpsZXgpCiAJCQkJCWlmIChjaCA9PSAwKQogCQkJCQl7CiAJCQkJCQkvKiBX ZSBjYW4ndCBhbGxvdyB0aGlzLCBzaW5jZSBvdXIgVEVYVCB0eXBlIGRvZXNuJ3QgKi8KLQkJCQkJ CUZBSUxfQVRfQ0hBUl9FTkQoSlNPTl9VTklDT0RFX0NPREVfUE9JTlRfWkVSTyk7CisJCQkJCQly ZXR1cm4ganNvbl9sZXhfZmFpbF9hdF9jaGFyX2VuZChsZXgsIHMsIEpTT05fVU5JQ09ERV9DT0RF X1BPSU5UX1pFUk8pOwogCQkJCQl9CiAKIAkJCQkJLyoKQEAgLTgwOSw3ICs3ODksNyBAQCBqc29u X2xleF9zdHJpbmcoSnNvbkxleENvbnRleHQgKmxleCkKIAkJCQkJCWNoYXIJCWNidWZbTUFYX1VO SUNPREVfRVFVSVZBTEVOVF9TVFJJTkcgKyAxXTsKIAogCQkJCQkJaWYgKCFwZ191bmljb2RlX3Rv X3NlcnZlcl9ub2Vycm9yKGNoLCAodW5zaWduZWQgY2hhciAqKSBjYnVmKSkKLQkJCQkJCQlGQUlM X0FUX0NIQVJfRU5EKEpTT05fVU5JQ09ERV9VTlRSQU5TTEFUQUJMRSk7CisJCQkJCQkJcmV0dXJu IGpzb25fbGV4X2ZhaWxfYXRfY2hhcl9lbmQobGV4LCBzLCBKU09OX1VOSUNPREVfVU5UUkFOU0xB VEFCTEUpOwogCQkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhsZXgtPnN0cnZhbCwgY2J1Zik7 CiAJCQkJCX0KICNlbHNlCkBAIC04MjksMTQgKzgwOSwxNCBAQCBqc29uX2xleF9zdHJpbmcoSnNv bkxleENvbnRleHQgKmxleCkKIAkJCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGxleC0+c3RydmFs LCAoY2hhcikgY2gpOwogCQkJCQl9CiAJCQkJCWVsc2UKLQkJCQkJCUZBSUxfQVRfQ0hBUl9FTkQo SlNPTl9VTklDT0RFX0hJR0hfRVNDQVBFKTsKKwkJCQkJCXJldHVybiBqc29uX2xleF9mYWlsX2F0 X2NoYXJfZW5kKGxleCwgcywgSlNPTl9VTklDT0RFX0hJR0hfRVNDQVBFKTsKICNlbmRpZgkJCQkJ CQkvKiBGUk9OVEVORCAqLwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgaWYgKGxleC0+c3RydmFsICE9 IE5VTEwpCiAJCQl7CiAJCQkJaWYgKGhpX3N1cnJvZ2F0ZSAhPSAtMSkKLQkJCQkJRkFJTF9BVF9D SEFSX0VORChKU09OX1VOSUNPREVfTE9XX1NVUlJPR0FURSk7CisJCQkJCXJldHVybiBqc29uX2xl eF9mYWlsX2F0X2NoYXJfZW5kKGxleCwgcywgSlNPTl9VTklDT0RFX0xPV19TVVJST0dBVEUpOwog CiAJCQkJc3dpdGNoICgqcykKIAkJCQl7CkBAIC04NjgsNyArODQ4LDcgQEAganNvbl9sZXhfc3Ry aW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAJCQkJCQkgKiBpcyByZXBvcnRlZCwgbm90IHRoZSB3 aG9sZSBzdHJpbmcuCiAJCQkJCQkgKi8KIAkJCQkJCWxleC0+dG9rZW5fc3RhcnQgPSBzOwotCQkJ CQkJRkFJTF9BVF9DSEFSX0VORChKU09OX0VTQ0FQSU5HX0lOVkFMSUQpOworCQkJCQkJcmV0dXJu IGpzb25fbGV4X2ZhaWxfYXRfY2hhcl9lbmQobGV4LCBzLCBKU09OX0VTQ0FQSU5HX0lOVkFMSUQp OwogCQkJCX0KIAkJCX0KIAkJCWVsc2UgaWYgKHN0cmNocigiXCJcXC9iZm5ydCIsICpzKSA9PSBO VUxMKQpAQCAtODgxLDcgKzg2MSw3IEBAIGpzb25fbGV4X3N0cmluZyhKc29uTGV4Q29udGV4dCAq bGV4KQogCQkJCSAqIHNob3duIGl0J3Mgbm90IGEgcGVyZm9ybWFuY2Ugd2luLgogCQkJCSAqLwog CQkJCWxleC0+dG9rZW5fc3RhcnQgPSBzOwotCQkJCUZBSUxfQVRfQ0hBUl9FTkQoSlNPTl9FU0NB UElOR19JTlZBTElEKTsKKwkJCQlyZXR1cm4ganNvbl9sZXhfZmFpbF9hdF9jaGFyX2VuZChsZXgs IHMsIEpTT05fRVNDQVBJTkdfSU5WQUxJRCk7CiAJCQl9CiAJCX0KIAkJZWxzZQpAQCAtODg5LDcg Kzg2OSw3IEBAIGpzb25fbGV4X3N0cmluZyhKc29uTGV4Q29udGV4dCAqbGV4KQogCQkJY2hhcgkg ICAqcCA9IHM7CiAKIAkJCWlmIChoaV9zdXJyb2dhdGUgIT0gLTEpCi0JCQkJRkFJTF9BVF9DSEFS X0VORChKU09OX1VOSUNPREVfTE9XX1NVUlJPR0FURSk7CisJCQkJcmV0dXJuIGpzb25fbGV4X2Zh aWxfYXRfY2hhcl9lbmQobGV4LCBzLCBKU09OX1VOSUNPREVfTE9XX1NVUlJPR0FURSk7CiAKIAkJ CS8qCiAJCQkgKiBTa2lwIHRvIHRoZSBmaXJzdCBieXRlIHRoYXQgcmVxdWlyZXMgc3BlY2lhbCBo YW5kbGluZywgc28gd2UKQEAgLTkxMiw4ICs4OTIsNyBAQCBqc29uX2xleF9zdHJpbmcoSnNvbkxl eENvbnRleHQgKmxleCkKIAkJCQkJICogU2luY2UgKnAgaXNuJ3QgcHJpbnRhYmxlLCBleGNsdWRl IGl0IGZyb20gdGhlIGNvbnRleHQKIAkJCQkJICogc3RyaW5nCiAJCQkJCSAqLwotCQkJCQlsZXgt PnRva2VuX3Rlcm1pbmF0b3IgPSBwOwotCQkJCQlyZXR1cm4gSlNPTl9FU0NBUElOR19SRVFVSVJF RDsKKwkJCQkJcmV0dXJuIGpzb25fbGV4X2ZhaWxfYXRfY2hhcl9zdGFydChsZXgsIHAsIEpTT05f RVNDQVBJTkdfUkVRVUlSRUQpOwogCQkJCX0KIAkJCX0KIApAQCAtOTI5LDE4ICs5MDgsMTAgQEAg anNvbl9sZXhfc3RyaW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAJfQogCiAJaWYgKGhpX3N1cnJv Z2F0ZSAhPSAtMSkKLQl7Ci0JCWxleC0+dG9rZW5fdGVybWluYXRvciA9IHMgKyAxOwotCQlyZXR1 cm4gSlNPTl9VTklDT0RFX0xPV19TVVJST0dBVEU7Ci0JfQorCQlyZXR1cm4ganNvbl9sZXhfZmFp bF9hdF9jaGFyX3N0YXJ0KGxleCwgcyArIDEsIEpTT05fVU5JQ09ERV9MT1dfU1VSUk9HQVRFKTsK IAogCS8qIEhvb3JheSwgd2UgZm91bmQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nISAqLwotCWxleC0+ cHJldl90b2tlbl90ZXJtaW5hdG9yID0gbGV4LT50b2tlbl90ZXJtaW5hdG9yOwotCWxleC0+dG9r ZW5fdGVybWluYXRvciA9IHMgKyAxOwotCXJldHVybiBKU09OX1NVQ0NFU1M7Ci0KLSN1bmRlZiBG QUlMX0FUX0NIQVJfU1RBUlQKLSN1bmRlZiBGQUlMX0FUX0NIQVJfRU5ECisJcmV0dXJuIGpzb25f bGV4X3N1Y2Nlc3MobGV4LCBzICsgMSwgSlNPTl9UT0tFTl9TVFJJTkcpOwogfQogCiAvKgpAQCAt OTY2LDc0ICs5MzcsNTggQEAganNvbl9sZXhfc3RyaW5nKEpzb25MZXhDb250ZXh0ICpsZXgpCiAg KiBUaGUgJ3MnIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24gcG9pbnRzIHRvIHRoZSBvc3RlbnNp YmxlIGJlZ2lubmluZwogICogb2YgcGFydCAyIC0gaS5lLiB0aGUgY2hhcmFjdGVyIGFmdGVyIGFu eSBvcHRpb25hbCBtaW51cyBzaWduLCBvciB0aGUKICAqIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUg c3RyaW5nIGlmIHRoZXJlIGlzIG5vbmUuCi0gKgotICogSWYgbnVtX2VyciBpcyBub3QgTlVMTCwg d2UgcmV0dXJuIGFuIGVycm9yIGZsYWcgdG8gKm51bV9lcnIgcmF0aGVyIHRoYW4KLSAqIHJhaXNp bmcgYW4gZXJyb3IgZm9yIGEgYmFkbHktZm9ybWVkIG51bWJlci4gIEFsc28sIGlmIHRvdGFsX2xl biBpcyBub3QgTlVMTAotICogdGhlIGRpc3RhbmNlIGZyb20gbGV4LT5pbnB1dCB0byB0aGUgdG9r ZW4gZW5kKzEgaXMgcmV0dXJuZWQgdG8gKnRvdGFsX2xlbi4KICAqLwogc3RhdGljIGlubGluZSBK c29uUGFyc2VFcnJvclR5cGUKLWpzb25fbGV4X251bWJlcihKc29uTGV4Q29udGV4dCAqbGV4LCBj aGFyICpzLAotCQkJCWJvb2wgKm51bV9lcnIsIGludCAqdG90YWxfbGVuKQoranNvbl9sZXhfbnVt YmVyKEpzb25MZXhDb250ZXh0ICpsZXgsIGNoYXIgKnMpCiB7CiAJYm9vbAkJZXJyb3IgPSBmYWxz ZTsKLQlpbnQJCQlsZW4gPSBzIC0gbGV4LT5pbnB1dDsKKwljaGFyCSAgICppbnB1dF9lbmQgPSBs ZXgtPmlucHV0ICsgbGV4LT5pbnB1dF9sZW5ndGg7CiAKIAkvKiBQYXJ0ICgxKTogbGVhZGluZyBz aWduIGluZGljYXRvci4gKi8KIAkvKiBDYWxsZXIgYWxyZWFkeSBkaWQgdGhpcyBmb3IgdXM7IHNv IGRvIG5vdGhpbmcuICovCiAKIAkvKiBQYXJ0ICgyKTogcGFyc2UgbWFpbiBkaWdpdCBzdHJpbmcu ICovCi0JaWYgKGxlbiA8IGxleC0+aW5wdXRfbGVuZ3RoICYmICpzID09ICcwJykKLQl7CisJaWYg KHMgPCBpbnB1dF9lbmQgJiYgKnMgPT0gJzAnKQogCQlzKys7Ci0JCWxlbisrOwotCX0KLQllbHNl IGlmIChsZW4gPCBsZXgtPmlucHV0X2xlbmd0aCAmJiAqcyA+PSAnMScgJiYgKnMgPD0gJzknKQor CWVsc2UgaWYgKHMgPCBpbnB1dF9lbmQgJiYgKnMgPj0gJzEnICYmICpzIDw9ICc5JykKIAl7CiAJ CWRvCiAJCXsKIAkJCXMrKzsKLQkJCWxlbisrOwotCQl9IHdoaWxlIChsZW4gPCBsZXgtPmlucHV0 X2xlbmd0aCAmJiAqcyA+PSAnMCcgJiYgKnMgPD0gJzknKTsKKwkJfSB3aGlsZSAocyA8IGlucHV0 X2VuZCAmJiAqcyA+PSAnMCcgJiYgKnMgPD0gJzknKTsKIAl9CiAJZWxzZQogCQllcnJvciA9IHRy dWU7CiAKIAkvKiBQYXJ0ICgzKTogcGFyc2Ugb3B0aW9uYWwgZGVjaW1hbCBwb3J0aW9uLiAqLwot CWlmIChsZW4gPCBsZXgtPmlucHV0X2xlbmd0aCAmJiAqcyA9PSAnLicpCisJaWYgKHMgPCBpbnB1 dF9lbmQgJiYgKnMgPT0gJy4nKQogCXsKIAkJcysrOwotCQlsZW4rKzsKLQkJaWYgKGxlbiA9PSBs ZXgtPmlucHV0X2xlbmd0aCB8fCAqcyA8ICcwJyB8fCAqcyA+ICc5JykKKwkJaWYgKHMgPT0gaW5w dXRfZW5kIHx8ICpzIDwgJzAnIHx8ICpzID4gJzknKQogCQkJZXJyb3IgPSB0cnVlOwogCQllbHNl CiAJCXsKIAkJCWRvCiAJCQl7CiAJCQkJcysrOwotCQkJCWxlbisrOwotCQkJfSB3aGlsZSAobGVu IDwgbGV4LT5pbnB1dF9sZW5ndGggJiYgKnMgPj0gJzAnICYmICpzIDw9ICc5Jyk7CisJCQl9IHdo aWxlIChzIDwgaW5wdXRfZW5kICYmICpzID49ICcwJyAmJiAqcyA8PSAnOScpOwogCQl9CiAJfQog CiAJLyogUGFydCAoNCk6IHBhcnNlIG9wdGlvbmFsIGV4cG9uZW50LiAqLwotCWlmIChsZW4gPCBs ZXgtPmlucHV0X2xlbmd0aCAmJiAoKnMgPT0gJ2UnIHx8ICpzID09ICdFJykpCisJaWYgKHMgPCBp bnB1dF9lbmQgJiYgKCpzID09ICdlJyB8fCAqcyA9PSAnRScpKQogCXsKIAkJcysrOwotCQlsZW4r KzsKLQkJaWYgKGxlbiA8IGxleC0+aW5wdXRfbGVuZ3RoICYmICgqcyA9PSAnKycgfHwgKnMgPT0g Jy0nKSkKLQkJeworCQlpZiAocyA8IGlucHV0X2VuZCAmJiAoKnMgPT0gJysnIHx8ICpzID09ICct JykpCiAJCQlzKys7Ci0JCQlsZW4rKzsKLQkJfQotCQlpZiAobGVuID09IGxleC0+aW5wdXRfbGVu Z3RoIHx8ICpzIDwgJzAnIHx8ICpzID4gJzknKQorCQlpZiAocyA9PSBpbnB1dF9lbmQgfHwgKnMg PCAnMCcgfHwgKnMgPiAnOScpCiAJCQllcnJvciA9IHRydWU7CiAJCWVsc2UKIAkJewogCQkJZG8K IAkJCXsKIAkJCQlzKys7Ci0JCQkJbGVuKys7Ci0JCQl9IHdoaWxlIChsZW4gPCBsZXgtPmlucHV0 X2xlbmd0aCAmJiAqcyA+PSAnMCcgJiYgKnMgPD0gJzknKTsKKwkJCX0gd2hpbGUgKHMgPCBpbnB1 dF9lbmQgJiYgKnMgPj0gJzAnICYmICpzIDw9ICc5Jyk7CiAJCX0KIAl9CiAKQEAgLTEwNDIsMjgg Kzk5NywxNSBAQCBqc29uX2xleF9udW1iZXIoSnNvbkxleENvbnRleHQgKmxleCwgY2hhciAqcywK IAkgKiBoZXJlIHNob3VsZCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHRva2VuIGZvciBlcnJv ci1yZXBvcnRpbmcKIAkgKiBwdXJwb3Nlcy4KIAkgKi8KLQlmb3IgKDsgbGVuIDwgbGV4LT5pbnB1 dF9sZW5ndGggJiYgSlNPTl9BTFBIQU5VTUVSSUNfQ0hBUigqcyk7IHMrKywgbGVuKyspCisJZm9y ICg7IHMgPCBpbnB1dF9lbmQgJiYgSlNPTl9BTFBIQU5VTUVSSUNfQ0hBUigqcyk7IHMrKykKIAkJ ZXJyb3IgPSB0cnVlOwogCi0JaWYgKHRvdGFsX2xlbiAhPSBOVUxMKQotCQkqdG90YWxfbGVuID0g bGVuOwotCi0JaWYgKG51bV9lcnIgIT0gTlVMTCkKLQl7Ci0JCS8qIGxldCB0aGUgY2FsbGVyIGhh bmRsZSBhbnkgZXJyb3IgKi8KLQkJKm51bV9lcnIgPSBlcnJvcjsKLQl9Ci0JZWxzZQotCXsKLQkJ LyogcmV0dXJuIHRva2VuIGVuZHBvaW50ICovCi0JCWxleC0+cHJldl90b2tlbl90ZXJtaW5hdG9y ID0gbGV4LT50b2tlbl90ZXJtaW5hdG9yOwotCQlsZXgtPnRva2VuX3Rlcm1pbmF0b3IgPSBzOwot CQkvKiBoYW5kbGUgZXJyb3IgaWYgYW55ICovCi0JCWlmIChlcnJvcikKLQkJCXJldHVybiBKU09O X0lOVkFMSURfVE9LRU47Ci0JfQorCS8qIGhhbmRsZSBlcnJvciBpZiBhbnkgKi8KKwlpZiAoZXJy b3IpCisJCXJldHVybiBqc29uX2xleF9mYWlsX2F0X2NoYXJfc3RhcnQobGV4LCBzLCBKU09OX0lO VkFMSURfVE9LRU4pOwogCi0JcmV0dXJuIEpTT05fU1VDQ0VTUzsKKwkvKiByZXR1cm4gdG9rZW4g ZW5kcG9pbnQgJ3MnICovCisJcmV0dXJuIGpzb25fbGV4X3N1Y2Nlc3MobGV4LCBzLCBKU09OX1RP S0VOX05VTUJFUik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2pzb25fZW5jb2Rpbmcub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uX2Vu Y29kaW5nLm91dAppbmRleCBmZTcyOWRiOGM5ZC4uNDU1YzY0NDFmNDYgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbl9lbmNvZGluZy5vdXQKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qc29uX2VuY29kaW5nLm91dApAQCAtMjY3LDMgKzI2NywyOCBAQCBz ZWxlY3QgKiBmcm9tIHBnX2lucHV0X2Vycm9yX2luZm8oJ3sgImEiOiAgIlx1ZDgzZFx1ZGUwNFx1 ZDgzZFx1ZGMzNiIgfScsICdqc29uYgogICAgICAgICAgfCAgICAgICAgfCAgICAgIHwgCiAoMSBy b3cpCiAKKy0tIGFkZGl0aW9uYWwgdGVzdHMgZm9yIGJ1ZyBpbiBudWxsL3N1cnJvZ2F0ZXMgZXJy b3IgcmVwb3J0aW5nCitTRUxFQ1QganNvbmIgRSdcbiJcXHUwMDAwIicgYXMgbnVsbF9pc19ub3Rf c3VwcG9ydGVkOworRVJST1I6ICB1bnN1cHBvcnRlZCBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZQor TElORSAxOiBTRUxFQ1QganNvbmIgRSdcbiJcXHUwMDAwIicgYXMgbnVsbF9pc19ub3Rfc3VwcG9y dGVkOworICAgICAgICAgICAgICAgICAgICAgXgorREVUQUlMOiAgXHUwMDAwIGNhbm5vdCBiZSBj b252ZXJ0ZWQgdG8gdGV4dC4KK0NPTlRFWFQ6ICBKU09OIGRhdGEsIGxpbmUgMjogIlx1MDAwMC4u LgorU0VMRUNUIGpzb25iIEUnXG4iXFx1ZDgzZFgiJyBhcyBvcnBoYW5faGlnaF9zdXJyb2dhdGU7 CitFUlJPUjogIGludmFsaWQgaW5wdXQgc3ludGF4IGZvciB0eXBlIGpzb24KK0xJTkUgMTogU0VM RUNUIGpzb25iIEUnXG4iXFx1ZDgzZFgiJyBhcyBvcnBoYW5faGlnaF9zdXJyb2dhdGU7CisgICAg ICAgICAgICAgICAgICAgICBeCitERVRBSUw6ICBVbmljb2RlIGxvdyBzdXJyb2dhdGUgbXVzdCBm b2xsb3cgYSBoaWdoIHN1cnJvZ2F0ZS4KK0NPTlRFWFQ6ICBKU09OIGRhdGEsIGxpbmUgMjogIlx1 ZDgzZFguLi4KK1NFTEVDVCBqc29uYiBFJ1xuIlxcdWQ4M2RcdTAwYTkiJyBhcyBvcnBoYW5faGln aF9zdXJyb2dhdGU7CitFUlJPUjogIGludmFsaWQgaW5wdXQgc3ludGF4IGZvciB0eXBlIGpzb24K K0xJTkUgMTogU0VMRUNUIGpzb25iIEUnXG4iXFx1ZDgzZFx1MDBhOSInIGFzIG9ycGhhbl9oaWdo X3N1cnJvZ2F0ZTsKKyAgICAgICAgICAgICAgICAgICAgIF4KK0RFVEFJTDogIFVuaWNvZGUgbG93 IHN1cnJvZ2F0ZSBtdXN0IGZvbGxvdyBhIGhpZ2ggc3Vycm9nYXRlLgorQ09OVEVYVDogIEpTT04g ZGF0YSwgbGluZSAyOiAiXHVkODNkwqkuLi4KK1NFTEVDVCBqc29uYiBFJ1xuIlxcdWQ4M2RcXHVk ODNkIicgYXMgdHdvX2hpZ2hfc3Vycm9nYXRlc19pbl9hX3JvdzsKK0VSUk9SOiAgaW52YWxpZCBp bnB1dCBzeW50YXggZm9yIHR5cGUganNvbgorTElORSAxOiBTRUxFQ1QganNvbmIgRSdcbiJcXHVk ODNkXFx1ZDgzZCInIGFzIHR3b19oaWdoX3N1cnJvZ2F0ZXNfaW4uLi4KKyAgICAgICAgICAgICAg ICAgICAgIF4KK0RFVEFJTDogIFVuaWNvZGUgaGlnaCBzdXJyb2dhdGUgbXVzdCBub3QgZm9sbG93 IGEgaGlnaCBzdXJyb2dhdGUuCitDT05URVhUOiAgSlNPTiBkYXRhLCBsaW5lIDI6ICJcdWQ4M2Rc dWQ4M2QuLi4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbl9lbmNv ZGluZ18xLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNvbl9lbmNvZGluZ18xLm91 dAppbmRleCA1YzhkOTFhZDBiNi4uNTQwMGMyMGI2MjUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvanNvbl9lbmNvZGluZ18xLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL2pzb25fZW5jb2RpbmdfMS5vdXQKQEAgLTI2MywzICsyNjMsMjYgQEAgc2VsZWN0 ICogZnJvbSBwZ19pbnB1dF9lcnJvcl9pbmZvKCd7ICJhIjogICJcdWQ4M2RcdWRlMDRcdWQ4M2Rc dWRjMzYiIH0nLCAnanNvbmIKICB1bnN1cHBvcnRlZCBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSB8 IFVuaWNvZGUgZXNjYXBlIHZhbHVlIGNvdWxkIG5vdCBiZSB0cmFuc2xhdGVkIHRvIHRoZSBzZXJ2 ZXIncyBlbmNvZGluZyBTUUxfQVNDSUkuIHwgICAgICB8IDIyUDA1CiAoMSByb3cpCiAKKy0tIGFk ZGl0aW9uYWwgdGVzdHMgZm9yIGJ1ZyBpbiBudWxsL3N1cnJvZ2F0ZXMgZXJyb3IgcmVwb3J0aW5n CitTRUxFQ1QganNvbmIgRSdcbiJcXHUwMDAwIicgYXMgbnVsbF9pc19ub3Rfc3VwcG9ydGVkOwor RVJST1I6ICB1bnN1cHBvcnRlZCBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZQorTElORSAxOiBTRUxF Q1QganNvbmIgRSdcbiJcXHUwMDAwIicgYXMgbnVsbF9pc19ub3Rfc3VwcG9ydGVkOworICAgICAg ICAgICAgICAgICAgICAgXgorREVUQUlMOiAgXHUwMDAwIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8g dGV4dC4KK0NPTlRFWFQ6ICBKU09OIGRhdGEsIGxpbmUgMjogIlx1MDAwMC4uLgorU0VMRUNUIGpz b25iIEUnXG4iXFx1ZDgzZFgiJyBhcyBvcnBoYW5faGlnaF9zdXJyb2dhdGU7CitFUlJPUjogIGlu dmFsaWQgaW5wdXQgc3ludGF4IGZvciB0eXBlIGpzb24KK0xJTkUgMTogU0VMRUNUIGpzb25iIEUn XG4iXFx1ZDgzZFgiJyBhcyBvcnBoYW5faGlnaF9zdXJyb2dhdGU7CisgICAgICAgICAgICAgICAg ICAgICBeCitERVRBSUw6ICBVbmljb2RlIGxvdyBzdXJyb2dhdGUgbXVzdCBmb2xsb3cgYSBoaWdo IHN1cnJvZ2F0ZS4KK0NPTlRFWFQ6ICBKU09OIGRhdGEsIGxpbmUgMjogIlx1ZDgzZFguLi4KK1NF TEVDVCBqc29uYiBFJ1xuIlxcdWQ4M2RcdTAwYTkiJyBhcyBvcnBoYW5faGlnaF9zdXJyb2dhdGU7 CitFUlJPUjogIGNvbnZlcnNpb24gYmV0d2VlbiBVVEY4IGFuZCBTUUxfQVNDSUkgaXMgbm90IHN1 cHBvcnRlZAorTElORSAxOiBTRUxFQ1QganNvbmIgRSdcbiJcXHVkODNkXHUwMGE5IicgYXMgb3Jw aGFuX2hpZ2hfc3Vycm9nYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgor U0VMRUNUIGpzb25iIEUnXG4iXFx1ZDgzZFxcdWQ4M2QiJyBhcyB0d29faGlnaF9zdXJyb2dhdGVz X2luX2Ffcm93OworRVJST1I6ICBpbnZhbGlkIGlucHV0IHN5bnRheCBmb3IgdHlwZSBqc29uCitM SU5FIDE6IFNFTEVDVCBqc29uYiBFJ1xuIlxcdWQ4M2RcXHVkODNkIicgYXMgdHdvX2hpZ2hfc3Vy cm9nYXRlc19pbi4uLgorICAgICAgICAgICAgICAgICAgICAgXgorREVUQUlMOiAgVW5pY29kZSBo aWdoIHN1cnJvZ2F0ZSBtdXN0IG5vdCBmb2xsb3cgYSBoaWdoIHN1cnJvZ2F0ZS4KK0NPTlRFWFQ6 ICBKU09OIGRhdGEsIGxpbmUgMjogIlx1ZDgzZFx1ZDgzZC4uLgpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvanNvbl9lbmNvZGluZy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9q c29uX2VuY29kaW5nLnNxbAppbmRleCBhY2ViOGRiYzNjNi4uZjBiYjZkNjZhMWQgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25fZW5jb2Rpbmcuc3FsCisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2pzb25fZW5jb2Rpbmcuc3FsCkBAIC04MCwzICs4MCwxMCBAQCBTRUxFQ1Qg anNvbmIgJ3sgImEiOiAgIm51bGwgXFx1MDAwMCBlc2NhcGUiIH0nIC0+PiAnYScgYXMgbm90X2Fu X2VzY2FwZTsKIC0tIHNvZnQgZXJyb3IgZm9yIGlucHV0LXRpbWUgZmFpbHVyZQogCiBzZWxlY3Qg KiBmcm9tIHBnX2lucHV0X2Vycm9yX2luZm8oJ3sgImEiOiAgIlx1ZDgzZFx1ZGUwNFx1ZDgzZFx1 ZGMzNiIgfScsICdqc29uYicpOworCisKKy0tIGFkZGl0aW9uYWwgdGVzdHMgZm9yIGJ1ZyBpbiBu dWxsL3N1cnJvZ2F0ZXMgZXJyb3IgcmVwb3J0aW5nCitTRUxFQ1QganNvbmIgRSdcbiJcXHUwMDAw IicgYXMgbnVsbF9pc19ub3Rfc3VwcG9ydGVkOworU0VMRUNUIGpzb25iIEUnXG4iXFx1ZDgzZFgi JyBhcyBvcnBoYW5faGlnaF9zdXJyb2dhdGU7CitTRUxFQ1QganNvbmIgRSdcbiJcXHVkODNkXHUw MGE5IicgYXMgb3JwaGFuX2hpZ2hfc3Vycm9nYXRlOworU0VMRUNUIGpzb25iIEUnXG4iXFx1ZDgz ZFxcdWQ4M2QiJyBhcyB0d29faGlnaF9zdXJyb2dhdGVzX2luX2Ffcm93OwotLSAKMi4yNS4xCgo= --=-ns6cEYG1rpDVSU53O6Fy--