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 1vvwW9-00BZlf-1K for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Feb 2026 12:00:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vvwW8-0033Zn-0j for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Feb 2026 12:00:24 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vvwW7-0033Zf-28 for pgsql-hackers@lists.postgresql.org; Fri, 27 Feb 2026 12:00:23 +0000 Received: from mail-dy1-x1330.google.com ([2607:f8b0:4864:20::1330]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vvwW4-00000001UOj-38Rc for pgsql-hackers@lists.postgresql.org; Fri, 27 Feb 2026 12:00:22 +0000 Received: by mail-dy1-x1330.google.com with SMTP id 5a478bee46e88-2bdb4c7b60bso86374eec.3 for ; Fri, 27 Feb 2026 04:00:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772193621; cv=none; d=google.com; s=arc-20240605; b=ImoPrbVnAWxlLZICmVwof3RYkpj6lEQJr120tBCKHpgGrIw486SryTTSemtK7Xry5N +/+AgdyKhWggvzF1bt3hEo0J5K214VZ3JLNV+yxgHk5acfoVjq0isxWk3X9BtMPmS96q rAP8mnZi2K8SxV6gWDfUWnZhOuIzshPuYkI0nM3O0fv3iAXLdeVy+9019w4yGF1orWPI ymy/URGzKbMR+AsgHDR3mXsEhp/6FnjU9wUHzm5gRBa9yn7AnDCvIxC2AZAAhY8ZRAxi PAEiDNzgvNicBnvxUuu/qm8RtEuH20jNhkrapMOpY9Fqv5oecgo/RwMRzOScpEt9KyUx U5tA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=Smic8y330fVOb2uIdyZCEOSvmG51Vw5OSL8E5EN1ADY=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=MyTKoyGOyiv4/oG8nJnOVQe/ou1Ebeyd/wRxTqnh5l2DZQf4JdXjDNDRuP79ngnMiG Ndfd0rSBCWgqMmB3LL8hy9rrEPMji1NOfpu/2uTYGeJ9hdBQtLYXPr8dJh99oywXka+p dclmd4H3mGfniPXx26lXnSx3G6GgbBpPx8hPpdQzCNXDlykyiDpLb8p8EoUqi7GpssFk 3BClDzqezYA9Ym7bs0tBAc1I15wUTGXb86/UWIk5mLU2IOosZMmNf2dj+jUZxrQQlVRI I31fKoCBJmoFZwkJCETexGAwJOCL440IWN35zpww/gjcczueXNirVs25p9wVCzWkz23w g6Vw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772193621; x=1772798421; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=Smic8y330fVOb2uIdyZCEOSvmG51Vw5OSL8E5EN1ADY=; b=TiT614TokaJwYq46zJiTaWaYUOzbNSDNttEuk8zLAzSIJFutUXQh5UHJj/4rt6BVnF fs64S4k2iK0SJP5oceUJxLzCmUxVTwn7XD70MSD2z6rAfZOnigz5vH1PI3XDoinU29zY tvm6D10Y86zMhUurvA7lzfp/sjqCjjYjZfCtPaqEyTUMCKZCL2d92cvuBoyB577GGUbJ eSq3drWORSFbPPAiJhrb36/MceAfKbSn08qf7cS0rYFOTJ8CcVapfwIfPKUV/8BsdNQS 9tnKy2375uV1++LMhDwrlOY/VQ/V47noTBrnDIcRpC3w/aKAxjUrxRyTcIoCyE0iZ6Wf oReQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772193621; x=1772798421; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Smic8y330fVOb2uIdyZCEOSvmG51Vw5OSL8E5EN1ADY=; b=qDa3dJ96WZvhv3tlXL1QfswtcrPPxCBh0FZED+5DhHD52cAOxIHqeDjLVzPQ7930JD YukS0+TzuAJwDu46dNdNgMjSNkunWYX6TaSJTSwCyOEZjkwgEJsu7aqznfnR0iNtXD0D 0giQzFHaB3FZeAGqEcwJWCEDwRSeypXPanX7jf0iLzmHUDNpNQJjKoEl8MUkWw3JvQQe jnWWPMN2DhHbrBw1m05v4cUHkCOSw6xo43C/gJhWeXV6rieJw/kifTPyqmHAQzF6t1XY cnAZ2vlZ9GxxOaChOnHaXkCckQokF+z2qo1nj+DFbFDMh+An115XNZ+8zsdvockNHlaG FJRA== X-Gm-Message-State: AOJu0YxcTqv1FuroKDvnTeGcx2SjZp201TLs6HdoWivhusjrvSMN4HCl hui/tiqL51H62hCYdayHQH3JZJU8AyOtibUOEq933qh67n3SYxZhJXJjfdvFX5HnaufhHGAvBsB hLakJGrL9Fu9pESPPHDLiWylMVtcXppWLSODo X-Gm-Gg: ATEYQzxphgQu03rKzWAU09tx7cdH7XhQcvE1INy4UjxpWVXGLNw6HVMZwir+2l0mOzA cZrQ8yUMkkCX6mLncVBCZwdq4RJai8L+9Wns70XEITmt7wzC1AkhvkYTjFbgcX3Bin5dO7CwxQh /M9bGqKPebk/yRH8UEW4jYCKLf11PJa9ZnV6FZCnMkuqsb8xtqGAnaKpv9xTTD+nR8beaAdvavt FtsAcVO345nNLyntDbwgAR7OiBX32/ej114V1FVCSgbZGsPirNJ2Iq8TuQ35hU7njUiC6vPH2MZ UCmv8XyVlZZQrEA7qGdGxCHQzivGTUWu/DPDVc78YZxhGyqIQIxxspVaFfJXJDcveV4K9Z7QLT8 HsVhrxpbNnKPsUYHy9ijN X-Received: by 2002:a05:7301:169b:b0:2bd:dd46:7a55 with SMTP id 5a478bee46e88-2bde1b29395mr439601eec.2.1772193620070; Fri, 27 Feb 2026 04:00:20 -0800 (PST) MIME-Version: 1.0 From: Thomas Munro Date: Sat, 28 Feb 2026 00:59:42 +1300 X-Gm-Features: AaiRm53c_Yu6XH7Qd98uAUBoou1eUzRIu_azkL2urcRODbmKBbjL8TgIQV7SZAY Message-ID: Subject: A stack allocation API To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000334c01064bccfbfa" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000334c01064bccfbfa Content-Type: text/plain; charset="UTF-8" Hi, In the locale code we often use a 1KB array for copies of strings where we need a NUL-terminated or transcoded version to give a library function, with a fallback to palloc() + pfree() if we need more space than that, but: * we open code it repeatedly * we often have two allocations but won't use the stack if we can't fit both * we don't use it in nearby places that are obviously similar, probably because it's a bit tedious to repeat * in the past we've forgotten to pfree() large allocations and had to fix leaks * it's not very type-safe * we don't seem to consider alignment for non-char types, eg UChar, wchar_t (apparently ASAN has never complained about that and I think I see why it's always OK as written, but I suspect that might be UB) In the attached, I tried to tidy that up with an interface that lets you write: DECLARE_STACK_BUFFER(); p = stack_buffer_alloc(n); ... stack_buffer_free(p); The point of the _free() call is that it might need to call pfree() if it was a large allocation and not from the stack. Or slightly higher level and supporting the most common use cases with a one-liner: cstr1 = stack_buffer_strdup_with_len(str1, len1); cstr2 = stack_buffer_strdup_with_len(str2, len2); result = strcoll_l(cstr1, cstr2, locale); stack_buffer_free(cstr1); stack_buffer_free(cstr2); Or for non-char cases without casts or pointer/size arithmetic, in the style of recent palloc() variants: wcstr = stack_buffer_alloc_array(wchar_t, len); uchar = stack_buffer_alloc_array(UChar, len); Better names/ideas welcome. I also wondered if we might have a reasonable case for using alloca(), where available. It's pretty much the thing we are emulating, but keeps the stack nice and compact without big holes to step over for the following call to strcoll_l() or whatever it might be. Though it's non-standard and often discouraged due to the inherent danger of overflow, our usage is metered. I don't see why it's any more dangerous than the existing code as long as our cap is applied to it, or am I missing some other problem with that idea? One issue with USE_ALLOCA is that we have no systems where that wouldn't be used, so the fallback code would be untested unless you comment the #define out... --000000000000334c01064bccfbfa Content-Type: application/octet-stream; name="v1-0001-Provide-stack-allocation-API.patch" Content-Disposition: attachment; filename="v1-0001-Provide-stack-allocation-API.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm4te0hw0 RnJvbSA5NzE5Njk0OGRlMzAxZGY5NjY3ZDdiYjQ1MjE4MDZmNjM0M2U0ZDJmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUaG9tYXMgTXVucm8gPHRob21hcy5tdW5yb0BnbWFpbC5jb20+ CkRhdGU6IEZyaSwgMjcgRmViIDIwMjYgMjI6MjE6MzYgKzEzMDAKU3ViamVjdDogW1BBVENIIHYx XSBQcm92aWRlIHN0YWNrIGFsbG9jYXRpb24gQVBJLgoKU2V2ZXJhbCBwbGFjZXMgb3Blbi1jb2Rl ZCBhbiBhcnJheSBvbiB0aGUgc3RhY2sgZm9yIG5vbi1lc2NhcGluZyBtZW1vcnkKb2YgZHluYW1p YyBzaXplLCB3aXRoIGZhbGxiYWNrIHRvIHBhbGxvYygpL3BmcmVlKCkuICBDcmVhdGUgYSBzdGFu ZGFyZApBUEkgZm9yIHRoYXQsIGFuZCBpbXBsZW1lbnQgaXQgd2l0aCBhbGxvY2EoKSB3aGVuIGF2 YWlsYWJsZSAoaW4KcHJhY3RpY2UsIGFsd2F5cykuICBhbGxvY2EoKSBpcyBub24tc3RhbmRhcmQg YW5kIGRpc2NvdXJhZ2VkIGR1ZSB0bwpvdmVyZmxvdyByaXNrIGFuZCBpbXBsZW1lbnRhdGlvbiBk ZXRhaWxzLCBidXQgd2UgYXBwbHkgdGhlIGV4aXN0aW5nCnNwYWNlIGxpbWl0IGFuZCByZXN0cmlj dCB1c2FnZSB0byBzdWl0YWJsZSBjb21waWxlcnMuCgpFeGlzdGluZyB1c2VycyBvZiB0aGUgdGVj aG5pcXVlIGluIHBnX2xvY2FsX1hYWCBmdW5jdGlvbnMgYXJlIHVwZGF0ZWQgdG8KdXNlIHRoZSBu ZXcgQVBJLCBhcyB3ZWxsIGFzIHNvbWUgbmVhcmJ5IGNhbmRpZGF0ZXMgdGhhdCB3ZXJlIHByZXZp b3VzbHkKdXNpbmcgcGFsbG9jKCkuCgpSZXZpZXdlZC1ieToKLS0tCiBzcmMvYmFja2VuZC91dGls cy9hZHQvcGdfbG9jYWxlLmMgICAgICB8ICAgNyArLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Bn X2xvY2FsZV9pY3UuYyAgfCAgNTkgKysrLS0tLS0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Bn X2xvY2FsZV9saWJjLmMgfCAxNTAgKysrKysrKysrLS0tLS0tLS0tLS0tLS0tCiBzcmMvaW5jbHVk ZS91dGlscy9zdGFja19idWZmZXIuaCAgICAgICB8IDE1NCArKysrKysrKysrKysrKysrKysrKysr KysrCiA0IGZpbGVzIGNoYW5nZWQsIDIyNiBpbnNlcnRpb25zKCspLCAxNDQgZGVsZXRpb25zKC0p CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvdXRpbHMvc3RhY2tfYnVmZmVyLmgKCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKaW5kZXggYWMzMjRlY2FhZDIuLmMyZTliMzAzNjM5IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSAi dXRpbHMvcGdfbG9jYWxlLmgiCiAjaW5jbHVkZSAidXRpbHMvcGdfbG9jYWxlX2MuaCIKICNpbmNs dWRlICJ1dGlscy9yZWxjYWNoZS5oIgorI2luY2x1ZGUgInV0aWxzL3N0YWNrX2J1ZmZlci5oIgog I2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCiAKICNpZmRlZiBXSU4zMgpAQCAtNjAsMTIgKzYx LDYgQEAKICNkZWZpbmUJCVBHTE9DQUxFX1NVUFBPUlRfRVJST1IocHJvdmlkZXIpIFwKIAllbG9n KEVSUk9SLCAidW5zdXBwb3J0ZWQgY29sbHByb3ZpZGVyIGZvciAlczogJWMiLCBfX2Z1bmNfXywg cHJvdmlkZXIpCiAKLS8qCi0gKiBUaGlzIHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdGhhdCBtb3N0 IHN0cmluZ3Mgd2lsbCBmaXQsIGJ1dCBzbWFsbCBlbm91Z2gKLSAqIHRoYXQgd2UgZmVlbCBjb21m b3J0YWJsZSBwdXR0aW5nIGl0IG9uIHRoZSBzdGFjawotICovCi0jZGVmaW5lCQlURVhUQlVGTEVO CQkJMTAyNAotCiAjZGVmaW5lCQlNQVhfTDEwTl9EQVRBCQk4MAogCiAvKiBwZ19sb2NhbGVfYnVp bHRpbi5jICovCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2lj dS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwppbmRleCAzNTJiNGMz ODg1Zi4uOGVjMTM2NzlkOTAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19s b2NhbGVfaWN1LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwpA QCAtMzksMTYgKzM5LDkgQEAKICNpbmNsdWRlICJ1dGlscy9mb3JtYXR0aW5nLmgiCiAjaW5jbHVk ZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9wZ19sb2NhbGUuaCIKKyNpbmNs dWRlICJ1dGlscy9zdGFja19idWZmZXIuaCIKICNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgog Ci0vKgotICogU2l6ZSBvZiBzdGFjayBidWZmZXIgdG8gdXNlIGZvciBzdHJpbmcgdHJhbnNmb3Jt YXRpb25zLCB1c2VkIHRvIGF2b2lkIGhlYXAKLSAqIGFsbG9jYXRpb25zIGluIHR5cGljYWwgY2Fz ZXMuIFRoaXMgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0aGF0IG1vc3Qgc3RyaW5ncwotICogd2ls bCBmaXQsIGJ1dCBzbWFsbCBlbm91Z2ggdGhhdCB3ZSBmZWVsIGNvbWZvcnRhYmxlIHB1dHRpbmcg aXQgb24gdGhlCi0gKiBzdGFjay4KLSAqLwotI2RlZmluZQkJVEVYVEJVRkxFTgkJCTEwMjQKLQog ZXh0ZXJuIHBnX2xvY2FsZV90IGNyZWF0ZV9wZ19sb2NhbGVfaWN1KE9pZCBjb2xsaWQsIE1lbW9y eUNvbnRleHQgY29udGV4dCk7CiAKICNpZmRlZiBVU0VfSUNVCkBAIC03NTUsMjMgKzc0OCwxNyBA QCBzaXplX3QKIHN0cm54ZnJtX2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0 IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQogewot CWNoYXIJCXNidWZbVEVYVEJVRkxFTl07Ci0JY2hhcgkgICAqYnVmID0gc2J1ZjsKIAlVQ2hhcgkg ICAqdWNoYXI7CiAJaW50MzJfdAkJdWxlbjsKLQlzaXplX3QJCXVjaGFyX2JzaXplOwogCVNpemUJ CXJlc3VsdF9ic2l6ZTsKIAorCURFQ0xBUkVfU1RBQ0tfQlVGRkVSKCk7CisKIAlpbml0X2ljdV9j b252ZXJ0ZXIoKTsKIAogCXVsZW4gPSB1Y2hhcl9sZW5ndGgoaWN1X2NvbnZlcnRlciwgc3JjLCBz cmNsZW4pOwogCi0JdWNoYXJfYnNpemUgPSAodWxlbiArIDEpICogc2l6ZW9mKFVDaGFyKTsKLQot CWlmICh1Y2hhcl9ic2l6ZSA+IFRFWFRCVUZMRU4pCi0JCWJ1ZiA9IHBhbGxvYyh1Y2hhcl9ic2l6 ZSk7Ci0KLQl1Y2hhciA9IChVQ2hhciAqKSBidWY7CisJdWNoYXIgPSBzdGFja19idWZmZXJfYWxs b2NfYXJyYXkoVUNoYXIsIHVsZW4gKyAxKTsKIAogCXVsZW4gPSB1Y2hhcl9jb252ZXJ0KGljdV9j b252ZXJ0ZXIsIHVjaGFyLCB1bGVuICsgMSwgc3JjLCBzcmNsZW4pOwogCkBAIC03ODYsOCArNzcz LDcgQEAgc3Rybnhmcm1faWN1KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hh ciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKIAlBc3NlcnQocmVzdWx0X2JzaXplID4gMCk7CiAJcmVz dWx0X2JzaXplLS07CiAKLQlpZiAoYnVmICE9IHNidWYpCi0JCXBmcmVlKGJ1Zik7CisJc3RhY2tf YnVmZmVyX2ZyZWUodWNoYXIpOwogCiAJLyogaWYgZGVzdCBpcyBkZWZpbmVkLCBpdCBzaG91bGQg YmUgbnVsLXRlcm1pbmF0ZWQgKi8KIAlBc3NlcnQocmVzdWx0X2JzaXplID49IGRlc3RzaXplIHx8 IGRlc3RbcmVzdWx0X2JzaXplXSA9PSAnXDAnKTsKQEAgLTEwMjAsMTYgKzEwMDYsMTQgQEAgc3Rh dGljIGludAogc3RybmNvbGxfaWN1KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwKIAkJ CSBjb25zdCBjaGFyICphcmcyLCBzc2l6ZV90IGxlbjIsIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsK LQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwotCWNoYXIJICAgKmJ1ZiA9IHNidWY7CiAJaW50MzJf dAkJdWxlbjE7CiAJaW50MzJfdAkJdWxlbjI7Ci0Jc2l6ZV90CQlidWZzaXplMTsKLQlzaXplX3QJ CWJ1ZnNpemUyOwogCVVDaGFyCSAgICp1Y2hhcjEsCiAJCQkgICAqdWNoYXIyOwogCWludAkJCXJl c3VsdDsKIAorCURFQ0xBUkVfU1RBQ0tfQlVGRkVSKCk7CisKIAkvKiBpZiBlbmNvZGluZyBpcyBV VEY4LCB1c2UgbW9yZSBlZmZpY2llbnQgc3RybmNvbGxfaWN1X3V0ZjggKi8KICNpZmRlZiBIQVZF X1VDT0xfU1RSQ09MTFVURjgKIAlBc3NlcnQoR2V0RGF0YWJhc2VFbmNvZGluZygpICE9IFBHX1VU RjgpOwpAQCAtMTA0MCwxNCArMTAyNCw4IEBAIHN0cm5jb2xsX2ljdShjb25zdCBjaGFyICphcmcx LCBzc2l6ZV90IGxlbjEsCiAJdWxlbjEgPSB1Y2hhcl9sZW5ndGgoaWN1X2NvbnZlcnRlciwgYXJn MSwgbGVuMSk7CiAJdWxlbjIgPSB1Y2hhcl9sZW5ndGgoaWN1X2NvbnZlcnRlciwgYXJnMiwgbGVu Mik7CiAKLQlidWZzaXplMSA9ICh1bGVuMSArIDEpICogc2l6ZW9mKFVDaGFyKTsKLQlidWZzaXpl MiA9ICh1bGVuMiArIDEpICogc2l6ZW9mKFVDaGFyKTsKLQotCWlmIChidWZzaXplMSArIGJ1ZnNp emUyID4gVEVYVEJVRkxFTikKLQkJYnVmID0gcGFsbG9jKGJ1ZnNpemUxICsgYnVmc2l6ZTIpOwot Ci0JdWNoYXIxID0gKFVDaGFyICopIGJ1ZjsKLQl1Y2hhcjIgPSAoVUNoYXIgKikgKGJ1ZiArIGJ1 ZnNpemUxKTsKKwl1Y2hhcjEgPSBzdGFja19idWZmZXJfYWxsb2NfYXJyYXkoVUNoYXIsIHVsZW4x ICsgMSk7CisJdWNoYXIyID0gc3RhY2tfYnVmZmVyX2FsbG9jX2FycmF5KFVDaGFyLCB1bGVuMiAr IDEpOwogCiAJdWxlbjEgPSB1Y2hhcl9jb252ZXJ0KGljdV9jb252ZXJ0ZXIsIHVjaGFyMSwgdWxl bjEgKyAxLCBhcmcxLCBsZW4xKTsKIAl1bGVuMiA9IHVjaGFyX2NvbnZlcnQoaWN1X2NvbnZlcnRl ciwgdWNoYXIyLCB1bGVuMiArIDEsIGFyZzIsIGxlbjIpOwpAQCAtMTA1Niw4ICsxMDM0LDggQEAg c3RybmNvbGxfaWN1KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwKIAkJCQkJCSAgdWNo YXIxLCB1bGVuMSwKIAkJCQkJCSAgdWNoYXIyLCB1bGVuMik7CiAKLQlpZiAoYnVmICE9IHNidWYp Ci0JCXBmcmVlKGJ1Zik7CisJc3RhY2tfYnVmZmVyX2ZyZWUodWNoYXIxKTsKKwlzdGFja19idWZm ZXJfZnJlZSh1Y2hhcjIpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTEwNjgsMTYgKzEwNDYs MTUgQEAgc3Rybnhmcm1fcHJlZml4X2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCiAJ CQkJCWNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkJCXBnX2xvY2FsZV90IGxv Y2FsZSkKIHsKLQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwotCWNoYXIJICAgKmJ1ZiA9IHNidWY7 CiAJVUNoYXJJdGVyYXRvciBpdGVyOwogCXVpbnQzMl90CXN0YXRlWzJdOwogCVVFcnJvckNvZGUJ c3RhdHVzOwogCWludDMyX3QJCXVsZW4gPSAtMTsKIAlVQ2hhcgkgICAqdWNoYXIgPSBOVUxMOwot CXNpemVfdAkJdWNoYXJfYnNpemU7CiAJU2l6ZQkJcmVzdWx0X2JzaXplOwogCisJREVDTEFSRV9T VEFDS19CVUZGRVIoKTsKKwogCS8qIGlmIGVuY29kaW5nIGlzIFVURjgsIHVzZSBtb3JlIGVmZmlj aWVudCBzdHJueGZybV9wcmVmaXhfaWN1X3V0ZjggKi8KIAlBc3NlcnQoR2V0RGF0YWJhc2VFbmNv ZGluZygpICE9IFBHX1VURjgpOwogCkBAIC0xMDg1LDEyICsxMDYyLDcgQEAgc3Rybnhmcm1fcHJl Zml4X2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCiAKIAl1bGVuID0gdWNoYXJfbGVu Z3RoKGljdV9jb252ZXJ0ZXIsIHNyYywgc3JjbGVuKTsKIAotCXVjaGFyX2JzaXplID0gKHVsZW4g KyAxKSAqIHNpemVvZihVQ2hhcik7Ci0KLQlpZiAodWNoYXJfYnNpemUgPiBURVhUQlVGTEVOKQot CQlidWYgPSBwYWxsb2ModWNoYXJfYnNpemUpOwotCi0JdWNoYXIgPSAoVUNoYXIgKikgYnVmOwor CXVjaGFyID0gc3RhY2tfYnVmZmVyX2FsbG9jX2FycmF5KFVDaGFyLCB1bGVuICsgMSk7CiAKIAl1 bGVuID0gdWNoYXJfY29udmVydChpY3VfY29udmVydGVyLCB1Y2hhciwgdWxlbiArIDEsIHNyYywg c3JjbGVuKTsKIApAQCAtMTEwOCw4ICsxMDgwLDcgQEAgc3Rybnhmcm1fcHJlZml4X2ljdShjaGFy ICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCiAJCQkJKGVycm1zZygic29ydCBrZXkgZ2VuZXJhdGlv biBmYWlsZWQ6ICVzIiwKIAkJCQkJCXVfZXJyb3JOYW1lKHN0YXR1cykpKSk7CiAKLQlpZiAoYnVm ICE9IHNidWYpCi0JCXBmcmVlKGJ1Zik7CisJc3RhY2tfYnVmZmVyX2ZyZWUodWNoYXIpOwogCiAJ cmV0dXJuIHJlc3VsdF9ic2l6ZTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9wZ19sb2NhbGVfbGliYy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9saWJj LmMKaW5kZXggNzhmNmVhMTYxYTAuLjBmMWJiNDkwYzMyIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC91dGlscy9hZHQvcGdfbG9jYWxlX2xpYmMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQv cGdfbG9jYWxlX2xpYmMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInV0aWxzL2Zvcm1h dHRpbmcuaCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3Bn X2xvY2FsZS5oIgorI2luY2x1ZGUgInV0aWxzL3N0YWNrX2J1ZmZlci5oIgogI2luY2x1ZGUgInV0 aWxzL3N5c2NhY2hlLmgiCiAKICNpZmRlZiBfX0dMSUJDX18KQEAgLTcyLDE0ICs3Myw2IEBACiAg KiBOQjogdGhlIGNvZGluZyBoZXJlIGFzc3VtZXMgcGdfd2NoYXIgaXMgYW4gdW5zaWduZWQgdHlw ZS4KICAqLwogCi0vKgotICogU2l6ZSBvZiBzdGFjayBidWZmZXIgdG8gdXNlIGZvciBzdHJpbmcg dHJhbnNmb3JtYXRpb25zLCB1c2VkIHRvIGF2b2lkIGhlYXAKLSAqIGFsbG9jYXRpb25zIGluIHR5 cGljYWwgY2FzZXMuIFRoaXMgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCB0aGF0IG1vc3Qgc3RyaW5n cwotICogd2lsbCBmaXQsIGJ1dCBzbWFsbCBlbm91Z2ggdGhhdCB3ZSBmZWVsIGNvbWZvcnRhYmxl IHB1dHRpbmcgaXQgb24gdGhlCi0gKiBzdGFjay4KLSAqLwotI2RlZmluZQkJVEVYVEJVRkxFTgkJ CTEwMjQKLQogZXh0ZXJuIHBnX2xvY2FsZV90IGNyZWF0ZV9wZ19sb2NhbGVfbGliYyhPaWQgY29s bGlkLCBNZW1vcnlDb250ZXh0IGNvbnRleHQpOwogCiBzdGF0aWMgaW50CXN0cm5jb2xsX2xpYmMo Y29uc3QgY2hhciAqYXJnMSwgc3NpemVfdCBsZW4xLApAQCAtNTAyLDYgKzQ5NSw4IEBAIHN0cmxv d2VyX2xpYmNfbWIoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMs IHNzaXplX3Qgc3JjbGVuLAogCXNpemVfdAkJY3Vycl9jaGFyOwogCXNpemVfdAkJbWF4X3NpemU7 CiAKKwlERUNMQVJFX1NUQUNLX0JVRkZFUigpOworCiAJaWYgKHNyY2xlbiA8IDApCiAJCXNyY2xl biA9IHN0cmxlbihzcmMpOwogCkBAIC01MTIsNyArNTA3LDcgQEAgc3RybG93ZXJfbGliY19tYihj aGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNs ZW4sCiAJCQkJIGVycm1zZygib3V0IG9mIG1lbW9yeSIpKSk7CiAKIAkvKiBPdXRwdXQgd29ya3Nw YWNlIGNhbm5vdCBoYXZlIG1vcmUgY29kZXMgdGhhbiBpbnB1dCBieXRlcyAqLwotCXdvcmtzcGFj ZSA9IHBhbGxvY19hcnJheSh3Y2hhcl90LCBzcmNsZW4gKyAxKTsKKwl3b3Jrc3BhY2UgPSBzdGFj a19idWZmZXJfYWxsb2NfYXJyYXkod2NoYXJfdCwgc3JjbGVuICsgMSk7CiAKIAljaGFyMndjaGFy KHdvcmtzcGFjZSwgc3JjbGVuICsgMSwgc3JjLCBzcmNsZW4sIGxvYyk7CiAKQEAgLTUyMyw3ICs1 MTgsNyBAQCBzdHJsb3dlcl9saWJjX21iKGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29u c3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKIAkgKiBNYWtlIHJlc3VsdCBsYXJnZSBlbm91 Z2g7IGNhc2UgY2hhbmdlIG1pZ2h0IGNoYW5nZSBudW1iZXIgb2YgYnl0ZXMKIAkgKi8KIAltYXhf c2l6ZSA9IGN1cnJfY2hhciAqIHBnX2RhdGFiYXNlX2VuY29kaW5nX21heF9sZW5ndGgoKTsKLQly ZXN1bHQgPSBwYWxsb2MobWF4X3NpemUgKyAxKTsKKwlyZXN1bHQgPSBzdGFja19idWZmZXJfYWxs b2MobWF4X3NpemUgKyAxKTsKIAogCXJlc3VsdF9zaXplID0gd2NoYXIyY2hhcihyZXN1bHQsIHdv cmtzcGFjZSwgbWF4X3NpemUgKyAxLCBsb2MpOwogCkBAIC01MzMsOCArNTI4LDggQEAgc3RybG93 ZXJfbGliY19tYihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywg c3NpemVfdCBzcmNsZW4sCiAJCWRlc3RbcmVzdWx0X3NpemVdID0gJ1wwJzsKIAl9CiAKLQlwZnJl ZSh3b3Jrc3BhY2UpOwotCXBmcmVlKHJlc3VsdCk7CisJc3RhY2tfYnVmZmVyX2ZyZWUod29ya3Nw YWNlKTsKKwlzdGFja19idWZmZXJfZnJlZShyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdF9zaXpl OwogfQpAQCAtNjA3LDYgKzYwMiw4IEBAIHN0cnRpdGxlX2xpYmNfbWIoY2hhciAqZGVzdCwgc2l6 ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLAogCXNpemVfdAkJ Y3Vycl9jaGFyOwogCXNpemVfdAkJbWF4X3NpemU7CiAKKwlERUNMQVJFX1NUQUNLX0JVRkZFUigp OworCiAJaWYgKHNyY2xlbiA8IDApCiAJCXNyY2xlbiA9IHN0cmxlbihzcmMpOwogCkBAIC02MTcs NyArNjE0LDcgQEAgc3RydGl0bGVfbGliY19tYihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUs IGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkJIGVycm1zZygib3V0IG9mIG1l bW9yeSIpKSk7CiAKIAkvKiBPdXRwdXQgd29ya3NwYWNlIGNhbm5vdCBoYXZlIG1vcmUgY29kZXMg dGhhbiBpbnB1dCBieXRlcyAqLwotCXdvcmtzcGFjZSA9IHBhbGxvY19hcnJheSh3Y2hhcl90LCBz cmNsZW4gKyAxKTsKKwl3b3Jrc3BhY2UgPSBzdGFja19idWZmZXJfYWxsb2NfYXJyYXkod2NoYXJf dCwgc3JjbGVuICsgMSk7CiAKIAljaGFyMndjaGFyKHdvcmtzcGFjZSwgc3JjbGVuICsgMSwgc3Jj LCBzcmNsZW4sIGxvYyk7CiAKQEAgLTYzNCw3ICs2MzEsNyBAQCBzdHJ0aXRsZV9saWJjX21iKGNo YXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xl biwKIAkgKiBNYWtlIHJlc3VsdCBsYXJnZSBlbm91Z2g7IGNhc2UgY2hhbmdlIG1pZ2h0IGNoYW5n ZSBudW1iZXIgb2YgYnl0ZXMKIAkgKi8KIAltYXhfc2l6ZSA9IGN1cnJfY2hhciAqIHBnX2RhdGFi YXNlX2VuY29kaW5nX21heF9sZW5ndGgoKTsKLQlyZXN1bHQgPSBwYWxsb2MobWF4X3NpemUgKyAx KTsKKwlyZXN1bHQgPSBzdGFja19idWZmZXJfYWxsb2MobWF4X3NpemUgKyAxKTsKIAogCXJlc3Vs dF9zaXplID0gd2NoYXIyY2hhcihyZXN1bHQsIHdvcmtzcGFjZSwgbWF4X3NpemUgKyAxLCBsb2Mp OwogCkBAIC02NDQsOCArNjQxLDggQEAgc3RydGl0bGVfbGliY19tYihjaGFyICpkZXN0LCBzaXpl X3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCWRlc3RbcmVz dWx0X3NpemVdID0gJ1wwJzsKIAl9CiAKLQlwZnJlZSh3b3Jrc3BhY2UpOwotCXBmcmVlKHJlc3Vs dCk7CisJc3RhY2tfYnVmZmVyX2ZyZWUod29ya3NwYWNlKTsKKwlzdGFja19idWZmZXJfZnJlZShy ZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdF9zaXplOwogfQpAQCAtNzAwLDYgKzY5Nyw4IEBAIHN0 cnVwcGVyX2xpYmNfbWIoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpz cmMsIHNzaXplX3Qgc3JjbGVuLAogCXNpemVfdAkJY3Vycl9jaGFyOwogCXNpemVfdAkJbWF4X3Np emU7CiAKKwlERUNMQVJFX1NUQUNLX0JVRkZFUigpOworCiAJaWYgKHNyY2xlbiA8IDApCiAJCXNy Y2xlbiA9IHN0cmxlbihzcmMpOwogCkBAIC03MTAsNyArNzA5LDcgQEAgc3RydXBwZXJfbGliY19t YihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBz cmNsZW4sCiAJCQkJIGVycm1zZygib3V0IG9mIG1lbW9yeSIpKSk7CiAKIAkvKiBPdXRwdXQgd29y a3NwYWNlIGNhbm5vdCBoYXZlIG1vcmUgY29kZXMgdGhhbiBpbnB1dCBieXRlcyAqLwotCXdvcmtz cGFjZSA9IHBhbGxvY19hcnJheSh3Y2hhcl90LCBzcmNsZW4gKyAxKTsKKwl3b3Jrc3BhY2UgPSBz dGFja19idWZmZXJfYWxsb2NfYXJyYXkod2NoYXJfdCwgc3JjbGVuICsgMSk7CiAKIAljaGFyMndj aGFyKHdvcmtzcGFjZSwgc3JjbGVuICsgMSwgc3JjLCBzcmNsZW4sIGxvYyk7CiAKQEAgLTcyMSw3 ICs3MjAsNyBAQCBzdHJ1cHBlcl9saWJjX21iKGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwg Y29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKIAkgKiBNYWtlIHJlc3VsdCBsYXJnZSBl bm91Z2g7IGNhc2UgY2hhbmdlIG1pZ2h0IGNoYW5nZSBudW1iZXIgb2YgYnl0ZXMKIAkgKi8KIAlt YXhfc2l6ZSA9IGN1cnJfY2hhciAqIHBnX2RhdGFiYXNlX2VuY29kaW5nX21heF9sZW5ndGgoKTsK LQlyZXN1bHQgPSBwYWxsb2MobWF4X3NpemUgKyAxKTsKKwlyZXN1bHQgPSBzdGFja19idWZmZXJf YWxsb2MobWF4X3NpemUgKyAxKTsKIAogCXJlc3VsdF9zaXplID0gd2NoYXIyY2hhcihyZXN1bHQs IHdvcmtzcGFjZSwgbWF4X3NpemUgKyAxLCBsb2MpOwogCkBAIC03MzEsOCArNzMwLDggQEAgc3Ry dXBwZXJfbGliY19tYihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNy Yywgc3NpemVfdCBzcmNsZW4sCiAJCWRlc3RbcmVzdWx0X3NpemVdID0gJ1wwJzsKIAl9CiAKLQlw ZnJlZSh3b3Jrc3BhY2UpOwotCXBmcmVlKHJlc3VsdCk7CisJc3RhY2tfYnVmZmVyX2ZyZWUod29y a3NwYWNlKTsKKwlzdGFja19idWZmZXJfZnJlZShyZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdF9z aXplOwogfQpAQCAtODk2LDQ4ICs4OTUsMjUgQEAgaW50CiBzdHJuY29sbF9saWJjKGNvbnN0IGNo YXIgKmFyZzEsIHNzaXplX3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwgc3NpemVfdCBsZW4yLAog CQkJICBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7Ci0JY2hhcgkJc2J1ZltURVhUQlVGTEVOXTsKLQlj aGFyCSAgICpidWYgPSBzYnVmOwotCXNpemVfdAkJYnVmc2l6ZTEgPSAobGVuMSA9PSAtMSkgPyAw IDogbGVuMSArIDE7Ci0Jc2l6ZV90CQlidWZzaXplMiA9IChsZW4yID09IC0xKSA/IDAgOiBsZW4y ICsgMTsKLQljb25zdCBjaGFyICphcmcxbjsKLQljb25zdCBjaGFyICphcmcybjsKKwljaGFyCSAg ICpjc3RyMSA9IE5VTEw7CisJY2hhcgkgICAqY3N0cjIgPSBOVUxMOwogCWludAkJCXJlc3VsdDsK IAotCWlmIChidWZzaXplMSArIGJ1ZnNpemUyID4gVEVYVEJVRkxFTikKLQkJYnVmID0gcGFsbG9j KGJ1ZnNpemUxICsgYnVmc2l6ZTIpOworCURFQ0xBUkVfU1RBQ0tfQlVGRkVSKCk7CiAKIAkvKiBu dWwtdGVybWluYXRlIGFyZ3VtZW50cyBpZiBuZWNlc3NhcnkgKi8KLQlpZiAobGVuMSA9PSAtMSkK LQl7Ci0JCWFyZzFuID0gYXJnMTsKLQl9Ci0JZWxzZQotCXsKLQkJY2hhcgkgICAqYnVmMSA9IGJ1 ZjsKKwlpZiAobGVuMSAhPSAtMSkKKwkJYXJnMSA9IGNzdHIxID0gc3RhY2tfYnVmZmVyX3N0cmR1 cF93aXRoX2xlbihhcmcxLCBsZW4xKTsKIAotCQltZW1jcHkoYnVmMSwgYXJnMSwgbGVuMSk7Ci0J CWJ1ZjFbbGVuMV0gPSAnXDAnOwotCQlhcmcxbiA9IGJ1ZjE7Ci0JfQorCWlmIChsZW4yICE9IC0x KQorCQlhcmcyID0gY3N0cjIgPSBzdGFja19idWZmZXJfc3RyZHVwX3dpdGhfbGVuKGFyZzIsIGxl bjIpOwogCi0JaWYgKGxlbjIgPT0gLTEpCi0JewotCQlhcmcybiA9IGFyZzI7Ci0JfQotCWVsc2UK LQl7Ci0JCWNoYXIJICAgKmJ1ZjIgPSBidWYgKyBidWZzaXplMTsKLQotCQltZW1jcHkoYnVmMiwg YXJnMiwgbGVuMik7Ci0JCWJ1ZjJbbGVuMl0gPSAnXDAnOwotCQlhcmcybiA9IGJ1ZjI7Ci0JfQor CXJlc3VsdCA9IHN0cmNvbGxfbChhcmcxLCBhcmcyLCBsb2NhbGUtPmx0KTsKIAotCXJlc3VsdCA9 IHN0cmNvbGxfbChhcmcxbiwgYXJnMm4sIGxvY2FsZS0+bHQpOwotCi0JaWYgKGJ1ZiAhPSBzYnVm KQotCQlwZnJlZShidWYpOworCWlmIChjc3RyMSkKKwkJc3RhY2tfYnVmZmVyX2ZyZWUoY3N0cjEp OworCWlmIChjc3RyMikKKwkJc3RhY2tfYnVmZmVyX2ZyZWUoY3N0cjIpOwogCiAJcmV0dXJuIHJl c3VsdDsKIH0KQEAgLTk1MywyNSArOTI5LDE3IEBAIHNpemVfdAogc3Rybnhmcm1fbGliYyhjaGFy ICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4s CiAJCQkgIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwot CWNoYXIJICAgKmJ1ZiA9IHNidWY7Ci0Jc2l6ZV90CQlidWZzaXplID0gc3JjbGVuICsgMTsKKwlj aGFyCSAgICpjc3RyOwogCXNpemVfdAkJcmVzdWx0OwogCisJREVDTEFSRV9TVEFDS19CVUZGRVIo KTsKKwogCWlmIChzcmNsZW4gPT0gLTEpCiAJCXJldHVybiBzdHJ4ZnJtX2woZGVzdCwgc3JjLCBk ZXN0c2l6ZSwgbG9jYWxlLT5sdCk7CiAKLQlpZiAoYnVmc2l6ZSA+IFRFWFRCVUZMRU4pCi0JCWJ1 ZiA9IHBhbGxvYyhidWZzaXplKTsKLQotCS8qIG51bC10ZXJtaW5hdGUgYXJndW1lbnQgKi8KLQlt ZW1jcHkoYnVmLCBzcmMsIHNyY2xlbik7Ci0JYnVmW3NyY2xlbl0gPSAnXDAnOwotCi0JcmVzdWx0 ID0gc3RyeGZybV9sKGRlc3QsIGJ1ZiwgZGVzdHNpemUsIGxvY2FsZS0+bHQpOwotCi0JaWYgKGJ1 ZiAhPSBzYnVmKQotCQlwZnJlZShidWYpOworCWNzdHIgPSBzdGFja19idWZmZXJfc3RyZHVwX3dp dGhfbGVuKHNyYywgc3JjbGVuKTsKKwlyZXN1bHQgPSBzdHJ4ZnJtX2woZGVzdCwgY3N0ciwgZGVz dHNpemUsIGxvY2FsZS0+bHQpOworCXN0YWNrX2J1ZmZlcl9mcmVlKGNzdHIpOwogCiAJLyogaWYg ZGVzdCBpcyBkZWZpbmVkLCBpdCBzaG91bGQgYmUgbnVsLXRlcm1pbmF0ZWQgKi8KIAlBc3NlcnQo cmVzdWx0ID49IGRlc3RzaXplIHx8IGRlc3RbcmVzdWx0XSA9PSAnXDAnKTsKQEAgLTEwNTcsMTUg KzEwMjUsMTMgQEAgc3RhdGljIGludAogc3RybmNvbGxfbGliY193aW4zMl91dGY4KGNvbnN0IGNo YXIgKmFyZzEsIHNzaXplX3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwKIAkJCQkJCSBzc2l6ZV90 IGxlbjIsIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQljaGFyCQlzYnVmW1RFWFRCVUZMRU5dOwot CWNoYXIJICAgKmJ1ZiA9IHNidWY7Ci0JY2hhcgkgICAqYTFwLAotCQkJICAgKmEycDsKLQlpbnQJ CQlhMWxlbjsKLQlpbnQJCQlhMmxlbjsKKwl3Y2hhcl90ICAgICp3MXA7CisJd2NoYXJfdCAgICAq dzJwOwogCWludAkJCXI7CiAJaW50CQkJcmVzdWx0OwogCisJREVDTEFSRV9TVEFDS19CVUZGRVIo KTsKKwogCUFzc2VydChHZXREYXRhYmFzZUVuY29kaW5nKCkgPT0gUEdfVVRGOCk7CiAKIAlpZiAo bGVuMSA9PSAtMSkKQEAgLTEwNzMsNTAgKzEwMzksNDIgQEAgc3RybmNvbGxfbGliY193aW4zMl91 dGY4KGNvbnN0IGNoYXIgKmFyZzEsIHNzaXplX3QgbGVuMSwgY29uc3QgY2hhciAqYXJnMiwKIAlp ZiAobGVuMiA9PSAtMSkKIAkJbGVuMiA9IHN0cmxlbihhcmcyKTsKIAotCWExbGVuID0gbGVuMSAq IDIgKyAyOwotCWEybGVuID0gbGVuMiAqIDIgKyAyOwotCi0JaWYgKGExbGVuICsgYTJsZW4gPiBU RVhUQlVGTEVOKQotCQlidWYgPSBwYWxsb2MoYTFsZW4gKyBhMmxlbik7Ci0KLQlhMXAgPSBidWY7 Ci0JYTJwID0gYnVmICsgYTFsZW47CisJdzFwID0gc3RhY2tfYnVmZmVyX2FsbG9jX2FycmF5KHdj aGFyX3QsIGxlbjEgKyAxKTsKKwl3MnAgPSBzdGFja19idWZmZXJfYWxsb2NfYXJyYXkod2NoYXJf dCwgbGVuMiArIDEpOwogCiAJLyogQVBJIGRvZXMgbm90IHdvcmsgZm9yIHplcm8tbGVuZ3RoIGlu cHV0ICovCiAJaWYgKGxlbjEgPT0gMCkKIAkJciA9IDA7CiAJZWxzZQogCXsKLQkJciA9IE11bHRp Qnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgYXJnMSwgbGVuMSwKLQkJCQkJCQkJKExQV1NUUikg YTFwLCBhMWxlbiAvIDIpOworCQlyID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LCAwLCBh cmcxLCBsZW4xLCB3MXAsIGxlbjEpOwogCQlpZiAoIXIpCiAJCQllcmVwb3J0KEVSUk9SLAogCQkJ CQkoZXJybXNnKCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVRGLTE2OiBlcnJvciBjb2Rl ICVsdSIsCiAJCQkJCQkJR2V0TGFzdEVycm9yKCkpKSk7CiAJfQotCSgoTFBXU1RSKSBhMXApW3Jd ID0gMDsKKwl3MXBbcl0gPSAwOwogCiAJaWYgKGxlbjIgPT0gMCkKIAkJciA9IDA7CiAJZWxzZQog CXsKLQkJciA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVVRGOCwgMCwgYXJnMiwgbGVuMiwKLQkJ CQkJCQkJKExQV1NUUikgYTJwLCBhMmxlbiAvIDIpOworCQlyID0gTXVsdGlCeXRlVG9XaWRlQ2hh cihDUF9VVEY4LCAwLCBhcmcyLCBsZW4yLCB3MnAsIGxlbjIpOwogCQlpZiAoIXIpCiAJCQllcmVw b3J0KEVSUk9SLAogCQkJCQkoZXJybXNnKCJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVRG LTE2OiBlcnJvciBjb2RlICVsdSIsCiAJCQkJCQkJR2V0TGFzdEVycm9yKCkpKSk7CiAJfQotCSgo TFBXU1RSKSBhMnApW3JdID0gMDsKKwl3MnBbcl0gPSAwOwogCiAJZXJybm8gPSAwOwotCXJlc3Vs dCA9IHdjc2NvbGxfbCgoTFBXU1RSKSBhMXAsIChMUFdTVFIpIGEycCwgbG9jYWxlLT5sdCk7CisJ cmVzdWx0ID0gd2NzY29sbF9sKHcxcCwgdzJwLCBsb2NhbGUtPmx0KTsKIAlpZiAocmVzdWx0ID09 IDIxNDc0ODM2NDcpCS8qIF9OTFNDTVBFUlJPUjsgbWlzc2luZyBmcm9tIG1pbmd3IGhlYWRlcnMg Ki8KIAkJZXJlcG9ydChFUlJPUiwKIAkJCQkoZXJybXNnKCJjb3VsZCBub3QgY29tcGFyZSBVbmlj b2RlIHN0cmluZ3M6ICVtIikpKTsKIAotCWlmIChidWYgIT0gc2J1ZikKLQkJcGZyZWUoYnVmKTsK KwlzdGFja19idWZmZXJfZnJlZSh3MXApOworCXN0YWNrX2J1ZmZlcl9mcmVlKHcycCk7CiAKIAly ZXR1cm4gcmVzdWx0OwogfQpAQCAtMTI4OSw4ICsxMjQ3LDEyIEBAIGNoYXIyd2NoYXIod2NoYXJf dCAqdG8sIHNpemVfdCB0b2xlbiwgY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IGZyb21sZW4sCiAJ ZWxzZQogI2VuZGlmCQkJCQkJCS8qIFdJTjMyICovCiAJeworCQljaGFyCSAgICpzdHI7CisKKwkJ REVDTEFSRV9TVEFDS19CVUZGRVIoKTsKKwogCQkvKiBtYnN0b3djcyByZXF1aXJlcyBlbmRpbmcg J1wwJyAqLwotCQljaGFyCSAgICpzdHIgPSBwbnN0cmR1cChmcm9tLCBmcm9tbGVuKTsKKwkJc3Ry ID0gc3RhY2tfYnVmZmVyX3N0cmR1cF93aXRoX2xlbihmcm9tLCBmcm9tbGVuKTsKIAogCQlpZiAo bG9jID09IChsb2NhbGVfdCkgMCkKIAkJewpAQCAtMTMwMyw3ICsxMjY1LDcgQEAgY2hhcjJ3Y2hh cih3Y2hhcl90ICp0bywgc2l6ZV90IHRvbGVuLCBjb25zdCBjaGFyICpmcm9tLCBzaXplX3QgZnJv bWxlbiwKIAkJCXJlc3VsdCA9IG1ic3Rvd2NzX2wodG8sIHN0ciwgdG9sZW4sIGxvYyk7CiAJCX0K IAotCQlwZnJlZShzdHIpOworCQlzdGFja19idWZmZXJfZnJlZShzdHIpOwogCX0KIAogCWlmIChy ZXN1bHQgPT0gLTEpCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9zdGFja19idWZmZXIu aCBiL3NyYy9pbmNsdWRlL3V0aWxzL3N0YWNrX2J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwLi4xNjgyNjNlOWY2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9p bmNsdWRlL3V0aWxzL3N0YWNrX2J1ZmZlci5oCkBAIC0wLDAgKzEsMTU0IEBACisvKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqCisgKiBzdGFja19idWZmZXIuaAorICoJCU1lbW9yeSBhbGxvY2F0b3IgZm9y IHNtYWxsIG5vbi1lc2NhcGluZyBvYmplY3RzLgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAo YykgMTk5Ni0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9y dGlvbnMgQ29weXJpZ2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENh bGlmb3JuaWEKKyAqCisgKiBzcmMvaW5jbHVkZS91dGlscy9zdGFja19idWZmZXIuaAorICoKKyAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIFNUQUNLX0JVRkZFUl9ICisjZGVmaW5lIFNU QUNLX0JVRkZFUl9ICisKKyNpbmNsdWRlICJ1dGlscy9wYWxsb2MuaCIKKworLyoKKyAqIFRoZSBh bGxvY2EoKS1iYXNlZCBpbXBsZW1lbnRhdGlvbiB1c2VzIGFsbG9jYSgpIGluIHRoZSBhcmd1bWVu dCBsaXN0IG9mIGEKKyAqIGZ1bmN0aW9uIGNhbGwuICBHQ0MsIENsYW5nIGFuZCBNU1ZDIGNhbiBk byB0aGF0LCBidXQgaGlzdG9yaWNhbCBjb21waWxlcnMKKyAqIGNvdWxkIG5vdC4KKyAqLworI2lm IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIFVTRV9BTExP Q0EKKyNlbmRpZgorCisvKgorICogVW5peGVuIHRyYWRpdGlvbmFsbHkgZWl0aGVyIHJlcXVpcmVk IDxhbGxvY2EuaD4gb3IgPHN0ZGxpYi5oPiB0byBiZSBpbmNsdWRlZAorICogdG8gdXNlIGFsbG9j YSgpLiAgSXQgaXMgbm90IHN0YW5kYXJkaXplZCBieSBDIG9yIFBPU0lYLiAgR0NDIGFuZCBDbGFu ZworICogdW5kZXJzdGFuZCBpdCBhcyBhIGJ1aWx0aW4sIHNvIHdlIG9ubHkgbmVlZCB0byBpbmNs dWRlIGEgaGVhZGVyIGZvciBNU1ZDLgorICovCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5l ZChfTVNDX1ZFUikKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorCisvKgorICogVGhpcyBz aG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRoYXQgbW9zdCBzdHJpbmdzIGFuZCBvdGhlciBzbWFsbCBv YmplY3RzIHdpbGwKKyAqIGZpdCwgYnV0IHNtYWxsIGVub3VnaCB0aGF0IHdlIGZlZWwgY29tZm9y dGFibGUgcHV0dGluZyBpdCBvbiB0aGUgc3RhY2suCisgKi8KKyNkZWZpbmUgU1RBQ0tfQlVGRkVS X1NJWkUgMTAyNAorCisvKgorICogRGVjbGFyZSBhIHN0YWNrIGJ1ZmZlciwgYWxsb3dpbmcgdGhl IGZvbGxvd2luZyBBUEkgdG8gYmUgdXNlZCB0byBhbGxvY2F0ZQorICogbWVtb3J5IHRoYXQgZG9l c24ndCBlc2NhcGUgdGhlIHByZXNlbnQgZnVuY3Rpb24uCisgKi8KKyNkZWZpbmUgREVDTEFSRV9T VEFDS19CVUZGRVIoKSBcCisJREVDTEFSRV9TVEFDS19CVUZGRVJfSU1QTChTVEFDS19CVUZGRVJf U0laRSkKKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSBzdGFjayBpZiB0aGUgZGVj bGFyZWQgbGltaXQgd291bGRuJ3QgYmUgZXhjZWVkZWQsCisgKiBhbmQgb3RoZXJ3aXNlIGZhbGwg YmFjayB0byBwYWxsb2MoKS4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIGFsaWduZWQgdG8KKyAq IE1BWElNVU1fQUxJR05PRiAobm90IG1heF9hbGlnbl90KSwgbGlrZSBwYWxsb2MoKS4KKyAqLwor I2RlZmluZSBzdGFja19idWZmZXJfYWxsb2Moc2l6ZSkgXAorCShzdGFja19idWZmZXJfdG1wID0g KHNpemUpLCAvKiBhdm9pZCBkb3VibGUgZXZhbHVhdGlvbiAqLyBcCisJIHN0YWNrX2J1ZmZlcl9h bGxvY19pbXBsKHN0YWNrX2J1ZmZlcl90bXApKQorCisvKiBMaWtlIHBhbGxvY19hcnJheShULCBz aXplKS4gKi8KKyNkZWZpbmUgc3RhY2tfYnVmZmVyX2FsbG9jX2FycmF5KFQsIHNpemUpIFwKKwko VCAqKSBzdGFja19idWZmZXJfYWxsb2MoKHNpemUpICogc2l6ZW9mKFQpKQorCisvKiBMaWtlIHBh bGxvY19vYmplY3QoVCkuICovCisjZGVmaW5lIHN0YWNrX2J1ZmZlcl9hbGxvY19vYmplY3QoVCkg XAorCXN0YWNrX2J1ZmZlcl9hbGxvY19hcnJheShULCAxKQorCisvKgorICogQWxsb2NhdGUgYSBm cmVzaCBOVUwtdGVybWluYXRlZCBzdHJpbmcgY29waWVkIGZyb20gYSBzdHJpbmcgb2Yga25vd24g c2l6ZSwKKyAqIG5vdCBjb3VudGluZyB0aGUgTlVMLXRlcm1pbmF0b3IuICBUaGUgaW5wdXQgc3Ry aW5nIG5lZWQgbm90IGJlCisgKiBOVUwtdGVybWluYXRlZC4KKyAqLworI2RlZmluZSBzdGFja19i dWZmZXJfc3RyZHVwX3dpdGhfbGVuKGRhdGEsIHNpemUpIFwKKwkoc3RhY2tfYnVmZmVyX3RtcCA9 IChzaXplKSwgLyogYXZvaWQgZG91YmxlIGV2YWx1YXRpb24gKi8gXAorCSBzdGFja19idWZmZXJf c3RyZHVwX3dpdGhfbGVuX2ltcGwoc3RhY2tfYnVmZmVyX2FsbG9jX2ltcGwoc3RhY2tfYnVmZmVy X3RtcCArIDEpLCBcCisJCQkJCQkJCQkgICAoZGF0YSksIFwKKwkJCQkJCQkJCSAgIHN0YWNrX2J1 ZmZlcl90bXApKQorCisvKgorICogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIHdpdGggc3RhY2tfYnVm ZmVyX2FsbG9jKCkuICBBIG5vLW9wIGlmIGl0IGNhbWUgZnJvbQorICogdGhlIHN0YWNrLCBhbmQg b3RoZXJ3aXNlIHBmcmVlKCkuCisgKi8KKyNkZWZpbmUgc3RhY2tfYnVmZmVyX2ZyZWUocHRyKSBc CisJc3RhY2tfYnVmZmVyX2ZyZWVfaW1wbChzdGFja19idWZmZXJfbCwgc3RhY2tfYnVmZmVyX2gs IChwdHIpKQorCisKKworI2lmZGVmIFVTRV9BTExPQ0EKKy8qIGFsbG9jYSgpIHdpdGggYSBzaXpl IGxpbWl0LiAqLworI2RlZmluZSBERUNMQVJFX1NUQUNLX0JVRkZFUl9JTVBMKHNpemUpIFwKK2Nv bnN0IHNpemVfdCBzdGFja19idWZmZXJfbWF4X3NpemUgPSAoc2l6ZSk7IFwKK2NoYXIgKnN0YWNr X2J1ZmZlcl9sID0gTlVMTDsgXAorY2hhciAqc3RhY2tfYnVmZmVyX2ggPSBOVUxMOyBcCitzaXpl X3Qgc3RhY2tfYnVmZmVyX3RtcCBwZ19hdHRyaWJ1dGVfdW51c2VkKCkKKyNkZWZpbmUgc3RhY2tf YnVmZmVyX2FsbG9jX2ltcGwoc2l6ZSkgXAorCSgoKHN0YWNrX2J1ZmZlcl9oIC0gc3RhY2tfYnVm ZmVyX2wpICsgKHNpemUpKSA8IHN0YWNrX2J1ZmZlcl9tYXhfc2l6ZSA/IFwKKwkgc3RhY2tfYnVm ZmVyX2FsbG9jX2ltcGwyKCZzdGFja19idWZmZXJfbCwgXAorCQkJCQkJCSAgJnN0YWNrX2J1ZmZl cl9oLCBcCisJCQkJCQkJICBhbGxvY2Eoc2l6ZSkpIDogXAorCSBwYWxsb2Moc2l6ZSkpCitzdGF0 aWMgaW5saW5lIHZvaWQgKgorc3RhY2tfYnVmZmVyX2FsbG9jX2ltcGwyKGNoYXIgKipsLCBjaGFy ICoqaCwgdm9pZCAqcHRyKQoreworCWNoYXIJICAgKnAgPSAoY2hhciAqKSBwdHI7CisKKwlpZiAo KmwgPT0gTlVMTCB8fCBwIDwgKmwpCisJCSpsID0gcDsKKwlpZiAoKmggPT0gTlVMTCB8fCBwID4g KmgpCisJCSpoID0gcDsKKworCXJldHVybiBwOworfQorI2Vsc2UKKy8qIFN0YW5kYXJkIEMgaW1w bGVtZW50YXRpb24gdXNpbmcgYSBiaWcgYXJyYXkuICovCisjZGVmaW5lIERFQ0xBUkVfU1RBQ0tf QlVGRkVSX0lNUEwoc2l6ZSkgXAorYWxpZ25hcyhNQVhJTVVNX0FMSUdOT0YpIGNoYXIgc3RhY2tf YnVmZmVyX2FycmF5W01BWEFMSUdOKHNpemUpXTsgXAorY2hhciAqc3RhY2tfYnVmZmVyX2FsbG9j YXRvciA9IHN0YWNrX2J1ZmZlcl9hcnJheSArIHNpemVvZihNQVhBTElHTihzaXplKSk7IFwKK2Nv bnN0IGNoYXIgKnN0YWNrX2J1ZmZlcl9sID0gc3RhY2tfYnVmZmVyX2FycmF5OyBcCitjb25zdCBj aGFyICpzdGFja19idWZmZXJfaCA9IHN0YWNrX2J1ZmZlcl9hbGxvY2F0b3I7IFwKK3NpemVfdCBz dGFja19idWZmZXJfdG1wIHBnX2F0dHJpYnV0ZV91bnVzZWQoKQorI2RlZmluZSBzdGFja19idWZm ZXJfYWxsb2NfaW1wbChzaXplKSBcCisJc3RhY2tfYnVmZmVyX2FsbG9jX2ltcGwyKHN0YWNrX2J1 ZmZlcl9sLCBcCisJCQkJCQkJICZzdGFja19idWZmZXJfYWxsb2NhdG9yLCBcCisJCQkJCQkJIChz aXplKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqCitzdGFja19idWZmZXJfYWxsb2NfaW1wbDIoY29u c3QgY2hhciAqbCwgY2hhciAqKmFsbG9jYXRvciwgc2l6ZV90IHNpemUpCit7CisJc2l6ZSA9IE1B WEFMSUdOKHNpemUpOworCisJaWYgKCphbGxvY2F0b3IgLSBzaXplID49IGwpCisJeworCQkqYWxs b2NhdG9yIC09IHNpemU7CisJCXJldHVybiAqYWxsb2NhdG9yOworCX0KKwlyZXR1cm4gcGFsbG9j KHNpemUpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitzdGFja19idWZmZXJf c3RyZHVwX3dpdGhfbGVuX2ltcGwoY2hhciAqZHN0LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qg c2l6ZSkKK3sKKwltZW1jcHkoZHN0LCBkYXRhLCBzaXplKTsKKwlkc3Rbc2l6ZV0gPSAwOworCXJl dHVybiBkc3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3RhY2tfYnVmZmVyX2ZyZWVfaW1w bChjb25zdCBjaGFyICpsLCBjb25zdCBjaGFyICpoLCB2b2lkICpwdHIpCit7CisJY2hhcgkgICAq cCA9IChjaGFyICopIHB0cjsKKworCWlmIChwIDwgbCB8fCBwID4gaCkKKwkJcGZyZWUocHRyKTsK K30KKworI2VuZGlmCi0tIAoyLjUwLjEgKEFwcGxlIEdpdC0xNTUpCgo= --000000000000334c01064bccfbfa--