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 1wZ8vG-000o4p-37 for pgsql-bugs@arkaria.postgresql.org; Mon, 15 Jun 2026 15:08:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wZ8vF-00CRZR-2d for pgsql-bugs@arkaria.postgresql.org; Mon, 15 Jun 2026 15:08:21 +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 1wZ8vF-00CRZ9-1L for pgsql-bugs@lists.postgresql.org; Mon, 15 Jun 2026 15:08:21 +0000 Received: from lahtoruutu.iki.fi ([185.185.170.37]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1wZ8vD-00000000Xjo-0KyA for pgsql-bugs@postgresql.org; Mon, 15 Jun 2026 15:08:21 +0000 Received: from [10.0.2.15] (unknown [130.41.208.2]) (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 lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4gfD5R2p8xz49PtJ; Mon, 15 Jun 2026 18:08:11 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1781536093; 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=9mv7VeWHnj6MHSnVOa8/dM3MHpAVWnd+AdHCcPt5A2Y=; b=v35HP7vrqqZHROR1fYsujw+UNF4w+4BmrUD9QidH9aRL3syjfH4M/hzLsGQnVsg5Nibl2o 37uVQjTaqu4/y5iscku51guLTxKgKYg9daJpUtQE/xPZLy2AN574+3h+KLfQdbxcrfU7cT sravjYyqWothrOxq9BIibkg41vjhZtuy1xz8lMzttsCKc8eDWIsxwdVb6a963Da/3PosTo 01m40pf6vn72TT7ARvtJW+HzD772iIQlG2WmfMqnhG/aLTYpsizEQCMLnwaynGId/6Zcwj HJtV7tARcArBMNk7/3ZNnGbk62nQbF4iFpBgHlQkD96DSdo8eshWrOOJo5Q/Qg== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1781536093; b=HPtojy3e0ByKQWW+Qw6W2p8NasLgoEuQPPDsWRXYk90p8zbfYfijBN7dUF4uw0Oj25tOhf 9uHt0y/VO7ONDWwt68hdY6eXA7aXofsG87qaSNXpe7i5RZpWJEl3S5jAQWZeGk+BsxH7Dw I7rhEKCrIS9AxRkRo+iilAz/6KX+HZGMUloHBMoRlfYviB2Cgq6pMgG8kD7ARdMKzE1+da 9aOljJ5fAf+517ClrZV/8jDnrdXgiBrOdCCgckuQKdRc09GgKiY5HGmuAmoMwZ3xjDHDGD TZDKTKHfaA0Oh3ybwyfS6qCW7MaYE1M5GCp2s1jI9xZsxWjOBAKWgWgZ7Yd/9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1781536093; 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=9mv7VeWHnj6MHSnVOa8/dM3MHpAVWnd+AdHCcPt5A2Y=; b=JOjwMHrN+h5qad+QIyNpKI5M8nlD4r6UXW2ApRQ4BIXDDGjS4g/VOe462+zCwk6R0ESq1s 5fBBdLSGOeGlyUiJ/sfkY1gFxINk9D0OXYCze+JuNhZFI2I9C3A9sbupKTAbfwoVUJ21PZ +fCLfjsVilXGxiIRhPhThzaCI7YxfxwYH5fVr1nvmcJkz27aEy7PJQ2ATNSvftRcrykJrL iVekHFJTvuVbJBE1PlTrMRysAyKIsbEZl4TQES7Y0s0BUqeArTVn0imVY3AhECps4A8fPR W0W7X6KHPqbHtLGd5h2ezGeO6V4UV0/iawvk60WAHwzZsAuYGcs4jrX90SQqsg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi Content-Type: multipart/mixed; boundary="------------Tc5AntmfUuntrq6kS4snOE6H" Message-ID: Date: Mon, 15 Jun 2026 18:08:05 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Fw:Re: Fw: ltree_compare in contrib/ltree/ltree_op.c overflows int32 on deep ltree comparisons, returning the wrong sign To: Ayush Tiwari , =?UTF-8?B?546L6LeD5p6X?= Cc: pgsql-bugs@postgresql.org References: Content-Language: en-US From: Heikki Linnakangas In-Reply-To: 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. --------------Tc5AntmfUuntrq6kS4snOE6H Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 13/06/2026 09:12, Ayush Tiwari wrote: > This looks like a classic case of integer overflow that's > happening in ltree_compare function in ltree_op.c. > > return (al->len - bl->len) * 10 * (an + 1); > return res * 10 * (an + 1); > return (a->numlevel - b->numlevel) * 10 * (an + 1); > > I think the calculation should be done as int64, something of this sort: > >     int64 v = (int64) (al->len - bl->len) * 10 * (an + 1); >     if (v > PG_INT32_MAX) return PG_INT32_MAX; >     if (v < PG_INT32_MIN) return PG_INT32_MIN; >     return (int) v; > > And needed to adjust the ltree_penalty function too. > > Attached is a draft patch for this, I guess we can add a helper > function too for the above conversion. Yeah, that works. However, I note that the multiplication is only really needed by the ltree_penalty() caller. All the other callers just check if the return value is less than, equal, or greater than zero. It feels a little silly to do all that work of multiplication and clamping for those callers. And for ltree_penalty(), the caller actually converts the return value to a float, so clamping it to int32 range feels a little silly for that too. So I propose the attached, which splits the ltree_compare() function into two variants: one for ltree_penalty() that returns a float, and one for others that don't care about the "magnitude". It duplicates a little code, but I think it's easier to reason about. What do you think? - Heikki --------------Tc5AntmfUuntrq6kS4snOE6H Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-Fix-int32-overflow-in-ltree_compare.patch" Content-Disposition: attachment; filename="v2-0001-Fix-int32-overflow-in-ltree_compare.patch" Content-Transfer-Encoding: base64 RnJvbSAxODA0ZjRmMmE0M2UwNjc0OGZmYWNjY2ExZjllMDI3ZDAzYjdlM2ZhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IE1vbiwgMTUgSnVuIDIwMjYgMTc6NTM6NTEgKzAzMDAK U3ViamVjdDogW1BBVENIIHYyIDEvMV0gRml4IGludDMyIG92ZXJmbG93IGluIGx0cmVlX2Nv bXBhcmUoKQpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNo YXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKVGhlIGV4cHJl c3Npb24gKGxlbl9kaWZmICogMTAgKiAoYW4gKyAxKSkgdXNlZCBhcyB0aGUgcmV0dXJuIHZh bHVlIG9mCmx0cmVlX2NvbXBhcmUoKSBpcyBjb21wdXRlZCBhdCBpbnQzMiB3aWR0aC4gIFdp dGggTFRSRUVfTUFYX0xFVkVMUyA9CjY1NTM1LCB0aGUgcHJvZHVjdCBjYW4gZXhjZWVkIElO VDMyX01BWCBvbmNlIGFuIGx0cmVlIGhhcyBtb3JlIHRoYW4KfjE0LDY1MyBsZXZlbHMsIHdo aWNoIGNhdXNlcyB0aGUgcmVzdWx0IHRvIHdyYXAgYW5kIGludmVydCBpdHMgc2lnbi4KVGhh dCBjb3JydXB0cyBidHJlZSBvcmRlcmluZyBhcyB3ZWxsIGFzIHRoZSBtYWduaXR1ZGUgY29u c3VtZWQgYnkKbHRyZWVfcGVuYWx0eSgpIGZvciBHaVNUIHBhZ2Ugc3BsaXRzLgoKV2lkZW4g dGhlIG11bHRpcGxpY2F0aW9uIHRvIGludDY0IGFuZCBzYXR1cmF0ZSB0aGUgcmVzdWx0IHRv ClBHX0lOVDMyX01JTiAvIFBHX0lOVDMyX01BWCBiZWZvcmUgcmV0dXJuaW5nLiAgU2F0dXJh dGlvbiBwcmVzZXJ2ZXMgYm90aAp0aGUgc2lnbiBuZWVkZWQgYnkgYnRyZWUgY29tcGFyYXRv cnMgYW5kIHRoZSAiZGVlcGVyIG1pc21hdGNoIHlpZWxkcwpsYXJnZXIgbWFnbml0dWRlIiBw cm9wZXJ0eSB1c2VkIGJ5IGx0cmVlX3BlbmFsdHkoKS4gIFJldHVybmluZyBJTlRfTUlOCmZy b20gYSBjb21wYXJhdG9yIGhhcyBiZWVuIGV4cGxpY2l0bHkgYWxsb3dlZCBzaW5jZSBjb21t aXQgNmU2M2UwNjk3NTEuCgpsdHJlZV9wZW5hbHR5KCkgc3VtcyB0aGUgdHdvIGNvbXBhcmF0 b3IgcmVzdWx0cywgc28gYSBwYWlyIG9mIHNhdHVyYXRlZApJTlQzMl9NQVggdmFsdWVzIHdv dWxkIHJlLW92ZXJmbG93IGludDMyIGFuZCB5aWVsZCBhIG5lZ2F0aXZlIHBlbmFsdHkKb25j ZSBhc3NpZ25lZCB0byBpdHMgZmxvYXQgb3V0cHV0LiAgV2lkZW4gdGhhdCBzdW0gdG8gaW50 NjQgYmVmb3JlCmNvbnZlcnRpbmcgdG8gZmxvYXQuCgpFeGlzdGluZyBidHJlZSBvciBHaVNU IGluZGV4ZXMgb24gbHRyZWUgY29sdW1ucyBjb250YWluaW5nIHZhbHVlcyB3aXRoCm1vcmUg dGhhbiB+MTQsNjUzIGxldmVscyBtYXkgYmUgY29ycnVwdCBhbmQgc2hvdWxkIGJlIFJFSU5E RVhlZC4KCkFkZCBhIHJlZ3Jlc3Npb24gdGVzdCBiYXNlZCBvbiB0aGUgcmVwb3J0ZXIncyBQ b0MuCgpBdXRob3I6IEF5dXNoIFRpd2FyaSA8YXl1c2h0aXdhcmkuc2xnMDFAZ21haWwuY29t PgpSZXBvcnRlZC1ieTog546L6LeD5p6XIDx2aW9saW4wNjEzQHRqdS5lZHUuY24+CkRpc2N1 c3Npb246IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQvQUk2QW5BQmdL VzkzUWJ4MWpWemk4NHI5LjguMTc4MTMyMjYyNTc1Ni5IbWFpbC4zMDIwMDAxMjUxJTQwdGp1 LmVkdS5jbgotLS0KIGNvbnRyaWIvbHRyZWUvZXhwZWN0ZWQvbHRyZWUub3V0IHwgMTAgKysr KysrKwogY29udHJpYi9sdHJlZS9sdHJlZS5oICAgICAgICAgICAgfCAgMSArCiBjb250cmli L2x0cmVlL2x0cmVlX2dpc3QuYyAgICAgICB8ICA2ICsrLS0KIGNvbnRyaWIvbHRyZWUvbHRy ZWVfb3AuYyAgICAgICAgIHwgNDkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0K IGNvbnRyaWIvbHRyZWUvc3FsL2x0cmVlLnNxbCAgICAgIHwgIDYgKysrKwogNSBmaWxlcyBj aGFuZ2VkLCA2MyBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L2NvbnRyaWIvbHRyZWUvZXhwZWN0ZWQvbHRyZWUub3V0IGIvY29udHJpYi9sdHJlZS9leHBl Y3RlZC9sdHJlZS5vdXQKaW5kZXggMTViOTEzMWE3NTAuLmYxZDBlYjM3YjgxIDEwMDY0NAot LS0gYS9jb250cmliL2x0cmVlL2V4cGVjdGVkL2x0cmVlLm91dAorKysgYi9jb250cmliL2x0 cmVlL2V4cGVjdGVkL2x0cmVlLm91dApAQCAtODIyNiwzICs4MjI2LDEzIEBAIERFVEFJTDog IFRvdGFsIHNpemUgb2YgbGV2ZWwgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkICg2NTUz NSBieXRlcykuCiBTRUxFQ1QgKHJlcGVhdCgnYXwnLCA2NTUzNSkgfHwgJ2EnKTo6bHF1ZXJ5 OwogRVJST1I6ICBscXVlcnkgbGV2ZWwgaGFzIHRvbyBtYW55IHZhcmlhbnRzCiBERVRBSUw6 ICBOdW1iZXIgb2YgdmFyaWFudHMgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkICg2NTUz NSkuCistLSBUZXN0IHRoYXQgbHRyZWVfY29tcGFyZSgpIGRvZXMgbm90IG92ZXJmbG93IHdp dGggdmVyeSBkZWVwIHBhdGhzLgorV0lUSCBzIEFTIChTRUxFQ1QgJ2EnOjpsdHJlZSBBUyB2 KSwKKyAgICAgbCBBUyAoU0VMRUNUIChyZXBlYXQoJ2EuJywgMTQ5OTkpIHx8ICdhJyk6Omx0 cmVlIEFTIHYpCitTRUxFQ1QgKGwudiA+IHMudikgQVMgZ3Rfb2ssIChsLnYgPCBzLnYpIEFT IGx0X29rLCAobC52ID0gcy52KSBBUyBlcV9vaworICBGUk9NIHMsIGw7CisgZ3Rfb2sgfCBs dF9vayB8IGVxX29rIAorLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KKyB0ICAgICB8IGYgICAg IHwgZgorKDEgcm93KQorCmRpZmYgLS1naXQgYS9jb250cmliL2x0cmVlL2x0cmVlLmggYi9j b250cmliL2x0cmVlL2x0cmVlLmgKaW5kZXggMjI2YzFjYjIxMTUuLjg5YzViOTMyMjkyIDEw MDY0NAotLS0gYS9jb250cmliL2x0cmVlL2x0cmVlLmgKKysrIGIvY29udHJpYi9sdHJlZS9s dHJlZS5oCkBAIC0yMDYsNiArMjA2LDcgQEAgYm9vbAkJbHRyZWVfZXhlY3V0ZShJVEVNICpj dXJpdGVtLCB2b2lkICpjaGVja3ZhbCwKIAkJCQkJCSAgYm9vbCBjYWxjbm90LCBib29sICgq Y2hrY29uZCkgKHZvaWQgKmNoZWNrdmFsLCBJVEVNICp2YWwpKTsKIAogaW50CQkJbHRyZWVf Y29tcGFyZShjb25zdCBsdHJlZSAqYSwgY29uc3QgbHRyZWUgKmIpOworZmxvYXQJCWx0cmVl X2NvbXBhcmVfZGlzdGFuY2UoY29uc3QgbHRyZWUgKmEsIGNvbnN0IGx0cmVlICpiKTsKIGJv b2wJCWlubmVyX2lzcGFyZW50KGNvbnN0IGx0cmVlICpjLCBjb25zdCBsdHJlZSAqcCk7CiBi b29sCQljb21wYXJlX3N1Ym5vZGUobHRyZWVfbGV2ZWwgKnQsIGNoYXIgKnFuLCBpbnQgbGVu LCBib29sIHByZWZpeCwgYm9vbCBjaSk7CiBsdHJlZQkgICAqbGNhX2lubmVyKGx0cmVlICoq YSwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9jb250cmliL2x0cmVlL2x0cmVlX2dpc3QuYyBi L2NvbnRyaWIvbHRyZWUvbHRyZWVfZ2lzdC5jCmluZGV4IDc4Yzk1MDUyOTkwLi5lODQ1MTE3 MWM3MiAxMDA2NDQKLS0tIGEvY29udHJpYi9sdHJlZS9sdHJlZV9naXN0LmMKKysrIGIvY29u dHJpYi9sdHJlZS9sdHJlZV9naXN0LmMKQEAgLTI2NCwxMSArMjY0LDExIEBAIGx0cmVlX3Bl bmFsdHkoUEdfRlVOQ1RJT05fQVJHUykKIAlsdHJlZV9naXN0ICpuZXd2YWwgPSAobHRyZWVf Z2lzdCAqKSBEYXR1bUdldFBvaW50ZXIoKChHSVNURU5UUlkgKikgUEdfR0VUQVJHX1BPSU5U RVIoMSkpLT5rZXkpOwogCWZsb2F0CSAgICpwZW5hbHR5ID0gKGZsb2F0ICopIFBHX0dFVEFS R19QT0lOVEVSKDIpOwogCWludAkJCXNpZ2xlbiA9IExUUkVFX0dFVF9TSUdMRU4oKTsKLQlp bnQzMgkJY21wciwKKwlmbG9hdAkJY21wciwKIAkJCQljbXBsOwogCi0JY21wbCA9IGx0cmVl X2NvbXBhcmUoTFRHX0dFVExOT0RFKG9yaWd2YWwsIHNpZ2xlbiksIExUR19HRVRMTk9ERShu ZXd2YWwsIHNpZ2xlbikpOwotCWNtcHIgPSBsdHJlZV9jb21wYXJlKExUR19HRVRSTk9ERShu ZXd2YWwsIHNpZ2xlbiksIExUR19HRVRSTk9ERShvcmlndmFsLCBzaWdsZW4pKTsKKwljbXBs ID0gbHRyZWVfY29tcGFyZV9kaXN0YW5jZShMVEdfR0VUTE5PREUob3JpZ3ZhbCwgc2lnbGVu KSwgTFRHX0dFVExOT0RFKG5ld3ZhbCwgc2lnbGVuKSk7CisJY21wciA9IGx0cmVlX2NvbXBh cmVfZGlzdGFuY2UoTFRHX0dFVFJOT0RFKG5ld3ZhbCwgc2lnbGVuKSwgTFRHX0dFVFJOT0RF KG9yaWd2YWwsIHNpZ2xlbikpOwogCiAJKnBlbmFsdHkgPSBNYXgoY21wbCwgMCkgKyBNYXgo Y21wciwgMCk7CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvbHRyZWUvbHRyZWVfb3AuYyBiL2Nv bnRyaWIvbHRyZWUvbHRyZWVfb3AuYwppbmRleCBjMWZjNzdmYzgwNC4uMWY5ZjAyY2Y0NTMg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvbHRyZWUvbHRyZWVfb3AuYworKysgYi9jb250cmliL2x0 cmVlL2x0cmVlX29wLmMKQEAgLTQyLDYgKzQyLDkgQEAgUEdfRlVOQ1RJT05fSU5GT19WMShs dHJlZTJ0ZXh0KTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEodGV4dDJsdHJlZSk7CiBQR19GVU5D VElPTl9JTkZPX1YxKGx0cmVlcGFyZW50c2VsKTsKIAorLyoKKyAqIGJ0cmVlLWNvbXBhcmlz b24gZnVuY3Rpb24uCisgKi8KIGludAogbHRyZWVfY29tcGFyZShjb25zdCBsdHJlZSAqYSwg Y29uc3QgbHRyZWUgKmIpCiB7CkBAIC01NCwxOCArNTcsNTIgQEAgbHRyZWVfY29tcGFyZShj b25zdCBsdHJlZSAqYSwgY29uc3QgbHRyZWUgKmIpCiAJewogCQlpbnQJCQlyZXM7CiAKLQkJ aWYgKChyZXMgPSBtZW1jbXAoYWwtPm5hbWUsIGJsLT5uYW1lLCBNaW4oYWwtPmxlbiwgYmwt PmxlbikpKSA9PSAwKQorCQlyZXMgPSBtZW1jbXAoYWwtPm5hbWUsIGJsLT5uYW1lLCBNaW4o YWwtPmxlbiwgYmwtPmxlbikpOworCQlpZiAocmVzID09IDApCisJCXsKKwkJCWlmIChhbC0+ bGVuICE9IGJsLT5sZW4pCisJCQkJcmV0dXJuIChpbnQpIGFsLT5sZW4gLSAoaW50KSBibC0+ bGVuOworCQl9CisJCWVsc2UKKwkJCXJldHVybiByZXM7CisKKwkJYW4tLTsKKwkJYm4tLTsK KwkJYWwgPSBMRVZFTF9ORVhUKGFsKTsKKwkJYmwgPSBMRVZFTF9ORVhUKGJsKTsKKwl9CisK KwlyZXR1cm4gYS0+bnVtbGV2ZWwgLSBiLT5udW1sZXZlbDsKK30KKworLyoKKyAqIFJldHVy bnMgYSAiZGlzdGFuY2UiIGJldHdlZW4gYSBhbmQgYi4gIElmIGEgPCBiLCB0aGUgZGlzdGFu Y2UgaXMgbmVnYXRpdmUsCisgKiBjb25zaXN0ZW50IHdpdGggdGhlIGx0cmVlX2NvbXBhcmUo KSBvcmRlcmluZy4KKyAqLworZmxvYXQKK2x0cmVlX2NvbXBhcmVfZGlzdGFuY2UoY29uc3Qg bHRyZWUgKmEsIGNvbnN0IGx0cmVlICpiKQoreworCWx0cmVlX2xldmVsICphbCA9IExUUkVF X0ZJUlNUKGEpOworCWx0cmVlX2xldmVsICpibCA9IExUUkVFX0ZJUlNUKGIpOworCWludAkJ CWFuID0gYS0+bnVtbGV2ZWw7CisJaW50CQkJYm4gPSBiLT5udW1sZXZlbDsKKworCXdoaWxl IChhbiA+IDAgJiYgYm4gPiAwKQorCXsKKwkJaW50CQkJcmVzOworCisJCXJlcyA9IG1lbWNt cChhbC0+bmFtZSwgYmwtPm5hbWUsIE1pbihhbC0+bGVuLCBibC0+bGVuKSk7CisJCWlmIChy ZXMgPT0gMCkKIAkJewogCQkJaWYgKGFsLT5sZW4gIT0gYmwtPmxlbikKLQkJCQlyZXR1cm4g KGFsLT5sZW4gLSBibC0+bGVuKSAqIDEwICogKGFuICsgMSk7CisJCQkJcmV0dXJuIChmbG9h dCkgKGFsLT5sZW4gLSBibC0+bGVuKSAqIDEwLjAgKiAoYW4gKyAxKTsKIAkJfQogCQllbHNl CiAJCXsKIAkJCWlmIChyZXMgPCAwKQotCQkJCXJlcyA9IC0xOworCQkJCXJldHVybiAtMS4w ICogMTAuMCAqIChhbiArIDEpOwogCQkJZWxzZQotCQkJCXJlcyA9IDE7Ci0JCQlyZXR1cm4g cmVzICogMTAgKiAoYW4gKyAxKTsKKwkJCQlyZXR1cm4gMS4wICogMTAuMCAqIChhbiArIDEp OwogCQl9CiAKIAkJYW4tLTsKQEAgLTc0LDcgKzExMSw3IEBAIGx0cmVlX2NvbXBhcmUoY29u c3QgbHRyZWUgKmEsIGNvbnN0IGx0cmVlICpiKQogCQlibCA9IExFVkVMX05FWFQoYmwpOwog CX0KIAotCXJldHVybiAoYS0+bnVtbGV2ZWwgLSBiLT5udW1sZXZlbCkgKiAxMCAqIChhbiAr IDEpOworCXJldHVybiAoKGZsb2F0KSAoYS0+bnVtbGV2ZWwgLSBiLT5udW1sZXZlbCkpICog MTAuMCAqIChhbiArIDEpOwogfQogCiAjZGVmaW5lIFJVTkNNUAkJCQkJCVwKZGlmZiAtLWdp dCBhL2NvbnRyaWIvbHRyZWUvc3FsL2x0cmVlLnNxbCBiL2NvbnRyaWIvbHRyZWUvc3FsL2x0 cmVlLnNxbAppbmRleCBkMGZhZGU5ZDE3ZC4uODMzMDkxZGM2YmIgMTAwNjQ0Ci0tLSBhL2Nv bnRyaWIvbHRyZWUvc3FsL2x0cmVlLnNxbAorKysgYi9jb250cmliL2x0cmVlL3NxbC9sdHJl ZS5zcWwKQEAgLTQ3NywzICs0NzcsOSBAQCBTRUxFQ1QgKHJlcGVhdCgneCcsIDI1NSkgfHwg cmVwZWF0KCd8JyB8fCByZXBlYXQoJ3gnLCAyNTUpLCAyNTYpKTo6bHF1ZXJ5OwogLS0tIFRl c3QgZm9yIG92ZXJmbG93IG9mIGxxdWVyeV9sZXZlbC5udW12YXIsIHdpdGggYSBzZXQgb2Yg c2luZ2xlLWNoYXIKIC0tLSB2YXJpYW50cyBpbiBvbmUgbGV2ZWwuCiBTRUxFQ1QgKHJlcGVh dCgnYXwnLCA2NTUzNSkgfHwgJ2EnKTo6bHF1ZXJ5OworCistLSBUZXN0IHRoYXQgbHRyZWVf Y29tcGFyZSgpIGRvZXMgbm90IG92ZXJmbG93IHdpdGggdmVyeSBkZWVwIHBhdGhzLgorV0lU SCBzIEFTIChTRUxFQ1QgJ2EnOjpsdHJlZSBBUyB2KSwKKyAgICAgbCBBUyAoU0VMRUNUIChy ZXBlYXQoJ2EuJywgMTQ5OTkpIHx8ICdhJyk6Omx0cmVlIEFTIHYpCitTRUxFQ1QgKGwudiA+ IHMudikgQVMgZ3Rfb2ssIChsLnYgPCBzLnYpIEFTIGx0X29rLCAobC52ID0gcy52KSBBUyBl cV9vaworICBGUk9NIHMsIGw7Ci0tIAoyLjQ3LjMKCg== --------------Tc5AntmfUuntrq6kS4snOE6H--