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 1tWm3p-001XPB-Dp for pgsql-hackers@arkaria.postgresql.org; Sun, 12 Jan 2025 00:42:38 +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 1tWm3n-00ECM8-TO for pgsql-hackers@arkaria.postgresql.org; Sun, 12 Jan 2025 00:42:35 +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 1tWm3n-00ECM0-Ez for pgsql-hackers@lists.postgresql.org; Sun, 12 Jan 2025 00:42:35 +0000 Received: from relay3-d.mail.gandi.net ([2001:4b98:dc4:8::223]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tWm3j-0019Y2-2i for pgsql-hackers@postgresql.org; Sun, 12 Jan 2025 00:42:34 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 2C26560002; Sun, 12 Jan 2025 00:42:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1736642549; 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=KroMm02Hr/Yy4yv6oh1gHYFahtKgBPCvhL4uIF1BK2Y=; b=bV9b11Slv3VJyXfaM6wtrcU55G8iDIc7eiCLKYfZ3yJXyLk/AEwTTaUOefBQm6KrqOXONr KRRiM7LMKjuYPHmtpwxuJiZ1hzwt3NB9x2Q6dfd89IwMmEb3FSHn5pD4BmCflGX2ZTiEhH MA4Kiw7oofvqkcYYJbqvSlWfda7sgNktIq2uiHIaLCxeUEAo6OwK1ibvprQKpz73y247WK Ew45SdD0BUGJh4LtDngVuQ84GKFc1UWnz51/LlQ2oTpnf/JE261AstGUDTdRlhIaILOZVO nUFAl9xIkY9LBBugEclPHQUR8JuSyuXhbUJLjJStx+JQcTjqdBk7aGqK+gQNsg== Content-Type: multipart/mixed; boundary="------------1irM27dwxKKf84QQCnT9Emjy" Message-ID: <508fda6f-5a9d-42c9-af6e-aa94ed1210ec@vondra.me> Date: Sun, 12 Jan 2025 01:42:28 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Adjusting hash join memory limit to handle batch explosion To: Melanie Plageman Cc: PostgreSQL Hackers References: <7bed6c08-72a0-4ab9-a79c-e01fcdd0940f@vondra.me> <5a440920-4ca4-4bd0-8b42-a5aa7af4fb70@vondra.me> Content-Language: en-US From: Tomas Vondra In-Reply-To: X-GND-Sasl: tomas@vondra.me 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. --------------1irM27dwxKKf84QQCnT9Emjy Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 1/10/25 15:54, Melanie Plageman wrote: > On Thu, Jan 9, 2025 at 6:59 PM Tomas Vondra wrote: >> >> ... > >> Robert's idea kept using buffered files, but limited how many we can >> fill at any phase. Say we'd use a limit of 1024 batches, but we actually >> need 1M batches. Then we'd do the build in two phases - we'd generate >> 1024 batches, and then we'd split each of those batches into 1024 >> smaller batches. The trick (as I understand it) is those batches can't >> overlap, so we'd not need more than 1024 batches, which greatly limits >> the memory consumption. We could even use a lower limit, derived from >> work_mem or something like that. > > I think this is because we get the batch based on > > *batchno = pg_rotate_right32(hashvalue, hashtable->log2_nbuckets) & > (nbatch - 1); > > And tuples can only spill forward. I think Robert's example is if we > plan for 64 batches and eventually increase to 256 batches, a tuple > assigned to batch 1 could go to 65, 129, or 193 but no other batch -- > meaning we would only need 3 files open when processing batch 1. But I > think we would need to do more explicit file flushing and closing and > opening, right? Which maybe doesn't matter when compared to the > overhead of so many more buffers. > I had a quiet evening yesterday, so I decided to take a stab at this and see how hard would it be, and how bad would the impact be. Attached is an experimental patch, doing the *bare* minimum for a simple query: 1) It defines a limit of 128 batches (a bit low, but also 1MB). In practice we'd use something like 256 - 1024, probably. Doesn't matter. 2) Ensures the initial pass over data in MultiExecPrivateHash does not use more than 128 batches, switches to "tooManyBatches=true" if that happens (and dumps the batch to file ExecHashDumpBatchToFile, even if it's batchno=0). And later it calls ExecHashHandleTooManyBatches() to increase the nbatch further. 3) Does something similar for the outer relation - if there are too many batches, we do ExecHashJoinRepartitionBatches() which first partitions into 128 batches. This only does a single pass in the WIP, though. Should be recursive or something. 4) Extends the BufFile API with BufFileHasBuffer/BufFileFreeBuffer so that the code can free the buffers. It also means the buffer needs to be allocated separately, not embedded in BufFile struct. (I'm a bit surprised it works without having to re-read the buffer after freeing it, but that's probably thanks to how hashjoin uses the files). Anyway, this seems to work, and a simple experiment looks like this: -------------------------------------------------------------------- create table t (a int, b text); insert into t select i, md5(i::text) from generate_series(1,100000) s(i); insert into t select i, md5(i::text) from generate_series(1,100000) s(i); insert into t select i, md5(i::text) from generate_series(1,100000) s(i); insert into t select i, md5(i::text) from generate_series(1,100000) s(i); vacuum analyze; set work_mem='128kB'; explain analyze select * from t t1 join t t2 on (t1.a = t2.a); -------------------------------------------------------------------- This is just enough to need 256 batches, i.e. "one doubling" over the 128 batch limit. On master I get this: QUERY PLAN ----------------------------------------------------------------------- Hash Join (cost=15459.00..51555.40 rows=1638740 width=74) (actual time=80.065..337.192 rows=1600000 loops=1) Hash Cond: (t1.a = t2.a) Buffers: shared hit=6668, temp read=5806 written=5806 -> Seq Scan on t t1 (cost=0.00..7334.00 rows=400000 width=37) (actual time=0.008..19.867 rows=400000 loops=1) Buffers: shared hit=3334 -> Hash (cost=7334.00..7334.00 rows=400000 width=37) (actual time=76.824..76.824 rows=400000 loops=1) Buckets: 4096 Batches: 256 Memory Usage: 132kB Buffers: shared hit=3334, temp written=2648 -> Seq Scan on t t2 (cost=0.00..7334.00 rows=400000 width=37) (actual time=0.001..20.855 rows=400000 loops=1) Buffers: shared hit=3334 Planning Time: 0.100 ms Execution Time: 385.779 ms (12 rows) while with the patch we get this: QUERY PLAN ----------------------------------------------------------------------- Hash Join (cost=15459.00..51555.40 rows=1638740 width=74) (actual time=93.346..325.604 rows=1600000 loops=1) Hash Cond: (t1.a = t2.a) Buffers: shared hit=6668, temp read=8606 written=8606 -> Seq Scan on t t1 (cost=0.00..7334.00 rows=400000 width=37) (actual time=0.006..14.416 rows=400000 loops=1) Buffers: shared hit=3334 -> Hash (cost=7334.00..7334.00 rows=400000 width=37) (actual time=48.481..48.482 rows=400000 loops=1) Buckets: 4096 (originally 4096) Batches: 256 (originally 128) Memory Usage: 132kB Buffers: shared hit=3334, temp read=23 written=2860 -> Seq Scan on t t2 (cost=0.00..7334.00 rows=400000 width=37) (actual time=0.001..14.754 rows=400000 loops=1) Buffers: shared hit=3334 Planning Time: 0.061 ms Execution Time: 374.229 ms (12 rows) So for this particular query there doesn't seem to be a particularly massive hit. With more batches that's unfortunately not the case, but that seems to be mostly due to looping over all batches when freeing buffers. Looping over 1M batches (which we do for every batch) is expensive, but that could be improved somehow - we only have a couple files open (say 1024), so we could keep them in a list or something. And I think we don't need to free the batches this often anyway, we might not even opened any future batches. I'm sure there's plenty of issues with the patch - e.g. it may not not handle nbatch increases later (after batch 0), I ignored skew buckets, and stuff like that ... But it does seem like a workable idea ... regards -- Tomas Vondra --------------1irM27dwxKKf84QQCnT9Emjy Content-Type: text/x-patch; charset=UTF-8; name="hashjoin-file-limit.patch" Content-Disposition: attachment; filename="hashjoin-file-limit.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVIYXNoLmMgYi9zcmMvYmFj a2VuZC9leGVjdXRvci9ub2RlSGFzaC5jCmluZGV4IDZmOGEzNzllM2I5Li42Y2QwYTMzMjhi YiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUhhc2guYworKysgYi9z cmMvYmFja2VuZC9leGVjdXRvci9ub2RlSGFzaC5jCkBAIC03OSw3ICs3OSw4IEBAIHN0YXRp YyBib29sIEV4ZWNQYXJhbGxlbEhhc2hUdXBsZVByZWFsbG9jKEhhc2hKb2luVGFibGUgaGFz aHRhYmxlLAogCQkJCQkJCQkJCSAgc2l6ZV90IHNpemUpOwogc3RhdGljIHZvaWQgRXhlY1Bh cmFsbGVsSGFzaE1lcmdlQ291bnRlcnMoSGFzaEpvaW5UYWJsZSBoYXNodGFibGUpOwogc3Rh dGljIHZvaWQgRXhlY1BhcmFsbGVsSGFzaENsb3NlQmF0Y2hBY2Nlc3NvcnMoSGFzaEpvaW5U YWJsZSBoYXNodGFibGUpOwotCitzdGF0aWMgdm9pZCBFeGVjSGFzaER1bXBCYXRjaFRvRmls ZShIYXNoSm9pblRhYmxlIGhhc2h0YWJsZSk7CitzdGF0aWMgdm9pZCBFeGVjSGFzaEhhbmRs ZVRvb01hbnlCYXRjaGVzKEhhc2hKb2luVGFibGUgaGFzaHRhYmxlLCBUdXBsZVRhYmxlU2xv dCAqc2xvdCk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQlFeGVjSGFzaApAQCAtMTk1LDYgKzE5 NiwxMyBAQCBNdWx0aUV4ZWNQcml2YXRlSGFzaChIYXNoU3RhdGUgKm5vZGUpCiAJCX0KIAl9 CiAKKwkvKgorCSAqIElmIHdlIGhhZCB0byBkaXNhYmxlIGFkZGluZyBtb3JlIGJhdGNoZXMg d2hpbGUgYnVpbGRpbmcgdGhlIGhhc2gsIG5vdworCSAqIGlzIGEgZ29vZCB0aW1lIHRvIGRv IHRoZSBuZXh0IHBoYXNlIC0gcmVsZWFzZSBhbGwgZmlsZSBidWZmZXJzIGFuZCBzcGxpdAor CSAqIGVhY2ggYmF0Y2ggaW50byBuZXcgYmF0Y2hlcy4KKwkgKi8KKwlFeGVjSGFzaEhhbmRs ZVRvb01hbnlCYXRjaGVzKGhhc2h0YWJsZSwgbm9kZS0+cHMucHNfUmVzdWx0VHVwbGVTbG90 KTsKKwogCS8qIHJlc2l6ZSB0aGUgaGFzaCB0YWJsZSBpZiBuZWVkZWQgKE5UVVBfUEVSX0JV Q0tFVCBleGNlZWRlZCkgKi8KIAlpZiAoaGFzaHRhYmxlLT5uYnVja2V0cyAhPSBoYXNodGFi bGUtPm5idWNrZXRzX29wdGltYWwpCiAJCUV4ZWNIYXNoSW5jcmVhc2VOdW1CdWNrZXRzKGhh c2h0YWJsZSk7CkBAIC01MDIsMTAgKzUxMCwxNyBAQCBFeGVjSGFzaFRhYmxlQ3JlYXRlKEhh c2hTdGF0ZSAqc3RhdGUpCiAJaGFzaHRhYmxlLT5za2V3QnVja2V0TGVuID0gMDsKIAloYXNo dGFibGUtPm5Ta2V3QnVja2V0cyA9IDA7CiAJaGFzaHRhYmxlLT5za2V3QnVja2V0TnVtcyA9 IE5VTEw7Ci0JaGFzaHRhYmxlLT5uYmF0Y2ggPSBuYmF0Y2g7CiAJaGFzaHRhYmxlLT5jdXJi YXRjaCA9IDA7Ci0JaGFzaHRhYmxlLT5uYmF0Y2hfb3JpZ2luYWwgPSBuYmF0Y2g7Ci0JaGFz aHRhYmxlLT5uYmF0Y2hfb3V0c3RhcnQgPSBuYmF0Y2g7CisKKwkvKiBsaW1pdCB0aGUgbnVt YmVyIG9mIGJhdGNoZXMgd2UgY2FuIHBvcHVsYXRlIGF0IG9uY2UgKi8KKwloYXNodGFibGUt Pm5iYXRjaF9tYXhpbXVtID0gSEFTSEpPSU5fQkFUQ0hFU19QRVJfUEhBU0U7CisJaGFzaHRh YmxlLT5uYmF0Y2ggPSBNaW4obmJhdGNoLCBoYXNodGFibGUtPm5iYXRjaF9tYXhpbXVtKTsK KwloYXNodGFibGUtPmN1cmJhdGNoID0gMDsKKwloYXNodGFibGUtPm5iYXRjaF9vcmlnaW5h bCA9IE1pbihuYmF0Y2gsIGhhc2h0YWJsZS0+bmJhdGNoX21heGltdW0pOworCWhhc2h0YWJs ZS0+bmJhdGNoX291dHN0YXJ0ID0gTWluKG5iYXRjaCwgaGFzaHRhYmxlLT5uYmF0Y2hfbWF4 aW11bSk7CisKKwkvKiBhc3N1bWUgd2UgaGF2ZW4ndCBoaXQgdGhlIGJhdGNoIGNvdW50IGxp bWl0ICovCisJaGFzaHRhYmxlLT50b29NYW55QmF0Y2hlcyA9IChuYmF0Y2ggPiBIQVNISk9J Tl9CQVRDSEVTX1BFUl9QSEFTRSk7CiAJaGFzaHRhYmxlLT5ncm93RW5hYmxlZCA9IHRydWU7 CiAJaGFzaHRhYmxlLT50b3RhbFR1cGxlcyA9IDA7CiAJaGFzaHRhYmxlLT5wYXJ0aWFsVHVw bGVzID0gMDsKQEAgLTg3NCw3ICs4ODksOCBAQCBFeGVjSGFzaFRhYmxlRGVzdHJveShIYXNo Sm9pblRhYmxlIGhhc2h0YWJsZSkKIAkgKi8KIAlpZiAoaGFzaHRhYmxlLT5pbm5lckJhdGNo RmlsZSAhPSBOVUxMKQogCXsKLQkJZm9yIChpID0gMTsgaSA8IGhhc2h0YWJsZS0+bmJhdGNo OyBpKyspCisJCS8qIFhYWCBXZSBtaWdodCBoYXZlIGFsbG9jYXRlZCBhIGZpbGUgZm9yIGJh dGNoIDAsIHNvIHJlbGVhc2UgaXQuICovCisJCWZvciAoaSA9IDA7IGkgPCBoYXNodGFibGUt Pm5iYXRjaDsgaSsrKQogCQl7CiAJCQlpZiAoaGFzaHRhYmxlLT5pbm5lckJhdGNoRmlsZVtp XSkKIAkJCQlCdWZGaWxlQ2xvc2UoaGFzaHRhYmxlLT5pbm5lckJhdGNoRmlsZVtpXSk7CkBA IC05MDUsNiArOTIxLDEyIEBAIEV4ZWNIYXNoSW5jcmVhc2VOdW1CYXRjaGVzKEhhc2hKb2lu VGFibGUgaGFzaHRhYmxlKQogCWxvbmcJCW5mcmVlZDsKIAlIYXNoTWVtb3J5Q2h1bmsgb2xk Y2h1bmtzOwogCisJLyoKKwkgKiBXZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYWZ0ZXIgaGl0 dGluZyB0b28gbWFueSBiYXRjaGVzLCBhbmQgc3dpdGNoaW5nCisJICogdG8gc3BpbGxpbmcg ZGF0YSBmb3IgYWxsIGJhdGNoZXMuCisJICovCisJQXNzZXJ0KCFoYXNodGFibGUtPnRvb01h bnlCYXRjaGVzKTsKKwogCS8qIGRvIG5vdGhpbmcgaWYgd2UndmUgZGVjaWRlZCB0byBzaHV0 IG9mZiBncm93dGggKi8KIAlpZiAoIWhhc2h0YWJsZS0+Z3Jvd0VuYWJsZWQpCiAJCXJldHVy bjsKQEAgLTEwNTQsNiArMTA3NiwxNjYgQEAgRXhlY0hhc2hJbmNyZWFzZU51bUJhdGNoZXMo SGFzaEpvaW5UYWJsZSBoYXNodGFibGUpCiAJfQogfQogCisvKgorICogRXhlY0hhc2hEdW1w QmF0Y2hUb0ZpbGUKKyAqCQlEdW1wIHRoZSBjdXJyZW50IGhhc2ggdGFibGUgaW50byBhIGZp bGUgZm9yIHRoZSBjdXJyZW50IGJhdGNoLgorICoKKyAqIE9uY2Ugd2UgaGl0IHRoZSBudW1i ZXIgb2YgYmF0Y2hlcyB3ZSdyZSBwb3B1bGF0aW5nLCB3ZSBzdG9wIGRvdWJsaW5nIHRoZQor ICogbnVtYmVyIG9mIGJhdGNoZXMuIEJ1dCB3ZSBhbHNvIGNhbid0IGtlZXAgdGhlIGN1cnJl bnQgYmF0Y2ggaW4gbWVtb3J5LCBzbworICogaW5zdGVhZCB3ZSBkdW1wIHRoZSBkYXRhIHRv IGZpbGUgYW5kIHdpbGwgcmVhZCBpdCBsYXRlciBhZnRlciB3ZSBpbmNyZWFzZQorICogdGhl IG51bWJlciBvZiBiYXRjaGVzIChhdCB3aGljaCBwb2ludCB3ZSB3b24ndCBuZWVkIHRvIGtl ZXAgdGhlIGN1cnJlbnQKKyAqIGJhdGNoZXMpLgorICoKKyAqIFhYWCBUaGlzIGlzIHZpcnR1 YWxseSB0aGUgc2FtZSB0aGluZyB3ZSBkbyBpbiBFeGVjSGFzaEluY3JlYXNlTnVtQmF0Y2hl cy4KKyAqLworc3RhdGljIHZvaWQKK0V4ZWNIYXNoRHVtcEJhdGNoVG9GaWxlKEhhc2hKb2lu VGFibGUgaGFzaHRhYmxlKQoreworCUhhc2hNZW1vcnlDaHVuayBvbGRjaHVua3M7CisJaW50 CQkJY3VyYmF0Y2ggPSBoYXNodGFibGUtPmN1cmJhdGNoOworCisJbWVtc2V0KGhhc2h0YWJs ZS0+YnVja2V0cy51bnNoYXJlZCwgMCwKKwkJICAgc2l6ZW9mKEhhc2hKb2luVHVwbGUpICog aGFzaHRhYmxlLT5uYnVja2V0cyk7CisJb2xkY2h1bmtzID0gaGFzaHRhYmxlLT5jaHVua3M7 CisJaGFzaHRhYmxlLT5jaHVua3MgPSBOVUxMOworCisJLyogc28sIGxldCdzIHNjYW4gdGhy b3VnaCB0aGUgb2xkIGNodW5rcywgYW5kIGFsbCB0dXBsZXMgaW4gZWFjaCBjaHVuayAqLwor CXdoaWxlIChvbGRjaHVua3MgIT0gTlVMTCkKKwl7CisJCUhhc2hNZW1vcnlDaHVuayBuZXh0 Y2h1bmsgPSBvbGRjaHVua3MtPm5leHQudW5zaGFyZWQ7CisKKwkJLyogcG9zaXRpb24gd2l0 aGluIHRoZSBidWZmZXIgKHVwIHRvIG9sZGNodW5rcy0+dXNlZCkgKi8KKwkJc2l6ZV90CQlp ZHggPSAwOworCisJCS8qIHByb2Nlc3MgYWxsIHR1cGxlcyBzdG9yZWQgaW4gdGhpcyBjaHVu ayAoYW5kIHRoZW4gZnJlZSBpdCkgKi8KKwkJd2hpbGUgKGlkeCA8IG9sZGNodW5rcy0+dXNl ZCkKKwkJeworCQkJSGFzaEpvaW5UdXBsZSBoYXNoVHVwbGUgPSAoSGFzaEpvaW5UdXBsZSkg KEhBU0hfQ0hVTktfREFUQShvbGRjaHVua3MpICsgaWR4KTsKKwkJCU1pbmltYWxUdXBsZSB0 dXBsZSA9IEhKVFVQTEVfTUlOVFVQTEUoaGFzaFR1cGxlKTsKKwkJCWludAkJCWhhc2hUdXBs ZVNpemUgPSAoSEpUVVBMRV9PVkVSSEVBRCArIHR1cGxlLT50X2xlbik7CisJCQlpbnQJCQli dWNrZXRubzsKKwkJCWludAkJCWJhdGNobm87CisKKwkJCUV4ZWNIYXNoR2V0QnVja2V0QW5k QmF0Y2goaGFzaHRhYmxlLCBoYXNoVHVwbGUtPmhhc2h2YWx1ZSwKKwkJCQkJCQkJCSAgJmJ1 Y2tldG5vLCAmYmF0Y2hubyk7CisKKwkJCS8qIGV2ZXJ5dGhpbmcgYmVsb25ncyB0byBjdXJy ZW50IGJhdGNoLCB3ZSdyZSBub3QgYWRkaW5nIGFueSAqLworCQkJQXNzZXJ0KGJhdGNobm8g PT0gY3VyYmF0Y2gpOworCisJCQkvKiBkdW1wIGl0IG91dCAqLworCQkJRXhlY0hhc2hKb2lu U2F2ZVR1cGxlKEhKVFVQTEVfTUlOVFVQTEUoaGFzaFR1cGxlKSwKKwkJCQkJCQkJICBoYXNo VHVwbGUtPmhhc2h2YWx1ZSwKKwkJCQkJCQkJICAmaGFzaHRhYmxlLT5pbm5lckJhdGNoRmls ZVtiYXRjaG5vXSwKKwkJCQkJCQkJICBoYXNodGFibGUpOworCisJCQloYXNodGFibGUtPnNw YWNlVXNlZCAtPSBoYXNoVHVwbGVTaXplOworCisJCQkvKiBuZXh0IHR1cGxlIGluIHRoaXMg Y2h1bmsgKi8KKwkJCWlkeCArPSBNQVhBTElHTihoYXNoVHVwbGVTaXplKTsKKworCQkJLyog YWxsb3cgdGhpcyBsb29wIHRvIGJlIGNhbmNlbGxhYmxlICovCisJCQlDSEVDS19GT1JfSU5U RVJSVVBUUygpOworCQl9CisKKwkJLyogd2UncmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsgLSBm cmVlIGl0IGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IG9uZSAqLworCQlwZnJlZShvbGRjaHVu a3MpOworCQlvbGRjaHVua3MgPSBuZXh0Y2h1bms7CisJfQorfQorCisvKgorICogRXhlY0hh c2hIYW5kbGVUb29NYW55QmF0Y2hlcworICoJCUhhbmRsZSB0aGUgY2FzZSB3aGVuIHdlIGhp dCB0aGUgbnVtYmVyIG9mIGJhdGNoZXMgd2hpbGUgYnVpbGRpbmcgdGhlCisgKgkJaGFzaCB0 YWJsZS4KKyAqCisgKiBXZSBjYW4gaGl0IHRoZSBzaXR1YXRpb24gYWdhaW4gKGUuZy4gd2Ug bmVlZCAxTSBiYXRjaGVzLCBidXQgdGhlIGxpbWl0IGlzCisgKiAxMjgsIHNvIHdlIGdvIDEy OCAtPiAxNjM4NCAtPiAxTSkuCisgKi8KK3N0YXRpYyB2b2lkCitFeGVjSGFzaEhhbmRsZVRv b01hbnlCYXRjaGVzKEhhc2hKb2luVGFibGUgaGFzaHRhYmxlLCBUdXBsZVRhYmxlU2xvdCAq c2xvdCkKK3sKKwlpZiAoIWhhc2h0YWJsZS0+dG9vTWFueUJhdGNoZXMpCisJCXJldHVybjsK KworCS8qIGRpZG4ndCBydW4gaW50byB0aGUgaXNzdWUsIG5vdGhpbmcgdG8gZG8gKi8KKwl3 aGlsZSAoaGFzaHRhYmxlLT50b29NYW55QmF0Y2hlcykKKwl7CisJCWludAkJCW5iYXRjaDsK KwkJaW50CQkJb2xkbmJhdGNoOworCisJCUJ1ZkZpbGUgKmZpbGUgPSBoYXNodGFibGUtPmlu bmVyQmF0Y2hGaWxlW2hhc2h0YWJsZS0+Y3VyYmF0Y2hdOworCisJCUFzc2VydChmaWxlICE9 IE5VTEwpOworCisJCS8qIFhYWCBzdHVwaWQgd2F5IHRvIGluY3JlYXNlIG51bWJlciBvZiBi YXRjaGVzICovCisJCW9sZG5iYXRjaCA9IGhhc2h0YWJsZS0+bmJhdGNoOworCQluYmF0Y2gg PSBNYXgoaGFzaHRhYmxlLT5uYmF0Y2gsIGhhc2h0YWJsZS0+bmJhdGNoICogMik7CisKKwkJ aGFzaHRhYmxlLT5uYmF0Y2ggPSBuYmF0Y2g7CisJCWhhc2h0YWJsZS0+dG9vTWFueUJhdGNo ZXMgPSBmYWxzZTsKKworCQkvKiBlbmxhcmdlIGFycmF5cyBhbmQgemVybyBvdXQgYWRkZWQg ZW50cmllcyAqLworCQloYXNodGFibGUtPmlubmVyQmF0Y2hGaWxlID0gcmVwYWxsb2MwX2Fy cmF5KGhhc2h0YWJsZS0+aW5uZXJCYXRjaEZpbGUsIEJ1ZkZpbGUgKiwgb2xkbmJhdGNoLCBu YmF0Y2gpOworCQloYXNodGFibGUtPm91dGVyQmF0Y2hGaWxlID0gcmVwYWxsb2MwX2FycmF5 KGhhc2h0YWJsZS0+b3V0ZXJCYXRjaEZpbGUsIEJ1ZkZpbGUgKiwgb2xkbmJhdGNoLCBuYmF0 Y2gpOworCisJCS8qIHNldCB0byBOVUxMLCBzbyB0aGF0IHdlIGNyZWF0ZSBhIG5ldyAvIGVt cHR5IGZpbGUgZm9yIHRoaXMgYmF0Y2ggKi8KKwkJaGFzaHRhYmxlLT5pbm5lckJhdGNoRmls ZVtoYXNodGFibGUtPmN1cmJhdGNoXSA9IE5VTEw7CisKKwkJLyogRklYTUUgY2xvc2UvZmx1 c2ggYWxsIGN1cnJlbnQgZmlsZXMgKHJlbGVhc2UgdGhlIGJ1ZmZlcikgKi8KKwkJZm9yIChp bnQgaSA9IDA7IGkgPCBvbGRuYmF0Y2g7IGkrKykKKwkJeworCQkJaWYgKGhhc2h0YWJsZS0+ aW5uZXJCYXRjaEZpbGVbaV0gIT0gTlVMTCkKKwkJCQlCdWZGaWxlRnJlZUJ1ZmZlcihoYXNo dGFibGUtPmlubmVyQmF0Y2hGaWxlW2ldKTsKKwkJfQorCisJCUJ1ZkZpbGVTZWVrKGZpbGUs IDAsIDAsIFNFRUtfU0VUKTsKKworCQkvKiByZWFkIHRoZSBjdXJyZW50IHR1cGxlcyBmcm9t IHRoZSBiYXRjaCBmaWxlLCBkZWNpZGUgd2hhdAorCQkgKiB0byBkbyB3aXRoIHRoZW0gKi8K KwkJd2hpbGUgKHRydWUpCisJCXsKKwkJCXVpbnQzMgkJaGFzaHZhbHVlOworCQkJdWludDMy CQloZWFkZXJbMl07CisJCQlzaXplX3QJCW5yZWFkOworCQkJTWluaW1hbFR1cGxlIHR1cGxl OworCisJCQkvKgorCQkJICogV2UgY2hlY2sgZm9yIGludGVycnVwdHMgaGVyZSBiZWNhdXNl IHRoaXMgaXMgdHlwaWNhbGx5IHRha2VuIGFzIGFuCisJCQkgKiBhbHRlcm5hdGl2ZSBjb2Rl IHBhdGggdG8gYW4gRXhlY1Byb2NOb2RlKCkgY2FsbCwgd2hpY2ggd291bGQgaW5jbHVkZQor CQkJICogc3VjaCBhIGNoZWNrLgorCQkJICovCisJCQlDSEVDS19GT1JfSU5URVJSVVBUUygp OworCisJCQkvKgorCQkJICogU2luY2UgYm90aCB0aGUgaGFzaCB2YWx1ZSBhbmQgdGhlIE1p bmltYWxUdXBsZSBsZW5ndGggd29yZCBhcmUgdWludDMyLAorCQkJICogd2UgY2FuIHJlYWQg dGhlbSBib3RoIGluIG9uZSBCdWZGaWxlUmVhZCgpIGNhbGwgd2l0aG91dCBhbnkgdHlwZQor CQkJICogY2hlYXRpbmcuCisJCQkgKi8KKwkJCW5yZWFkID0gQnVmRmlsZVJlYWRNYXliZUVP RihmaWxlLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpLCB0cnVlKTsKKwkJCWlmIChucmVhZCA9 PSAwKQkJCQkvKiBlbmQgb2YgZmlsZSAqLworCQkJeworCQkJCUV4ZWNDbGVhclR1cGxlKHNs b3QpOworCQkJCWJyZWFrOworCQkJfQorCisJCQloYXNodmFsdWUgPSBoZWFkZXJbMF07CisJ CQl0dXBsZSA9IChNaW5pbWFsVHVwbGUpIHBhbGxvYyhoZWFkZXJbMV0pOworCQkJdHVwbGUt PnRfbGVuID0gaGVhZGVyWzFdOworCisJCQlCdWZGaWxlUmVhZEV4YWN0KGZpbGUsCisJCQkJ CQkJIChjaGFyICopIHR1cGxlICsgc2l6ZW9mKHVpbnQzMiksCisJCQkJCQkJIGhlYWRlclsx XSAtIHNpemVvZih1aW50MzIpKTsKKworCQkJRXhlY0ZvcmNlU3RvcmVNaW5pbWFsVHVwbGUo dHVwbGUsIHNsb3QsIHRydWUpOworCisJCQlFeGVjSGFzaFRhYmxlSW5zZXJ0KGhhc2h0YWJs ZSwgc2xvdCwgaGFzaHZhbHVlKTsKKwkJfQorCisJCS8qIGNsb3NlIHRoZSBvbGQgYmF0Y2gg ZmlsZSAqLworCQlCdWZGaWxlQ2xvc2UoZmlsZSk7CisJfQorfQorCiAvKgogICogRXhlY1Bh cmFsbGVsSGFzaEluY3JlYXNlTnVtQmF0Y2hlcwogICoJCUV2ZXJ5IHBhcnRpY2lwYW50IGF0 dGFjaGVkIHRvIGdyb3dfYmF0Y2hlc19iYXJyaWVyIG11c3QgcnVuIHRoaXMKQEAgLTE2MjUs OCArMTgwNywxMSBAQCBFeGVjSGFzaFRhYmxlSW5zZXJ0KEhhc2hKb2luVGFibGUgaGFzaHRh YmxlLAogCiAJLyoKIAkgKiBkZWNpZGUgd2hldGhlciB0byBwdXQgdGhlIHR1cGxlIGluIHRo ZSBoYXNoIHRhYmxlIG9yIGEgdGVtcCBmaWxlCisJICoKKwkgKiBYWFggSWYgd2UgYXJlIGFs cmVhZHkgaW4gInRvbyBtYW55IGJhdGNoZXMiIHNpdHVhdGlvbiwganVzdCB3cml0ZSB0aGUK KwkgKiBkYXRhIGRpcmVjdGx5IHRvIHRoZSB0ZW1wIGZpbGUsIGV2ZW4gZm9yIGN1cnJlbnQg YmF0Y2guCiAJICovCi0JaWYgKGJhdGNobm8gPT0gaGFzaHRhYmxlLT5jdXJiYXRjaCkKKwlp ZiAoYmF0Y2hubyA9PSBoYXNodGFibGUtPmN1cmJhdGNoICYmICFoYXNodGFibGUtPnRvb01h bnlCYXRjaGVzKQogCXsKIAkJLyoKIAkJICogcHV0IHRoZSB0dXBsZSBpbiBoYXNoIHRhYmxl CkBAIC0xNjc4LDE0ICsxODYzLDI5IEBAIEV4ZWNIYXNoVGFibGVJbnNlcnQoSGFzaEpvaW5U YWJsZSBoYXNodGFibGUsCiAJCWlmIChoYXNodGFibGUtPnNwYWNlVXNlZCArCiAJCQloYXNo dGFibGUtPm5idWNrZXRzX29wdGltYWwgKiBzaXplb2YoSGFzaEpvaW5UdXBsZSkKIAkJCT4g aGFzaHRhYmxlLT5zcGFjZUFsbG93ZWQpCi0JCQlFeGVjSGFzaEluY3JlYXNlTnVtQmF0Y2hl cyhoYXNodGFibGUpOworCQl7CisJCQkvKgorCQkJICogSWYgd2UgYWxyZWFkeSBoaXQgdGhl IG1heGltdW0gZm9yIHRoaXMgcGhhc2UsIHdlIGNhbid0IGluY3JlYXNlCisJCQkgKiB0aGUg bnVtYmVyIG9mIGJhdGNoZXMgZnVydGhlciwgc28gd2Ugc3RvcCBhbmQgZmx1c2ggZXZlcnl0 aGluZworCQkJICogaW50byB0aGUgdGVtcCBmaWxlLgorCQkJICovCisJCQlpZiAoaGFzaHRh YmxlLT5uYmF0Y2ggPT0gaGFzaHRhYmxlLT5uYmF0Y2hfbWF4aW11bSkKKwkJCXsKKwkJCQkv KiB3cml0ZSBldmVyeXRoaW5nIGZyb20gdGhpcyBiYXRjaCB0byB0aGUgdGVtcCBmaWxlICov CisJCQkJRXhlY0hhc2hEdW1wQmF0Y2hUb0ZpbGUoaGFzaHRhYmxlKTsKKwkJCQloYXNodGFi bGUtPnRvb01hbnlCYXRjaGVzID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlFeGVjSGFz aEluY3JlYXNlTnVtQmF0Y2hlcyhoYXNodGFibGUpOworCQl9CiAJfQogCWVsc2UKIAl7CiAJ CS8qCiAJCSAqIHB1dCB0aGUgdHVwbGUgaW50byBhIHRlbXAgZmlsZSBmb3IgbGF0ZXIgYmF0 Y2hlcwogCQkgKi8KLQkJQXNzZXJ0KGJhdGNobm8gPiBoYXNodGFibGUtPmN1cmJhdGNoKTsK KwkJQXNzZXJ0KGJhdGNobm8gPiBoYXNodGFibGUtPmN1cmJhdGNoIHx8CisJCQkgICAoaGFz aHRhYmxlLT50b29NYW55QmF0Y2hlcyAmJiBiYXRjaG5vID09IGhhc2h0YWJsZS0+Y3VyYmF0 Y2gpKTsKIAkJRXhlY0hhc2hKb2luU2F2ZVR1cGxlKHR1cGxlLAogCQkJCQkJCSAgaGFzaHZh bHVlLAogCQkJCQkJCSAgJmhhc2h0YWJsZS0+aW5uZXJCYXRjaEZpbGVbYmF0Y2hub10sCkBA IC0yNDk0LDYgKzI2OTQsNyBAQCBFeGVjSGFzaFNrZXdUYWJsZUluc2VydChIYXNoSm9pblRh YmxlIGhhc2h0YWJsZSwKIAl3aGlsZSAoaGFzaHRhYmxlLT5zcGFjZVVzZWRTa2V3ID4gaGFz aHRhYmxlLT5zcGFjZUFsbG93ZWRTa2V3KQogCQlFeGVjSGFzaFJlbW92ZU5leHRTa2V3QnVj a2V0KGhhc2h0YWJsZSk7CiAKKwkvKiBYWFggbWF5YmUgc2hvdWxkIGNoZWNrIG5iYXRjaF9t YXhpbXVtPyAqLwogCS8qIENoZWNrIHdlIGFyZSBub3Qgb3ZlciB0aGUgdG90YWwgc3BhY2VB bGxvd2VkLCBlaXRoZXIgKi8KIAlpZiAoaGFzaHRhYmxlLT5zcGFjZVVzZWQgPiBoYXNodGFi bGUtPnNwYWNlQWxsb3dlZCkKIAkJRXhlY0hhc2hJbmNyZWFzZU51bUJhdGNoZXMoaGFzaHRh YmxlKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVIYXNoam9pbi5j IGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUhhc2hqb2luLmMKaW5kZXggNTY2MWFkNzY4 MzAuLmE3NTE0Y2E1MTM3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2Rl SGFzaGpvaW4uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSGFzaGpvaW4uYwpA QCAtOTYzLDYgKzk2MywxMDcgQEAgRXhlY0VuZEhhc2hKb2luKEhhc2hKb2luU3RhdGUgKm5v ZGUpCiAJRXhlY0VuZE5vZGUoaW5uZXJQbGFuU3RhdGUobm9kZSkpOwogfQogCisvKgorICog RXhlY0hhc2hKb2luUmVwYXJ0aXRpb25CYXRjaGVzCisgKgkJQnVpbGQgdGhlIGhhc2hlcyBm b3IgdGhlIG91dGVyIHNpZGUsIHJlY3Vyc2l2ZWx5IHRvIG5vdCBuZWVkIG1vcmUgdGhhbgor ICoJCUhBU0hKT0lOX0JBVENIRVNfUEVSX1BIQVNFIGJhdGNoZXMuCisgKgorICogWFhYIFRo ZXJlJ3Mgbm8gcmVjdXJzaW9uIHJpZ2h0IG5vdywgd2UganVzdCBkbyB0aGUgZmlyc3QgcGhh c2UgYW5kIGxlYXZlCisgKiB0aGUgcmVzdCB0byB0aGUgcmVndWxhciByZS1iYXRjaGluZy4g VGhpcyB3b24ndCBiZSBlbm91Z2ggaWYgd2UgbmVlZCBtb3JlCisgKiB0aGFuIGEgc2luZ2xl IHJlcGFydGl0aW9uIGN5Y2xlLgorICoKKyAqIFhYWCBEb2VzIHRoaXMgbmVlZCB0byB3b3Jy eSBhYm91dCB0aGUgc2tldyBidWNrZXRzPyBQcm9iYWJseSB5ZXMuCisgKi8KK3N0YXRpYyB2 b2lkCitFeGVjSGFzaEpvaW5SZXBhcnRpdGlvbkJhdGNoZXMoUGxhblN0YXRlICpvdXRlck5v ZGUsCisJCQkJCQkJICAgSGFzaEpvaW5TdGF0ZSAqaGpzdGF0ZSkKK3sKKwlUdXBsZVRhYmxl U2xvdCAqc2xvdDsKKwlIYXNoSm9pblRhYmxlIGhhc2h0YWJsZSA9IGhqc3RhdGUtPmhqX0hh c2hUYWJsZTsKKwlpbnQJCW5iYXRjaCA9IGhhc2h0YWJsZS0+bmJhdGNoOworCWludDY0CW50 dXBsZXMgPSAwOworCisJLyogZmFrZSB0aGUgdmFsdWUgc28gdGhhdCB3ZSBjYWxjdWxhdGUg dGhlIGZpcnN0IHBoYXNlIGJhdGNoICovCisJaGFzaHRhYmxlLT5uYmF0Y2ggPSBIQVNISk9J Tl9CQVRDSEVTX1BFUl9QSEFTRTsKKworCXdoaWxlICh0cnVlKQorCXsKKwkJLyoKKwkJICog Q2hlY2sgdG8gc2VlIGlmIGZpcnN0IG91dGVyIHR1cGxlIHdhcyBhbHJlYWR5IGZldGNoZWQg YnkKKwkJICogRXhlY0hhc2hKb2luKCkgYW5kIG5vdCB1c2VkIHlldC4KKwkJICovCisJCXNs b3QgPSBoanN0YXRlLT5oal9GaXJzdE91dGVyVHVwbGVTbG90OworCQlpZiAoIVR1cElzTnVs bChzbG90KSkKKwkJCWhqc3RhdGUtPmhqX0ZpcnN0T3V0ZXJUdXBsZVNsb3QgPSBOVUxMOwor CQllbHNlCisJCQlzbG90ID0gRXhlY1Byb2NOb2RlKG91dGVyTm9kZSk7CisKKwkJd2hpbGUg KCFUdXBJc051bGwoc2xvdCkpCisJCXsKKwkJCXVpbnQzMgkJaGFzaHZhbHVlOworCQkJYm9v bAkJaXNudWxsOworCisJCQkvKgorCQkJICogV2UgaGF2ZSB0byBjb21wdXRlIHRoZSB0dXBs ZSdzIGhhc2ggdmFsdWUuCisJCQkgKi8KKwkJCUV4cHJDb250ZXh0ICplY29udGV4dCA9IGhq c3RhdGUtPmpzLnBzLnBzX0V4cHJDb250ZXh0OworCisJCQllY29udGV4dC0+ZWN4dF9vdXRl cnR1cGxlID0gc2xvdDsKKworCQkJUmVzZXRFeHByQ29udGV4dChlY29udGV4dCk7CisKKwkJ CWhhc2h2YWx1ZSA9IERhdHVtR2V0VUludDMyKEV4ZWNFdmFsRXhwclN3aXRjaENvbnRleHQo aGpzdGF0ZS0+aGpfT3V0ZXJIYXNoLAorCQkJCQkJCQkJCQkJCQkJCSAgZWNvbnRleHQsCisJ CQkJCQkJCQkJCQkJCQkJICAmaXNudWxsKSk7CisKKwkJCWlmICghaXNudWxsKQorCQkJewor CQkJCWludAlidWNrZXRubzsKKwkJCQlpbnQJYmF0Y2hubzsKKwkJCQlib29sCQlzaG91bGRG cmVlOworCQkJCU1pbmltYWxUdXBsZSBtaW50dXBsZTsKKworCQkJCW50dXBsZXMrKzsKKwor CQkJCS8qIHJlbWVtYmVyIG91dGVyIHJlbGF0aW9uIGlzIG5vdCBlbXB0eSBmb3IgcG9zc2li bGUgcmVzY2FuICovCisJCQkJaGpzdGF0ZS0+aGpfT3V0ZXJOb3RFbXB0eSA9IHRydWU7CisK KwkJCQlFeGVjSGFzaEdldEJ1Y2tldEFuZEJhdGNoKGhhc2h0YWJsZSwgaGFzaHZhbHVlLAor CQkJCQkJCQkJCSAgJmJ1Y2tldG5vLCAmYmF0Y2hubyk7CisKKwkJCQkvKgorCQkJCSAqIFRo ZSB0dXBsZSBtaWdodCBub3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IGJhdGNoICh3aGVyZQor CQkJCSAqICJjdXJyZW50IGJhdGNoIiBpbmNsdWRlcyB0aGUgc2tldyBidWNrZXRzIGlmIGFu eSkuCisJCQkJICovCisJCQkJbWludHVwbGUgPSBFeGVjRmV0Y2hTbG90TWluaW1hbFR1cGxl KHNsb3QsICZzaG91bGRGcmVlKTsKKworCQkJCS8qCisJCQkJICogTmVlZCB0byBwb3N0cG9u ZSB0aGlzIG91dGVyIHR1cGxlIHRvIGEgbGF0ZXIgYmF0Y2guCisJCQkJICogU2F2ZSBpdCBp biB0aGUgY29ycmVzcG9uZGluZyBvdXRlci1iYXRjaCBmaWxlLgorCQkJCSAqLworCQkJCUFz c2VydChiYXRjaG5vID49IGhhc2h0YWJsZS0+Y3VyYmF0Y2gpOworCQkJCUV4ZWNIYXNoSm9p blNhdmVUdXBsZShtaW50dXBsZSwgaGFzaHZhbHVlLAorCQkJCQkJCQkJICAmaGFzaHRhYmxl LT5vdXRlckJhdGNoRmlsZVtiYXRjaG5vXSwKKwkJCQkJCQkJCSAgaGFzaHRhYmxlKTsKKwor CQkJCWlmIChzaG91bGRGcmVlKQorCQkJCQloZWFwX2ZyZWVfbWluaW1hbF90dXBsZShtaW50 dXBsZSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGF0IHR1cGxlIGNvdWxkbid0IG1hdGNo IGJlY2F1c2Ugb2YgYSBOVUxMLCBzbyBkaXNjYXJkIGl0IGFuZAorCQkJICogY29udGludWUg d2l0aCB0aGUgbmV4dCBvbmUuCisJCQkgKi8KKwkJCXNsb3QgPSBFeGVjUHJvY05vZGUob3V0 ZXJOb2RlKTsKKwkJfQorCisJCWJyZWFrOworCX0KKworCS8qIHJlc3RvcmUgdGhlIGNvcnJl Y3QgdmFsdWUgKi8KKwloYXNodGFibGUtPm5iYXRjaCA9IG5iYXRjaDsKK30KKwogLyoKICAq IEV4ZWNIYXNoSm9pbk91dGVyR2V0VHVwbGUKICAqCkBAIC05ODMsOCArMTA4NCwzNiBAQCBF eGVjSGFzaEpvaW5PdXRlckdldFR1cGxlKFBsYW5TdGF0ZSAqb3V0ZXJOb2RlLAogCUhhc2hK b2luVGFibGUgaGFzaHRhYmxlID0gaGpzdGF0ZS0+aGpfSGFzaFRhYmxlOwogCWludAkJCWN1 cmJhdGNoID0gaGFzaHRhYmxlLT5jdXJiYXRjaDsKIAlUdXBsZVRhYmxlU2xvdCAqc2xvdDsK Kwlib29sCQlyZXBhcnRpdGlvbmVkID0gZmFsc2U7CiAKLQlpZiAoY3VyYmF0Y2ggPT0gMCkJ CQkvKiBpZiBpdCBpcyB0aGUgZmlyc3QgcGFzcyAqLworCS8qCisJICogSWYgdGhpcyBpcyB0 aGUgZmlyc3QgYmF0Y2gsIGNvbnNpZGVyIHBlcmZvcm1pbmcgdGhlIHJlcGFydGl0aW9uaW5n LiBUaGlzCisJICogd2lsbCBidWlsZCBIQVNISk9JTl9CQVRDSEVTX1BFUl9QSEFTRSBiYXRj aGVzLCB3aGljaCB0aGVuIG5lZWQgdG8gYmUKKwkgKiByZWJhdGNoZWQgdXNpbmcgdGhlIHJl Z3VsYXIgbG9naWMuCisJICoKKwkgKiBUaGlzIGluY2x1ZGVzIHRoZSBmaXJzdCBiYXRjaCwg d2hpY2ggbWVhbnMgd2UgdGhlbiBuZWVkIHRvIHJlYWQgdGhlCisJICogdHVwbGVzIGZyb20g dGhlIGZpbGUsIGp1c3QgbGlrZSBmb3IgZXZlcnkgb3RoZXIgYmF0Y2guCisJICoKKwkgKiBC dXQgZG8gdGhhdCBvbmx5IG9uY2UsIHdoaWNoIHdlIGRldGVjdCBieSAoZmlsZSA9PSBOVUxM KS4KKwkgKi8KKwlpZiAoKGN1cmJhdGNoID09IDApICYmCisJCShoYXNodGFibGUtPm5iYXRj aCA+IEhBU0hKT0lOX0JBVENIRVNfUEVSX1BIQVNFKSAmJgorCQkoaGFzaHRhYmxlLT5vdXRl ckJhdGNoRmlsZVswXSA9PSBOVUxMKSkKKwl7CisJCUV4ZWNIYXNoSm9pblJlcGFydGl0aW9u QmF0Y2hlcyhvdXRlck5vZGUsIGhqc3RhdGUpOworCisJCS8qIG1ha2Ugc3VyZSB0byByZXNl dCB0aGUgZmlyc3QgYmF0Y2ggdG8gc3RhcnQgcmVhZGluZyAqLworCQlpZiAoaGFzaHRhYmxl LT5vdXRlckJhdGNoRmlsZVswXSkKKwkJCUJ1ZkZpbGVTZWVrKGhhc2h0YWJsZS0+b3V0ZXJC YXRjaEZpbGVbMF0sIDAsIDAsIFNFRUtfU0VUKTsKKwl9CisKKwkvKgorCSAqIFdlIG5lZWQg dG8ga25vdyBpZiB0aGlzIGlzIHJlcGFydGl0aW9uZWQgZXZlbiBmb3IgbGF0ZXIgdHVwbGVz IGluCisJICogdGhlIGZpcnN0IGJhdGNoLiBXZSBkZXRlY3QgdGhhdCBieSBoYXZpbmcgdGhl IGJhdGNoIGZpbGUuCisJICovCisJcmVwYXJ0aXRpb25lZCA9IChjdXJiYXRjaCA9PSAwKSAm JiAoaGFzaHRhYmxlLT5vdXRlckJhdGNoRmlsZVswXSAhPSBOVUxMKTsKKworCWlmIChjdXJi YXRjaCA9PSAwICYmICFyZXBhcnRpdGlvbmVkKQkJCS8qIGlmIGl0IGlzIHRoZSBmaXJzdCBw YXNzICovCiAJewogCQkvKgogCQkgKiBDaGVjayB0byBzZWUgaWYgZmlyc3Qgb3V0ZXIgdHVw bGUgd2FzIGFscmVhZHkgZmV0Y2hlZCBieQpAQCAtMTEyMCw2ICsxMjQ5LDIzIEBAIEV4ZWNQ YXJhbGxlbEhhc2hKb2luT3V0ZXJHZXRUdXBsZShQbGFuU3RhdGUgKm91dGVyTm9kZSwKIAly ZXR1cm4gTlVMTDsKIH0KIAorLyogWFhYIHRoaXMgaXMgdmVyeSBleHBlbnNpdmUsIHdlIGhh dmUgdG8gd2FsayBsb25nIGFycmF5cyBvZnRlbiAqLworc3RhdGljIHZvaWQKK0V4ZWNIYXNo Sm9pbkZyZWVCdWZmZXJzKEhhc2hKb2luVGFibGUgaGFzaHRhYmxlKQoreworCWlmICgoIWhh c2h0YWJsZS0+aW5uZXJCYXRjaEZpbGUpICYmICghaGFzaHRhYmxlLT5vdXRlckJhdGNoRmls ZSkpCisJCXJldHVybjsKKworCWZvciAoaW50IGkgPSBoYXNodGFibGUtPmN1cmJhdGNoOyBp IDwgaGFzaHRhYmxlLT5uYmF0Y2g7IGkrKykKKwl7CisJCWlmIChoYXNodGFibGUtPmlubmVy QmF0Y2hGaWxlW2ldKQorCQkJQnVmRmlsZUZyZWVCdWZmZXIoaGFzaHRhYmxlLT5pbm5lckJh dGNoRmlsZVtpXSk7CisKKwkJaWYgKGhhc2h0YWJsZS0+b3V0ZXJCYXRjaEZpbGVbaV0pCisJ CQlCdWZGaWxlRnJlZUJ1ZmZlcihoYXNodGFibGUtPm91dGVyQmF0Y2hGaWxlW2ldKTsKKwl9 Cit9CisKIC8qCiAgKiBFeGVjSGFzaEpvaW5OZXdCYXRjaAogICoJCXN3aXRjaCB0byBhIG5l dyBoYXNoam9pbiBiYXRjaApAQCAtMTEzOSw2ICsxMjg1LDggQEAgRXhlY0hhc2hKb2luTmV3 QmF0Y2goSGFzaEpvaW5TdGF0ZSAqaGpzdGF0ZSkKIAluYmF0Y2ggPSBoYXNodGFibGUtPm5i YXRjaDsKIAljdXJiYXRjaCA9IGhhc2h0YWJsZS0+Y3VyYmF0Y2g7CiAKKwlFeGVjSGFzaEpv aW5GcmVlQnVmZmVycyhoYXNodGFibGUpOworCiAJaWYgKGN1cmJhdGNoID4gMCkKIAl7CiAJ CS8qCkBAIC0xMzk4LDYgKzE1NDYsMjAgQEAgRXhlY1BhcmFsbGVsSGFzaEpvaW5OZXdCYXRj aChIYXNoSm9pblN0YXRlICpoanN0YXRlKQogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGlj IGludAorRXhlY0hhc2hDb3VudEJ1ZmZlcnMoQnVmRmlsZSAqKmZpbGVzLCBpbnQgbmZpbGVz KQoreworCWludCBjbnQgPSAwOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBuZmlsZXM7IGkr KykKKwl7CisJCWlmIChmaWxlc1tpXSAmJiBCdWZGaWxlSGFzQnVmZmVyKGZpbGVzW2ldKSkK KwkJCWNudCsrOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKIC8qCiAgKiBFeGVjSGFzaEpv aW5TYXZlVHVwbGUKICAqCQlzYXZlIGEgdHVwbGUgdG8gYSBiYXRjaCBmaWxlLgpAQCAtMTQz OCw2ICsxNjAwLDEzIEBAIEV4ZWNIYXNoSm9pblNhdmVUdXBsZShNaW5pbWFsVHVwbGUgdHVw bGUsIHVpbnQzMiBoYXNodmFsdWUsCiAJCSpmaWxlcHRyID0gZmlsZTsKIAogCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkY3R4KTsKKworCQlpZiAoZmFsc2UpCisJCXsKKwkJCWludAlu aW5uZXIgPSBFeGVjSGFzaENvdW50QnVmZmVycyhoYXNodGFibGUtPmlubmVyQmF0Y2hGaWxl LCBoYXNodGFibGUtPm5iYXRjaCk7CisJCQlpbnQJbm91dGVyID0gRXhlY0hhc2hDb3VudEJ1 ZmZlcnMoaGFzaHRhYmxlLT5vdXRlckJhdGNoRmlsZSwgaGFzaHRhYmxlLT5uYmF0Y2gpOwor CQkJZWxvZyhXQVJOSU5HLCAiY3VyYmF0Y2ggJWQgIGlubmVyICVkICBvdXRlciAlZCIsIGhh c2h0YWJsZS0+Y3VyYmF0Y2gsIG5pbm5lciwgbm91dGVyKTsKKwkJfQogCX0KIAogCUJ1ZkZp bGVXcml0ZShmaWxlLCAmaGFzaHZhbHVlLCBzaXplb2YodWludDMyKSk7CmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvYnVmZmlsZS5jIGIvc3JjL2JhY2tlbmQvc3Rv cmFnZS9maWxlL2J1ZmZpbGUuYwppbmRleCA2NDQ5ZjgyYTcyYi4uZTE1NTk3NmNjMjMgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvZmlsZS9idWZmaWxlLmMKKysrIGIvc3Jj L2JhY2tlbmQvc3RvcmFnZS9maWxlL2J1ZmZpbGUuYwpAQCAtMTAwLDcgKzEwMCw4IEBAIHN0 cnVjdCBCdWZGaWxlCiAJICogWFhYIFNob3VsZCBpZGVhbGx5IHVzIFBHSU9BbGlnbmVkQmxv Y2ssIGJ1dCBtaWdodCBuZWVkIGEgd2F5IHRvIGF2b2lkCiAJICogd2FzdGluZyBwZXItZmls ZSBhbGlnbm1lbnQgcGFkZGluZyB3aGVuIHNvbWUgdXNlcnMgY3JlYXRlIG1hbnkgZmlsZXMu CiAJICovCi0JUEdBbGlnbmVkQmxvY2sgYnVmZmVyOworCU1lbW9yeUNvbnRleHQJYnVmY3R4 OworCVBHQWxpZ25lZEJsb2NrICpidWZmZXI7CiB9OwogCiBzdGF0aWMgQnVmRmlsZSAqbWFr ZUJ1ZkZpbGVDb21tb24oaW50IG5maWxlcyk7CkBAIC0xMjgsNiArMTI5LDkgQEAgbWFrZUJ1 ZkZpbGVDb21tb24oaW50IG5maWxlcykKIAlmaWxlLT5wb3MgPSAwOwogCWZpbGUtPm5ieXRl cyA9IDA7CiAKKwlmaWxlLT5idWZjdHggPSBDdXJyZW50TWVtb3J5Q29udGV4dDsKKwlmaWxl LT5idWZmZXIgPSBOVUxMOworCiAJcmV0dXJuIGZpbGU7CiB9CiAKQEAgLTQyMyw2ICs0Mjcs MzMgQEAgQnVmRmlsZUNsb3NlKEJ1ZkZpbGUgKmZpbGUpCiAJcGZyZWUoZmlsZSk7CiB9CiAK K3N0YXRpYyB2b2lkCitCdWZGaWxlQWxsb2NCdWZmZXIoQnVmRmlsZSAqZmlsZSkKK3sKKwlp ZiAoZmlsZS0+YnVmZmVyICE9IE5VTEwpCisJCXJldHVybjsKKworCWZpbGUtPmJ1ZmZlciA9 IE1lbW9yeUNvbnRleHRBbGxvYyhmaWxlLT5idWZjdHgsIHNpemVvZihQR0FsaWduZWRCbG9j aykpOworfQorCit2b2lkCitCdWZGaWxlRnJlZUJ1ZmZlcihCdWZGaWxlICpmaWxlKQorewor CWlmIChmaWxlLT5idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQnVmRmlsZUZsdXNo KGZpbGUpOworCisJcGZyZWUoZmlsZS0+YnVmZmVyKTsKKwlmaWxlLT5idWZmZXIgPSBOVUxM OworfQorCitib29sCitCdWZGaWxlSGFzQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpCit7CisJcmV0 dXJuIChmaWxlLT5idWZmZXIgIT0gTlVMTCk7Cit9CisKIC8qCiAgKiBCdWZGaWxlTG9hZEJ1 ZmZlcgogICoKQEAgLTQ1NCwxMiArNDg1LDE0IEBAIEJ1ZkZpbGVMb2FkQnVmZmVyKEJ1ZkZp bGUgKmZpbGUpCiAJZWxzZQogCQlJTlNUUl9USU1FX1NFVF9aRVJPKGlvX3N0YXJ0KTsKIAor CUJ1ZkZpbGVBbGxvY0J1ZmZlcihmaWxlKTsKKwogCS8qCiAJICogUmVhZCB3aGF0ZXZlciB3 ZSBjYW4gZ2V0LCB1cCB0byBhIGZ1bGwgYnVmZmVybG9hZC4KIAkgKi8KIAlmaWxlLT5uYnl0 ZXMgPSBGaWxlUmVhZCh0aGlzZmlsZSwKLQkJCQkJCQlmaWxlLT5idWZmZXIuZGF0YSwKLQkJ CQkJCQlzaXplb2YoZmlsZS0+YnVmZmVyKSwKKwkJCQkJCQlmaWxlLT5idWZmZXItPmRhdGEs CisJCQkJCQkJc2l6ZW9mKGZpbGUtPmJ1ZmZlci0+ZGF0YSksCiAJCQkJCQkJZmlsZS0+Y3Vy T2Zmc2V0LAogCQkJCQkJCVdBSVRfRVZFTlRfQlVGRklMRV9SRUFEKTsKIAlpZiAoZmlsZS0+ bmJ5dGVzIDwgMCkKQEAgLTUzNSw3ICs1NjgsNyBAQCBCdWZGaWxlRHVtcEJ1ZmZlcihCdWZG aWxlICpmaWxlKQogCQkJSU5TVFJfVElNRV9TRVRfWkVSTyhpb19zdGFydCk7CiAKIAkJYnl0 ZXN0b3dyaXRlID0gRmlsZVdyaXRlKHRoaXNmaWxlLAotCQkJCQkJCQkgZmlsZS0+YnVmZmVy LmRhdGEgKyB3cG9zLAorCQkJCQkJCQkgZmlsZS0+YnVmZmVyLT5kYXRhICsgd3BvcywKIAkJ CQkJCQkJIGJ5dGVzdG93cml0ZSwKIAkJCQkJCQkJIGZpbGUtPmN1ck9mZnNldCwKIAkJCQkJ CQkJIFdBSVRfRVZFTlRfQlVGRklMRV9XUklURSk7CkBAIC02MTYsNyArNjQ5LDcgQEAgQnVm RmlsZVJlYWRDb21tb24oQnVmRmlsZSAqZmlsZSwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwg Ym9vbCBleGFjdCwgYm9vbCBlb2ZPSykKIAkJCW50aGlzdGltZSA9IHNpemU7CiAJCUFzc2Vy dChudGhpc3RpbWUgPiAwKTsKIAotCQltZW1jcHkocHRyLCBmaWxlLT5idWZmZXIuZGF0YSAr IGZpbGUtPnBvcywgbnRoaXN0aW1lKTsKKwkJbWVtY3B5KHB0ciwgZmlsZS0+YnVmZmVyLT5k YXRhICsgZmlsZS0+cG9zLCBudGhpc3RpbWUpOwogCiAJCWZpbGUtPnBvcyArPSBudGhpc3Rp bWU7CiAJCXB0ciA9IChjaGFyICopIHB0ciArIG50aGlzdGltZTsKQEAgLTY3OSw2ICs3MTIs OCBAQCBCdWZGaWxlV3JpdGUoQnVmRmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqcHRyLCBzaXpl X3Qgc2l6ZSkKIAogCUFzc2VydCghZmlsZS0+cmVhZE9ubHkpOwogCisJQnVmRmlsZUFsbG9j QnVmZmVyKGZpbGUpOworCiAJd2hpbGUgKHNpemUgPiAwKQogCXsKIAkJaWYgKGZpbGUtPnBv cyA+PSBCTENLU1opCkBAIC03MDAsNyArNzM1LDcgQEAgQnVmRmlsZVdyaXRlKEJ1ZkZpbGUg KmZpbGUsIGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCiAJCQludGhpc3RpbWUgPSBz aXplOwogCQlBc3NlcnQobnRoaXN0aW1lID4gMCk7CiAKLQkJbWVtY3B5KGZpbGUtPmJ1ZmZl ci5kYXRhICsgZmlsZS0+cG9zLCBwdHIsIG50aGlzdGltZSk7CisJCW1lbWNweShmaWxlLT5i dWZmZXItPmRhdGEgKyBmaWxlLT5wb3MsIHB0ciwgbnRoaXN0aW1lKTsKIAogCQlmaWxlLT5k aXJ0eSA9IHRydWU7CiAJCWZpbGUtPnBvcyArPSBudGhpc3RpbWU7CmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9leGVjdXRvci9oYXNoam9pbi5oIGIvc3JjL2luY2x1ZGUvZXhlY3V0b3Iv aGFzaGpvaW4uaAppbmRleCA2N2FlODljODI1Ny4uMWJhN2E2ZDFiODggMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2hhc2hqb2luLmgKKysrIGIvc3JjL2luY2x1ZGUvZXhl Y3V0b3IvaGFzaGpvaW4uaApAQCAtMzIyLDkgKzMyMiwxMSBAQCB0eXBlZGVmIHN0cnVjdCBI YXNoSm9pblRhYmxlRGF0YQogCWludAkJCW5iYXRjaDsJCQkvKiBudW1iZXIgb2YgYmF0Y2hl cyAqLwogCWludAkJCWN1cmJhdGNoOwkJLyogY3VycmVudCBiYXRjaCAjOyAwIGR1cmluZyAx c3QgcGFzcyAqLwogCisJaW50CQkJbmJhdGNoX21heGltdW07CQkvKiBtYXhpbXVtIG51bWJl ciBvZiBiYXRjaGVzIHRvIGNyZWF0ZSAqLwogCWludAkJCW5iYXRjaF9vcmlnaW5hbDsJLyog bmJhdGNoIHdoZW4gd2Ugc3RhcnRlZCBpbm5lciBzY2FuICovCiAJaW50CQkJbmJhdGNoX291 dHN0YXJ0OwkvKiBuYmF0Y2ggd2hlbiB3ZSBzdGFydGVkIG91dGVyIHNjYW4gKi8KIAorCWJv b2wJCXRvb01hbnlCYXRjaGVzOwkvKiBkaWQgd2UgZ2VuZXJhdGUgdG9vIG1hbnkgYmF0Y2hl cz8gKi8KIAlib29sCQlncm93RW5hYmxlZDsJLyogZmxhZyB0byBzaHV0IG9mZiBuYmF0Y2gg aW5jcmVhc2VzICovCiAKIAlkb3VibGUJCXRvdGFsVHVwbGVzOwkvKiAjIHR1cGxlcyBvYnRh aW5lZCBmcm9tIGlubmVyIHBsYW4gKi8KQEAgLTM2Miw0ICszNjQsNyBAQCB0eXBlZGVmIHN0 cnVjdCBIYXNoSm9pblRhYmxlRGF0YQogCWRzYV9wb2ludGVyIGN1cnJlbnRfY2h1bmtfc2hh cmVkOwogfSBIYXNoSm9pblRhYmxlRGF0YTsKIAorCisjZGVmaW5lIEhBU0hKT0lOX0JBVENI RVNfUEVSX1BIQVNFCTEyOAorCiAjZW5kaWYJCQkJCQkJLyogSEFTSEpPSU5fSCAqLwpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZmaWxlLmggYi9zcmMvaW5jbHVkZS9z dG9yYWdlL2J1ZmZpbGUuaAppbmRleCA2YjkyNjY4ZDkwZi4uN2RkMmYzOTRjMGQgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmZmlsZS5oCisrKyBiL3NyYy9pbmNsdWRl L3N0b3JhZ2UvYnVmZmlsZS5oCkBAIC01NSw1ICs1NSw3IEBAIGV4dGVybiBCdWZGaWxlICpC dWZGaWxlT3BlbkZpbGVTZXQoRmlsZVNldCAqZmlsZXNldCwgY29uc3QgY2hhciAqbmFtZSwK IGV4dGVybiB2b2lkIEJ1ZkZpbGVEZWxldGVGaWxlU2V0KEZpbGVTZXQgKmZpbGVzZXQsIGNv bnN0IGNoYXIgKm5hbWUsCiAJCQkJCQkJCSBib29sIG1pc3Npbmdfb2spOwogZXh0ZXJuIHZv aWQgQnVmRmlsZVRydW5jYXRlRmlsZVNldChCdWZGaWxlICpmaWxlLCBpbnQgZmlsZW5vLCBv ZmZfdCBvZmZzZXQpOworZXh0ZXJuIHZvaWQgQnVmRmlsZUZyZWVCdWZmZXIoQnVmRmlsZSAq ZmlsZSk7CitleHRlcm4gYm9vbCBCdWZGaWxlSGFzQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpOwog CiAjZW5kaWYJCQkJCQkJLyogQlVGRklMRV9IICovCg== --------------1irM27dwxKKf84QQCnT9Emjy--