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.98.2) (envelope-from ) id 1xArTH-00000002sO5-1GHM for pgsql-bugs@arkaria.postgresql.org; Sun, 27 Sep 2026 16:11:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.98.2) (envelope-from ) id 1xArTG-000000066Vo-28Rd for pgsql-bugs@arkaria.postgresql.org; Sun, 27 Sep 2026 16:11:22 +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.98.2) (envelope-from ) id 1xArTG-000000066Va-0jXv for pgsql-bugs@lists.postgresql.org; Sun, 27 Sep 2026 16:11:22 +0000 Received: from mail-dy2-x0f.google.com ([2607:f8b0:4864:36::f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1xArTD-00000001aPq-2EJv for pgsql-bugs@lists.postgresql.org; Sun, 27 Sep 2026 16:11:21 +0000 Received: by mail-dy2-x0f.google.com with SMTP id 5a478bee46e88-33e4e75342aso164499eec.1 for ; Sun, 27 Sep 2026 09:11:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790525477; x=1791130277; darn=lists.postgresql.org; h=content-type:mime-version:references:in-reply-to:message-id:date :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to :content-type; bh=h4X3mR3trcPdpnDcSwYLHo3d4ZE6a1DysggEmxSq8MQ=; b=sTiBzYFRvqeN96w4vh2tujQcXSQ/nsf7T48y4w2Gvj+0uOeFivYbxDA4P6cZGphpdd Q+WwgG1CO8PRlHVkOFgSSNTWW1ESp/DubuBPsSNqZA5wUupty24WRmxu5EjIDgemWrov PDXVOHH+OTRDF5/CqeH7YVT4LZkeS7eEqxefQdODweg4GpA0+cFOZJ9uNWoVUXEWdcfx hHGfgqBYePorSXq+T5OsFH1qFM3pkaBKtpxGC/Cv5BR8/ZSSm92X8OYgwKGBHeBL8CD1 0dLr9rkcC1dY7b2eKx2mGG5WkKH8fJkvII665N/o0x+y5VyfBONoFtpgd1P1JTP4td54 R1ig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790525477; x=1791130277; h=content-type:mime-version:references:in-reply-to:message-id:date :subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to:content-type; bh=h4X3mR3trcPdpnDcSwYLHo3d4ZE6a1DysggEmxSq8MQ=; b=h+eBN+UWMscQTbm+N0aE+2qj/wyL2xt8MIN+dwA9B0BvYtb6IFOXoqez6rPj0yb5yp IVh1p8QAYM6JOWFhIYUOVbGRS441jq5vAxeclK80lNsbRIdUAsH8XChAj+kJdEMKptG/ Jw1Q7Glg6nNImiZEiErqK8w8F11S8BSJiqyic9n+dDS39fmafW8JR4fdlTMoihXLikWQ myaHAkhGmVMeCLbzPgobKqyUqV06omzYcIEcZoDdvjJLkkUnzGTv5WGEc8dZogEnwWou dXk8cyfKlqbNUGB/Yv2meXjDuHJNakUK7dJ+I/+dmpnQAkgO3Vyx4FFjaE7LY+bMcjof IRdQ== X-Forwarded-Encrypted: i=1; AKwUvBzA6JmtytCOfdb9iPkrhi9uyHBmaUu0d7xMNZg2O1mo0UPRGj5M99Aqk8VdmpsWptAImV4Z6WPuMgiK@lists.postgresql.org X-Gm-Message-State: AFq9FYIwf3zDZXjGft/GO4Wn9J2+rgowjZkMwG0X44PoK8fTraSX96cN iYprR9HtdOZQevfO4uLtt3L6YjyQhy8aFIlT9kAA/cXMWm9Rzg9Q3CEf X-Gm-Gg: AYBFou0WV7q5mvWKUoyYViS3G6aWZH9M1EdP8cApWaKLlxRTjPgPWS4ldgIc5NI4kk6 dz3rP+1IiPo73DghZmy6MgeJPCvKr3c3yo/0/I05CwtIjSfgIsvXw4xdM1eg/x6/Uw6lzXd5a5k TPEYuBOVEUl0M+AsiZUEbuqawipW8k3zY4YCn1Multj6eJ02QWLBWeXw4VZJ4egzQqx0Ibac8q/ m5q1EM1Gx7c6dywTljPDNg7OVNpSYUgydJHSKZGxUdM3sBU/xVTrurOqwatAByWp7vGwIlhhhcf Alqfah2qKdmhxyinnLNer5UYtB/oHDPbLuOZf1U4ibkjv+2HiVsHzlvqFoS0soirs6s8vyxL9B/ iaa9uhURgVFBWSWQvx/Aq5ZC3O8OhQRl/WOZyxESeVmuKrFkPbbAaW7QeQgd1uh68KAxBkaLv+a p4gYFVWVLltSQ4jpkPcPMCP/HdMxsWuO2KikSK/10fK8Kvu4l2Y47dXT7Hvo+FB5LEFvwmCr7rt TlCtFx9Difnh+19kPwYZxoh3nNePOlAudiSBJqLvTpESXG0IBIixb+Y1Cby5Q1rK7SjUlD8eOa9 PE0ikQ0Q5xcanjp2dsRgP7GZpQ== X-Received: by 2002:a05:7300:cc93:b0:342:41f3:5b2f with SMTP id 5a478bee46e88-34271c886eemr10390084eec.2.1790525476831; Sun, 27 Sep 2026 09:11:16 -0700 (PDT) Received: from 192.168.1.109 ([2803:3c90:cee:ea00:5c3c:7e70:29e3:7a55]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-347323f5a7esm1490424eec.15.2026.09.27.09.11.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 27 Sep 2026 09:11:15 -0700 (PDT) From: Manu To: Alexandre Felipe , pgsql-bugs@lists.postgresql.org Cc: Alexander Lakhin Subject: Re: BUG #19686: Rolling back SET TABLESPACE + INSERT leads to index corruption Date: Sun, 27 Sep 2026 13:11:13 -0300 Message-ID: <179052547394.318321.10043901456417388246@gmail.com> In-Reply-To: References: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0682097667753335172==" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --===============0682097667753335172== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit On 2026-09-15 08:59, Alexandre Felipe wrote: > I started investigating. > ... > Anyone else looking into this? I looked into it too; here is what I found, in case it is useful. The trigger is that ALTER TABLE ... SET TABLESPACE gives the heap a new relfilenode while the table's indexes deliberately keep theirs. The two then unwind differently on abort: the heap's new file is discarded, so the heap TIDs used by rows inserted after the SET TABLESPACE are free again, but the index entries for those rows were written to the unchanged index files and survive. A later insert reuses one of those freed TIDs, and the index is left with two entries pointing at the same live heap tuple. That fits your point that it is not really an nbtree problem: gist shows the same duplicate through an index-only scan, and the _bt_posting_valid assert from 0d861bbb7 only makes btree notice it. Dropping the insert, or the SET TABLESPACE, or turning the insert into an update all avoid it, which lines up with the TID-reuse explanation. Attached is a patch for discussion. After the heap is moved, ATExecSetTableSpace gives each of the table's indexes a new relfilenumber by copying it within its own tablespace, so the indexes share the heap's rollback: on abort the new heap and index files are discarded together, and on commit they are kept together. It closes both the btree and the gist case here, and make check-world passes. I first tried reindexing the indexes instead, which also fixes it, but on a 1M-row table with three indexes that made SET TABLESPACE roughly 20x slower (about 100 ms to 1.9 s); copying the files keeps it near 2x. As far as I can tell an abort-time fix is not possible, so SET TABLESPACE has to make the indexes safe up front, but whether this is the right way to do it is a question for people who know this code better than I do. Manu --===============0682097667753335172== Content-Type: text/x-patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v1-0001-Fix-index-corruption-SET-TABLESPACE-rollback.patch" MIME-Version: 1.0 RnJvbSAzYzU2NjJmZjI2OGFjMmIyZTgwMzEzMGI3MTk5NTE3MTYwZjVhNGU5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYW51IDxtYW51ZWxyZXllc2JyYXZvQGdtYWlsLmNvbT4KRGF0 ZTogU3VuLCAyNyBTZXAgMjAyNiAxMzowODozNiAtMDMwMApTdWJqZWN0OiBbUEFUQ0hdIEZpeCBp bmRleCBjb3JydXB0aW9uIGFmdGVyIHJvbGxpbmcgYmFjayBBTFRFUiBUQUJMRSBTRVQKIFRBQkxF U1BBQ0UKCkFMVEVSIFRBQkxFIC4uLiBTRVQgVEFCTEVTUEFDRSByZXdyaXRlcyBhIHRhYmxlJ3Mg aGVhcCB0byBhIG5ldwpyZWxmaWxlbm9kZSBidXQgZGVsaWJlcmF0ZWx5IGxlYXZlcyB0aGUgdGFi bGUncyBpbmRleGVzIG9uIHRoZWlyCmV4aXN0aW5nIHJlbGZpbGVub2Rlcy4gIFRoZSB0d28gdGhl biByb2xsIGJhY2sgYnkgZGlmZmVyZW50IG1lY2hhbmlzbXM6Cm9uIGFib3J0IHRoZSBoZWFwJ3Mg bmV3IGZpbGUgaXMgZGlzY2FyZGVkLCBzbyB0aGUgaGVhcCBUSURzIGNvbnN1bWVkIGJ5CnJvd3Mg aW5zZXJ0ZWQgYWZ0ZXIgdGhlIFNFVCBUQUJMRVNQQUNFIGJlY29tZSBmcmVlIGFnYWluLCB3aGls ZSB0aGUKaW5kZXggZW50cmllcyBmb3IgdGhvc2Ugcm93cyB3ZXJlIHdyaXR0ZW4gdG8gdGhlIHVu Y2hhbmdlZCBpbmRleCBmaWxlcwphbmQgc3Vydml2ZSB0aGUgYWJvcnQuICBBIGxhdGVyIGluc2Vy dCBjYW4gcmV1c2UgYSBmcmVlZCBoZWFwIFRJRCwKbGVhdmluZyB0d28gaW5kZXggZW50cmllcyB0 aGF0IHBvaW50IGF0IHRoZSBzYW1lIGxpdmUgaGVhcCB0dXBsZS4gIFRoaXMKc3VyZmFjZXMgYXMg YSBfYnRfcG9zdGluZ192YWxpZCBhc3NlcnRpb24gZmFpbHVyZSBpbiBuYnRyZWUKZGVkdXBsaWNh dGlvbiwgYW5kIGFzIGR1cGxpY2F0ZSByb3dzIHRocm91Z2ggYW4gaW5kZXgtb25seSBzY2FuIGlu IGdpc3QuCgpNYWtlIHRoZSBpbmRleGVzIHNoYXJlIHRoZSBoZWFwJ3MgcmV3cml0ZTogYWZ0ZXIg bW92aW5nIHRoZSBoZWFwLCBnaXZlCmVhY2ggb2YgdGhlIHRhYmxlJ3MgaW5kZXhlcyBhIG5ldyBy ZWxmaWxlbnVtYmVyIGJ5IGNvcHlpbmcgaXQgd2l0aGluIGl0cwpvd24gdGFibGVzcGFjZSwgc28g dGhhdCBhbiBhYm9ydCBkaXNjYXJkcyB0aGUgbmV3IGhlYXAgYW5kIGluZGV4IGZpbGVzCnRvZ2V0 aGVyIGFuZCBhIGNvbW1pdCBrZWVwcyB0aGVtIHRvZ2V0aGVyLgoKQnVnOiAjMTk2ODYKUmVwb3J0 ZWQtYnk6IEFsZXhhbmRlciBMYWtoaW4KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNt ZHMuYyB8IDkzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdl ZCwgOTMgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3Rh YmxlY21kcy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMKaW5kZXggMDI3NGQ4 OTJmMmUuLjkxOGQ1MTdhYzIzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJs ZWNtZHMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwpAQCAtNjk1LDYg KzY5NSw3IEBAIHN0YXRpYyB2b2lkIEFUUHJlcENoYW5nZVBlcnNpc3RlbmNlKEFsdGVyZWRUYWJs ZUluZm8gKnRhYiwgUmVsYXRpb24gcmVsLAogc3RhdGljIHZvaWQgQVRQcmVwU2V0VGFibGVTcGFj ZShBbHRlcmVkVGFibGVJbmZvICp0YWIsIFJlbGF0aW9uIHJlbCwKIAkJCQkJCQkJY29uc3QgY2hh ciAqdGFibGVzcGFjZW5hbWUsIExPQ0tNT0RFIGxvY2ttb2RlKTsKIHN0YXRpYyB2b2lkIEFURXhl Y1NldFRhYmxlU3BhY2UoT2lkIHRhYmxlT2lkLCBPaWQgbmV3VGFibGVTcGFjZSwgTE9DS01PREUg bG9ja21vZGUpOworc3RhdGljIHZvaWQgQVRFeGVjU2V0VGFibGVTcGFjZU5ld0luZGV4UmVsZmls ZW51bWJlcihPaWQgaW5kZXhPaWQsIExPQ0tNT0RFIGxvY2ttb2RlKTsKIHN0YXRpYyB2b2lkIEFU RXhlY1NldFRhYmxlU3BhY2VOb1N0b3JhZ2UoUmVsYXRpb24gcmVsLCBPaWQgbmV3VGFibGVTcGFj ZSk7CiBzdGF0aWMgdm9pZCBBVEV4ZWNTZXRSZWxPcHRpb25zKFJlbGF0aW9uIHJlbCwgTGlzdCAq ZGVmTGlzdCwKIAkJCQkJCQkJQWx0ZXJUYWJsZVR5cGUgb3BlcmF0aW9uLApAQCAtMTc1MjAsOSAr MTc1MjEsMTEgQEAgQVRFeGVjU2V0VGFibGVTcGFjZShPaWQgdGFibGVPaWQsIE9pZCBuZXdUYWJs ZVNwYWNlLCBMT0NLTU9ERSBsb2NrbW9kZSkKIHsKIAlSZWxhdGlvbglyZWw7CiAJT2lkCQkJcmVs dG9hc3RyZWxpZDsKKwljaGFyCQlyZWxraW5kOwogCVJlbEZpbGVOdW1iZXIgbmV3cmVsZmlsZW51 bWJlcjsKIAlSZWxGaWxlTG9jYXRvciBuZXdybG9jYXRvcjsKIAlMaXN0CSAgICpyZWx0b2FzdGlk eGlkcyA9IE5JTDsKKwlMaXN0CSAgICpyZWx0YWJpZHhpZHMgPSBOSUw7CiAJTGlzdENlbGwgICAq bGM7CiAKIAkvKgpAQCAtMTc1NDAsNiArMTc1NDMsNyBAQCBBVEV4ZWNTZXRUYWJsZVNwYWNlKE9p ZCB0YWJsZU9pZCwgT2lkIG5ld1RhYmxlU3BhY2UsIExPQ0tNT0RFIGxvY2ttb2RlKQogCX0KIAog CXJlbHRvYXN0cmVsaWQgPSByZWwtPnJkX3JlbC0+cmVsdG9hc3RyZWxpZDsKKwlyZWxraW5kID0g cmVsLT5yZF9yZWwtPnJlbGtpbmQ7CiAJLyogRmV0Y2ggdGhlIGxpc3Qgb2YgaW5kZXhlcyBvbiB0 b2FzdCByZWxhdGlvbiBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoT2lkSXNWYWxpZChyZWx0b2FzdHJl bGlkKSkKIAl7CkBAIC0xNzU4Niw2ICsxNzU5MCwxMyBAQCBBVEV4ZWNTZXRUYWJsZVNwYWNlKE9p ZCB0YWJsZU9pZCwgT2lkIG5ld1RhYmxlU3BhY2UsIExPQ0tNT0RFIGxvY2ttb2RlKQogCiAJUmVs YXRpb25Bc3N1bWVOZXdSZWxmaWxlbG9jYXRvcihyZWwpOwogCisJLyoKKwkgKiBJZiB0aGlzIGlz IGEgdGFibGUsIGNvbGxlY3QgaXRzIGluZGV4IGxpc3Qgbm93LCB3aGlsZSB0aGUgcmVsYXRpb24g aXMKKwkgKiBzdGlsbCBvcGVuLCBzbyB3ZSBjYW4gZ2l2ZSBlYWNoIGluZGV4IGEgZnJlc2ggcmVs ZmlsZW51bWJlciBiZWxvdy4KKwkgKi8KKwlpZiAocmVsa2luZCA9PSBSRUxLSU5EX1JFTEFUSU9O IHx8IHJlbGtpbmQgPT0gUkVMS0lORF9NQVRWSUVXKQorCQlyZWx0YWJpZHhpZHMgPSBSZWxhdGlv bkdldEluZGV4TGlzdChyZWwpOworCiAJcmVsYXRpb25fY2xvc2UocmVsLCBOb0xvY2spOwogCiAJ LyogTWFrZSBzdXJlIHRoZSByZWx0YWJsZXNwYWNlIGNoYW5nZSBpcyB2aXNpYmxlICovCkBAIC0x NzU5OSw2ICsxNzYxMCw4OCBAQCBBVEV4ZWNTZXRUYWJsZVNwYWNlKE9pZCB0YWJsZU9pZCwgT2lk IG5ld1RhYmxlU3BhY2UsIExPQ0tNT0RFIGxvY2ttb2RlKQogCiAJLyogQ2xlYW4gdXAgKi8KIAls aXN0X2ZyZWUocmVsdG9hc3RpZHhpZHMpOworCisJLyoKKwkgKiBNb3ZpbmcgYSB0YWJsZSdzIGhl YXAgYXNzaWducyBpdCBhIG5ldyByZWxmaWxlbm9kZSwgYnV0IGl0cyBpbmRleGVzIGFyZQorCSAq IGRlbGliZXJhdGVseSBsZWZ0IGluIHBsYWNlIHdpdGggdGhlaXIgZXhpc3RpbmcgcmVsZmlsZW5v ZGVzLiAgVGhhdCBtaXgKKwkgKiBpcyB1bnNhZmUgYWNyb3NzIGEgcm9sbGJhY2s6IGlmIHRoZSB0 cmFuc2FjdGlvbiBpbnNlcnRzIGludG8gdGhlIHRhYmxlCisJICogYWZ0ZXIgdGhpcyBhbmQgdGhl biBhYm9ydHMsIHRoZSBoZWFwJ3MgbmV3IHJlbGZpbGVub2RlIGlzIGRpc2NhcmRlZCBhbmQKKwkg KiBpdHMgZmlsZSByZXZlcnRzIHRvIHRoZSBwcmUtbW92ZSBjb250ZW50cywgZnJlZWluZyB0aGUg VElEcyB1c2VkIGJ5IHRoZQorCSAqIGFib3J0ZWQgcm93czsgYnV0IHRoZSBtYXRjaGluZyBpbmRl eCBlbnRyaWVzIHdlcmUgd3JpdHRlbiB0byB0aGUKKwkgKiB1bmNoYW5nZWQgaW5kZXggZmlsZXMg YW5kIHN1cnZpdmUgdGhlIGFib3J0LiAgQSBsYXRlciBpbnNlcnQgY2FuIHJldXNlIGEKKwkgKiBm cmVlZCBoZWFwIFRJRCwgbGVhdmluZyB0d28gaW5kZXggZW50cmllcyBwb2ludGluZyBhdCB0aGUg c2FtZSBsaXZlIGhlYXAKKwkgKiB0dXBsZSAtLSBpbmRleCBjb3JydXB0aW9uIChidWcgIzE5Njg2 KS4gIEdpdmUgZWFjaCBpbmRleCBhIGZyZXNoCisJICogcmVsZmlsZW51bWJlciwgY29waWVkIHdp dGhpbiBpdHMgb3duIHRhYmxlc3BhY2UsIHNvIGl0IHNoYXJlcyB0aGUgaGVhcCdzCisJICogbmV3 LXJlbGZpbGVub2RlIGZhdGU6IG9uIGFib3J0IHRoZSBuZXcgaGVhcCBhbmQgaW5kZXggZmlsZXMg YXJlIGFsbAorCSAqIGRpc2NhcmRlZCB0b2dldGhlciwgYW5kIG9uIGNvbW1pdCB0aGV5IGFyZSBh bGwga2VwdC4KKwkgKi8KKwlmb3JlYWNoKGxjLCByZWx0YWJpZHhpZHMpCisJCUFURXhlY1NldFRh YmxlU3BhY2VOZXdJbmRleFJlbGZpbGVudW1iZXIobGZpcnN0X29pZChsYyksIGxvY2ttb2RlKTsK KwlsaXN0X2ZyZWUocmVsdGFiaWR4aWRzKTsKK30KKworLyoKKyAqIEdpdmUgb25lIG9mIGEgdGFi bGUncyBpbmRleGVzIGEgZnJlc2ggcmVsZmlsZW51bWJlciB3aXRoaW4gaXRzIGV4aXN0aW5nCisg KiB0YWJsZXNwYWNlLCBjb3B5aW5nIHRoZSBjdXJyZW50IGluZGV4IGZpbGUgdG8gdGhlIG5ldyBy ZWxmaWxlbnVtYmVyLgorICoKKyAqIEFURXhlY1NldFRhYmxlU3BhY2UoKSBjYWxscyB0aGlzIGZv ciBlYWNoIGluZGV4IG9mIGEgdGFibGUgd2hvc2UgaGVhcCBpdCBoYXMKKyAqIGp1c3QgcmV3cml0 dGVuIHRvIGEgbmV3IHJlbGZpbGVub2RlLiAgVGhlIGluZGV4ZXMgbXVzdCBzaGFyZSB0aGF0IHJl d3JpdGUncworICogdHJhbnNhY3Rpb25hbCBmYXRlLCBvdGhlcndpc2UgYW4gYWJvcnQgZGlzY2Fy ZHMgdGhlIGhlYXAncyBuZXcgZmlsZSAoZnJlZWluZworICogaXRzIFRJRHMpIHdoaWxlIGxlYXZp bmcgYmVoaW5kIGluZGV4IGVudHJpZXMgdGhhdCB3ZXJlIHdyaXR0ZW4gZHVyaW5nIHRoZQorICog dHJhbnNhY3Rpb24sIHdoaWNoIGEgbGF0ZXIgaW5zZXJ0IGNhbiB0aGVuIGFsaWFzIC0tIGluZGV4 IGNvcnJ1cHRpb24gKGJ1ZworICogIzE5Njg2KS4gIFVubGlrZSBhIGZ1bGwgcmVpbmRleCB0aGlz IG1lcmVseSBjb3BpZXMgdGhlIGV4aXN0aW5nIGluZGV4IGZpbGUsCisgKiBzbyB0aGUgYWRkZWQg Y29zdCBzdGF5cyBjbG9zZSB0byB0aGF0IG9mIHRoZSBoZWFwIG1vdmUgaXRzZWxmLgorICovCitz dGF0aWMgdm9pZAorQVRFeGVjU2V0VGFibGVTcGFjZU5ld0luZGV4UmVsZmlsZW51bWJlcihPaWQg aW5kZXhPaWQsIExPQ0tNT0RFIGxvY2ttb2RlKQoreworCVJlbGF0aW9uCWluZDsKKwlSZWxGaWxl TnVtYmVyIG5ld3JlbGZpbGVudW1iZXI7CisJUmVsRmlsZUxvY2F0b3IgbmV3cmxvY2F0b3I7CisJ UmVsYXRpb24JcGdfY2xhc3M7CisJSGVhcFR1cGxlCXR1cGxlOworCUl0ZW1Qb2ludGVyRGF0YSBv dGlkOworCUZvcm1fcGdfY2xhc3MgcmRfcmVsOworCisJaW5kID0gcmVsYXRpb25fb3BlbihpbmRl eE9pZCwgbG9ja21vZGUpOworCisJLyogT25seSBwbGFpbiBpbmRleGVzIGhhdmUgc3RvcmFnZSB0 aGF0IGNhbiBob2xkIHRoZSBzdGFsZSBlbnRyaWVzLiAqLworCWlmIChpbmQtPnJkX3JlbC0+cmVs a2luZCAhPSBSRUxLSU5EX0lOREVYIHx8CisJCSFSRUxLSU5EX0hBU19TVE9SQUdFKGluZC0+cmRf cmVsLT5yZWxraW5kKSkKKwl7CisJCXJlbGF0aW9uX2Nsb3NlKGluZCwgTm9Mb2NrKTsKKwkJcmV0 dXJuOworCX0KKworCS8qIEFsbG9jYXRlIGEgbmV3IHJlbGZpbGVudW1iZXIgaW4gdGhlIGluZGV4 J3MgY3VycmVudCB0YWJsZXNwYWNlLiAqLworCW5ld3JlbGZpbGVudW1iZXIgPSBHZXROZXdSZWxG aWxlTnVtYmVyKGluZC0+cmRfcmVsLT5yZWx0YWJsZXNwYWNlLCBOVUxMLAorCQkJCQkJCQkJCSAg IGluZC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZSk7CisJbmV3cmxvY2F0b3IgPSBpbmQtPnJkX2xv Y2F0b3I7CisJbmV3cmxvY2F0b3IucmVsTnVtYmVyID0gbmV3cmVsZmlsZW51bWJlcjsKKworCS8q IENvcHkgdGhlIGluZGV4IGludG8gdGhlIG5ldyBmaWxlIGFuZCBzY2hlZHVsZSB0aGUgb2xkIG9u ZSBmb3IgY2xlYW51cC4gKi8KKwlpbmRleF9jb3B5X2RhdGEoaW5kLCBuZXdybG9jYXRvcik7CisK KwkvKiBVcGRhdGUgdGhlIHBnX2NsYXNzIHJvdzsgb25seSB0aGUgcmVsZmlsZW5vZGUgY2hhbmdl cy4gKi8KKwlwZ19jbGFzcyA9IHRhYmxlX29wZW4oUmVsYXRpb25SZWxhdGlvbklkLCBSb3dFeGNs dXNpdmVMb2NrKTsKKwl0dXBsZSA9IFNlYXJjaFN5c0NhY2hlTG9ja2VkQ29weTEoUkVMT0lELCBP YmplY3RJZEdldERhdHVtKGluZGV4T2lkKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxl KSkKKwkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9yIGluZGV4ICV1IiwgaW5k ZXhPaWQpOworCW90aWQgPSB0dXBsZS0+dF9zZWxmOworCXJkX3JlbCA9IChGb3JtX3BnX2NsYXNz KSBHRVRTVFJVQ1QodHVwbGUpOworCXJkX3JlbC0+cmVsZmlsZW5vZGUgPSBuZXdyZWxmaWxlbnVt YmVyOworCUNhdGFsb2dUdXBsZVVwZGF0ZShwZ19jbGFzcywgJm90aWQsIHR1cGxlKTsKKwlVbmxv Y2tUdXBsZShwZ19jbGFzcywgJm90aWQsIElucGxhY2VVcGRhdGVUdXBsZUxvY2spOworCWhlYXBf ZnJlZXR1cGxlKHR1cGxlKTsKKwl0YWJsZV9jbG9zZShwZ19jbGFzcywgUm93RXhjbHVzaXZlTG9j ayk7CisKKwlJbnZva2VPYmplY3RQb3N0QWx0ZXJIb29rKFJlbGF0aW9uUmVsYXRpb25JZCwgaW5k ZXhPaWQsIDApOworCVJlbGF0aW9uQXNzdW1lTmV3UmVsZmlsZWxvY2F0b3IoaW5kKTsKKworCXJl bGF0aW9uX2Nsb3NlKGluZCwgTm9Mb2NrKTsKKworCS8qIE1ha2UgdGhlIHJlbGZpbGVub2RlIGNo YW5nZSB2aXNpYmxlLiAqLworCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CiB9CiAKIC8qCi0t IAoyLjU1LjAKCg== --===============0682097667753335172==--