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 1vtjhV-008kfU-1A for pgsql-hackers@arkaria.postgresql.org; Sat, 21 Feb 2026 09:55:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vtjhT-009f1o-2v for pgsql-hackers@arkaria.postgresql.org; Sat, 21 Feb 2026 09:54:59 +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 1vtjhT-009f1V-1B for pgsql-hackers@lists.postgresql.org; Sat, 21 Feb 2026 09:54:59 +0000 Received: from mail-oo1-xc2c.google.com ([2607:f8b0:4864:20::c2c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vtjhQ-00000000UrY-0ZmX for pgsql-hackers@postgresql.org; Sat, 21 Feb 2026 09:54:58 +0000 Received: by mail-oo1-xc2c.google.com with SMTP id 006d021491bc7-6780761b665so1618864eaf.1 for ; Sat, 21 Feb 2026 01:54:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771667696; cv=none; d=google.com; s=arc-20240605; b=hOFjUiS+fO/wPBJB3Up5gqd6IZRiVYJAJjZJXWCbZXmOM5FmT5hl68GmE7f3spfG7h 6EH38V3LsSu7l5h4MpjxcFiH5ujhLyXygfYcU5veh7CZBT3dc5f7jGmy2rL7mQdE1Vbz m1DKROmZttZoyNPFAlSpPbNSY6dckDw/+fbVBwFhQGJDXwus3T8xuQuGjwaOE4zSeHrX ofF1xphdW6DI+lJvEFEtjk5VxyckZP181T3CcOClWmv4FWfK5ss3HAgx9dff/XOeGCio awu/OgAc0RGBQcA5iy8/pMZX9f4siupRnyl0HCMvV4CPkPcEKEHAlCJ1zjj1Zjao7MU5 ao2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=Krn7fjTw4YTQQg4m+Dcyms/e74CtWjigtEO5e7ptQMw=; fh=ab2QULvDsfAQZSkQ0LbXUMmEfPg89lFn2bauBsCokMg=; b=kv0laNbl8DQpll6TrdRyHxHRWuOMK1t2/dW+4Z49GuaVgZakYEEu0SHA1pgxoTE7gV Hg8dU8Fkzf+ofrRIKXBaT4ysYM1Qgv0GixjFRWU6m9kbSyad41GO1WQM/jb5M1lCmruI MLZJHRl0IibWj1ZC6JTpCNIRg32CgNkEvU8R8uIF0/h3g3ni3ed0CRQaAWZF52GYffTL OtQJ8wvAlCpvJYnTESXu3Pobji+pCOWz96kiNAfT/66xQ/H2THuKHEgq2HbqvuFtv/1X uMUmGa0FQf4z/6Q56V1JZn4+MvekdC6guHm5qp+Iw89C/28lcJN3l9BGH0wJYlYNeSq0 0lzg==; darn=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=1771667696; x=1772272496; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Krn7fjTw4YTQQg4m+Dcyms/e74CtWjigtEO5e7ptQMw=; b=mVyg20uvndBczaskfUcfWXrWlP6mvofK91pVSoUnBU2Ayzzs7cQIBkic+reys9eGbs nHd9x/s+AAEtNOHgvp2MTrMjmF16FWU5UoFeUM2hNfYKXLpkY8u1J2HlnBuzIXyrziHe ogSBDb3IA3nYbJ8ixq2pxcIVLpojfycSnqOjUepr4Zt1vIvMlXAuvn+zDgzq47tuuImy r7UsExM5hpMopXkGEglO2Z9W9wPhA+LRny1RZV2z9Z2MQZjybIBmd2EnBuO7Q5RDJWPq x8Bpf6aq9ba26O1kHNRcT3bfKsJ8EeStVJgghyIF8hzXdM4oIB/iTqfL2TL+5Ge9hVVK XUbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771667696; x=1772272496; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Krn7fjTw4YTQQg4m+Dcyms/e74CtWjigtEO5e7ptQMw=; b=Es0d4dfvgYxOlqq4qLQo1PeWwJLizh8rgvm5HIRxsn0oq3Nk1WpuSA8KAYMWV6r+Zd sPsXRfDZbAW9jfc16i2+8c9S3ea2GCHW9kmbooxAvg8gzSbGgCnwbiTcAmRm6Txfs8f9 3/itx/V7/a9zeLJJrHGh6nmy2j8QI3qYoKDU1pQy6gul1A1152jx3F204Ieo4cv5MDKp 0PBshK4Dp/pHuDirilAILGOdgsolpwqNaymoiqAC9lMD7YCi4ZCkJqiXQlsNFL8Fjy9C 1vzTh1jh6z3d7Wt/Ue2hg505jtv5Qy8el1QWme7EDX46En/yY1PEz7Zmj71Yj6i/aPHz 428g== X-Gm-Message-State: AOJu0YxT8f/e5MWygU/JsdlPqQ1txKbHtjJ9p9QWj0u1vL2wewcH5MnU n4a4YBlgJ0zVe6npV2nGFM0CiBbRwO2a1FzljJ7vMxIcPmuT2DEz3AsXHM/eua0FBuFokzqtUYz 2XR7YLBl8ynUYTAJY/FaQgvfSyhgNqxjhs0LSqqQ= X-Gm-Gg: AZuq6aKIJQ1TPmRo4Z+v9HeimaX6Sv1HPJK6VL1A04ODiq3nrsh7MwwYLZYbCzFvVb6 hI+lQm+hRuF6c8bJFl7UAuyLNuu4+5KFOBzFg6sxNzaoilJ3U1jsEiUVd2qTGtGE/JSAF93kJ/n 1NG/TdyK2H/Jtuhqz5VEDyA9xlLy5UNwNU2T9E77iivl8yQnNpN05ce0U1EQG4+KoqeRRdPWJ6c m1J3R1OPnrbePPmnkvO0VnG2to2EZZY6cRj60nho5vc/Hf+V5Corr0LsfP1AOe3M2tF+lv4Tyk3 aqcpM9p57qcbvV7lXQ/BvHwaea2MbsfPnUtl1+rx0VwaObRAgKuesuvNIUWwE/KWcCn+MC3S+Lm U4vJx+57QqAAR+WvE0T0dKBY1/v3yKaN4PujGI7g= X-Received: by 2002:a05:6820:61d:b0:679:95da:9752 with SMTP id 006d021491bc7-679c464670dmr1569977eaf.11.1771667695716; Sat, 21 Feb 2026 01:54:55 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Alexander Korotkov Date: Sat, 21 Feb 2026 11:54:43 +0200 X-Gm-Features: AaiRm51a_jrGbyeMAv2IVcCU-y42O_eR7UNyCHCjwwB1YNozmFHxjP9E6BtvVXo Message-ID: Subject: Re: Odd code around ginScanToDelete To: Andres Freund Cc: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000aa1e8c064b528709" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000aa1e8c064b528709 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Feb 4, 2026 at 12:32=E2=80=AFAM Alexander Korotkov wrote: > > On Tue, Feb 3, 2026 at 6:26=E2=80=AFPM Andres Freund = wrote: > > > > While looking at converting more places to UnlockReleaseBuffer(), in th= e > > course of making UnlockReleaseBuffer() faster than the two separate > > operations, I found this code: > > > > static bool > > ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, > > DataPageDeleteStack *parent, OffsetNumb= er myoff) > > ... > > > > if (!meDelete) > > { > > if (BufferIsValid(me->leftBuffer)) > > UnlockReleaseBuffer(me->leftBuffer); > > me->leftBuffer =3D buffer; > > } > > else > > { > > if (!isRoot) > > LockBuffer(buffer, GIN_UNLOCK); > > > > ReleaseBuffer(buffer); > > } > > > > if (isRoot) > > ReleaseBuffer(buffer); > > > > > > Which sure looks like it'd release buffer twice if isRoot is set? I gu= ess > > that's not reachable, because presumably the root page will always go d= own the > > !meDelete path. But it sure made me wonder if there's a hard to reach b= ug. > > Yes, it's not possible to have meDelete set for root, because > me->leftBuffer is always InvalidBuffer for the root. So the branch > handling meDelete case should better do Assert(!isRoot). > > > This code was introduced in > > commit e14641197a5 > > Author: Alexander Korotkov > > Date: 2019-11-19 23:07:36 +0300 > > > > Fix deadlock between ginDeletePage() and ginStepRight() > > > > I didn't trace it further to see if it existed before that in some fash= ion. > > Yes. I think generally this area needs to be reworked to become more > clear, and have vast more comments. It was wrong from my side trying > to fix bugs there without reworking it into something more > appropriate. I'm planning to put work on this during this week. > > > There's another oddity here: ginScanToDelete() requires that the root p= age has > > been locked by the caller already, but will afaict re-read the root pag= e? But > > then have code to avoid locking it again, because that would not have w= orked? > > Seems odd. > > > It seems a bit odd for me that caller already have locked buffer, but > passes BlockNumber making us re-read the buffer. But I'm not sure > that's the same as your point. Could you, please, elaborate more on > this? Here is the refactoring patch. Sorry for the delay. ------ Regards, Alexander Korotkov Supabase --000000000000aa1e8c064b528709 Content-Type: application/octet-stream; name="v1-0001-Rework-ginScanToDelete-to-pass-Buffers-instead-of.patch" Content-Disposition: attachment; filename="v1-0001-Rework-ginScanToDelete-to-pass-Buffers-instead-of.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlw546xn0 RnJvbSAwYzRkMDk4Yzk4MWUyOTc4NTdmNTI3NjgzZThhZWQ0ZDA3MDk4Njg5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogU2F0LCAyMSBGZWIgMjAyNiAxMTowODowOCArMDIwMApTdWJqZWN0OiBb UEFUQ0ggdjFdIFJld29yayBnaW5TY2FuVG9EZWxldGUoKSB0byBwYXNzIEJ1ZmZlcnMgaW5zdGVh ZCBvZgogQmxvY2tOdW1iZXJzLgoKUHJldmlvdXNseSwgZ2luU2NhblRvRGVsZXRlKCkgYW5kIGdp bkRlbGV0ZVBhZ2UoKSBwYXNzZWQgQmxvY2tOdW1iZXJzIGFuZApyZS1yZWFkIHBhZ2VzIHRoYXQg d2VyZSBhbHJlYWR5IHBpbm5lZCBhbmQgbG9ja2VkIGR1cmluZyB0aGUgdHJlZSB3YWxrLiAgVGhl CmNhbGxlciBnaW5WYWN1dW1Qb3N0aW5nVHJlZSgpKSBoZWxkIGEgY2xlYW51cC1sb2NrZWQgcm9v dCBidWZmZXIsIHlldApnaW5TY2FuVG9EZWxldGUoKSByZS1yZWFkIGl0IGJ5IGJsb2NrIG51bWJl ciB3aXRoIHNwZWNpYWwtY2FzZSBjb2RlIHRvIHNraXAKcmUtbG9ja2luZy4KClJld29yayBib3Ro IGZ1bmN0aW9ucyB0byBwYXNzIEJ1ZmZlcnMgZGlyZWN0bHkuICBEYXRhUGFnZURlbGV0ZVN0YWNr IG5vdwpjYXJyaWVzIGJ1ZmZlciwgbXlvZmYgKGRvd25saW5rIG9mZnNldCBpbiBwYXJlbnQpLCBh bmQgaXNSb290IHBlciBsZXZlbCwKc28gZ2luU2NhblRvRGVsZXRlKCkgdGFrZXMgb25seSBHaW5W YWN1dW1TdGF0ZSBhbmQgRGF0YVBhZ2VEZWxldGVTdGFjawpwb2ludGVycy4gIEFsc28sIGdpbkRl bGV0ZVBhZ2UoKSByZWNlaXZlcyB0aGUgdGhyZWUgQnVmZmVycyBkaXJlY3RseSwgYW5kCm5vIGxv bmdlciByZWFkcyBvciByZWxlYXNlcyB0aGVtIGl0c2VsZi4gIFRoZSBjYWxsZXIgcmVhZHMgYW5k IGxvY2tzIGNoaWxkCnBhZ2VzIGJlZm9yZSByZWN1cnNpbmcsIGFuZCBtYW5hZ2VzIGJ1ZmZlciBs aWZlY3ljbGUgYWZ0ZXJ3YXJkLgoKVGhpcyBlbGltaW5hdGVzIHRoZSBjb25mdXNpbmcgaXNSb290 IHNwZWNpYWwgY2FzZXMgaW4gYnVmZmVyIG1hbmFnZW1lbnQsCmluY2x1ZGluZyB0aGUgYXBwYXJl bnQgKGJ1dCB1bnJlYWNoYWJsZSkgZG91YmxlIHJlbGVhc2Ugb2YgdGhlIHJvb3QKYnVmZmVyIGlk ZW50aWZpZWQgYnkgQW5kcmVzIEZyZXVuZC4KCkFkZCBjb21tZW50cyBleHBsYWluaW5nIHRoZSBs b2NraW5nIHByb3RvY29sIGFuZCB0aGUgRGF0YVBhZ2VEZWxldGVTdGFjawpzdHJ1Y3R1cmUuCgpS ZXBvcnRlZC1ieTogQW5kcmVzIEZyZXVuZCA8YW5kcmVzQGFuYXJhemVsLmRlPgpEaXNjdXNzaW9u OiBodHRwczovL3Bvc3Rnci5lcy9tL3V0cmx4aWo0M2ZiZ3V6dzRrbGR0ZTJzcGM0YnRvbGRpenV0 Y3F5cmZha3FuYnJwM2lyQHBoM3NwaHBqNGFzegotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9naW4v Z2ludmFjdXVtLmMgfCAxODggKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0KIDEgZmlsZSBj aGFuZ2VkLCAxMTEgaW5zZXJ0aW9ucygrKSwgNzcgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEv c3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW52YWN1dW0uYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2ludmFjdXVtLmMKaW5kZXggYzlmMTQzZjZjMzEuLjI4MDAyYWM5N2Y2IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnZhY3V1bS5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9naW4vZ2ludmFjdXVtLmMKQEAgLTExMCwzMSArMTEwLDUyIEBAIHhsb2dWYWN1dW1QYWdl KFJlbGF0aW9uIGluZGV4LCBCdWZmZXIgYnVmZmVyKQogfQogCiAKKy8qCisgKiBTdGFjayBlbnRy eSB1c2VkIGR1cmluZyBwb3N0aW5nIHRyZWUgZW1wdHktcGFnZSBkZWxldGlvbiBzY2FuLgorICoK KyAqIE9uZSBEYXRhUGFnZURlbGV0ZVN0YWNrIGVudHJ5IGlzIGFsbG9jYXRlZCBwZXIgdHJlZSBs ZXZlbC4gIEFzCisgKiBnaW5TY2FuVG9EZWxldGUoKSByZWN1cnNlcyBkb3duIHRoZSB0cmVlLCBl YWNoIGVudHJ5IHRyYWNrcyB0aGUgYnVmZmVyCisgKiBvZiB0aGUgcGFnZSBjdXJyZW50bHkgYmVp bmcgdmlzaXRlZCBhdCB0aGF0IGxldmVsICgnYnVmZmVyJyksIGFuZCB0aGUKKyAqIHJpZ2h0bW9z dCBub24tZGVsZXRlZCBwYWdlIHRvIGl0cyBsZWZ0ICgnbGVmdEJ1ZmZlcicpLiAgVGhlIGxlZnQg cGFnZQorICogaXMga2VwdCBwaW5uZWQgYW5kIGV4Y2x1c2l2ZWx5IGxvY2tlZCBiZWNhdXNlIGdp bkRlbGV0ZVBhZ2UoKSBuZWVkcyBpdAorICogdG8gdXBkYXRlIHRoZSBzaWJsaW5nIGNoYWluOyBh Y3F1aXJpbmcgaXQgbGF0ZXIgY291bGQgZGVhZGxvY2sgd2l0aAorICogZ2luU3RlcFJpZ2h0KCks IHdoaWNoIGxvY2tzIHBhZ2VzIGxlZnQtdG8tcmlnaHQgKHNlZSBjb21taXQgZTE0NjQxMTk3YTUp LgorICovCiB0eXBlZGVmIHN0cnVjdCBEYXRhUGFnZURlbGV0ZVN0YWNrCiB7CiAJc3RydWN0IERh dGFQYWdlRGVsZXRlU3RhY2sgKmNoaWxkOwogCXN0cnVjdCBEYXRhUGFnZURlbGV0ZVN0YWNrICpw YXJlbnQ7CiAKLQlCbG9ja051bWJlciBibGtubzsJCQkvKiBjdXJyZW50IGJsb2NrIG51bWJlciAq LwotCUJ1ZmZlcgkJbGVmdEJ1ZmZlcjsJCS8qIHBpbm5lZCBhbmQgbG9ja2VkIHJpZ2h0ZXN0IG5v bi1kZWxldGVkIHBhZ2UKLQkJCQkJCQkJICogb24gbGVmdCAqLworCUJ1ZmZlcgkJYnVmZmVyOwkJ CS8qIGJ1ZmZlciBmb3IgdGhlIHBhZ2UgYmVpbmcgdmlzaXRlZCBhdCB0aGlzCisJCQkJCQkJCSAq IHRyZWUgbGV2ZWw7IHZhbGlkIG9ubHkgd2hpbGUgcmVjdXJzaW5nCisJCQkJCQkJCSAqIGludG8g Y2hpbGRyZW4gKi8KKwlCdWZmZXIJCWxlZnRCdWZmZXI7CQkvKiBwaW5uZWQgYW5kIGxvY2tlZCBy aWdodG1vc3Qgbm9uLWRlbGV0ZWQKKwkJCQkJCQkJICogc2libGluZyB0byB0aGUgbGVmdCBvZiB0 aGUgY3VycmVudCBwYWdlICovCisJT2Zmc2V0TnVtYmVyIG15b2ZmOwkJCS8qIG9mZnNldCBvZiB0 aGlzIHBhZ2UncyBkb3dubGluayBpbiB0aGUKKwkJCQkJCQkJICogcGFyZW50ICovCiAJYm9vbAkJ aXNSb290OwogfSBEYXRhUGFnZURlbGV0ZVN0YWNrOwogCiAKIC8qCiAgKiBEZWxldGUgYSBwb3N0 aW5nIHRyZWUgcGFnZS4KKyAqCisgKiBSZW1vdmVzIHRoZSBwYWdlIGlkZW50aWZpZWQgYnkgZEJ1 ZmZlciBmcm9tIHRoZSBwb3N0aW5nIHRyZWUgYnkgdXBkYXRpbmcKKyAqIHRoZSBsZWZ0IHNpYmxp bmcncyByaWdodGxpbmsgKGluIGxCdWZmZXIpIHRvIHNraXAgb3ZlciB0aGUgZGVsZXRlZCBwYWdl LAorICogYW5kIHJlbW92aW5nIHRoZSBkb3dubGluayBmcm9tIHRoZSBwYXJlbnQgcGFnZSAoaW4g cEJ1ZmZlcikuICBBbGwgdGhyZWUKKyAqIGJ1ZmZlcnMgbXVzdCBhbHJlYWR5IGJlIHBpbm5lZCBh bmQgZXhjbHVzaXZlbHkgbG9ja2VkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogVGhlIGJ1ZmZlcnMg YXJlIE5PVCByZWxlYXNlZCBub3IgdW5sb2NrZWQgaGVyZTsgdGhlIGNhbGxlciBpcyByZXNwb25z aWJsZQorICogZm9yIHRoaXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1naW5EZWxldGVQYWdlKEdpblZh Y3V1bVN0YXRlICpndnMsIEJsb2NrTnVtYmVyIGRlbGV0ZUJsa25vLCBCbG9ja051bWJlciBsZWZ0 Qmxrbm8sCi0JCQkgIEJsb2NrTnVtYmVyIHBhcmVudEJsa25vLCBPZmZzZXROdW1iZXIgbXlvZmYs IGJvb2wgaXNQYXJlbnRSb290KQorZ2luRGVsZXRlUGFnZShHaW5WYWN1dW1TdGF0ZSAqZ3ZzLCBC dWZmZXIgZEJ1ZmZlciwgQnVmZmVyIGxCdWZmZXIsCisJCQkgIEJ1ZmZlciBwQnVmZmVyLCBPZmZz ZXROdW1iZXIgbXlvZmYsIGJvb2wgaXNQYXJlbnRSb290KQogewotCUJ1ZmZlcgkJZEJ1ZmZlcjsK LQlCdWZmZXIJCWxCdWZmZXI7Ci0JQnVmZmVyCQlwQnVmZmVyOwogCVBhZ2UJCXBhZ2UsCiAJCQkJ cGFyZW50UGFnZTsKIAlCbG9ja051bWJlciByaWdodGxpbms7CisJQmxvY2tOdW1iZXIgZGVsZXRl Qmxrbm8gPSBCdWZmZXJHZXRCbG9ja051bWJlcihkQnVmZmVyKTsKIAogCS8qCiAJICogVGhpcyBm dW5jdGlvbiBNVVNUIGJlIGNhbGxlZCBvbmx5IGlmIHNvbWVvbmUgb2YgcGFyZW50IHBhZ2VzIGhv bGQKQEAgLTE0MiwxMiArMTYzLDYgQEAgZ2luRGVsZXRlUGFnZShHaW5WYWN1dW1TdGF0ZSAqZ3Zz LCBCbG9ja051bWJlciBkZWxldGVCbGtubywgQmxvY2tOdW1iZXIgbGVmdEJsa24KIAkgKiBoYXBw ZW4gaW4gdGhpcyBzdWJ0cmVlLiBDYWxsZXIgYWxzbyBhY3F1aXJlcyBFeGNsdXNpdmUgbG9ja3Mg b24KIAkgKiBkZWxldGFibGUsIHBhcmVudCBhbmQgbGVmdCBwYWdlcy4KIAkgKi8KLQlsQnVmZmVy ID0gUmVhZEJ1ZmZlckV4dGVuZGVkKGd2cy0+aW5kZXgsIE1BSU5fRk9SS05VTSwgbGVmdEJsa25v LAotCQkJCQkJCQkgUkJNX05PUk1BTCwgZ3ZzLT5zdHJhdGVneSk7Ci0JZEJ1ZmZlciA9IFJlYWRC dWZmZXJFeHRlbmRlZChndnMtPmluZGV4LCBNQUlOX0ZPUktOVU0sIGRlbGV0ZUJsa25vLAotCQkJ CQkJCQkgUkJNX05PUk1BTCwgZ3ZzLT5zdHJhdGVneSk7Ci0JcEJ1ZmZlciA9IFJlYWRCdWZmZXJF eHRlbmRlZChndnMtPmluZGV4LCBNQUlOX0ZPUktOVU0sIHBhcmVudEJsa25vLAotCQkJCQkJCQkg UkJNX05PUk1BTCwgZ3ZzLT5zdHJhdGVneSk7CiAKIAlwYWdlID0gQnVmZmVyR2V0UGFnZShkQnVm ZmVyKTsKIAlyaWdodGxpbmsgPSBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5yaWdodGxpbms7CkBA IC0yMjYsNTUgKzI0MSwzNyBAQCBnaW5EZWxldGVQYWdlKEdpblZhY3V1bVN0YXRlICpndnMsIEJs b2NrTnVtYmVyIGRlbGV0ZUJsa25vLCBCbG9ja051bWJlciBsZWZ0QmxrbgogCiAJRU5EX0NSSVRf U0VDVElPTigpOwogCi0JUmVsZWFzZUJ1ZmZlcihwQnVmZmVyKTsKLQlSZWxlYXNlQnVmZmVyKGxC dWZmZXIpOwotCVJlbGVhc2VCdWZmZXIoZEJ1ZmZlcik7Ci0KIAlndnMtPnJlc3VsdC0+cGFnZXNf bmV3bHlfZGVsZXRlZCsrOwogCWd2cy0+cmVzdWx0LT5wYWdlc19kZWxldGVkKys7CiB9CiAKIAog LyoKLSAqIFNjYW5zIHBvc3RpbmcgdHJlZSBhbmQgZGVsZXRlcyBlbXB0eSBwYWdlcy4gIENhbGxl ciBtdXN0IGxvY2sgcm9vdCBwYWdlIGZvcgotICogY2xlYW51cC4gIER1cmluZyBzY2FuIHBhdGgg ZnJvbSByb290IHRvIGN1cnJlbnQgcGFnZSBpcyBrZXB0IGV4Y2x1c2l2ZWx5Ci0gKiBsb2NrZWQu ICBBbHNvIGtlZXAgbGVmdCBwYWdlIGV4Y2x1c2l2ZWx5IGxvY2tlZCwgYmVjYXVzZSBnaW5EZWxl dGVQYWdlKCkKLSAqIG5lZWRzIGl0LiAgSWYgd2UgdHJ5IHRvIHJlbG9jayBsZWZ0IHBhZ2UgbGF0 ZXIsIGl0IGNvdWxkIGRlYWRsb2NrIHdpdGgKLSAqIGdpblN0ZXBSaWdodCgpLgorICogU2NhbnMg YSBwb3N0aW5nIHRyZWUgYW5kIGRlbGV0ZXMgZW1wdHkgcGFnZXMuCisgKgorICogVGhlIGNhbGxl ciBtdXN0IGhvbGQgYSBjbGVhbnVwIGxvY2sgb24gdGhlIHJvb3QgcGFnZSB0byBwcmV2ZW50IGNv bmN1cnJlbnQKKyAqIGluc2VydHMuICBUaGUgZW50aXJlIHBhdGggZnJvbSB0aGUgcm9vdCBkb3du IHRvIHRoZSBjdXJyZW50IHBhZ2UgaXMga2VwdAorICogZXhjbHVzaXZlbHkgbG9ja2VkIHRocm91 Z2hvdXQgdGhlIHNjYW4uICBUaGUgbGVmdCBzaWJsaW5nIGF0IGVhY2ggbGV2ZWwgaXMKKyAqIGFs c28ga2VwdCBsb2NrZWQsIGJlY2F1c2UgZ2luRGVsZXRlUGFnZSgpIG5lZWRzIGl0IHRvIHVwZGF0 ZSB0aGUgcmlnaHRsaW5rCisgKiBvZiB0aGUgbGVmdCBzaWJsaW5nOyByZS1hY3F1aXJpbmcgdGhl IGxlZnQgc2libGluZyBsb2NrIGxhdGVyIGNvdWxkCisgKiBkZWFkbG9jayB3aXRoIGdpblN0ZXBS aWdodCgpLCB3aGljaCBhY3F1aXJlcyBwYWdlIGxvY2tzIGxlZnQtdG8tcmlnaHQuCisgKgorICog QWxsIHBlci1sZXZlbCBzdGF0ZSBpcyBjYXJyaWVkIGluICdteVN0YWNrSXRlbSc6IHRoZSBidWZm ZXIgdG8gcHJvY2VzcworICogKG11c3QgYWxyZWFkeSBiZSBwaW5uZWQgYW5kIGV4Y2x1c2l2ZWx5 IGxvY2tlZCksIHRoZSBsZWZ0IHNpYmxpbmcgYnVmZmVyLAorICogYW5kIHRoaXMgcGFnZSdzIG9m ZnNldCBpbiB0aGUgcGFyZW50J3MgZG93bmxpbmsgYXJyYXkuICBUaGUgcm9vdCBlbnRyeSBpcwor ICogc2V0IHVwIGJ5IGdpblZhY3V1bVBvc3RpbmdUcmVlKCk7IGNoaWxkIGVudHJpZXMgYXJlIHBv cHVsYXRlZCBoZXJlIGJlZm9yZQorICogcmVjdXJzaW5nLgorICoKKyAqIFJldHVybnMgdHJ1ZSBp ZiB0aGUgcGFnZSB3YXMgZGVsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgYm9v bAotZ2luU2NhblRvRGVsZXRlKEdpblZhY3V1bVN0YXRlICpndnMsIEJsb2NrTnVtYmVyIGJsa25v LCBib29sIGlzUm9vdCwKLQkJCQlEYXRhUGFnZURlbGV0ZVN0YWNrICpwYXJlbnQsIE9mZnNldE51 bWJlciBteW9mZikKK2dpblNjYW5Ub0RlbGV0ZShHaW5WYWN1dW1TdGF0ZSAqZ3ZzLCBEYXRhUGFn ZURlbGV0ZVN0YWNrICpteVN0YWNrSXRlbSkKIHsKLQlEYXRhUGFnZURlbGV0ZVN0YWNrICptZTsK LQlCdWZmZXIJCWJ1ZmZlcjsKKwlCdWZmZXIJCWJ1ZmZlciA9IG15U3RhY2tJdGVtLT5idWZmZXI7 CiAJUGFnZQkJcGFnZTsKLQlib29sCQltZURlbGV0ZSA9IGZhbHNlOworCWJvb2wJCXBhZ2VXYXNE ZWxldGVkID0gZmFsc2U7CiAJYm9vbAkJaXNlbXB0eTsKIAotCWlmIChpc1Jvb3QpCi0JewotCQlt ZSA9IHBhcmVudDsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKCFwYXJlbnQtPmNoaWxkKQotCQl7Ci0J CQltZSA9IHBhbGxvYzBfb2JqZWN0KERhdGFQYWdlRGVsZXRlU3RhY2spOwotCQkJbWUtPnBhcmVu dCA9IHBhcmVudDsKLQkJCXBhcmVudC0+Y2hpbGQgPSBtZTsKLQkJCW1lLT5sZWZ0QnVmZmVyID0g SW52YWxpZEJ1ZmZlcjsKLQkJfQotCQllbHNlCi0JCQltZSA9IHBhcmVudC0+Y2hpbGQ7Ci0JfQot Ci0JYnVmZmVyID0gUmVhZEJ1ZmZlckV4dGVuZGVkKGd2cy0+aW5kZXgsIE1BSU5fRk9SS05VTSwg Ymxrbm8sCi0JCQkJCQkJCVJCTV9OT1JNQUwsIGd2cy0+c3RyYXRlZ3kpOwotCi0JaWYgKCFpc1Jv b3QpCi0JCUxvY2tCdWZmZXIoYnVmZmVyLCBHSU5fRVhDTFVTSVZFKTsKLQogCXBhZ2UgPSBCdWZm ZXJHZXRQYWdlKGJ1ZmZlcik7CiAKIAlBc3NlcnQoR2luUGFnZUlzRGF0YShwYWdlKSk7CkBAIC0y ODMsMTkgKzI4MCw0OCBAQCBnaW5TY2FuVG9EZWxldGUoR2luVmFjdXVtU3RhdGUgKmd2cywgQmxv Y2tOdW1iZXIgYmxrbm8sIGJvb2wgaXNSb290LAogCXsKIAkJT2Zmc2V0TnVtYmVyIGk7CiAKLQkJ bWUtPmJsa25vID0gYmxrbm87Ci0JCWZvciAoaSA9IEZpcnN0T2Zmc2V0TnVtYmVyOyBpIDw9IEdp blBhZ2VHZXRPcGFxdWUocGFnZSktPm1heG9mZjsgaSsrKQorCQlmb3IgKGkgPSBGaXJzdE9mZnNl dE51bWJlcjsgaSA8PSBHaW5QYWdlR2V0T3BhcXVlKHBhZ2UpLT5tYXhvZmY7KQogCQl7CiAJCQlQ b3N0aW5nSXRlbSAqcGl0ZW0gPSBHaW5EYXRhUGFnZUdldFBvc3RpbmdJdGVtKHBhZ2UsIGkpOwor CQkJQnVmZmVyCQljaGlsZEJ1ZmZlcjsKKworCQkJY2hpbGRCdWZmZXIgPSBSZWFkQnVmZmVyRXh0 ZW5kZWQoZ3ZzLT5pbmRleCwKKwkJCQkJCQkJCQkJIE1BSU5fRk9SS05VTSwKKwkJCQkJCQkJCQkJ IFBvc3RpbmdJdGVtR2V0QmxvY2tOdW1iZXIocGl0ZW0pLAorCQkJCQkJCQkJCQkgUkJNX05PUk1B TCwgZ3ZzLT5zdHJhdGVneSk7CisJCQlMb2NrQnVmZmVyKGNoaWxkQnVmZmVyLCBHSU5fRVhDTFVT SVZFKTsKKworCQkJLyogQWxsb2NhdGUgYSBjaGlsZCBzdGFjayBlbnRyeSBvbiBmaXJzdCB1c2U7 IHJldXNlIHRoZXJlYWZ0ZXIgKi8KKwkJCWlmICghbXlTdGFja0l0ZW0tPmNoaWxkKQorCQkJewor CQkJCW15U3RhY2tJdGVtLT5jaGlsZCA9IHBhbGxvYzBfb2JqZWN0KERhdGFQYWdlRGVsZXRlU3Rh Y2spOworCQkJCW15U3RhY2tJdGVtLT5jaGlsZC0+cGFyZW50ID0gbXlTdGFja0l0ZW07CisJCQkJ bXlTdGFja0l0ZW0tPmNoaWxkLT5sZWZ0QnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsKKwkJCX0KIAot CQkJaWYgKGdpblNjYW5Ub0RlbGV0ZShndnMsIFBvc3RpbmdJdGVtR2V0QmxvY2tOdW1iZXIocGl0 ZW0pLCBmYWxzZSwgbWUsIGkpKQotCQkJCWktLTsKKwkJCW15U3RhY2tJdGVtLT5jaGlsZC0+YnVm ZmVyID0gY2hpbGRCdWZmZXI7CisJCQlteVN0YWNrSXRlbS0+Y2hpbGQtPmlzUm9vdCA9IGZhbHNl OworCQkJbXlTdGFja0l0ZW0tPmNoaWxkLT5teW9mZiA9IGk7CisKKwkJCS8qCisJCQkgKiBSZWN1 cnNlIGludG8gY2hpbGQuICBJZiB0aGUgY2hpbGQgcGFnZSB3YXMgZGVsZXRlZCwgaXRzCisJCQkg KiBkb3dubGluayB3YXMgcmVtb3ZlZCBmcm9tIG91ciBwYWdlLCBzbyByZS1leGFtaW5lIHRoZSBz YW1lCisJCQkgKiBvZmZzZXQ7IG90aGVyd2lzZSBhZHZhbmNlIHRvIHRoZSBuZXh0IGRvd25saW5r LgorCQkJICovCisJCQlpZiAoIWdpblNjYW5Ub0RlbGV0ZShndnMsIG15U3RhY2tJdGVtLT5jaGls ZCkpCisJCQkJaSsrOwogCQl9CisJCW15U3RhY2tJdGVtLT5idWZmZXIgPSBJbnZhbGlkQnVmZmVy OwogCi0JCWlmIChHaW5QYWdlUmlnaHRNb3N0KHBhZ2UpICYmIEJ1ZmZlcklzVmFsaWQobWUtPmNo aWxkLT5sZWZ0QnVmZmVyKSkKKwkJLyoKKwkJICogQWZ0ZXIgcHJvY2Vzc2luZyBhbGwgY2hpbGRy ZW4gYXQgdGhpcyBsZXZlbCwgcmVsZWFzZSB0aGUgY2hpbGQKKwkJICogbGV2ZWwncyBsZWZ0QnVm ZmVyIGlmIHdlJ3JlIGF0IHRoZSByaWdodG1vc3QgcGFnZS4gIFRoZXJlIGlzIG5vCisJCSAqIHJp Z2h0IHNpYmxpbmcgdGhhdCBjb3VsZCBuZWVkIGl0IGZvciBkZWxldGlvbi4KKwkJICovCisJCWlm IChHaW5QYWdlUmlnaHRNb3N0KHBhZ2UpICYmIEJ1ZmZlcklzVmFsaWQobXlTdGFja0l0ZW0tPmNo aWxkLT5sZWZ0QnVmZmVyKSkKIAkJewotCQkJVW5sb2NrUmVsZWFzZUJ1ZmZlcihtZS0+Y2hpbGQt PmxlZnRCdWZmZXIpOwotCQkJbWUtPmNoaWxkLT5sZWZ0QnVmZmVyID0gSW52YWxpZEJ1ZmZlcjsK KwkJCVVubG9ja1JlbGVhc2VCdWZmZXIobXlTdGFja0l0ZW0tPmNoaWxkLT5sZWZ0QnVmZmVyKTsK KwkJCW15U3RhY2tJdGVtLT5jaGlsZC0+bGVmdEJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CiAJCX0K IAl9CiAKQEAgLTMwNiwzNCArMzMyLDQwIEBAIGdpblNjYW5Ub0RlbGV0ZShHaW5WYWN1dW1TdGF0 ZSAqZ3ZzLCBCbG9ja051bWJlciBibGtubywgYm9vbCBpc1Jvb3QsCiAKIAlpZiAoaXNlbXB0eSkK IAl7Ci0JCS8qIHdlIG5ldmVyIGRlbGV0ZSB0aGUgbGVmdC0gb3IgcmlnaHRtb3N0IGJyYW5jaCAq LwotCQlpZiAoQnVmZmVySXNWYWxpZChtZS0+bGVmdEJ1ZmZlcikgJiYgIUdpblBhZ2VSaWdodE1v c3QocGFnZSkpCisJCS8qCisJCSAqIFByb2NlZWQgdG8gdGhlIGdpbkRlbGV0ZVBhZ2UoKSBpZiB0 aGF0J3Mgbm90IHRoZSBsZWZ0bW9zdCBvcgorCQkgKiB0aGUgcmlnaHRtb3N0IHBhZ2UuCisJCSAq LworCQlpZiAoQnVmZmVySXNWYWxpZChteVN0YWNrSXRlbS0+bGVmdEJ1ZmZlcikgJiYgIUdpblBh Z2VSaWdodE1vc3QocGFnZSkpCiAJCXsKLQkJCUFzc2VydCghaXNSb290KTsKLQkJCWdpbkRlbGV0 ZVBhZ2UoZ3ZzLCBibGtubywgQnVmZmVyR2V0QmxvY2tOdW1iZXIobWUtPmxlZnRCdWZmZXIpLAot CQkJCQkJICBtZS0+cGFyZW50LT5ibGtubywgbXlvZmYsIG1lLT5wYXJlbnQtPmlzUm9vdCk7Ci0J CQltZURlbGV0ZSA9IHRydWU7CisJCQlBc3NlcnQoIW15U3RhY2tJdGVtLT5pc1Jvb3QpOworCQkJ Z2luRGVsZXRlUGFnZShndnMsIGJ1ZmZlciwgbXlTdGFja0l0ZW0tPmxlZnRCdWZmZXIsCisJCQkJ CQkgIG15U3RhY2tJdGVtLT5wYXJlbnQtPmJ1ZmZlciwgbXlTdGFja0l0ZW0tPm15b2ZmLAorCQkJ CQkJICBteVN0YWNrSXRlbS0+cGFyZW50LT5pc1Jvb3QpOworCQkJcGFnZVdhc0RlbGV0ZWQgPSB0 cnVlOwogCQl9CiAJfQogCi0JaWYgKCFtZURlbGV0ZSkKKwlpZiAoIXBhZ2VXYXNEZWxldGVkKQog CXsKLQkJaWYgKEJ1ZmZlcklzVmFsaWQobWUtPmxlZnRCdWZmZXIpKQotCQkJVW5sb2NrUmVsZWFz ZUJ1ZmZlcihtZS0+bGVmdEJ1ZmZlcik7Ci0JCW1lLT5sZWZ0QnVmZmVyID0gYnVmZmVyOworCQkv KgorCQkgKiBLZWVwIHRoaXMgcGFnZSBhcyB0aGUgbmV3IGxlZnRCdWZmZXIgZm9yIHRoaXMgbGV2 ZWw6IHRoZSBuZXh0CisJCSAqIHNpYmxpbmcgdG8gdGhlIHJpZ2h0IG1pZ2h0IG5lZWQgaXQgZm9y IGRlbGV0aW9uLiAgUmVsZWFzZSBhbnkKKwkJICogcHJldmlvdXNseSBoZWxkIGxlZnQgcGFnZSBm aXJzdC4KKwkJICovCisJCWlmIChCdWZmZXJJc1ZhbGlkKG15U3RhY2tJdGVtLT5sZWZ0QnVmZmVy KSkKKwkJCVVubG9ja1JlbGVhc2VCdWZmZXIobXlTdGFja0l0ZW0tPmxlZnRCdWZmZXIpOworCQlt eVN0YWNrSXRlbS0+bGVmdEJ1ZmZlciA9IGJ1ZmZlcjsKIAl9CiAJZWxzZQogCXsKLQkJaWYgKCFp c1Jvb3QpCi0JCQlMb2NrQnVmZmVyKGJ1ZmZlciwgR0lOX1VOTE9DSyk7Ci0KLQkJUmVsZWFzZUJ1 ZmZlcihidWZmZXIpOworCQkvKgorCQkgKiBQYWdlIHdhcyBkZWxldGVkOyByZWxlYXNlIHRoZSBi dWZmZXIuICBsZWZ0QnVmZmVyIHJlbWFpbnMgdGhlIHNhbWUuCisJCSAqLworCQlVbmxvY2tSZWxl YXNlQnVmZmVyKGJ1ZmZlcik7CiAJfQogCi0JaWYgKGlzUm9vdCkKLQkJUmVsZWFzZUJ1ZmZlcihi dWZmZXIpOwotCi0JcmV0dXJuIG1lRGVsZXRlOworCXJldHVybiBwYWdlV2FzRGVsZXRlZDsKIH0K IAogCkBAIC00MjgsMTAgKzQ2MCwxMiBAQCBnaW5WYWN1dW1Qb3N0aW5nVHJlZShHaW5WYWN1dW1T dGF0ZSAqZ3ZzLCBCbG9ja051bWJlciByb290Qmxrbm8pCiAJCUxvY2tCdWZmZXJGb3JDbGVhbnVw KGJ1ZmZlcik7CiAKIAkJbWVtc2V0KCZyb290LCAwLCBzaXplb2YoRGF0YVBhZ2VEZWxldGVTdGFj aykpOworCQlyb290LmJ1ZmZlciA9IGJ1ZmZlcjsKIAkJcm9vdC5sZWZ0QnVmZmVyID0gSW52YWxp ZEJ1ZmZlcjsKKwkJcm9vdC5teW9mZiA9IEludmFsaWRPZmZzZXROdW1iZXI7CiAJCXJvb3QuaXNS b290ID0gdHJ1ZTsKIAotCQlnaW5TY2FuVG9EZWxldGUoZ3ZzLCByb290Qmxrbm8sIHRydWUsICZy b290LCBJbnZhbGlkT2Zmc2V0TnVtYmVyKTsKKwkJZ2luU2NhblRvRGVsZXRlKGd2cywgJnJvb3Qp OwogCiAJCXB0ciA9IHJvb3QuY2hpbGQ7CiAKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --000000000000aa1e8c064b528709--