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 1r6Xt9-001JHk-1v for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Nov 2023 15:14:39 +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 1r6Xt7-00CFk3-75 for pgsql-hackers@arkaria.postgresql.org; Fri, 24 Nov 2023 15:14:37 +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 1r6Xt6-00CFjv-N9 for pgsql-hackers@lists.postgresql.org; Fri, 24 Nov 2023 15:14:36 +0000 Received: from meesny.iki.fi ([2001:67c:2b0:1c1::201]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1r6Xt3-008J91-9d for pgsql-hackers@lists.postgresql.org; Fri, 24 Nov 2023 15:14:36 +0000 Received: from [192.168.1.115] (dsl-hkibng22-54f8db-125.dhcp.inet.fi [84.248.219.125]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by meesny.iki.fi (Postfix) with ESMTPSA id 4ScJRm1L8xzyQl; Fri, 24 Nov 2023 17:14:25 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1700838869; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=CUswtM7deGOdSVUQLP/9QgZlNrQWJmbMamPLhuTGJmY=; b=Lw+Zi8sa4gTwMatT+nb0Qe+qBAz66Pb7uEhdYwu9l3YZPnhPwtPOAmdsDLlAok5RkHNo6X yGDYt42YXJZFzqF8owaAyBw4GyPwtFmt/KXsRRu3HWVBUpNhlxhzlInPYwBHEZQIGo1a5r gsHzU+yqFHKL0po3itqJ5qZOzn6rKCk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1700838869; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=CUswtM7deGOdSVUQLP/9QgZlNrQWJmbMamPLhuTGJmY=; b=sTCfN7hkZv0syQixv+09Rllvxr5KmtSdzGct+uAmQQ0GsneFQ76xmKotqyG1VlxjPU0PZB oJNgVUnfenQcYc/b5uiJpISnWOP7KJ3qAAWa1h8GsFXgDIJIAMNRCAXopL78+FoCRC7Wpy Y3q20keBCwg/hIKyZIdM5rCCIyyiLFA= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi ARC-Seal: i=1; s=meesny; d=iki.fi; t=1700838869; a=rsa-sha256; cv=none; b=RAQWSduIscXWoxtXBywgaf6PNHsJksdNjJ1xNtYvv3J0AChhjcgfq77uGlst5FxQfZ4IjD 8AcbzKRkAL1mjO8qTpPkUO4DOXxTO8aI20LJiu4GLdie+mT4DpmD6OIU1LG/n5LxgDjD94 KZOXdLH0tjZEdXVOifh+BdRLpVmrvC4= Content-Type: multipart/mixed; boundary="------------TtXrZbwzTLPzJLdzsubweEjm" Message-ID: <6b48c746-9704-46dc-b9be-01fe4137c824@iki.fi> Date: Fri, 24 Nov 2023 17:14:24 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Stack overflow issue To: Egor Chindyaskin , Sascha Kuhl Cc: pgsql-hackers@lists.postgresql.org References: <1661334672.728714027@f473.i.mail.ru> <485cf2a2-d504-fb5f-6751-1085ccf614ec@mail.ru> <4530546a-3216-eaa9-4c92-92d33290a211@mail.ru> Content-Language: en-US From: Heikki Linnakangas In-Reply-To: <4530546a-3216-eaa9-4c92-92d33290a211@mail.ru> 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. --------------TtXrZbwzTLPzJLdzsubweEjm Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 21/06/2023 16:45, Egor Chindyaskin wrote: > Hello! In continuation of the topic I would like to suggest solution. > This patch adds several checks to the vulnerable functions above. I looked at this last patch. The depth checks are clearly better than segfaulting, but I think we can also avoid the recursions and having to error out. That seems nice especially for MemoryContextDelete(), which is called at transaction cleanup. 1. CommitTransactionCommand This is just tail recursion. The compiler will almost certainly optimize it away unless you're using -O0. We can easily turn it into iteration ourselves to avoid that hazard, per attached 0001-Turn-tail-recursion-into-iteration-in-CommitTransact.patch. 2. ShowTransactionStateRec Since this is just a debugging aid, I think we can just stop recursing if we're about to run out of stack space. Seems nicer than erroring out, although it can still error if you run out of memory. See 0002-Avoid-stack-overflow-in-ShowTransactionStateRec.patch. 3. All the MemoryContext functions I'm reluctant to add stack checks to these, because they are called in places like cleaning up after transaction abort. MemoryContextDelete() in particular. If you ereport an error, it's not clear that you can recover cleanly; you'll leak memory if nothing else. Fortunately MemoryContext contains pointers to parent and siblings, so we can traverse a tree of MemoryContexts iteratively, without using stack. MemoryContextStats() is a bit tricky, but we can put a limit on how much it recurses, and just print a summary line if the limit is reached. That's what we already do if a memory context has a lot of children. (Actually, if we didn't try keep track of the # of children at each level, to trigger the summarization, we could traverse the tree without using stack. But a limit seems useful.) What do you think? -- Heikki Linnakangas Neon (https://neon.tech) --------------TtXrZbwzTLPzJLdzsubweEjm Content-Type: text/x-patch; charset=UTF-8; name="0001-Turn-tail-recursion-into-iteration-in-CommitTransact.patch" Content-Disposition: attachment; filename*0="0001-Turn-tail-recursion-into-iteration-in-CommitTransact.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA1NDNlNjU2OWEzZjQ3MzBmMzEwNTM3OWNjOTQ2Y2M2YjU0NTI1MTc5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjQgTm92IDIwMjMgMTQ6MTM6MTAgKzAyMDAK U3ViamVjdDogW1BBVENIIDEvNF0gVHVybiB0YWlsIHJlY3Vyc2lvbiBpbnRvIGl0ZXJhdGlv biBpbgogQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCkKClVzdWFsbHkgdGhlIGNvbXBpbGVy IHdpbGwgb3B0aW1pemUgYXdheSB0aGUgdGFpbCByZWN1cnNpb24gYW55d2F5LCBidXQKaWYg aXQgZG9lc24ndCwgeW91IGNhbiBkcml2ZSB0aGUgZnVuY3Rpb24gaW50byBzdGFjayBvdmVy Zmxvdy4gRm9yCmV4YW1wbGU6CgogICAgKG49MTAwMDAwMDsgcHJpbnRmICJCRUdJTjsiOyBm b3IgKChpPTE7aTw9JG47aSsrKSk7IGRvIHByaW50ZiAiU0FWRVBPSU5UIHMkaTsiOyBkb25l OyBwcmludGYgIkVSUk9SOyBDT01NSVQ7IikgfCBwc3FsID4vZGV2L251bGwKClJlcG9ydCBi eSBFZ29yIENoaW5keWFza2luIGFuZCBBbGV4YW5kZXIgTGFraGluLgoKRGlzY3Vzc2lvbjog aHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC8xNjcyNzYwNDU3Ljk0MDQ2 MjA3OSU0MGYzMDYuaS5tYWlsLnJ1Ci0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v eGFjdC5jIHwgMTEgKysrKysrLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA2IGluc2VydGlvbnMo KyksIDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGFjdC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGFjdC5jCmluZGV4 IDUzNmVkYjM3OTIuLmUxNmI3M2E5ZjEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hhY3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94YWN0 LmMKQEAgLTMwMzMsMTIgKzMwMzMsMTUgQEAgUmVzdG9yZVRyYW5zYWN0aW9uQ2hhcmFjdGVy aXN0aWNzKGNvbnN0IFNhdmVkVHJhbnNhY3Rpb25DaGFyYWN0ZXJpc3RpY3MgKnMpCiB2b2lk CiBDb21taXRUcmFuc2FjdGlvbkNvbW1hbmQodm9pZCkKIHsKLQlUcmFuc2FjdGlvblN0YXRl IHMgPSBDdXJyZW50VHJhbnNhY3Rpb25TdGF0ZTsKKwlUcmFuc2FjdGlvblN0YXRlIHM7CiAJ U2F2ZWRUcmFuc2FjdGlvbkNoYXJhY3RlcmlzdGljcyBzYXZldGM7CiAKK3JlY3Vyc2U6CisJ cyA9IEN1cnJlbnRUcmFuc2FjdGlvblN0YXRlOwogCS8qIE11c3Qgc2F2ZSBpbiBjYXNlIHdl IG5lZWQgdG8gcmVzdG9yZSBiZWxvdyAqLwogCVNhdmVUcmFuc2FjdGlvbkNoYXJhY3Rlcmlz dGljcygmc2F2ZXRjKTsKIAorCXMgPSBDdXJyZW50VHJhbnNhY3Rpb25TdGF0ZTsKIAlzd2l0 Y2ggKHMtPmJsb2NrU3RhdGUpCiAJewogCQkJLyoKQEAgLTMyMjYsOCArMzIyOSw3IEBAIENv bW1pdFRyYW5zYWN0aW9uQ29tbWFuZCh2b2lkKQogCQkJICovCiAJCWNhc2UgVEJMT0NLX1NV QkFCT1JUX0VORDoKIAkJCUNsZWFudXBTdWJUcmFuc2FjdGlvbigpOwotCQkJQ29tbWl0VHJh bnNhY3Rpb25Db21tYW5kKCk7Ci0JCQlicmVhazsKKwkJCWdvdG8gcmVjdXJzZTsKIAogCQkJ LyoKIAkJCSAqIEFzIGFib3ZlLCBidXQgaXQncyBub3QgZGVhZCB5ZXQsIHNvIGFib3J0IGZp cnN0LgpAQCAtMzIzNSw4ICszMjM3LDcgQEAgQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKHZv aWQpCiAJCWNhc2UgVEJMT0NLX1NVQkFCT1JUX1BFTkRJTkc6CiAJCQlBYm9ydFN1YlRyYW5z YWN0aW9uKCk7CiAJCQlDbGVhbnVwU3ViVHJhbnNhY3Rpb24oKTsKLQkJCUNvbW1pdFRyYW5z YWN0aW9uQ29tbWFuZCgpOwotCQkJYnJlYWs7CisJCQlnb3RvIHJlY3Vyc2U7CiAKIAkJCS8q CiAJCQkgKiBUaGUgY3VycmVudCBzdWJ0cmFuc2FjdGlvbiBpcyB0aGUgdGFyZ2V0IG9mIGEg Uk9MTEJBQ0sgVE8KLS0gCjIuMzkuMgoK --------------TtXrZbwzTLPzJLdzsubweEjm Content-Type: text/x-patch; charset=UTF-8; name="0002-Avoid-stack-overflow-in-ShowTransactionStateRec.patch" Content-Disposition: attachment; filename*0="0002-Avoid-stack-overflow-in-ShowTransactionStateRec.patch" Content-Transfer-Encoding: base64 RnJvbSAxZGEyMDMxM2I2MjUyMzQ2ZmJjM2Y0NmNkZmRlNjEyNTMyZTk4Yzg0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjQgTm92IDIwMjMgMTU6MDY6NTMgKzAyMDAK U3ViamVjdDogW1BBVENIIDIvNF0gQXZvaWQgc3RhY2sgb3ZlcmZsb3cgaW4gU2hvd1RyYW5z YWN0aW9uU3RhdGVSZWMoKQoKVGhlIGZ1bmN0aW9uIHJlY3Vyc2VzLCBidXQgZGlkbid0IHBl cmZvcm0gc3RhY2stZGVwdGggY2hlY2tzLiBJdCdzCmp1c3QgYSBkZWJ1Z2dpbmcgYWlkLCBz byBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBjaGVja19zdGFja19kZXB0aCgpCmNhbGwsIHN0b3Ag dGhlIHByaW50aW5nIGlmIHdlJ2QgcmlzayBzdGFjayBvdmVyZmxvdy4KCkhlcmUncyBhbiBl eGFtcGxlIG9mIGhvdyB0byB0ZXN0IHRoaXM6CgogICAgKG49MTAwMDAwMDsgcHJpbnRmICJC RUdJTjsiOyBmb3IgKChpPTE7aTw9JG47aSsrKSk7IGRvIHByaW50ZiAiU0FWRVBPSU5UIHMk aTsiOyBkb25lOyBwcmludGYgIlNFVCBsb2dfbWluX21lc3NhZ2VzID0gJ0RFQlVHNSc7IFNB VkVQT0lOVCBzcDsiKSB8IHBzcWwgPi9kZXYvbnVsbAoKSW4gdGhlIHBhc3NpbmcsIHN3YXAg YnVpbGRpbmcgdGhlIGxpc3Qgb2YgY2hpbGQgWElEcyBhbmQgcmVjdXJzaW5nIHRvCnBhcmVu dC4gVGhhdCBzYXZlcyBtZW1vcnkgd2hpbGUgcmVjdXJzaW5nLCByZWR1Y2luZyB0aGUgcmlz ayBvZiBvdXQgb2YKbWVtb3J5IGVycm9ycyB3aXRoIGxvdHMgb2Ygc3VidHJhbnNhY3Rpb25z LiBUaGUgc2F2aW5nIGlzIG5vdCB2ZXJ5CnNpZ25pZmljYW50IGluIHByYWN0aWNlLCBidXQg dGhpcyBvcmRlciBzZWVtcyBtb3JlIGxvZ2ljYWwgYW55d2F5LgoKUmVwb3J0IGJ5IEVnb3Ig Q2hpbmR5YXNraW4gYW5kIEFsZXhhbmRlciBMYWtoaW4uCgpEaXNjdXNzaW9uOiBodHRwczov L3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkLzE2NzI3NjA0NTcuOTQwNDYyMDc5JTQw ZjMwNi5pLm1haWwucnUKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94YWN0LmMg fCAyMSArKysrKysrKysrKysrKystLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNSBpbnNlcnRp b25zKCspLCA2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hhY3QuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hhY3QuYwpp bmRleCBlMTZiNzNhOWYxLi41MzU4NGY3ZGM2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9h Y2Nlc3MvdHJhbnNhbS94YWN0LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v eGFjdC5jCkBAIC01NTA3LDggKzU1MDcsMjIgQEAgU2hvd1RyYW5zYWN0aW9uU3RhdGVSZWMo Y29uc3QgY2hhciAqc3RyLCBUcmFuc2FjdGlvblN0YXRlIHMpCiB7CiAJU3RyaW5nSW5mb0Rh dGEgYnVmOwogCi0JaW5pdFN0cmluZ0luZm8oJmJ1Zik7CisJaWYgKHMtPnBhcmVudCkKKwl7 CisJCS8qCisJCSAqIFNpbmNlIHRoaXMgZnVuY3Rpb24gcmVjdXJzZXMsIGl0IGNvdWxkIGJl IGRyaXZlbiB0byBzdGFjayBvdmVyZmxvdy4KKwkJICogVGhpcyBpcyBqdXN0IGEgZGVidWdn aW5nIGFpZCwgc28gd2UgY2FuIGxlYXZlIG91dCBzb21lIGRldGFpbHMKKwkJICogaW5zdGVh ZCBvZiBlcnJvcmluZyBvdXQgd2l0aCBjaGVja19zdGFja19kZXB0aCgpLgorCQkgKi8KKwkJ aWYgKHN0YWNrX2lzX3Rvb19kZWVwKCkpCisJCQllcmVwb3J0KERFQlVHNSwKKwkJCQkJKGVy cm1zZ19pbnRlcm5hbCgiJXMoJWQpOiBwYXJlbnQgb21pdHRlZCB0byBhdm9pZCBzdGFjayBv dmVyZmxvdyIsCisJCQkJCQkJCQkgc3RyLCBzLT5uZXN0aW5nTGV2ZWwpKSk7CisJCWVsc2UK KwkJCVNob3dUcmFuc2FjdGlvblN0YXRlUmVjKHN0ciwgcy0+cGFyZW50KTsKKwl9CiAKKwlp bml0U3RyaW5nSW5mbygmYnVmKTsKIAlpZiAocy0+bkNoaWxkWGlkcyA+IDApCiAJewogCQlp bnQJCQlpOwpAQCAtNTUxNywxMCArNTUzMSw2IEBAIFNob3dUcmFuc2FjdGlvblN0YXRlUmVj KGNvbnN0IGNoYXIgKnN0ciwgVHJhbnNhY3Rpb25TdGF0ZSBzKQogCQlmb3IgKGkgPSAxOyBp IDwgcy0+bkNoaWxkWGlkczsgaSsrKQogCQkJYXBwZW5kU3RyaW5nSW5mbygmYnVmLCAiICV1 Iiwgcy0+Y2hpbGRYaWRzW2ldKTsKIAl9Ci0KLQlpZiAocy0+cGFyZW50KQotCQlTaG93VHJh bnNhY3Rpb25TdGF0ZVJlYyhzdHIsIHMtPnBhcmVudCk7Ci0KIAllcmVwb3J0KERFQlVHNSwK IAkJCShlcnJtc2dfaW50ZXJuYWwoIiVzKCVkKSBuYW1lOiAlczsgYmxvY2tTdGF0ZTogJXM7 IHN0YXRlOiAlcywgeGlkL3N1YmlkL2NpZDogJXUvJXUvJXUlcyVzIiwKIAkJCQkJCQkgc3Ry LCBzLT5uZXN0aW5nTGV2ZWwsCkBAIC01NTMyLDcgKzU1NDIsNiBAQCBTaG93VHJhbnNhY3Rp b25TdGF0ZVJlYyhjb25zdCBjaGFyICpzdHIsIFRyYW5zYWN0aW9uU3RhdGUgcykKIAkJCQkJ CQkgKHVuc2lnbmVkIGludCkgY3VycmVudENvbW1hbmRJZCwKIAkJCQkJCQkgY3VycmVudENv bW1hbmRJZFVzZWQgPyAiICh1c2VkKSIgOiAiIiwKIAkJCQkJCQkgYnVmLmRhdGEpKSk7Ci0K IAlwZnJlZShidWYuZGF0YSk7CiB9CiAKLS0gCjIuMzkuMgoK --------------TtXrZbwzTLPzJLdzsubweEjm Content-Type: text/x-patch; charset=UTF-8; name="0003-Avoid-recursion-in-MemoryContext-functions.patch" Content-Disposition: attachment; filename="0003-Avoid-recursion-in-MemoryContext-functions.patch" Content-Transfer-Encoding: base64 RnJvbSBiZTdhMWJlNjU4NDc5ZGU3MmVlNjk0ZTQxYThjZTBmMDdiOGI0MGFkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IEZyaSwgMjQgTm92IDIwMjMgMTc6MDM6MjggKzAyMDAK U3ViamVjdDogW1BBVENIIDMvNF0gQXZvaWQgcmVjdXJzaW9uIGluIE1lbW9yeUNvbnRleHQg ZnVuY3Rpb25zLgoKWW91IG1pZ2h0IHJ1biBvdXQgb2Ygc3RhY2sgc3BhY2Ugd2l0aCByZWN1 cnNpb24sIHdoaWNoIGlzIG5vdCBuaWNlIGluCmZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGJlIHVz ZWQgZS5nLiBhdCBjbGVhbnVwIGFmdGVyIHRyYW5zYWN0aW9uCmFib3J0LiBNZW1vcnlDb250 ZXh0IGNvbnRhaW5zIHBvaW50ZXIgdG8gcGFyZW50IGFuZCBzaWJsaW5ncywgc28gd2UKY2Fu IHRyYXZlcnNlIGEgdHJlZSBvZiBjb250ZXh0cyBpdGVyYXRpdmVseSwgd2l0aG91dCB1c2lu ZwpzdGFjay4gUmVmYWN0b3IgdGhlIGZ1bmN0aW9ucyB0byBkbyB0aGF0LgoKTWVtb3J5Q29u dGV4dFN0YXRzKCkgc3RpbGwgcmVjdXJzZXMsIGJ1dCBpdCBub3cgaGFzIGEgbGltaXQgdG8g aG93CmRlZXAgaXQgcmVjdXJzZXMuIE9uY2UgdGhlIGxpbWl0IGlzIHJlYWNoZWQsIGl0IHBy aW50cyBqdXN0IGEgc3VtbWFyeQpvZiB0aGUgcmVzdCBvZiB0aGUgaGllcmFyY2h5LCBzaW1p bGFyIHRvIGhvdyBpdCBzdW1tYXJpemVzIGNvbnRleHRzCndpdGggbG90cyBvZiBjaGlsZHJl bi4gVGhhdCBzZWVtcyBnb29kIGFueXdheSwgYmVjYXVzZSBhIGNvbnRleHQgZHVtcAp3aXRo IGh1bmRyZWRzIG9mIG5lc3RlZCBjb250ZXh0cyBpc24ndCB2ZXJ5IHJlYWRhYmxlLgoKUmVw b3J0IGJ5IEVnb3IgQ2hpbmR5YXNraW4gYW5kIEFsZXhhbmRlciBMYWtoaW4uCgpEaXNjdXNz aW9uOiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkLzE2NzI3NjA0NTcu OTQwNDYyMDc5JTQwZjMwNi5pLm1haWwucnUKLS0tCiBzcmMvYmFja2VuZC91dGlscy9tbWdy L21jeHQuYyB8IDI0NCArKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tCiBzcmMv aW5jbHVkZS91dGlscy9tZW11dGlscy5oICB8ICAgMyArLQogMiBmaWxlcyBjaGFuZ2VkLCAx NjcgaW5zZXJ0aW9ucygrKSwgODAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvdXRpbHMvbW1nci9tY3h0LmMgYi9zcmMvYmFja2VuZC91dGlscy9tbWdyL21jeHQu YwppbmRleCA5ZmM4M2YxMWY2Li4yZTk1NjNkOGMxIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC91dGlscy9tbWdyL21jeHQuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9tbWdyL21jeHQu YwpAQCAtMTQ5LDkgKzE0OSwxMCBAQCBNZW1vcnlDb250ZXh0IEN1clRyYW5zYWN0aW9uQ29u dGV4dCA9IE5VTEw7CiAvKiBUaGlzIGlzIGEgdHJhbnNpZW50IGxpbmsgdG8gdGhlIGFjdGl2 ZSBwb3J0YWwncyBtZW1vcnkgY29udGV4dDogKi8KIE1lbW9yeUNvbnRleHQgUG9ydGFsQ29u dGV4dCA9IE5VTEw7CiAKK3N0YXRpYyB2b2lkIE1lbW9yeUNvbnRleHREZWxldGVPbmx5KE1l bW9yeUNvbnRleHQgY29udGV4dCk7CiBzdGF0aWMgdm9pZCBNZW1vcnlDb250ZXh0Q2FsbFJl c2V0Q2FsbGJhY2tzKE1lbW9yeUNvbnRleHQgY29udGV4dCk7CiBzdGF0aWMgdm9pZCBNZW1v cnlDb250ZXh0U3RhdHNJbnRlcm5hbChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGludCBsZXZl bCwKLQkJCQkJCQkJCSAgIGJvb2wgcHJpbnQsIGludCBtYXhfY2hpbGRyZW4sCisJCQkJCQkJ CQkgICBpbnQgbWF4X2xldmVsLCBpbnQgbWF4X2NoaWxkcmVuLAogCQkJCQkJCQkJICAgTWVt b3J5Q29udGV4dENvdW50ZXJzICp0b3RhbHMsCiAJCQkJCQkJCQkgICBib29sIHByaW50X3Rv X3N0ZGVycik7CiBzdGF0aWMgdm9pZCBNZW1vcnlDb250ZXh0U3RhdHNQcmludChNZW1vcnlD b250ZXh0IGNvbnRleHQsIHZvaWQgKnBhc3N0aHJ1LApAQCAtMjYwLDYgKzI2MSw0MSBAQCBC b2d1c0dldENodW5rU3BhY2Uodm9pZCAqcG9pbnRlcikKIAlyZXR1cm4gMDsJCQkJCS8qIGtl ZXAgY29tcGlsZXIgcXVpZXQgKi8KIH0KIAorLyoKKyAqIE1lbW9yeUNvbnRleHRUcmF2ZXJz ZQorICoJCUhlbHBlciBmdW5jdGlvbiB0byB0cmF2ZXJzZSBhbGwgZGVzY2VuZGFudHMgb2Yg YSBtZW1vcnkgY29udGV4dAorICoJCXdpdGhvdXQgcmVjdXJzaW9uLgorICoKKyAqIFJlY3Vy c2lvbiBjb3VsZCBsZWFkIHRvIG91dC1vZi1zdGFjayBlcnJvcnMgd2l0aCBkZWVwIGNvbnRl eHQgaGllcmFyY2hpZXMsCisgKiB3aGljaCB3b3VsZCBiZSB1bnBsZWFzYW50IGluIGVycm9y IGNsZWFudXAgY29kZSBwYXRocy4KKyAqCisgKiBUbyBwcm9jZXNzICdjb250ZXh0JyBhbmQg YWxsIGl0cyBkZXNjZW5kYW50cywgdXNlIGEgbG9vcCBsaWtlIHRoaXM6CisgKgorICogICAg IDxwcm9jZXNzICdjb250ZXh0Jz4KKyAqICAgICBmb3IgKE1lbW9yeUNvbnRleHQgY3VyciA9 IGNvbnRleHQtPmZpcnN0Y2hpbGQ7CisgKiAgICAgICAgICBjdXJyICE9IE5VTEw7CisgKiAg ICAgICAgICBjdXJyID0gTWVtb3J5Q29udGV4dFRyYXZlcnNlKGN1cnIsIGNvbnRleHQpKQor ICogICAgIHsKKyAqICAgICAgICAgPHByb2Nlc3MgJ2N1cnInPgorICogICAgIH0KKyAqCisg KiBUaGlzIHZpc2l0cyBhbGwgdGhlIGNvbnRleHRzIGluIHByZW9yZGVyLgorICovCitzdGF0 aWMgTWVtb3J5Q29udGV4dAorTWVtb3J5Q29udGV4dFRyYXZlcnNlKE1lbW9yeUNvbnRleHQg Y3VyciwgTWVtb3J5Q29udGV4dCB0b3ApCit7CisJaWYgKGN1cnItPmZpcnN0Y2hpbGQgIT0g TlVMTCkKKwkJcmV0dXJuIGN1cnItPmZpcnN0Y2hpbGQ7CisKKwl3aGlsZSAoY3Vyci0+bmV4 dGNoaWxkID09IE5VTEwpCisJeworCQljdXJyID0gY3Vyci0+cGFyZW50OworCQlpZiAoY3Vy ciA9PSB0b3ApCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGN1cnItPm5leHRjaGls ZDsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgRVhQT1JURUQgUk9V VElORVMJCQkJCQkJCQkJCQkJCSAqCkBAIC0zNzksMTQgKzQxNSwxMyBAQCBNZW1vcnlDb250 ZXh0UmVzZXRPbmx5KE1lbW9yeUNvbnRleHQgY29udGV4dCkKIHZvaWQKIE1lbW9yeUNvbnRl eHRSZXNldENoaWxkcmVuKE1lbW9yeUNvbnRleHQgY29udGV4dCkKIHsKLQlNZW1vcnlDb250 ZXh0IGNoaWxkOwotCiAJQXNzZXJ0KE1lbW9yeUNvbnRleHRJc1ZhbGlkKGNvbnRleHQpKTsK IAotCWZvciAoY2hpbGQgPSBjb250ZXh0LT5maXJzdGNoaWxkOyBjaGlsZCAhPSBOVUxMOyBj aGlsZCA9IGNoaWxkLT5uZXh0Y2hpbGQpCisJZm9yIChNZW1vcnlDb250ZXh0IGN1cnIgPSBj b250ZXh0LT5maXJzdGNoaWxkOworCQkgY3VyciAhPSBOVUxMOworCQkgY3VyciA9IE1lbW9y eUNvbnRleHRUcmF2ZXJzZShjdXJyLCBjb250ZXh0KSkKIAl7Ci0JCU1lbW9yeUNvbnRleHRS ZXNldENoaWxkcmVuKGNoaWxkKTsKLQkJTWVtb3J5Q29udGV4dFJlc2V0T25seShjaGlsZCk7 CisJCU1lbW9yeUNvbnRleHRSZXNldE9ubHkoY3Vycik7CiAJfQogfQogCkBAIC00MDEsMTYg KzQzNiw1MyBAQCBNZW1vcnlDb250ZXh0UmVzZXRDaGlsZHJlbihNZW1vcnlDb250ZXh0IGNv bnRleHQpCiAgKi8KIHZvaWQKIE1lbW9yeUNvbnRleHREZWxldGUoTWVtb3J5Q29udGV4dCBj b250ZXh0KQoreworCU1lbW9yeUNvbnRleHQgY3VycjsKKworCS8qCisJICogRGVsZXRlIHN1 YmNvbnRleHRzIGZyb20gdGhlIGJvdHRvbSB1cC4KKwkgKgorCSAqIE5vdGU6IERvIG5vdCB1 c2UgcmVjdXJzaW9uIGhlcmUuICBBICJzdGFjayBkZXB0aCBsaW1pdCBleGNlZWRlZCIgZXJy b3IKKwkgKiB3b3VsZCBiZSB1bnBsZWFzYW50IGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIHBy b2Nlc3Mgb2YgY2xlYW5pbmcgdXAgZnJvbQorCSAqIHRyYW5zYWN0aW9uIGFib3J0LiAgV2Ug YWxzbyBjYW5ub3QgdXNlIE1lbW9yeUNvbnRleHRUcmF2ZXJzZSgpIGhlcmUKKwkgKiBiZWNh dXNlIHdlIG1vZGlmeSB0aGUgdHJlZSBhcyB3ZSBnby4KKwkgKi8KKwljdXJyID0gY29udGV4 dDsKKwlmb3IgKDs7KQorCXsKKwkJTWVtb3J5Q29udGV4dCBwYXJlbnQ7CisKKwkJLyogRGVz Y2VuZCBkb3duIHVudGlsIHdlIGZpbmQgYSBsZWFmIGNvbnRleHQgd2l0aCBubyBjaGlsZHJl biAqLworCQl3aGlsZSAoY3Vyci0+Zmlyc3RjaGlsZCAhPSBOVUxMKQorCQkJY3VyciA9IGN1 cnItPmZpcnN0Y2hpbGQ7CisKKwkJLyoKKwkJICogV2UncmUgbm93IGF0IGEgbGVhZiB3aXRo IG5vIGNoaWxkcmVuLiBGcmVlIGl0IGFuZCBjb250aW51ZSBmcm9tIHRoZQorCQkgKiBwYXJl bnQuICBPciBpZiB0aGlzIHdhcyB0aGUgb3JpZ2luYWwgbm9kZSwgd2UncmUgYWxsIGRvbmUu CisJCSAqLworCQlwYXJlbnQgPSBjdXJyLT5wYXJlbnQ7CisJCU1lbW9yeUNvbnRleHREZWxl dGVPbmx5KGN1cnIpOworCisJCWlmIChjdXJyID09IGNvbnRleHQpCisJCQlicmVhazsKKwkJ Y3VyciA9IHBhcmVudDsKKwl9Cit9CisKKy8qCisgKiBTdWJyb3V0aW5lIG9mIE1lbW9yeUNv bnRleHREZWxldGUsIHRvIGRlbGV0ZSBhIGNvbnRleHQgdGhhdCBoYXMgbm8KKyAqIGNoaWxk cmVuLgorICovCitzdGF0aWMgdm9pZAorTWVtb3J5Q29udGV4dERlbGV0ZU9ubHkoTWVtb3J5 Q29udGV4dCBjb250ZXh0KQogewogCUFzc2VydChNZW1vcnlDb250ZXh0SXNWYWxpZChjb250 ZXh0KSk7CiAJLyogV2UgaGFkIGJldHRlciBub3QgYmUgZGVsZXRpbmcgVG9wTWVtb3J5Q29u dGV4dCAuLi4gKi8KIAlBc3NlcnQoY29udGV4dCAhPSBUb3BNZW1vcnlDb250ZXh0KTsKIAkv KiBBbmQgbm90IEN1cnJlbnRNZW1vcnlDb250ZXh0LCBlaXRoZXIgKi8KIAlBc3NlcnQoY29u dGV4dCAhPSBDdXJyZW50TWVtb3J5Q29udGV4dCk7Ci0KLQkvKiBzYXZlIGEgZnVuY3Rpb24g Y2FsbCBpbiBjb21tb24gY2FzZSB3aGVyZSB0aGVyZSBhcmUgbm8gY2hpbGRyZW4gKi8KLQlp ZiAoY29udGV4dC0+Zmlyc3RjaGlsZCAhPSBOVUxMKQotCQlNZW1vcnlDb250ZXh0RGVsZXRl Q2hpbGRyZW4oY29udGV4dCk7CisJLyogQWxsIHRoZSBjaGlsZHJlbiBzaG91bGQndmUgYmVl biBkZWxldGVkIGFscmVhZHkgKi8KKwlBc3NlcnQoY29udGV4dC0+Zmlyc3RjaGlsZCA9PSBO VUxMKTsKIAogCS8qCiAJICogSXQncyBub3QgZW50aXJlbHkgY2xlYXIgd2hldGhlciAndGlz IGJldHRlciB0byBkbyB0aGlzIGJlZm9yZSBvciBhZnRlcgpAQCAtNjc2LDEyICs3NDgsMTIg QEAgTWVtb3J5Q29udGV4dE1lbUFsbG9jYXRlZChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGJv b2wgcmVjdXJzZSkKIAogCWlmIChyZWN1cnNlKQogCXsKLQkJTWVtb3J5Q29udGV4dCBjaGls ZDsKLQotCQlmb3IgKGNoaWxkID0gY29udGV4dC0+Zmlyc3RjaGlsZDsKLQkJCSBjaGlsZCAh PSBOVUxMOwotCQkJIGNoaWxkID0gY2hpbGQtPm5leHRjaGlsZCkKLQkJCXRvdGFsICs9IE1l bW9yeUNvbnRleHRNZW1BbGxvY2F0ZWQoY2hpbGQsIHRydWUpOworCQlmb3IgKE1lbW9yeUNv bnRleHQgY3VyciA9IGNvbnRleHQtPmZpcnN0Y2hpbGQ7CisJCQkgY3VyciAhPSBOVUxMOwor CQkJIGN1cnIgPSBNZW1vcnlDb250ZXh0VHJhdmVyc2UoY3VyciwgY29udGV4dCkpCisJCXsK KwkJCXRvdGFsICs9IGN1cnItPm1lbV9hbGxvY2F0ZWQ7CisJCX0KIAl9CiAKIAlyZXR1cm4g dG90YWw7CkBAIC02OTgsOCArNzcwLDggQEAgTWVtb3J5Q29udGV4dE1lbUFsbG9jYXRlZChN ZW1vcnlDb250ZXh0IGNvbnRleHQsIGJvb2wgcmVjdXJzZSkKIHZvaWQKIE1lbW9yeUNvbnRl eHRTdGF0cyhNZW1vcnlDb250ZXh0IGNvbnRleHQpCiB7Ci0JLyogQSBoYXJkLXdpcmVkIGxp bWl0IG9uIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaXMgdXN1YWxseSBnb29kIGVub3VnaCAq LwotCU1lbW9yeUNvbnRleHRTdGF0c0RldGFpbChjb250ZXh0LCAxMDAsIHRydWUpOworCS8q IEhhcmQtd2lyZWQgbGltaXRzIGFyZSB1c3VhbGx5IGdvb2QgZW5vdWdoICovCisJTWVtb3J5 Q29udGV4dFN0YXRzRGV0YWlsKGNvbnRleHQsIDEwMCwgMTAwLCB0cnVlKTsKIH0KIAogLyoK QEAgLTcxMSwxNCArNzgzLDE1IEBAIE1lbW9yeUNvbnRleHRTdGF0cyhNZW1vcnlDb250ZXh0 IGNvbnRleHQpCiAgKiB3aXRoIGZwcmludGYoc3RkZXJyKSwgb3RoZXJ3aXNlIHVzZSBlcmVw b3J0KCkuCiAgKi8KIHZvaWQKLU1lbW9yeUNvbnRleHRTdGF0c0RldGFpbChNZW1vcnlDb250 ZXh0IGNvbnRleHQsIGludCBtYXhfY2hpbGRyZW4sCitNZW1vcnlDb250ZXh0U3RhdHNEZXRh aWwoTWVtb3J5Q29udGV4dCBjb250ZXh0LAorCQkJCQkJIGludCBtYXhfbGV2ZWwsIGludCBt YXhfY2hpbGRyZW4sCiAJCQkJCQkgYm9vbCBwcmludF90b19zdGRlcnIpCiB7CiAJTWVtb3J5 Q29udGV4dENvdW50ZXJzIGdyYW5kX3RvdGFsczsKIAogCW1lbXNldCgmZ3JhbmRfdG90YWxz LCAwLCBzaXplb2YoZ3JhbmRfdG90YWxzKSk7CiAKLQlNZW1vcnlDb250ZXh0U3RhdHNJbnRl cm5hbChjb250ZXh0LCAwLCB0cnVlLCBtYXhfY2hpbGRyZW4sICZncmFuZF90b3RhbHMsIHBy aW50X3RvX3N0ZGVycik7CisJTWVtb3J5Q29udGV4dFN0YXRzSW50ZXJuYWwoY29udGV4dCwg MCwgbWF4X2xldmVsLCBtYXhfY2hpbGRyZW4sICZncmFuZF90b3RhbHMsIHByaW50X3RvX3N0 ZGVycik7CiAKIAlpZiAocHJpbnRfdG9fc3RkZXJyKQogCQlmcHJpbnRmKHN0ZGVyciwKQEAg LTc1Niw3OCArODI5LDg5IEBAIE1lbW9yeUNvbnRleHRTdGF0c0RldGFpbChNZW1vcnlDb250 ZXh0IGNvbnRleHQsIGludCBtYXhfY2hpbGRyZW4sCiAgKi8KIHN0YXRpYyB2b2lkCiBNZW1v cnlDb250ZXh0U3RhdHNJbnRlcm5hbChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGludCBsZXZl bCwKLQkJCQkJCSAgIGJvb2wgcHJpbnQsIGludCBtYXhfY2hpbGRyZW4sCisJCQkJCQkgICBp bnQgbWF4X2xldmVsLCBpbnQgbWF4X2NoaWxkcmVuLAogCQkJCQkJICAgTWVtb3J5Q29udGV4 dENvdW50ZXJzICp0b3RhbHMsCiAJCQkJCQkgICBib29sIHByaW50X3RvX3N0ZGVycikKIHsK LQlNZW1vcnlDb250ZXh0Q291bnRlcnMgbG9jYWxfdG90YWxzOwogCU1lbW9yeUNvbnRleHQg Y2hpbGQ7CiAJaW50CQkJaWNoaWxkOwogCiAJQXNzZXJ0KE1lbW9yeUNvbnRleHRJc1ZhbGlk KGNvbnRleHQpKTsKIAogCS8qIEV4YW1pbmUgdGhlIGNvbnRleHQgaXRzZWxmICovCi0JY29u dGV4dC0+bWV0aG9kcy0+c3RhdHMoY29udGV4dCwKLQkJCQkJCQlwcmludCA/IE1lbW9yeUNv bnRleHRTdGF0c1ByaW50IDogTlVMTCwKLQkJCQkJCQkodm9pZCAqKSAmbGV2ZWwsCi0JCQkJ CQkJdG90YWxzLCBwcmludF90b19zdGRlcnIpOworCXsKKwkJY29udGV4dC0+bWV0aG9kcy0+ c3RhdHMoY29udGV4dCwKKwkJCQkJCQkJTWVtb3J5Q29udGV4dFN0YXRzUHJpbnQsCisJCQkJ CQkJCSh2b2lkICopICZsZXZlbCwKKwkJCQkJCQkJdG90YWxzLAorCQkJCQkJCQlwcmludF90 b19zdGRlcnIpOworCX0KIAogCS8qCi0JICogRXhhbWluZSBjaGlsZHJlbi4gIElmIHRoZXJl IGFyZSBtb3JlIHRoYW4gbWF4X2NoaWxkcmVuIG9mIHRoZW0sIHdlIGRvCi0JICogbm90IHBy aW50IHRoZSByZXN0IGV4cGxpY2l0bHksIGJ1dCBqdXN0IHN1bW1hcml6ZSB0aGVtLgorCSAq IEV4YW1pbmUgY2hpbGRyZW4uCisJICoKKwkgKiBJZiB3ZSBhcmUgcGFzdCB0aGUgcmVjdXJz aW9uIGRlcHRoIGxpbWl0IG9yIGFscmVhZHkgcnVubmluZyBsb3cgb24KKwkgKiBzdGFjaywg ZG8gbm90IHByaW50IHRoZW0gZXhwbGljaXRseSBidXQganVzdCBzdW1tYXJpemUgdGhlbS4g U2ltaWxhcmx5LAorCSAqIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gbWF4X2NoaWxkcmVuIG9m IHRoZW0sIHdlIGRvIG5vdCBwcmludCB0aGUgcmVzdAorCSAqIGV4cGxpY2l0bHksIGJ1dCBq dXN0IHN1bW1hcml6ZSB0aGVtLgogCSAqLwotCW1lbXNldCgmbG9jYWxfdG90YWxzLCAwLCBz aXplb2YobG9jYWxfdG90YWxzKSk7Ci0KLQlmb3IgKGNoaWxkID0gY29udGV4dC0+Zmlyc3Rj aGlsZCwgaWNoaWxkID0gMDsKLQkJIGNoaWxkICE9IE5VTEw7Ci0JCSBjaGlsZCA9IGNoaWxk LT5uZXh0Y2hpbGQsIGljaGlsZCsrKQorCWljaGlsZCA9IDA7CisJY2hpbGQgPSBjb250ZXh0 LT5maXJzdGNoaWxkOworCWlmIChsZXZlbCA8IG1heF9sZXZlbCAmJiAhc3RhY2tfaXNfdG9v X2RlZXAoKSkKIAl7Ci0JCWlmIChpY2hpbGQgPCBtYXhfY2hpbGRyZW4pCisJCWZvciAoOyBj aGlsZCAhPSBOVUxMICYmIGljaGlsZCA8IG1heF9jaGlsZHJlbjsKKwkJCSBjaGlsZCA9IGNo aWxkLT5uZXh0Y2hpbGQpCisJCXsKIAkJCU1lbW9yeUNvbnRleHRTdGF0c0ludGVybmFsKGNo aWxkLCBsZXZlbCArIDEsCi0JCQkJCQkJCQkgICBwcmludCwgbWF4X2NoaWxkcmVuLAorCQkJ CQkJCQkJICAgbWF4X2xldmVsLCBtYXhfY2hpbGRyZW4sCiAJCQkJCQkJCQkgICB0b3RhbHMs CiAJCQkJCQkJCQkgICBwcmludF90b19zdGRlcnIpOwotCQllbHNlCi0JCQlNZW1vcnlDb250 ZXh0U3RhdHNJbnRlcm5hbChjaGlsZCwgbGV2ZWwgKyAxLAotCQkJCQkJCQkJICAgZmFsc2Us IG1heF9jaGlsZHJlbiwKLQkJCQkJCQkJCSAgICZsb2NhbF90b3RhbHMsCi0JCQkJCQkJCQkg ICBwcmludF90b19zdGRlcnIpOworCQkJaWNoaWxkKys7CisJCX0KIAl9CiAKLQkvKiBEZWFs IHdpdGggZXhjZXNzIGNoaWxkcmVuICovCi0JaWYgKGljaGlsZCA+IG1heF9jaGlsZHJlbikK KwlpZiAoY2hpbGQgIT0gTlVMTCkKIAl7Ci0JCWlmIChwcmludCkKKwkJLyogU3VtbWFyaXpl IHRoZSByZXN0IG9mIHRoZSBjaGlsZHJlbiwgYXZvaWRpbmcgcmVjdXJzaW9uLiAqLworCQlN ZW1vcnlDb250ZXh0Q291bnRlcnMgbG9jYWxfdG90YWxzOworCisJCW1lbXNldCgmbG9jYWxf dG90YWxzLCAwLCBzaXplb2YobG9jYWxfdG90YWxzKSk7CisKKwkJd2hpbGUgKGNoaWxkICE9 IE5VTEwpCiAJCXsKLQkJCWlmIChwcmludF90b19zdGRlcnIpCi0JCQl7Ci0JCQkJaW50CQkJ aTsKLQotCQkJCWZvciAoaSA9IDA7IGkgPD0gbGV2ZWw7IGkrKykKLQkJCQkJZnByaW50Zihz dGRlcnIsICIgICIpOwotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCQkJIiVkIG1vcmUgY2hp bGQgY29udGV4dHMgY29udGFpbmluZyAlenUgdG90YWwgaW4gJXp1IGJsb2NrczsgJXp1IGZy ZWUgKCV6dSBjaHVua3MpOyAlenUgdXNlZFxuIiwKLQkJCQkJCWljaGlsZCAtIG1heF9jaGls ZHJlbiwKLQkJCQkJCWxvY2FsX3RvdGFscy50b3RhbHNwYWNlLAotCQkJCQkJbG9jYWxfdG90 YWxzLm5ibG9ja3MsCi0JCQkJCQlsb2NhbF90b3RhbHMuZnJlZXNwYWNlLAotCQkJCQkJbG9j YWxfdG90YWxzLmZyZWVjaHVua3MsCi0JCQkJCQlsb2NhbF90b3RhbHMudG90YWxzcGFjZSAt IGxvY2FsX3RvdGFscy5mcmVlc3BhY2UpOwotCQkJfQotCQkJZWxzZQotCQkJCWVyZXBvcnQo TE9HX1NFUlZFUl9PTkxZLAotCQkJCQkJKGVycmhpZGVzdG10KHRydWUpLAotCQkJCQkJIGVy cmhpZGVjb250ZXh0KHRydWUpLAotCQkJCQkJIGVycm1zZ19pbnRlcm5hbCgibGV2ZWw6ICVk OyAlZCBtb3JlIGNoaWxkIGNvbnRleHRzIGNvbnRhaW5pbmcgJXp1IHRvdGFsIGluICV6dSBi bG9ja3M7ICV6dSBmcmVlICglenUgY2h1bmtzKTsgJXp1IHVzZWQiLAotCQkJCQkJCQkJCSBs ZXZlbCwKLQkJCQkJCQkJCQkgaWNoaWxkIC0gbWF4X2NoaWxkcmVuLAotCQkJCQkJCQkJCSBs b2NhbF90b3RhbHMudG90YWxzcGFjZSwKLQkJCQkJCQkJCQkgbG9jYWxfdG90YWxzLm5ibG9j a3MsCi0JCQkJCQkJCQkJIGxvY2FsX3RvdGFscy5mcmVlc3BhY2UsCi0JCQkJCQkJCQkJIGxv Y2FsX3RvdGFscy5mcmVlY2h1bmtzLAotCQkJCQkJCQkJCSBsb2NhbF90b3RhbHMudG90YWxz cGFjZSAtIGxvY2FsX3RvdGFscy5mcmVlc3BhY2UpKSk7CisJCQljaGlsZC0+bWV0aG9kcy0+ c3RhdHMoY2hpbGQsIE5VTEwsIE5VTEwsICZsb2NhbF90b3RhbHMsIHByaW50X3RvX3N0ZGVy cik7CisJCQljaGlsZCA9IE1lbW9yeUNvbnRleHRUcmF2ZXJzZShjaGlsZCwgY29udGV4dCk7 CisJCQlpY2hpbGQrKzsKIAkJfQogCisJCWlmIChwcmludF90b19zdGRlcnIpCisJCXsKKwkJ CWludAkJCWk7CisKKwkJCWZvciAoaSA9IDA7IGkgPD0gbGV2ZWw7IGkrKykKKwkJCQlmcHJp bnRmKHN0ZGVyciwgIiAgIik7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVkIG1vcmUg Y2hpbGQgY29udGV4dHMgY29udGFpbmluZyAlenUgdG90YWwgaW4gJXp1IGJsb2NrczsgJXp1 IGZyZWUgKCV6dSBjaHVua3MpOyAlenUgdXNlZFxuIiwKKwkJCQkJaWNoaWxkIC0gbWF4X2No aWxkcmVuLAorCQkJCQlsb2NhbF90b3RhbHMudG90YWxzcGFjZSwKKwkJCQkJbG9jYWxfdG90 YWxzLm5ibG9ja3MsCisJCQkJCWxvY2FsX3RvdGFscy5mcmVlc3BhY2UsCisJCQkJCWxvY2Fs X3RvdGFscy5mcmVlY2h1bmtzLAorCQkJCQlsb2NhbF90b3RhbHMudG90YWxzcGFjZSAtIGxv Y2FsX3RvdGFscy5mcmVlc3BhY2UpOworCQl9CisJCWVsc2UKKwkJCWVyZXBvcnQoTE9HX1NF UlZFUl9PTkxZLAorCQkJCQkoZXJyaGlkZXN0bXQodHJ1ZSksCisJCQkJCSBlcnJoaWRlY29u dGV4dCh0cnVlKSwKKwkJCQkJIGVycm1zZ19pbnRlcm5hbCgibGV2ZWw6ICVkOyAlZCBtb3Jl IGNoaWxkIGNvbnRleHRzIGNvbnRhaW5pbmcgJXp1IHRvdGFsIGluICV6dSBibG9ja3M7ICV6 dSBmcmVlICglenUgY2h1bmtzKTsgJXp1IHVzZWQiLAorCQkJCQkJCQkJIGxldmVsLAorCQkJ CQkJCQkJIGljaGlsZCAtIG1heF9jaGlsZHJlbiwKKwkJCQkJCQkJCSBsb2NhbF90b3RhbHMu dG90YWxzcGFjZSwKKwkJCQkJCQkJCSBsb2NhbF90b3RhbHMubmJsb2NrcywKKwkJCQkJCQkJ CSBsb2NhbF90b3RhbHMuZnJlZXNwYWNlLAorCQkJCQkJCQkJIGxvY2FsX3RvdGFscy5mcmVl Y2h1bmtzLAorCQkJCQkJCQkJIGxvY2FsX3RvdGFscy50b3RhbHNwYWNlIC0gbG9jYWxfdG90 YWxzLmZyZWVzcGFjZSkpKTsKKwogCQlpZiAodG90YWxzKQogCQl7CiAJCQl0b3RhbHMtPm5i bG9ja3MgKz0gbG9jYWxfdG90YWxzLm5ibG9ja3M7CkBAIC04NDcsOCArOTMxLDcgQEAgTWVt b3J5Q29udGV4dFN0YXRzSW50ZXJuYWwoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBpbnQgbGV2 ZWwsCiAgKi8KIHN0YXRpYyB2b2lkCiBNZW1vcnlDb250ZXh0U3RhdHNQcmludChNZW1vcnlD b250ZXh0IGNvbnRleHQsIHZvaWQgKnBhc3N0aHJ1LAotCQkJCQkJY29uc3QgY2hhciAqc3Rh dHNfc3RyaW5nLAotCQkJCQkJYm9vbCBwcmludF90b19zdGRlcnIpCisJCQkJCQljb25zdCBj aGFyICpzdGF0c19zdHJpbmcsIGJvb2wgcHJpbnRfdG9fc3RkZXJyKQogewogCWludAkJCWxl dmVsID0gKihpbnQgKikgcGFzc3RocnU7CiAJY29uc3QgY2hhciAqbmFtZSA9IGNvbnRleHQt Pm5hbWU7CkBAIC05MjcsMTMgKzEwMTAsMTUgQEAgTWVtb3J5Q29udGV4dFN0YXRzUHJpbnQo TWVtb3J5Q29udGV4dCBjb250ZXh0LCB2b2lkICpwYXNzdGhydSwKIHZvaWQKIE1lbW9yeUNv bnRleHRDaGVjayhNZW1vcnlDb250ZXh0IGNvbnRleHQpCiB7Ci0JTWVtb3J5Q29udGV4dCBj aGlsZDsKLQogCUFzc2VydChNZW1vcnlDb250ZXh0SXNWYWxpZChjb250ZXh0KSk7Ci0KIAlj b250ZXh0LT5tZXRob2RzLT5jaGVjayhjb250ZXh0KTsKLQlmb3IgKGNoaWxkID0gY29udGV4 dC0+Zmlyc3RjaGlsZDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dGNoaWxk KQotCQlNZW1vcnlDb250ZXh0Q2hlY2soY2hpbGQpOworCisJZm9yIChNZW1vcnlDb250ZXh0 IGN1cnIgPSBjb250ZXh0LT5maXJzdGNoaWxkOworCQkgY3VyciAhPSBOVUxMOworCQkgY3Vy ciA9IE1lbW9yeUNvbnRleHRUcmF2ZXJzZShjdXJyLCBjb250ZXh0KSkKKwl7CisJCWN1cnIt Pm1ldGhvZHMtPmNoZWNrKGN1cnIpOworCX0KIH0KICNlbmRpZgogCkBAIC0xMjEyLDE0ICsx Mjk3LDE1IEBAIFByb2Nlc3NMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0KHZvaWQpCiAJLyoK IAkgKiBXaGVuIGEgYmFja2VuZCBwcm9jZXNzIGlzIGNvbnN1bWluZyBodWdlIG1lbW9yeSwg bG9nZ2luZyBhbGwgaXRzIG1lbW9yeQogCSAqIGNvbnRleHRzIG1pZ2h0IG92ZXJydW4gYXZh aWxhYmxlIGRpc2sgc3BhY2UuIFRvIHByZXZlbnQgdGhpcywgd2UgbGltaXQKLQkgKiB0aGUg bnVtYmVyIG9mIGNoaWxkIGNvbnRleHRzIHRvIGxvZyBwZXIgcGFyZW50IHRvIDEwMC4KKwkg KiB0aGUgZGVwdGggb2YgdGhlIGhpZXJhcmNoeSwgYXMgd2VsbCBhcyB0aGUgbnVtYmVyIG9m IGNoaWxkIGNvbnRleHRzIHRvCisJICogbG9nIHBlciBwYXJlbnQgdG8gMTAwLgogCSAqCiAJ ICogQXMgd2l0aCBNZW1vcnlDb250ZXh0U3RhdHMoKSwgd2Ugc3VwcG9zZSB0aGF0IHByYWN0 aWNhbCBjYXNlcyB3aGVyZSB0aGUKIAkgKiBkdW1wIGdldHMgbG9uZyB3aWxsIHR5cGljYWxs eSBiZSBodWdlIG51bWJlcnMgb2Ygc2libGluZ3MgdW5kZXIgdGhlCiAJICogc2FtZSBwYXJl bnQgY29udGV4dDsgd2hpbGUgdGhlIGFkZGl0aW9uYWwgZGVidWdnaW5nIHZhbHVlIGZyb20g c2VlaW5nCiAJICogZGV0YWlscyBhYm91dCBpbmRpdmlkdWFsIHNpYmxpbmdzIGJleW9uZCAx MDAgd2lsbCBub3QgYmUgbGFyZ2UuCiAJICovCi0JTWVtb3J5Q29udGV4dFN0YXRzRGV0YWls KFRvcE1lbW9yeUNvbnRleHQsIDEwMCwgZmFsc2UpOworCU1lbW9yeUNvbnRleHRTdGF0c0Rl dGFpbChUb3BNZW1vcnlDb250ZXh0LCAxMDAsIDEwMCwgZmFsc2UpOwogfQogCiB2b2lkICoK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL21lbXV0aWxzLmggYi9zcmMvaW5jbHVk ZS91dGlscy9tZW11dGlscy5oCmluZGV4IGQxNGU4NTQ2YTYuLmMyNWY5ODJkYzYgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL21lbXV0aWxzLmgKKysrIGIvc3JjL2luY2x1ZGUv dXRpbHMvbWVtdXRpbHMuaApAQCAtODUsNyArODUsOCBAQCBleHRlcm4gTWVtb3J5Q29udGV4 dCBNZW1vcnlDb250ZXh0R2V0UGFyZW50KE1lbW9yeUNvbnRleHQgY29udGV4dCk7CiBleHRl cm4gYm9vbCBNZW1vcnlDb250ZXh0SXNFbXB0eShNZW1vcnlDb250ZXh0IGNvbnRleHQpOwog ZXh0ZXJuIFNpemUgTWVtb3J5Q29udGV4dE1lbUFsbG9jYXRlZChNZW1vcnlDb250ZXh0IGNv bnRleHQsIGJvb2wgcmVjdXJzZSk7CiBleHRlcm4gdm9pZCBNZW1vcnlDb250ZXh0U3RhdHMo TWVtb3J5Q29udGV4dCBjb250ZXh0KTsKLWV4dGVybiB2b2lkIE1lbW9yeUNvbnRleHRTdGF0 c0RldGFpbChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGludCBtYXhfY2hpbGRyZW4sCitleHRl cm4gdm9pZCBNZW1vcnlDb250ZXh0U3RhdHNEZXRhaWwoTWVtb3J5Q29udGV4dCBjb250ZXh0 LAorCQkJCQkJCQkJIGludCBtYXhfbGV2ZWwsIGludCBtYXhfY2hpbGRyZW4sCiAJCQkJCQkJ CQkgYm9vbCBwcmludF90b19zdGRlcnIpOwogZXh0ZXJuIHZvaWQgTWVtb3J5Q29udGV4dEFs bG93SW5Dcml0aWNhbFNlY3Rpb24oTWVtb3J5Q29udGV4dCBjb250ZXh0LAogCQkJCQkJCQkJ CQkJYm9vbCBhbGxvdyk7Ci0tIAoyLjM5LjIKCg== --------------TtXrZbwzTLPzJLdzsubweEjm--