Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nTLPM-0004Mr-2c for pgsql-hackers@arkaria.postgresql.org; Sun, 13 Mar 2022 10:25:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nTLPJ-0008G7-OG for pgsql-hackers@arkaria.postgresql.org; Sun, 13 Mar 2022 10:25:01 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nTLPJ-0008FM-4L for pgsql-hackers@lists.postgresql.org; Sun, 13 Mar 2022 10:25:01 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nTLPF-0004lT-KU for pgsql-hackers@lists.postgresql.org; Sun, 13 Mar 2022 10:24:59 +0000 Received: from falcon-note (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 4EA0B21C0389; Sun, 13 Mar 2022 13:24:53 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1647167093; bh=qjT85swJ/UfY86TtoDAuRrrXifFV3DyFww/vTNDGSUI=; h=Subject:From:To:Cc:Date:In-Reply-To:References; b=HadLeucxj5pyFE9fsXWdHRnk8LwxSZSVOKj9QzICzn8NqeMl867iATbvxsPG9PTkn Ff9DK4Ks5Lq1oSAIjNoAe2V8cRhWtV2gJ1BRJ+YHRV0zyJ6Ytqbg5AgyaoKTb4tmgI h6CChppgIQ9OaBZYKWpgPzvM0nbbIgq36LYOzD1o= Message-ID: <6e6cfb8eea5ccac8e4bc2249fe0614d9f97055ee.camel@postgrespro.ru> Subject: Re: BufferAlloc: don't take two simultaneous locks From: Yura Sokolov To: Kyotaro Horiguchi Cc: pgsql-hackers@lists.postgresql.org, michail.nikolaev@gmail.com, x4mmm@yandex-team.ru, andres@anarazel.de, simon.riggs@enterprisedb.com Date: Sun, 13 Mar 2022 13:24:51 +0300 In-Reply-To: <20220311.172137.603201487885714707.horikyota.ntt@gmail.com> References: <20220311.153030.1881495127262295773.horikyota.ntt@gmail.com> <20220311.154949.1643256093439212518.horikyota.ntt@gmail.com> <20220311.172137.603201487885714707.horikyota.ntt@gmail.com> Organization: PostgresPro Content-Type: multipart/mixed; boundary="=-7HObuuU5jr2ASy8O0Rd6" User-Agent: Evolution 3.36.5-0ubuntu1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-7HObuuU5jr2ASy8O0Rd6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit В Пт, 11/03/2022 в 17:21 +0900, Kyotaro Horiguchi пишет: > At Fri, 11 Mar 2022 15:49:49 +0900 (JST), Kyotaro Horiguchi wrote in > > At Fri, 11 Mar 2022 15:30:30 +0900 (JST), Kyotaro Horiguchi wrote in > > > Thanks! I looked into dynahash part. > > > > > > struct HASHHDR > > > { > > > - /* > > > - * The freelist can become a point of contention in high-concurrency hash > > > > > > Why did you move around the freeList? This way it is possible to allocate just first partition, not all 32 partitions. > > Then I looked into bufmgr part. It looks fine to me but I have some > comments on code comments. > > > * To change the association of a valid buffer, we'll need to have > > * exclusive lock on both the old and new mapping partitions. > > if (oldFlags & BM_TAG_VALID) > > We don't take lock on the new mapping partition here. Thx, fixed. > + * Clear out the buffer's tag and flags. We must do this to ensure that > + * linear scans of the buffer array don't think the buffer is valid. We > + * also reset the usage_count since any recency of use of the old content > + * is no longer relevant. > + * > + * We are single pinner, we hold buffer header lock and exclusive > + * partition lock (if tag is valid). Given these statements it is safe to > + * clear tag since no other process can inspect it to the moment. > > This comment is a merger of the comments from InvalidateBuffer and > BufferAlloc. But I think what we need to explain here is why we > invalidate the buffer here despite of we are going to reuse it soon. > And I think we need to state that the old buffer is now safe to use > for the new tag here. I'm not sure the statement is really correct > but clearing-out actually looks like safer. I've tried to reformulate the comment block. > > > Now it is safe to use victim buffer for new tag. Invalidate the > > buffer before releasing header lock to ensure that linear scans of > > the buffer array don't think the buffer is valid. It is safe > > because it is guaranteed that we're the single pinner of the buffer. > > That pin also prevents the buffer from being stolen by others until > > we reuse it or return it to freelist. > > So I want to revise the following comment. > > - * Now it is safe to use victim buffer for new tag. > + * Now reuse victim buffer for new tag. > > * Make sure BM_PERMANENT is set for buffers that must be written at every > > * checkpoint. Unlogged buffers only need to be written at shutdown > > * checkpoints, except for their "init" forks, which need to be treated > > * just like permanent relations. > > * > > * The usage_count starts out at 1 so that the buffer can survive one > > * clock-sweep pass. > > But if you think the current commet is fine, I don't insist on the > comment chagnes. Used suggestion. Fr, 11/03/22 Yura Sokolov wrote: > В Пт, 11/03/2022 в 15:49 +0900, Kyotaro Horiguchi пишет: > > BufTableDelete considers both reuse and !reuse cases but > > BufTableInsert doesn't and always does HASH_ASSIGN. That looks > > odd. We should use HASH_ENTER here. Thus I think it is more > > reasonable that HASH_ENTRY uses the stashed entry if exists and > > needed, or returns it to freelist if exists but not needed. > > > > What do you think about this? > > Well... I don't like it but I don't mind either. > > Code in HASH_ENTER and HASH_ASSIGN cases differs much. > On the other hand, probably it is possible to merge it carefuly. > I'll try. I've merged HASH_ASSIGN into HASH_ENTER. As in previous letter, three commits are concatted to one file and could be applied with `git am`. ------- regards Yura Sokolov Postgres Professional y.sokolov@postgrespro.ru funny.falcon@gmail.com --=-7HObuuU5jr2ASy8O0Rd6 Content-Disposition: attachment; filename="v6-bufmgr-lock-improvements.patch" Content-Type: text/x-patch; name="v6-bufmgr-lock-improvements.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBmYmVjMGRkN2Q5ZjExYWVhZWI4ZjE0MWFkM2RlZGFiNzE3OGFlYjJlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBZdXJhIFNva29sb3YgPHkuc29rb2xvdkBwb3N0Z3Jlc3Byby5y dT4KRGF0ZTogTW9uLCAyMSBGZWIgMjAyMiAwODo0OTowMyArMDMwMApTdWJqZWN0OiBbUEFUQ0gg MS8zXSBidWZtZ3I6IGRvIG5vdCBhY3F1aXJlIHR3byBwYXJ0aXRpb24gbG9ja3MuCgpBY3F1aXJp bmcgdHdvIHBhcnRpdGlvbiBsb2NrcyBsZWFkcyB0byBjb21wbGV4IGRlcGVuZGVuY3kgY2hhaW4g dGhhdCBodXJ0cwphdCBoaWdoIGNvbmN1cnJlbmN5IGxldmVsLgoKVGhlcmUgaXMgbm8gbmVlZCB0 byBob2xkIGJvdGggbG9jayBzaW11bHRhbmVvdXNseS4gQnVmZmVyIGlzIHBpbm5lZCBzbwpvdGhl ciBwcm9jZXNzZXMgY291bGQgbm90IHNlbGVjdCBpdCBmb3IgZXZpY3Rpb24uIElmIHRhZyBpcyBj bGVhcmVkIGFuZApidWZmZXIgcmVtb3ZlZCBmcm9tIG9sZCBwYXJ0aXRpb24gb3RoZXIgcHJvY2Vz c2VzIHdpbGwgbm90IGZpbmQgaXQuClRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvIHJlbGVhc2Ugb2xk IHBhcnRpdGlvbiBsb2NrIGJlZm9yZSBhY3F1aXJpbmcKbmV3IHBhcnRpdGlvbiBsb2NrLgotLS0K IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jIHwgMTk4ICsrKysrKysrKysrKysr LS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA5NiBpbnNlcnRpb25zKCspLCAxMDIgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdy LmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwppbmRleCBmNTQ1OWM2OGY4 OS4uNjM4MjRiMTU2ODYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1 Zm1nci5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jCkBAIC0xMjc1 LDggKzEyNzUsOSBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciByZWxwZXJz aXN0ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl9CiAKIAkJLyoKLQkJICogVG8gY2hhbmdl IHRoZSBhc3NvY2lhdGlvbiBvZiBhIHZhbGlkIGJ1ZmZlciwgd2UnbGwgbmVlZCB0byBoYXZlCi0J CSAqIGV4Y2x1c2l2ZSBsb2NrIG9uIGJvdGggdGhlIG9sZCBhbmQgbmV3IG1hcHBpbmcgcGFydGl0 aW9ucy4KKwkJICogVG8gY2hhbmdlIHRoZSBhc3NvY2lhdGlvbiBvZiBhIHZhbGlkIGJ1ZmZlciwg d2UnbGwgbmVlZCB0byByZXNldAorCQkgKiB0YWcgZmlyc3QsIHNvIHdlIG5lZWQgdG8gaGF2ZSBl eGNsdXNpdmUgbG9jayBvbiB0aGUgb2xkIG1hcHBpbmcKKwkJICogcGFydGl0aW9ucy4KIAkJICov CiAJCWlmIChvbGRGbGFncyAmIEJNX1RBR19WQUxJRCkKIAkJewpAQCAtMTI4OSw5MyArMTI5MCwx NiBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciByZWxwZXJzaXN0ZW5jZSwg Rm9ya051bWJlciBmb3JrTnVtLAogCQkJb2xkSGFzaCA9IEJ1ZlRhYmxlSGFzaENvZGUoJm9sZFRh Zyk7CiAJCQlvbGRQYXJ0aXRpb25Mb2NrID0gQnVmTWFwcGluZ1BhcnRpdGlvbkxvY2sob2xkSGFz aCk7CiAKLQkJCS8qCi0JCQkgKiBNdXN0IGxvY2sgdGhlIGxvd2VyLW51bWJlcmVkIHBhcnRpdGlv biBmaXJzdCB0byBhdm9pZAotCQkJICogZGVhZGxvY2tzLgotCQkJICovCi0JCQlpZiAob2xkUGFy dGl0aW9uTG9jayA8IG5ld1BhcnRpdGlvbkxvY2spCi0JCQl7Ci0JCQkJTFdMb2NrQWNxdWlyZShv bGRQYXJ0aXRpb25Mb2NrLCBMV19FWENMVVNJVkUpOwotCQkJCUxXTG9ja0FjcXVpcmUobmV3UGFy dGl0aW9uTG9jaywgTFdfRVhDTFVTSVZFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9sZFBhcnRpdGlv bkxvY2sgPiBuZXdQYXJ0aXRpb25Mb2NrKQotCQkJewotCQkJCUxXTG9ja0FjcXVpcmUobmV3UGFy dGl0aW9uTG9jaywgTFdfRVhDTFVTSVZFKTsKLQkJCQlMV0xvY2tBY3F1aXJlKG9sZFBhcnRpdGlv bkxvY2ssIExXX0VYQ0xVU0lWRSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJLyogb25seSBv bmUgcGFydGl0aW9uLCBvbmx5IG9uZSBsb2NrICovCi0JCQkJTFdMb2NrQWNxdWlyZShuZXdQYXJ0 aXRpb25Mb2NrLCBMV19FWENMVVNJVkUpOwotCQkJfQorCQkJTFdMb2NrQWNxdWlyZShvbGRQYXJ0 aXRpb25Mb2NrLCBMV19FWENMVVNJVkUpOwogCQl9CiAJCWVsc2UKIAkJewotCQkJLyogaWYgaXQg d2Fzbid0IHZhbGlkLCB3ZSBuZWVkIG9ubHkgdGhlIG5ldyBwYXJ0aXRpb24gKi8KLQkJCUxXTG9j a0FjcXVpcmUobmV3UGFydGl0aW9uTG9jaywgTFdfRVhDTFVTSVZFKTsKIAkJCS8qIHJlbWVtYmVy IHdlIGhhdmUgbm8gb2xkLXBhcnRpdGlvbiBsb2NrIG9yIHRhZyAqLwogCQkJb2xkUGFydGl0aW9u TG9jayA9IE5VTEw7CiAJCQkvKiBrZWVwIHRoZSBjb21waWxlciBxdWlldCBhYm91dCB1bmluaXRp YWxpemVkIHZhcmlhYmxlcyAqLwogCQkJb2xkSGFzaCA9IDA7CiAJCX0KIAotCQkvKgotCQkgKiBU cnkgdG8gbWFrZSBhIGhhc2h0YWJsZSBlbnRyeSBmb3IgdGhlIGJ1ZmZlciB1bmRlciBpdHMgbmV3 IHRhZy4KLQkJICogVGhpcyBjb3VsZCBmYWlsIGJlY2F1c2Ugd2hpbGUgd2Ugd2VyZSB3cml0aW5n IHNvbWVvbmUgZWxzZQotCQkgKiBhbGxvY2F0ZWQgYW5vdGhlciBidWZmZXIgZm9yIHRoZSBzYW1l IGJsb2NrIHdlIHdhbnQgdG8gcmVhZCBpbi4KLQkJICogTm90ZSB0aGF0IHdlIGhhdmUgbm90IHll dCByZW1vdmVkIHRoZSBoYXNodGFibGUgZW50cnkgZm9yIHRoZSBvbGQKLQkJICogdGFnLgotCQkg Ki8KLQkJYnVmX2lkID0gQnVmVGFibGVJbnNlcnQoJm5ld1RhZywgbmV3SGFzaCwgYnVmLT5idWZf aWQpOwotCi0JCWlmIChidWZfaWQgPj0gMCkKLQkJewotCQkJLyoKLQkJCSAqIEdvdCBhIGNvbGxp c2lvbi4gU29tZW9uZSBoYXMgYWxyZWFkeSBkb25lIHdoYXQgd2Ugd2VyZSBhYm91dCB0bwotCQkJ ICogZG8uIFdlJ2xsIGp1c3QgaGFuZGxlIHRoaXMgYXMgaWYgaXQgd2VyZSBmb3VuZCBpbiB0aGUg YnVmZmVyCi0JCQkgKiBwb29sIGluIHRoZSBmaXJzdCBwbGFjZS4gIEZpcnN0LCBnaXZlIHVwIHRo ZSBidWZmZXIgd2Ugd2VyZQotCQkJICogcGxhbm5pbmcgdG8gdXNlLgotCQkJICovCi0JCQlVbnBp bkJ1ZmZlcihidWYsIHRydWUpOwotCi0JCQkvKiBDYW4gZ2l2ZSB1cCB0aGF0IGJ1ZmZlcidzIG1h cHBpbmcgcGFydGl0aW9uIGxvY2sgbm93ICovCi0JCQlpZiAob2xkUGFydGl0aW9uTG9jayAhPSBO VUxMICYmCi0JCQkJb2xkUGFydGl0aW9uTG9jayAhPSBuZXdQYXJ0aXRpb25Mb2NrKQotCQkJCUxX TG9ja1JlbGVhc2Uob2xkUGFydGl0aW9uTG9jayk7Ci0KLQkJCS8qIHJlbWFpbmluZyBjb2RlIHNo b3VsZCBtYXRjaCBjb2RlIGF0IHRvcCBvZiByb3V0aW5lICovCi0KLQkJCWJ1ZiA9IEdldEJ1ZmZl ckRlc2NyaXB0b3IoYnVmX2lkKTsKLQotCQkJdmFsaWQgPSBQaW5CdWZmZXIoYnVmLCBzdHJhdGVn eSk7Ci0KLQkJCS8qIENhbiByZWxlYXNlIHRoZSBtYXBwaW5nIGxvY2sgYXMgc29vbiBhcyB3ZSd2 ZSBwaW5uZWQgaXQgKi8KLQkJCUxXTG9ja1JlbGVhc2UobmV3UGFydGl0aW9uTG9jayk7Ci0KLQkJ CSpmb3VuZFB0ciA9IHRydWU7Ci0KLQkJCWlmICghdmFsaWQpCi0JCQl7Ci0JCQkJLyoKLQkJCQkg KiBXZSBjYW4gb25seSBnZXQgaGVyZSBpZiAoYSkgc29tZW9uZSBlbHNlIGlzIHN0aWxsIHJlYWRp bmcKLQkJCQkgKiBpbiB0aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0IGZh aWxlZC4gIFdlCi0JCQkJICogaGF2ZSB0byB3YWl0IGZvciBhbnkgYWN0aXZlIHJlYWQgYXR0ZW1w dCB0byBmaW5pc2gsIGFuZAotCQkJCSAqIHRoZW4gc2V0IHVwIG91ciBvd24gcmVhZCBhdHRlbXB0 IGlmIHRoZSBwYWdlIGlzIHN0aWxsIG5vdAotCQkJCSAqIEJNX1ZBTElELiAgU3RhcnRCdWZmZXJJ TyBkb2VzIGl0IGFsbC4KLQkJCQkgKi8KLQkJCQlpZiAoU3RhcnRCdWZmZXJJTyhidWYsIHRydWUp KQotCQkJCXsKLQkJCQkJLyoKLQkJCQkJICogSWYgd2UgZ2V0IGhlcmUsIHByZXZpb3VzIGF0dGVt cHRzIHRvIHJlYWQgdGhlIGJ1ZmZlcgotCQkJCQkgKiBtdXN0IGhhdmUgZmFpbGVkIC4uLiBidXQg d2Ugc2hhbGwgYnJhdmVseSB0cnkgYWdhaW4uCi0JCQkJCSAqLwotCQkJCQkqZm91bmRQdHIgPSBm YWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBidWY7Ci0JCX0KLQogCQkvKgogCQkgKiBO ZWVkIHRvIGxvY2sgdGhlIGJ1ZmZlciBoZWFkZXIgdG9vIGluIG9yZGVyIHRvIGNoYW5nZSBpdHMg dGFnLgogCQkgKi8KQEAgLTEzODMsNDAgKzEzMDcsMTE3IEBAIEJ1ZmZlckFsbG9jKFNNZ3JSZWxh dGlvbiBzbWdyLCBjaGFyIHJlbHBlcnNpc3RlbmNlLCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAKIAkJ LyoKIAkJICogU29tZWJvZHkgY291bGQgaGF2ZSBwaW5uZWQgb3IgcmUtZGlydGllZCB0aGUgYnVm ZmVyIHdoaWxlIHdlIHdlcmUKLQkJICogZG9pbmcgdGhlIEkvTyBhbmQgbWFraW5nIHRoZSBuZXcg aGFzaHRhYmxlIGVudHJ5LiAgSWYgc28sIHdlIGNhbid0Ci0JCSAqIHJlY3ljbGUgdGhpcyBidWZm ZXI7IHdlIG11c3QgdW5kbyBldmVyeXRoaW5nIHdlJ3ZlIGRvbmUgYW5kIHN0YXJ0Ci0JCSAqIG92 ZXIgd2l0aCBhIG5ldyB2aWN0aW0gYnVmZmVyLgorCQkgKiBkb2luZyB0aGUgSS9PLiAgSWYgc28s IHdlIGNhbid0IHJlY3ljbGUgdGhpcyBidWZmZXI7IHdlIG11c3QgdW5kbworCQkgKiBldmVyeXRo aW5nIHdlJ3ZlIGRvbmUgYW5kIHN0YXJ0IG92ZXIgd2l0aCBhIG5ldyB2aWN0aW0gYnVmZmVyLgog CQkgKi8KIAkJb2xkRmxhZ3MgPSBidWZfc3RhdGUgJiBCVUZfRkxBR19NQVNLOwogCQlpZiAoQlVG X1NUQVRFX0dFVF9SRUZDT1VOVChidWZfc3RhdGUpID09IDEgJiYgIShvbGRGbGFncyAmIEJNX0RJ UlRZKSkKIAkJCWJyZWFrOwogCiAJCVVubG9ja0J1ZkhkcihidWYsIGJ1Zl9zdGF0ZSk7Ci0JCUJ1 ZlRhYmxlRGVsZXRlKCZuZXdUYWcsIG5ld0hhc2gpOwotCQlpZiAob2xkUGFydGl0aW9uTG9jayAh PSBOVUxMICYmCi0JCQlvbGRQYXJ0aXRpb25Mb2NrICE9IG5ld1BhcnRpdGlvbkxvY2spCisJCWlm IChvbGRQYXJ0aXRpb25Mb2NrICE9IE5VTEwpCiAJCQlMV0xvY2tSZWxlYXNlKG9sZFBhcnRpdGlv bkxvY2spOwotCQlMV0xvY2tSZWxlYXNlKG5ld1BhcnRpdGlvbkxvY2spOwogCQlVbnBpbkJ1ZmZl cihidWYsIHRydWUpOwogCX0KIAogCS8qCi0JICogT2theSwgaXQncyBmaW5hbGx5IHNhZmUgdG8g cmVuYW1lIHRoZSBidWZmZXIuCisJICogV2UgYXJlIHNpbmdsZSBwaW5uZXIsIHdlIGhvbGQgYnVm ZmVyIGhlYWRlciBsb2NrIGFuZCBleGNsdXNpdmUKKwkgKiBwYXJ0aXRpb24gbG9jayAoaWYgdGFn IGlzIHZhbGlkKS4gSXQgbWVhbnMgbm8gb3RoZXIgcHJvY2VzcyBjYW4gaW5zcGVjdAorCSAqIGl0 IGF0IHRoZSBtb21lbnQuCiAJICoKLQkgKiBDbGVhcmluZyBCTV9WQUxJRCBoZXJlIGlzIG5lY2Vz c2FyeSwgY2xlYXJpbmcgdGhlIGRpcnR5Yml0cyBpcyBqdXN0Ci0JICogcGFyYW5vaWEuICBXZSBh bHNvIHJlc2V0IHRoZSB1c2FnZV9jb3VudCBzaW5jZSBhbnkgcmVjZW5jeSBvZiB1c2Ugb2YKLQkg KiB0aGUgb2xkIGNvbnRlbnQgaXMgbm8gbG9uZ2VyIHJlbGV2YW50LiAgKFRoZSB1c2FnZV9jb3Vu dCBzdGFydHMgb3V0IGF0Ci0JICogMSBzbyB0aGF0IHRoZSBidWZmZXIgY2FuIHN1cnZpdmUgb25l IGNsb2NrLXN3ZWVwIHBhc3MuKQorCSAqIEJ1dCB3ZSB3aWxsIHJlbGVhc2UgcGFydGl0aW9uIGxv Y2sgYW5kIGJ1ZmZlciBoZWFkZXIgbG9jay4gV2UgbXVzdCBiZQorCSAqIHN1cmUgb3RoZXIgYmFj a2VuZCB3aWxsIG5vdCB1c2UgdGhpcyBidWZmZXIgdW50aWwgd2UgcmV1c2UgaXQgZm9yIG5ldwor CSAqIHRhZy4gVGhlcmVmb3JlLCB3ZSBjbGVhciBvdXQgdGhlIGJ1ZmZlcidzIHRhZyBhbmQgZmxh Z3MgYW5kIHJlbW92ZSBpdAorCSAqIGZyb20gYnVmZmVyIHRhYmxlLiBBbHNvIGJ1ZmZlciByZW1h aW5zIHBpbm5lZCB0byBlbnN1cmUKKwkgKiBTdHJhdGVneUdldEJ1ZmZlciB3aWxsIG5vdCB0cnkg dG8gcmV1c2UgdGhlIGJ1ZmZlciBjb25jdXJyZW50bHkuCisJICoKKwkgKiBXZSBhbHNvIHJlc2V0 IHRoZSB1c2FnZV9jb3VudCBzaW5jZSBhbnkgcmVjZW5jeSBvZiB1c2Ugb2YgdGhlIG9sZAorCSAq IGNvbnRlbnQgaXMgbm8gbG9uZ2VyIHJlbGV2YW50LgorCSAqLworCUNMRUFSX0JVRkZFUlRBRyhi dWYtPnRhZyk7CisJYnVmX3N0YXRlICY9IH4oQlVGX0ZMQUdfTUFTSyB8IEJVRl9VU0FHRUNPVU5U X01BU0spOworCVVubG9ja0J1ZkhkcihidWYsIGJ1Zl9zdGF0ZSk7CisKKwkvKiBEZWxldGUgb2xk IHRhZyBmcm9tIGhhc2ggdGFibGUgaWYgaXQgd2VyZSB2YWxpZC4gKi8KKwlpZiAob2xkRmxhZ3Mg JiBCTV9UQUdfVkFMSUQpCisJCUJ1ZlRhYmxlRGVsZXRlKCZvbGRUYWcsIG9sZEhhc2gpOworCisJ aWYgKG9sZFBhcnRpdGlvbkxvY2sgIT0gbmV3UGFydGl0aW9uTG9jaykKKwl7CisJCWlmIChvbGRQ YXJ0aXRpb25Mb2NrICE9IE5VTEwpCisJCQlMV0xvY2tSZWxlYXNlKG9sZFBhcnRpdGlvbkxvY2sp OworCQlMV0xvY2tBY3F1aXJlKG5ld1BhcnRpdGlvbkxvY2ssIExXX0VYQ0xVU0lWRSk7CisJfQor CisJLyoKKwkgKiBUcnkgdG8gbWFrZSBhIGhhc2h0YWJsZSBlbnRyeSBmb3IgdGhlIGJ1ZmZlciB1 bmRlciBpdHMgbmV3IHRhZy4gVGhpcworCSAqIGNvdWxkIGZhaWwgYmVjYXVzZSB3aGlsZSB3ZSB3 ZXJlIHdyaXRpbmcgc29tZW9uZSBlbHNlIGFsbG9jYXRlZCBhbm90aGVyCisJICogYnVmZmVyIGZv ciB0aGUgc2FtZSBibG9jayB3ZSB3YW50IHRvIHJlYWQgaW4uIEluIHRoYXQgY2FzZSB3ZSB3aWxs IGhhdmUKKwkgKiB0byByZXR1cm4gb3VyIGJ1ZmZlciB0byBmcmVlIGxpc3QuCisJICovCisJYnVm X2lkID0gQnVmVGFibGVJbnNlcnQoJm5ld1RhZywgbmV3SGFzaCwgYnVmLT5idWZfaWQpOworCisJ aWYgKGJ1Zl9pZCA+PSAwKQorCXsKKwkJLyoKKwkJICogR290IGEgY29sbGlzaW9uLiBTb21lb25l IGhhcyBhbHJlYWR5IGRvbmUgd2hhdCB3ZSB3ZXJlIGFib3V0IHRvIGRvLgorCQkgKiBXZSdsbCBq dXN0IGhhbmRsZSB0aGlzIGFzIGlmIGl0IHdlcmUgZm91bmQgaW4gdGhlIGJ1ZmZlciBwb29sIGlu CisJCSAqIHRoZSBmaXJzdCBwbGFjZS4KKwkJICovCisKKwkJLyoKKwkJICogRmlyc3QsIGdpdmUg dXAgdGhlIGJ1ZmZlciB3ZSB3ZXJlIHBsYW5uaW5nIHRvIHVzZSBhbmQgcHV0IGl0IHRvCisJCSAq IGZyZWUgbGlzdHMuCisJCSAqLworCQlVbnBpbkJ1ZmZlcihidWYsIHRydWUpOworCQlTdHJhdGVn eUZyZWVCdWZmZXIoYnVmKTsKKworCQkvKiByZW1haW5pbmcgY29kZSBzaG91bGQgbWF0Y2ggY29k ZSBhdCB0b3Agb2Ygcm91dGluZSAqLworCisJCWJ1ZiA9IEdldEJ1ZmZlckRlc2NyaXB0b3IoYnVm X2lkKTsKKworCQl2YWxpZCA9IFBpbkJ1ZmZlcihidWYsIHN0cmF0ZWd5KTsKKworCQkvKiBDYW4g cmVsZWFzZSB0aGUgbWFwcGluZyBsb2NrIGFzIHNvb24gYXMgd2UndmUgcGlubmVkIGl0ICovCisJ CUxXTG9ja1JlbGVhc2UobmV3UGFydGl0aW9uTG9jayk7CisKKwkJKmZvdW5kUHRyID0gdHJ1ZTsK KworCQlpZiAoIXZhbGlkKQorCQl7CisJCQkvKgorCQkJICogV2UgY2FuIG9ubHkgZ2V0IGhlcmUg aWYgKGEpIHNvbWVvbmUgZWxzZSBpcyBzdGlsbCByZWFkaW5nIGluCisJCQkgKiB0aGUgcGFnZSwg b3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0IGZhaWxlZC4gIFdlIGhhdmUgdG8KKwkJCSAq IHdhaXQgZm9yIGFueSBhY3RpdmUgcmVhZCBhdHRlbXB0IHRvIGZpbmlzaCwgYW5kIHRoZW4gc2V0 IHVwIG91cgorCQkJICogb3duIHJlYWQgYXR0ZW1wdCBpZiB0aGUgcGFnZSBpcyBzdGlsbCBub3Qg Qk1fVkFMSUQuCisJCQkgKiBTdGFydEJ1ZmZlcklPIGRvZXMgaXQgYWxsLgorCQkJICovCisJCQlp ZiAoU3RhcnRCdWZmZXJJTyhidWYsIHRydWUpKQorCQkJeworCQkJCS8qCisJCQkJICogSWYgd2Ug Z2V0IGhlcmUsIHByZXZpb3VzIGF0dGVtcHRzIHRvIHJlYWQgdGhlIGJ1ZmZlciBtdXN0CisJCQkJ ICogaGF2ZSBmYWlsZWQgLi4uIGJ1dCB3ZSBzaGFsbCBicmF2ZWx5IHRyeSBhZ2Fpbi4KKwkJCQkg Ki8KKwkJCQkqZm91bmRQdHIgPSBmYWxzZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBidWY7CisJ fQorCisJLyoKKwkgKiBOb3cgcmV1c2UgdmljdGltIGJ1ZmZlciBmb3IgbmV3IHRhZy4KIAkgKgog CSAqIE1ha2Ugc3VyZSBCTV9QRVJNQU5FTlQgaXMgc2V0IGZvciBidWZmZXJzIHRoYXQgbXVzdCBi ZSB3cml0dGVuIGF0IGV2ZXJ5CiAJICogY2hlY2twb2ludC4gIFVubG9nZ2VkIGJ1ZmZlcnMgb25s eSBuZWVkIHRvIGJlIHdyaXR0ZW4gYXQgc2h1dGRvd24KIAkgKiBjaGVja3BvaW50cywgZXhjZXB0 IGZvciB0aGVpciAiaW5pdCIgZm9ya3MsIHdoaWNoIG5lZWQgdG8gYmUgdHJlYXRlZAogCSAqIGp1 c3QgbGlrZSBwZXJtYW5lbnQgcmVsYXRpb25zLgorCSAqCisJICogVGhlIHVzYWdlX2NvdW50IHN0 YXJ0cyBvdXQgYXQgMSBzbyB0aGF0IHRoZSBidWZmZXIgY2FuIHN1cnZpdmUgb25lCisJICogY2xv Y2stc3dlZXAgcGFzcy4KIAkgKi8KKwlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zik7CiAJYnVm LT50YWcgPSBuZXdUYWc7Ci0JYnVmX3N0YXRlICY9IH4oQk1fVkFMSUQgfCBCTV9ESVJUWSB8IEJN X0pVU1RfRElSVElFRCB8Ci0JCQkJICAgQk1fQ0hFQ0tQT0lOVF9ORUVERUQgfCBCTV9JT19FUlJP UiB8IEJNX1BFUk1BTkVOVCB8Ci0JCQkJICAgQlVGX1VTQUdFQ09VTlRfTUFTSyk7CiAJaWYgKHJl bHBlcnNpc3RlbmNlID09IFJFTFBFUlNJU1RFTkNFX1BFUk1BTkVOVCB8fCBmb3JrTnVtID09IElO SVRfRk9SS05VTSkKIAkJYnVmX3N0YXRlIHw9IEJNX1RBR19WQUxJRCB8IEJNX1BFUk1BTkVOVCB8 IEJVRl9VU0FHRUNPVU5UX09ORTsKIAllbHNlCkBAIC0xNDI0LDEzICsxNDI1LDYgQEAgQnVmZmVy QWxsb2MoU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVuY2UsIEZvcmtOdW1iZXIg Zm9ya051bSwKIAogCVVubG9ja0J1ZkhkcihidWYsIGJ1Zl9zdGF0ZSk7CiAKLQlpZiAob2xkUGFy dGl0aW9uTG9jayAhPSBOVUxMKQotCXsKLQkJQnVmVGFibGVEZWxldGUoJm9sZFRhZywgb2xkSGFz aCk7Ci0JCWlmIChvbGRQYXJ0aXRpb25Mb2NrICE9IG5ld1BhcnRpdGlvbkxvY2spCi0JCQlMV0xv Y2tSZWxlYXNlKG9sZFBhcnRpdGlvbkxvY2spOwotCX0KLQogCUxXTG9ja1JlbGVhc2UobmV3UGFy dGl0aW9uTG9jayk7CiAKIAkvKgotLSAKMi4zNS4xCgoKRnJvbSA2MWJhZTBlOTNiYTcxYTI0ODkw YjkyNjZlMDJlODc2ZDEzMDZiNWViIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBZdXJh IFNva29sb3YgPHkuc29rb2xvdkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogTW9uLCAyOCBGZWIgMjAy MiAxMjoxOToxNyArMDMwMApTdWJqZWN0OiBbUEFUQ0ggMi8zXSBBZGQgSEFTSF9SRVVTRSBhbmQg dXNlIGl0IGluIEJ1ZlRhYmxlLgoKQXZvaWQgZHluYWhhc2gncyBmcmVlbGlzdCBsb2NraW5nIHdo ZW4gQnVmZmVyQWxsb2MgcmV1c2VzIGJ1ZmZlciBmb3IKZGlmZmVyZW50IHRhZy4KCkhBU0hfUkVV U0UgYWN0cyBhcyBIQVNIX1JFTU9WRSwgYnV0IHN0b3JlcyBlbGVtZW50IHRvIHJldXNlIGluIHN0 YXRpYwp2YXJpYWJsZSBpbnN0ZWFkIG9mIGZyZWVsaXN0IHBhcnRpdGlvbi4gQW5kIEhBU0hfRU5U RVIgdGhlbiBtYXkgdXNlIHRoZQplbGVtZW50LgoKVW5mb3J0dW5hdGVseSwgRnJlZUxpc3REYXRh LT5uZW50cmllcyBoYWQgdG8gYmUgbWFuaXB1bGF0ZWQgZXZlbiBpbiB0aGlzCmNhc2UuIFNvIGlu c3RlYWQgb2YgbWFuaXB1bGF0aW9uIHdpdGggbmVudHJpZXMsIHdlIHJlcGxhY2UgbmVudHJpZXMg d2l0aApuZnJlZSAtIGFjdHVhbCBsZW5ndGggb2YgZnJlZSBsaXN0LCBhbmQgbmFsbG9jZWQgLSBp bml0aWFsbHkgYWxsb2NhdGVkCmVudHJpZXMgZm9yIGZyZWUgbGlzdC4gVGhpcyB3ZXJlIHN1Z2dl c3RlZCBieSBSb2JlcnQgSGFhcyBpbgpodHRwczovL3Bvc3Rnci5lcy9tL0NBJTJCVGdtb1prZy0w NHJjTlJVUnQlM0RqQUcwQ3M1b1B5Qi1xS3hINHdxWDA5ZS1vWHktbnclNDBtYWlsLmdtYWlsLmNv bQotLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zl90YWJsZS5jIHwgICA3ICstCiBz cmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYyAgICB8ICAgNCArLQogc3JjL2JhY2tl bmQvdXRpbHMvaGFzaC9keW5haGFzaC5jICAgICAgfCAxMjYgKysrKysrKysrKysrKysrKysrKyst LS0tLQogc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZfaW50ZXJuYWxzLmggICAgfCAgIDIgKy0KIHNy Yy9pbmNsdWRlL3V0aWxzL2hzZWFyY2guaCAgICAgICAgICAgIHwgICAzICstCiA1IGZpbGVzIGNo YW5nZWQsIDExMyBpbnNlcnRpb25zKCspLCAyOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZfdGFibGUuYyBiL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvYnVmZmVyL2J1Zl90YWJsZS5jCmluZGV4IGRjNDM5OTQwZmFhLi5jMTg5NTU1NzUxZSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmX3RhYmxlLmMKKysrIGIvc3Jj L2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmX3RhYmxlLmMKQEAgLTE0MywxMCArMTQzLDEzIEBA IEJ1ZlRhYmxlSW5zZXJ0KEJ1ZmZlclRhZyAqdGFnUHRyLCB1aW50MzIgaGFzaGNvZGUsIGludCBi dWZfaWQpCiAgKiBCdWZUYWJsZURlbGV0ZQogICoJCURlbGV0ZSB0aGUgaGFzaHRhYmxlIGVudHJ5 IGZvciBnaXZlbiB0YWcgKHdoaWNoIG11c3QgZXhpc3QpCiAgKgorICogSWYgcmV1c2UgZmxhZyBp cyB0cnVlLCBkZWxldGVkIGVudHJ5IGlzIGNhY2hlZCBmb3IgcmV1c2UsIGFuZCBjYWxsZXIKKyAq IG11c3QgY2FsbCBCdWZUYWJsZUluc2VydCBuZXh0LgorICoKICAqIENhbGxlciBtdXN0IGhvbGQg ZXhjbHVzaXZlIGxvY2sgb24gQnVmTWFwcGluZ0xvY2sgZm9yIHRhZydzIHBhcnRpdGlvbgogICov CiB2b2lkCi1CdWZUYWJsZURlbGV0ZShCdWZmZXJUYWcgKnRhZ1B0ciwgdWludDMyIGhhc2hjb2Rl KQorQnVmVGFibGVEZWxldGUoQnVmZmVyVGFnICp0YWdQdHIsIHVpbnQzMiBoYXNoY29kZSwgYm9v bCByZXVzZSkKIHsKIAlCdWZmZXJMb29rdXBFbnQgKnJlc3VsdDsKIApAQCAtMTU0LDcgKzE1Nyw3 IEBAIEJ1ZlRhYmxlRGVsZXRlKEJ1ZmZlclRhZyAqdGFnUHRyLCB1aW50MzIgaGFzaGNvZGUpCiAJ CWhhc2hfc2VhcmNoX3dpdGhfaGFzaF92YWx1ZShTaGFyZWRCdWZIYXNoLAogCQkJCQkJCQkJKHZv aWQgKikgdGFnUHRyLAogCQkJCQkJCQkJaGFzaGNvZGUsCi0JCQkJCQkJCQlIQVNIX1JFTU9WRSwK KwkJCQkJCQkJCXJldXNlID8gSEFTSF9SRVVTRSA6IEhBU0hfUkVNT1ZFLAogCQkJCQkJCQkJTlVM TCk7CiAKIAlpZiAoIXJlc3VsdCkJCQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgYi9zcmMvYmFja2VuZC9zdG9y YWdlL2J1ZmZlci9idWZtZ3IuYwppbmRleCA2MzgyNGIxNTY4Ni4uMjA0Y2ViZTM4NDMgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jCisrKyBiL3NyYy9iYWNr ZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jCkBAIC0xMzQwLDcgKzEzNDAsNyBAQCBCdWZmZXJB bGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciByZWxwZXJzaXN0ZW5jZSwgRm9ya051bWJlciBm b3JrTnVtLAogCiAJLyogRGVsZXRlIG9sZCB0YWcgZnJvbSBoYXNoIHRhYmxlIGlmIGl0IHdlcmUg dmFsaWQuICovCiAJaWYgKG9sZEZsYWdzICYgQk1fVEFHX1ZBTElEKQotCQlCdWZUYWJsZURlbGV0 ZSgmb2xkVGFnLCBvbGRIYXNoKTsKKwkJQnVmVGFibGVEZWxldGUoJm9sZFRhZywgb2xkSGFzaCwg dHJ1ZSk7CiAKIAlpZiAob2xkUGFydGl0aW9uTG9jayAhPSBuZXdQYXJ0aXRpb25Mb2NrKQogCXsK QEAgLTE1MzQsNyArMTUzNCw3IEBAIHJldHJ5OgogCSAqIFJlbW92ZSB0aGUgYnVmZmVyIGZyb20g dGhlIGxvb2t1cCBoYXNodGFibGUsIGlmIGl0IHdhcyBpbiB0aGVyZS4KIAkgKi8KIAlpZiAob2xk RmxhZ3MgJiBCTV9UQUdfVkFMSUQpCi0JCUJ1ZlRhYmxlRGVsZXRlKCZvbGRUYWcsIG9sZEhhc2gp OworCQlCdWZUYWJsZURlbGV0ZSgmb2xkVGFnLCBvbGRIYXNoLCBmYWxzZSk7CiAKIAkvKgogCSAq IERvbmUgd2l0aCBtYXBwaW5nIGxvY2suCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9o YXNoL2R5bmFoYXNoLmMgYi9zcmMvYmFja2VuZC91dGlscy9oYXNoL2R5bmFoYXNoLmMKaW5kZXgg M2JhYmRlOGQ3MDQuLjBjYjM1YTBmYWY5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9o YXNoL2R5bmFoYXNoLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvaGFzaC9keW5haGFzaC5jCkBA IC0xNCw3ICsxNCw3IEBACiAgKiBhIGhhc2ggdGFibGUgaW4gcGFydGl0aW9uZWQgbW9kZSwgdGhl IEhBU0hfUEFSVElUSU9OIGZsYWcgbXVzdCBiZSBnaXZlbgogICogdG8gaGFzaF9jcmVhdGUuICBU aGlzIHByZXZlbnRzIGFueSBhdHRlbXB0IHRvIHNwbGl0IGJ1Y2tldHMgb24tdGhlLWZseS4KICAq IFRoZXJlZm9yZSwgZWFjaCBoYXNoIGJ1Y2tldCBjaGFpbiBvcGVyYXRlcyBpbmRlcGVuZGVudGx5 LCBhbmQgbm8gZmllbGRzCi0gKiBvZiB0aGUgaGFzaCBoZWFkZXIgY2hhbmdlIGFmdGVyIGluaXQg ZXhjZXB0IG5lbnRyaWVzIGFuZCBmcmVlTGlzdC4KKyAqIG9mIHRoZSBoYXNoIGhlYWRlciBjaGFu Z2UgYWZ0ZXIgaW5pdCBleGNlcHQgbmZyZWUgYW5kIGZyZWVMaXN0LgogICogKEEgcGFydGl0aW9u ZWQgdGFibGUgdXNlcyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhvc2UgZmllbGRzLCBndWFyZGVkIGJ5 CiAgKiBzcGlubG9ja3MsIGZvciBhZGRpdGlvbmFsIGNvbmN1cnJlbmN5LikKICAqIFRoaXMgbGV0 cyBhbnkgc3Vic2V0IG9mIHRoZSBoYXNoIGJ1Y2tldHMgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRl bHkKQEAgLTEzOCw4ICsxMzgsOSBAQCB0eXBlZGVmIEhBU0hCVUNLRVQgKkhBU0hTRUdNRU5UOwog ICoKICAqIEluIGEgcGFydGl0aW9uZWQgaGFzaCB0YWJsZSwgZWFjaCBmcmVlbGlzdCBpcyBhc3Nv Y2lhdGVkIHdpdGggYSBzcGVjaWZpYwogICogc2V0IG9mIGhhc2hjb2RlcywgYXMgZGV0ZXJtaW5l ZCBieSB0aGUgRlJFRUxJU1RfSURYKCkgbWFjcm8gYmVsb3cuCi0gKiBuZW50cmllcyB0cmFja3Mg dGhlIG51bWJlciBvZiBsaXZlIGhhc2h0YWJsZSBlbnRyaWVzIGhhdmluZyB0aG9zZSBoYXNoY29k ZXMKLSAqIChOT1QgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmcmVlbGlzdCwgYXMgeW91 IG1pZ2h0IGV4cGVjdCkuCisgKiBuYWxsb2NlZCB0cmFja3MgdGhlIG51bWJlciBvZiBmcmVlIGhh c2h0YWJsZSBlbnRyaWVzIGluaXRpYWxseSBhbGxvY2F0ZWQKKyAqIGZvciB0aGUgZnJlZWxpc3Qu CisgKiBuZnJlZSB0cmFja3MgdGhlIGFjdHVhbCBudW1iZXIgb2YgZnJlZSBoYXNodGFibGUgZW50 cmllcyBpbiB0aGUgZnJlZWxpc3QuCiAgKgogICogVGhlIGNvdmVyYWdlIG9mIGEgZnJlZWxpc3Qg bWlnaHQgYmUgbW9yZSBvciBsZXNzIHRoYW4gb25lIHBhcnRpdGlvbiwgc28gaXQKICAqIG5lZWRz IGl0cyBvd24gbG9jayByYXRoZXIgdGhhbiByZWx5aW5nIG9uIGNhbGxlciBsb2NraW5nLiAgUmVs eWluZyBvbiB0aGF0CkBAIC0xNDcsMTMgKzE0OCwxNSBAQCB0eXBlZGVmIEhBU0hCVUNLRVQgKkhB U0hTRUdNRU5UOwogICogbmVlZCB0byAiYm9ycm93IiBlbnRyaWVzIGZyb20gYW5vdGhlciBmcmVl bGlzdDsgc2VlIGdldF9oYXNoX2VudHJ5KCkuCiAgKgogICogVXNpbmcgYW4gYXJyYXkgb2YgRnJl ZUxpc3REYXRhIGluc3RlYWQgb2Ygc2VwYXJhdGUgYXJyYXlzIG9mIG11dGV4ZXMsCi0gKiBuZW50 cmllcyBhbmQgZnJlZUxpc3RzIGhlbHBzIHRvIHJlZHVjZSBzaGFyaW5nIG9mIGNhY2hlIGxpbmVz IGJldHdlZW4KKyAqIG5mcmVlIGFuZCBmcmVlTGlzdHMgaGVscHMgdG8gcmVkdWNlIHNoYXJpbmcg b2YgY2FjaGUgbGluZXMgYmV0d2VlbgogICogZGlmZmVyZW50IG11dGV4ZXMuCiAgKi8KIHR5cGVk ZWYgc3RydWN0CiB7CiAJc2xvY2tfdAkJbXV0ZXg7CQkJLyogc3BpbmxvY2sgZm9yIHRoaXMgZnJl ZWxpc3QgKi8KLQlsb25nCQluZW50cmllczsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIGFzc29j aWF0ZWQgYnVja2V0cyAqLworCWxvbmcJCW5mcmVlOwkJCS8qIG51bWJlciBvZiBmcmVlIGVudHJp ZXMgaW4gdGhlIGxpc3QgKi8KKwlsb25nCQluYWxsb2NlZDsJCS8qIG51bWJlciBvZiBlbnRyaWVz IGluaXRpYWxseSBhbGxvY2F0ZWQgZm9yCisJCQkJCQkJCSAqIHRoZSBsaXN0ICovCiAJSEFTSEVM RU1FTlQgKmZyZWVMaXN0OwkJLyogY2hhaW4gb2YgZnJlZSBlbGVtZW50cyAqLwogfSBGcmVlTGlz dERhdGE7CiAKQEAgLTE3MCw3ICsxNzMsNyBAQCBzdHJ1Y3QgSEFTSEhEUgogCS8qCiAJICogVGhl IGZyZWVsaXN0IGNhbiBiZWNvbWUgYSBwb2ludCBvZiBjb250ZW50aW9uIGluIGhpZ2gtY29uY3Vy cmVuY3kgaGFzaAogCSAqIHRhYmxlcywgc28gd2UgdXNlIGFuIGFycmF5IG9mIGZyZWVsaXN0cywg ZWFjaCB3aXRoIGl0cyBvd24gbXV0ZXggYW5kCi0JICogbmVudHJpZXMgY291bnQsIGluc3RlYWQg b2YganVzdCBhIHNpbmdsZSBvbmUuICBBbHRob3VnaCB0aGUgZnJlZWxpc3RzCisJICogbmZyZWUg Y291bnQsIGluc3RlYWQgb2YganVzdCBhIHNpbmdsZSBvbmUuICBBbHRob3VnaCB0aGUgZnJlZWxp c3RzCiAJICogbm9ybWFsbHkgb3BlcmF0ZSBpbmRlcGVuZGVudGx5LCB3ZSB3aWxsIHNjYXZlbmdl IGVudHJpZXMgZnJvbSBmcmVlbGlzdHMKIAkgKiBvdGhlciB0aGFuIGEgaGFzaGNvZGUncyBkZWZh dWx0IGZyZWVsaXN0IHdoZW4gbmVjZXNzYXJ5LgogCSAqCkBAIC0yNTQsNiArMjU3LDE1IEBAIHN0 cnVjdCBIVEFCCiAgKi8KICNkZWZpbmUgTU9EKHgseSkJCQkgICAoKHgpICYgKCh5KS0xKSkKIAor LyoKKyAqIFN0cnVjdCBmb3IgcmV1c2UgZWxlbWVudC4KKyAqLworc3RydWN0IEhBU0hSRVVTRQor eworCUhUQUIJICAgKmhhc2hwOworCUhBU0hCVUNLRVQJZWxlbWVudDsKK307CisKICNpZmRlZiBI QVNIX1NUQVRJU1RJQ1MKIHN0YXRpYyBsb25nIGhhc2hfYWNjZXNzZXMsCiAJCQloYXNoX2NvbGxp c2lvbnMsCkBAIC0yOTMsNiArMzA1LDEyIEBAIER5bmFIYXNoQWxsb2MoU2l6ZSBzaXplKQogfQog CiAKKy8qCisgKiBTdXBwb3J0IGZvciBIQVNIX1JFVVNFICsgSEFTSF9BU1NJR04KKyAqLworc3Rh dGljIHN0cnVjdCBIQVNIUkVVU0UgRHluYUhhc2hSZXVzZSA9IHtOVUxMLCBOVUxMfTsKKworCiAv KgogICogSGFzaENvbXBhcmVGdW5jIGZvciBzdHJpbmcga2V5cwogICoKQEAgLTkzMiw2ICs5NTAs OCBAQCBjYWxjX2J1Y2tldChIQVNISERSICpoY3RsLCB1aW50MzIgaGFzaF92YWwpCiAgKgkJSEFT SF9FTlRFUjogbG9vayB1cCBrZXkgaW4gdGFibGUsIGNyZWF0aW5nIGVudHJ5IGlmIG5vdCBwcmVz ZW50CiAgKgkJSEFTSF9FTlRFUl9OVUxMOiBzYW1lLCBidXQgcmV0dXJuIE5VTEwgaWYgb3V0IG9m IG1lbW9yeQogICoJCUhBU0hfUkVNT1ZFOiBsb29rIHVwIGtleSBpbiB0YWJsZSwgcmVtb3ZlIGVu dHJ5IGlmIHByZXNlbnQKKyAqCQlIQVNIX1JFVVNFOiBzYW1lIGFzIEhBU0hfUkVNT1ZFLCBidXQg c3RvcmVzIHJlbW92ZWQgZWxlbWVudCBpbiBzdGF0aWMKKyAqCQkJCQl2YXJpYWJsZSBpbnN0ZWFk IG9mIGZyZWUgbGlzdC4KICAqCiAgKiBSZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBl bGVtZW50IGZvdW5kL2VudGVyZWQvcmVtb3ZlZCBpZiBhbnksCiAgKiBvciBOVUxMIGlmIG5vIG1h dGNoIHdhcyBmb3VuZC4gIChOQjogaW4gdGhlIGNhc2Ugb2YgdGhlIFJFTU9WRSBhY3Rpb24sCkBA IC05NDMsNiArOTYzLDExIEBAIGNhbGNfYnVja2V0KEhBU0hIRFIgKmhjdGwsIHVpbnQzMiBoYXNo X3ZhbCkKICAqIEhBU0hfRU5URVJfTlVMTCBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBkZWZhdWx0 IHBhbGxvYy1iYXNlZCBhbGxvY2F0b3IsCiAgKiBzaW5jZSBwYWxsb2MgaW50ZXJuYWxseSBlcmVw b3J0cyBvbiBvdXQtb2YtbWVtb3J5LgogICoKKyAqIElmIEhBU0hfUkVVU0Ugd2VyZSBjYWxsZWQg dGhlbiBuZXh0IGR5bmFoYXNoIG9wZXJhdGlvbiBtdXN0IGJlIEhBU0hfRU5URVIKKyAqIG9uIHRo ZSBzYW1lIGR5bmFoYXNoIGluc3RhbmNlLiBPdGhlcndpc2UsIGFzc2VydGlvbiB3aWxsIGJlIHRy aWdnZXJlZC4KKyAqIEhBU0hfRU5URVIgd2lsbCByZXVzZSBlbGVtZW50IHN0b3JlZCB3aXRoIEhB U0hfUkVVU0UgaWYgbm8gZHVwbGljYXRlIGVudHJ5CisgKiBmb3VuZC4KKyAqCiAgKiBJZiBmb3Vu ZFB0ciBpc24ndCBOVUxMLCB0aGVuICpmb3VuZFB0ciBpcyBzZXQgdHJ1ZSBpZiB3ZSBmb3VuZCBh bgogICogZXhpc3RpbmcgZW50cnkgaW4gdGhlIHRhYmxlLCBmYWxzZSBvdGhlcndpc2UuICBUaGlz IGlzIG5lZWRlZCBpbiB0aGUKICAqIEhBU0hfRU5URVIgY2FzZSwgYnV0IGlzIHJlZHVuZGFudCB3 aXRoIHRoZSByZXR1cm4gdmFsdWUgb3RoZXJ3aXNlLgpAQCAtMTAwMCw3ICsxMDI1LDkgQEAgaGFz aF9zZWFyY2hfd2l0aF9oYXNoX3ZhbHVlKEhUQUIgKmhhc2hwLAogCQkgKiBDYW4ndCBzcGxpdCBp ZiBydW5uaW5nIGluIHBhcnRpdGlvbmVkIG1vZGUsIG5vciBpZiBmcm96ZW4sIG5vciBpZgogCQkg KiB0YWJsZSBpcyB0aGUgc3ViamVjdCBvZiBhbnkgYWN0aXZlIGhhc2hfc2VxX3NlYXJjaCBzY2Fu cy4KIAkJICovCi0JCWlmIChoY3RsLT5mcmVlTGlzdFswXS5uZW50cmllcyA+IChsb25nKSBoY3Rs LT5tYXhfYnVja2V0ICYmCisJCWxvbmcgbmVudHJpZXMgPSBoY3RsLT5mcmVlTGlzdFswXS5uYWxs b2NlZCAtIGhjdGwtPmZyZWVMaXN0WzBdLm5mcmVlOworCisJCWlmIChuZW50cmllcyA+IChsb25n KSBoY3RsLT5tYXhfYnVja2V0ICYmCiAJCQkhSVNfUEFSVElUSU9ORUQoaGN0bCkgJiYgIWhhc2hw LT5mcm96ZW4gJiYKIAkJCSFoYXNfc2VxX3NjYW5zKGhhc2hwKSkKIAkJCSh2b2lkKSBleHBhbmRf dGFibGUoaGFzaHApOwpAQCAtMTA0NCw2ICsxMDcxLDExIEBAIGhhc2hfc2VhcmNoX3dpdGhfaGFz aF92YWx1ZShIVEFCICpoYXNocCwKIAlpZiAoZm91bmRQdHIpCiAJCSpmb3VuZFB0ciA9IChib29s KSAoY3VyckJ1Y2tldCAhPSBOVUxMKTsKIAorCS8qIENoZWNrIHRoZXJlIGlzIG5vIHVuZmluaXNo ZWQgSEFTSF9SRVVTRSArIEhBU0hfRU5URVIgcGFpciAqLworCUFzc2VydChhY3Rpb24gPT0gSEFT SF9FTlRFUiB8fCBEeW5hSGFzaFJldXNlLmVsZW1lbnQgPT0gTlVMTCk7CisJLyogQ2hlY2sgSEFT SF9SRVVTRSB3ZXJlIGNhbGxlZCBmb3Igc2FtZSBkeW5haGFzaCBpZiB3ZXJlICovCisJQXNzZXJ0 KER5bmFIYXNoUmV1c2UuZWxlbWVudCA9PSBOVUxMIHx8IER5bmFIYXNoUmV1c2UuaGFzaHAgPT0g aGFzaHApOworCiAJLyoKIAkgKiBPSywgbm93IHdoYXQ/CiAJICovCkBAIC0xMDU3LDIwICsxMDg5 LDE3IEBAIGhhc2hfc2VhcmNoX3dpdGhfaGFzaF92YWx1ZShIVEFCICpoYXNocCwKIAkJY2FzZSBI QVNIX1JFTU9WRToKIAkJCWlmIChjdXJyQnVja2V0ICE9IE5VTEwpCiAJCQl7Ci0JCQkJLyogaWYg cGFydGl0aW9uZWQsIG11c3QgbG9jayB0byB0b3VjaCBuZW50cmllcyBhbmQgZnJlZUxpc3QgKi8K KwkJCQkvKiBpZiBwYXJ0aXRpb25lZCwgbXVzdCBsb2NrIHRvIHRvdWNoIG5mcmVlIGFuZCBmcmVl TGlzdCAqLwogCQkJCWlmIChJU19QQVJUSVRJT05FRChoY3RsKSkKIAkJCQkJU3BpbkxvY2tBY3F1 aXJlKCYoaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5tdXRleCkpOwogCi0JCQkJLyogZGVs ZXRlIHRoZSByZWNvcmQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbmVudHJpZXMgY291bnRlci4gKi8K LQkJCQlBc3NlcnQoaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5uZW50cmllcyA+IDApOwot CQkJCWhjdGwtPmZyZWVMaXN0W2ZyZWVsaXN0X2lkeF0ubmVudHJpZXMtLTsKLQogCQkJCS8qIHJl bW92ZSByZWNvcmQgZnJvbSBoYXNoIGJ1Y2tldCdzIGNoYWluLiAqLwogCQkJCSpwcmV2QnVja2V0 UHRyID0gY3VyckJ1Y2tldC0+bGluazsKIAogCQkJCS8qIGFkZCB0aGUgcmVjb3JkIHRvIHRoZSBh cHByb3ByaWF0ZSBmcmVlbGlzdC4gKi8KIAkJCQljdXJyQnVja2V0LT5saW5rID0gaGN0bC0+ZnJl ZUxpc3RbZnJlZWxpc3RfaWR4XS5mcmVlTGlzdDsKIAkJCQloY3RsLT5mcmVlTGlzdFtmcmVlbGlz dF9pZHhdLmZyZWVMaXN0ID0gY3VyckJ1Y2tldDsKKwkJCQloY3RsLT5mcmVlTGlzdFtmcmVlbGlz dF9pZHhdLm5mcmVlKys7CiAKIAkJCQlpZiAoSVNfUEFSVElUSU9ORUQoaGN0bCkpCiAJCQkJCVNw aW5Mb2NrUmVsZWFzZSgmaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5tdXRleCk7CkBAIC0x MDg0LDYgKzExMTMsMjEgQEAgaGFzaF9zZWFyY2hfd2l0aF9oYXNoX3ZhbHVlKEhUQUIgKmhhc2hw LAogCQkJfQogCQkJcmV0dXJuIE5VTEw7CiAKKwkJY2FzZSBIQVNIX1JFVVNFOgorCQkJaWYgKGN1 cnJCdWNrZXQgIT0gTlVMTCkKKwkJCXsKKwkJCQkvKiByZW1vdmUgcmVjb3JkIGZyb20gaGFzaCBi dWNrZXQncyBjaGFpbi4gKi8KKwkJCQkqcHJldkJ1Y2tldFB0ciA9IGN1cnJCdWNrZXQtPmxpbms7 CisKKwkJCQkvKiBhbmQgc3RvcmUgZm9yIEhBU0hfQVNTSUdOICovCisJCQkJRHluYUhhc2hSZXVz ZS5lbGVtZW50ID0gY3VyckJ1Y2tldDsKKwkJCQlEeW5hSGFzaFJldXNlLmhhc2hwID0gaGFzaHA7 CisKKwkJCQkvKiBDYWxsZXIgc2hvdWxkIGNhbGwgSEFTSF9BU1NJR04gYXMgdGhlIHZlcnkgbmV4 dCBzdGVwLiAqLworCQkJCXJldHVybiAodm9pZCAqKSBFTEVNRU5US0VZKGN1cnJCdWNrZXQpOwor CQkJfQorCQkJcmV0dXJuIE5VTEw7CisKIAkJY2FzZSBIQVNIX0VOVEVSX05VTEw6CiAJCQkvKiBF TlRFUl9OVUxMIGRvZXMgbm90IHdvcmsgd2l0aCBwYWxsb2MtYmFzZWQgYWxsb2NhdG9yICovCiAJ CQlBc3NlcnQoaGFzaHAtPmFsbG9jICE9IER5bmFIYXNoQWxsb2MpOwpAQCAtMTA5MiwxNCArMTEz Niw0NCBAQCBoYXNoX3NlYXJjaF93aXRoX2hhc2hfdmFsdWUoSFRBQiAqaGFzaHAsCiAJCWNhc2Ug SEFTSF9FTlRFUjoKIAkJCS8qIFJldHVybiBleGlzdGluZyBlbGVtZW50IGlmIGZvdW5kLCBlbHNl IGNyZWF0ZSBvbmUgKi8KIAkJCWlmIChjdXJyQnVja2V0ICE9IE5VTEwpCisJCQl7CisJCQkJaWYg KGxpa2VseShEeW5hSGFzaFJldXNlLmVsZW1lbnQgPT0gTlVMTCkpCisJCQkJCXJldHVybiAodm9p ZCAqKSBFTEVNRU5US0VZKGN1cnJCdWNrZXQpOworCisJCQkJLyogaWYgcGFydGl0aW9uZWQsIG11 c3QgbG9jayB0byB0b3VjaCBuZnJlZSBhbmQgZnJlZUxpc3QgKi8KKwkJCQlpZiAoSVNfUEFSVElU SU9ORUQoaGN0bCkpCisJCQkJCVNwaW5Mb2NrQWNxdWlyZSgmKGhjdGwtPmZyZWVMaXN0W2ZyZWVs aXN0X2lkeF0ubXV0ZXgpKTsKKworCQkJCS8qIGFkZCB0aGUgcmVjb3JkIHRvIHRoZSBhcHByb3By aWF0ZSBmcmVlbGlzdC4gKi8KKwkJCQlEeW5hSGFzaFJldXNlLmVsZW1lbnQtPmxpbmsgPSBoY3Rs LT5mcmVlTGlzdFtmcmVlbGlzdF9pZHhdLmZyZWVMaXN0OworCQkJCWhjdGwtPmZyZWVMaXN0W2Zy ZWVsaXN0X2lkeF0uZnJlZUxpc3QgPSBEeW5hSGFzaFJldXNlLmVsZW1lbnQ7CisJCQkJaGN0bC0+ ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5uZnJlZSsrOworCisJCQkJaWYgKElTX1BBUlRJVElPTkVE KGhjdGwpKQorCQkJCQlTcGluTG9ja1JlbGVhc2UoJmhjdGwtPmZyZWVMaXN0W2ZyZWVsaXN0X2lk eF0ubXV0ZXgpOworCisJCQkJRHluYUhhc2hSZXVzZS5lbGVtZW50ID0gTlVMTDsKKwkJCQlEeW5h SGFzaFJldXNlLmhhc2hwID0gTlVMTDsKKwogCQkJCXJldHVybiAodm9pZCAqKSBFTEVNRU5US0VZ KGN1cnJCdWNrZXQpOworCQkJfQogCiAJCQkvKiBkaXNhbGxvdyBpbnNlcnRzIGlmIGZyb3plbiAq LwogCQkJaWYgKGhhc2hwLT5mcm96ZW4pCiAJCQkJZWxvZyhFUlJPUiwgImNhbm5vdCBpbnNlcnQg aW50byBmcm96ZW4gaGFzaHRhYmxlIFwiJXNcIiIsCiAJCQkJCSBoYXNocC0+dGFibmFtZSk7CiAK LQkJCWN1cnJCdWNrZXQgPSBnZXRfaGFzaF9lbnRyeShoYXNocCwgZnJlZWxpc3RfaWR4KTsKKwkJ CWlmIChEeW5hSGFzaFJldXNlLmVsZW1lbnQgPT0gTlVMTCkKKwkJCXsKKwkJCQljdXJyQnVja2V0 ID0gZ2V0X2hhc2hfZW50cnkoaGFzaHAsIGZyZWVsaXN0X2lkeCk7CisJCQl9CisJCQllbHNlCisJ CQl7CisJCQkJY3VyckJ1Y2tldCA9IER5bmFIYXNoUmV1c2UuZWxlbWVudDsKKwkJCQlEeW5hSGFz aFJldXNlLmVsZW1lbnQgPSBOVUxMOworCQkJCUR5bmFIYXNoUmV1c2UuaGFzaHAgPSBOVUxMOwor CQkJfQorCiAJCQlpZiAoY3VyckJ1Y2tldCA9PSBOVUxMKQogCQkJewogCQkJCS8qIG91dCBvZiBt ZW1vcnkgKi8KQEAgLTEzMDEsNyArMTM3NSw3IEBAIGdldF9oYXNoX2VudHJ5KEhUQUIgKmhhc2hw LCBpbnQgZnJlZWxpc3RfaWR4KQogCiAJZm9yICg7OykKIAl7Ci0JCS8qIGlmIHBhcnRpdGlvbmVk LCBtdXN0IGxvY2sgdG8gdG91Y2ggbmVudHJpZXMgYW5kIGZyZWVMaXN0ICovCisJCS8qIGlmIHBh cnRpdGlvbmVkLCBtdXN0IGxvY2sgdG8gdG91Y2ggbmZyZWUgYW5kIGZyZWVMaXN0ICovCiAJCWlm IChJU19QQVJUSVRJT05FRChoY3RsKSkKIAkJCVNwaW5Mb2NrQWNxdWlyZSgmaGN0bC0+ZnJlZUxp c3RbZnJlZWxpc3RfaWR4XS5tdXRleCk7CiAKQEAgLTEzNDYsMTQgKzE0MjAsMTEgQEAgZ2V0X2hh c2hfZW50cnkoSFRBQiAqaGFzaHAsIGludCBmcmVlbGlzdF9pZHgpCiAKIAkJCQlpZiAobmV3RWxl bWVudCAhPSBOVUxMKQogCQkJCXsKKwkJCQkJQXNzZXJ0KGhjdGwtPmZyZWVMaXN0W2JvcnJvd19m cm9tX2lkeF0ubmZyZWUgPiAwKTsKIAkJCQkJaGN0bC0+ZnJlZUxpc3RbYm9ycm93X2Zyb21faWR4 XS5mcmVlTGlzdCA9IG5ld0VsZW1lbnQtPmxpbms7CisJCQkJCWhjdGwtPmZyZWVMaXN0W2JvcnJv d19mcm9tX2lkeF0ubmZyZWUtLTsKIAkJCQkJU3BpbkxvY2tSZWxlYXNlKCYoaGN0bC0+ZnJlZUxp c3RbYm9ycm93X2Zyb21faWR4XS5tdXRleCkpOwogCi0JCQkJCS8qIGNhcmVmdWw6IGNvdW50IHRo ZSBuZXcgZWxlbWVudCBpbiBpdHMgcHJvcGVyIGZyZWVsaXN0ICovCi0JCQkJCVNwaW5Mb2NrQWNx dWlyZSgmaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5tdXRleCk7Ci0JCQkJCWhjdGwtPmZy ZWVMaXN0W2ZyZWVsaXN0X2lkeF0ubmVudHJpZXMrKzsKLQkJCQkJU3BpbkxvY2tSZWxlYXNlKCZo Y3RsLT5mcmVlTGlzdFtmcmVlbGlzdF9pZHhdLm11dGV4KTsKLQogCQkJCQlyZXR1cm4gbmV3RWxl bWVudDsKIAkJCQl9CiAKQEAgLTEzNjUsOSArMTQzNiwxMCBAQCBnZXRfaGFzaF9lbnRyeShIVEFC ICpoYXNocCwgaW50IGZyZWVsaXN0X2lkeCkKIAkJfQogCX0KIAotCS8qIHJlbW92ZSBlbnRyeSBm cm9tIGZyZWVsaXN0LCBidW1wIG5lbnRyaWVzICovCisJLyogcmVtb3ZlIGVudHJ5IGZyb20gZnJl ZWxpc3QsIGRlY3JlYXNlIG5mcmVlICovCisJQXNzZXJ0KGhjdGwtPmZyZWVMaXN0W2ZyZWVsaXN0 X2lkeF0ubmZyZWUgPiAwKTsKIAloY3RsLT5mcmVlTGlzdFtmcmVlbGlzdF9pZHhdLmZyZWVMaXN0 ID0gbmV3RWxlbWVudC0+bGluazsKLQloY3RsLT5mcmVlTGlzdFtmcmVlbGlzdF9pZHhdLm5lbnRy aWVzKys7CisJaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5uZnJlZS0tOwogCiAJaWYgKElT X1BBUlRJVElPTkVEKGhjdGwpKQogCQlTcGluTG9ja1JlbGVhc2UoJmhjdGwtPmZyZWVMaXN0W2Zy ZWVsaXN0X2lkeF0ubXV0ZXgpOwpAQCAtMTM4Miw3ICsxNDU0LDEwIEBAIGxvbmcKIGhhc2hfZ2V0 X251bV9lbnRyaWVzKEhUQUIgKmhhc2hwKQogewogCWludAkJCWk7Ci0JbG9uZwkJc3VtID0gaGFz aHAtPmhjdGwtPmZyZWVMaXN0WzBdLm5lbnRyaWVzOworCWxvbmcJCXN1bSA9IDA7CisKKwlzdW0g Kz0gaGFzaHAtPmhjdGwtPmZyZWVMaXN0WzBdLm5hbGxvY2VkOworCXN1bSAtPSBoYXNocC0+aGN0 bC0+ZnJlZUxpc3RbMF0ubmZyZWU7CiAKIAkvKgogCSAqIFdlIGN1cnJlbnRseSBkb24ndCBib3Ro ZXIgd2l0aCBhY3F1aXJpbmcgdGhlIG11dGV4ZXM7IGl0J3Mgb25seQpAQCAtMTM5Miw3ICsxNDY3 LDEwIEBAIGhhc2hfZ2V0X251bV9lbnRyaWVzKEhUQUIgKmhhc2hwKQogCWlmIChJU19QQVJUSVRJ T05FRChoYXNocC0+aGN0bCkpCiAJewogCQlmb3IgKGkgPSAxOyBpIDwgTlVNX0ZSRUVMSVNUUzsg aSsrKQotCQkJc3VtICs9IGhhc2hwLT5oY3RsLT5mcmVlTGlzdFtpXS5uZW50cmllczsKKwkJewor CQkJc3VtICs9IGhhc2hwLT5oY3RsLT5mcmVlTGlzdFtpXS5uYWxsb2NlZDsKKwkJCXN1bSAtPSBo YXNocC0+aGN0bC0+ZnJlZUxpc3RbaV0ubmZyZWU7CisJCX0KIAl9CiAKIAlyZXR1cm4gc3VtOwpA QCAtMTczOSw2ICsxODE3LDggQEAgZWxlbWVudF9hbGxvYyhIVEFCICpoYXNocCwgaW50IG5lbGVt LCBpbnQgZnJlZWxpc3RfaWR4KQogCS8qIGZyZWVsaXN0IGNvdWxkIGJlIG5vbmVtcHR5IGlmIHR3 byBiYWNrZW5kcyBkaWQgdGhpcyBjb25jdXJyZW50bHkgKi8KIAlmaXJzdEVsZW1lbnQtPmxpbmsg PSBoY3RsLT5mcmVlTGlzdFtmcmVlbGlzdF9pZHhdLmZyZWVMaXN0OwogCWhjdGwtPmZyZWVMaXN0 W2ZyZWVsaXN0X2lkeF0uZnJlZUxpc3QgPSBwcmV2RWxlbWVudDsKKwloY3RsLT5mcmVlTGlzdFtm cmVlbGlzdF9pZHhdLm5mcmVlICs9IG5lbGVtOworCWhjdGwtPmZyZWVMaXN0W2ZyZWVsaXN0X2lk eF0ubmFsbG9jZWQgKz0gbmVsZW07CiAKIAlpZiAoSVNfUEFSVElUSU9ORUQoaGN0bCkpCiAJCVNw aW5Mb2NrUmVsZWFzZSgmaGN0bC0+ZnJlZUxpc3RbZnJlZWxpc3RfaWR4XS5tdXRleCk7CmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1Zl9pbnRlcm5hbHMuaCBiL3NyYy9pbmNsdWRl L3N0b3JhZ2UvYnVmX2ludGVybmFscy5oCmluZGV4IGI5MDNkMmJjYWYwLi4yZmZjZGU2NzhhMCAx MDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZfaW50ZXJuYWxzLmgKKysrIGIvc3Jj L2luY2x1ZGUvc3RvcmFnZS9idWZfaW50ZXJuYWxzLmgKQEAgLTMyOCw3ICszMjgsNyBAQCBleHRl cm4gdm9pZCBJbml0QnVmVGFibGUoaW50IHNpemUpOwogZXh0ZXJuIHVpbnQzMiBCdWZUYWJsZUhh c2hDb2RlKEJ1ZmZlclRhZyAqdGFnUHRyKTsKIGV4dGVybiBpbnQJQnVmVGFibGVMb29rdXAoQnVm ZmVyVGFnICp0YWdQdHIsIHVpbnQzMiBoYXNoY29kZSk7CiBleHRlcm4gaW50CUJ1ZlRhYmxlSW5z ZXJ0KEJ1ZmZlclRhZyAqdGFnUHRyLCB1aW50MzIgaGFzaGNvZGUsIGludCBidWZfaWQpOwotZXh0 ZXJuIHZvaWQgQnVmVGFibGVEZWxldGUoQnVmZmVyVGFnICp0YWdQdHIsIHVpbnQzMiBoYXNoY29k ZSk7CitleHRlcm4gdm9pZCBCdWZUYWJsZURlbGV0ZShCdWZmZXJUYWcgKnRhZ1B0ciwgdWludDMy IGhhc2hjb2RlLCBib29sIHJldXNlKTsKIAogLyogbG9jYWxidWYuYyAqLwogZXh0ZXJuIFByZWZl dGNoQnVmZmVyUmVzdWx0IFByZWZldGNoTG9jYWxCdWZmZXIoU01nclJlbGF0aW9uIHNtZ3IsCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9oc2VhcmNoLmggYi9zcmMvaW5jbHVkZS91dGls cy9oc2VhcmNoLmgKaW5kZXggODU0YzMzMTI0MTQuLjFmZmI2MTZkOTllIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS91dGlscy9oc2VhcmNoLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvaHNlYXJj aC5oCkBAIC0xMTMsNyArMTEzLDggQEAgdHlwZWRlZiBlbnVtCiAJSEFTSF9GSU5ELAogCUhBU0hf RU5URVIsCiAJSEFTSF9SRU1PVkUsCi0JSEFTSF9FTlRFUl9OVUxMCisJSEFTSF9FTlRFUl9OVUxM LAorCUhBU0hfUkVVU0UKIH0gSEFTSEFDVElPTjsKIAogLyogaGFzaF9zZXEgc3RhdHVzIChzaG91 bGQgYmUgY29uc2lkZXJlZCBhbiBvcGFxdWUgdHlwZSBieSBjYWxsZXJzKSAqLwotLSAKMi4zNS4x CgoKRnJvbSBmNTI0MTFmYzIwNDNhZDZhYTMwMWE0MmFhMzY5M2M5NjhkNWMwODI1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBZdXJhIFNva29sb3YgPHkuc29rb2xvdkBwb3N0Z3Jlc3By by5ydT4KRGF0ZTogVGh1LCAzIE1hciAyMDIyIDAxOjE0OjU4ICswMzAwClN1YmplY3Q6IFtQQVRD SCAzLzNdIHJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3Igbm9uLXBhcnRpdGlvbmVkCiBkeW5h aGFzaAoKTm9uLXBhcnRpdGlvbmVkIGhhc2ggdGFibGUgZG9lc24ndCB1c2UgMzIgcGFydGl0aW9u cyBvZiBIQVNISERSLT5mcmVlTGlzdC4KTGV0cyBhbGxvY2F0ZSBqdXN0IHNpbmdsZSBmcmVlIGxp c3QuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvaGFzaC9keW5haGFzaC5jIHwgMzcgKysrKysrKysr KysrKysrKystLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDIwIGluc2VydGlvbnMoKyks IDE3IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2hhc2gvZHlu YWhhc2guYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2hhc2gvZHluYWhhc2guYwppbmRleCAwY2IzNWEw ZmFmOS4uMGExNzIwMDUwNTkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2hhc2gvZHlu YWhhc2guYworKysgYi9zcmMvYmFja2VuZC91dGlscy9oYXNoL2R5bmFoYXNoLmMKQEAgLTE3MCwx OCArMTcwLDYgQEAgdHlwZWRlZiBzdHJ1Y3QKICAqLwogc3RydWN0IEhBU0hIRFIKIHsKLQkvKgot CSAqIFRoZSBmcmVlbGlzdCBjYW4gYmVjb21lIGEgcG9pbnQgb2YgY29udGVudGlvbiBpbiBoaWdo LWNvbmN1cnJlbmN5IGhhc2gKLQkgKiB0YWJsZXMsIHNvIHdlIHVzZSBhbiBhcnJheSBvZiBmcmVl bGlzdHMsIGVhY2ggd2l0aCBpdHMgb3duIG11dGV4IGFuZAotCSAqIG5mcmVlIGNvdW50LCBpbnN0 ZWFkIG9mIGp1c3QgYSBzaW5nbGUgb25lLiAgQWx0aG91Z2ggdGhlIGZyZWVsaXN0cwotCSAqIG5v cm1hbGx5IG9wZXJhdGUgaW5kZXBlbmRlbnRseSwgd2Ugd2lsbCBzY2F2ZW5nZSBlbnRyaWVzIGZy b20gZnJlZWxpc3RzCi0JICogb3RoZXIgdGhhbiBhIGhhc2hjb2RlJ3MgZGVmYXVsdCBmcmVlbGlz dCB3aGVuIG5lY2Vzc2FyeS4KLQkgKgotCSAqIElmIHRoZSBoYXNoIHRhYmxlIGlzIG5vdCBwYXJ0 aXRpb25lZCwgb25seSBmcmVlTGlzdFswXSBpcyB1c2VkIGFuZCBpdHMKLQkgKiBzcGlubG9jayBp cyBub3QgdXNlZCBhdCBhbGw7IGNhbGxlcnMnIGxvY2tpbmcgaXMgYXNzdW1lZCBzdWZmaWNpZW50 LgotCSAqLwotCUZyZWVMaXN0RGF0YSBmcmVlTGlzdFtOVU1fRlJFRUxJU1RTXTsKLQogCS8qIFRo ZXNlIGZpZWxkcyBjYW4gY2hhbmdlLCBidXQgbm90IGluIGEgcGFydGl0aW9uZWQgdGFibGUgKi8K IAkvKiBBbHNvLCBkc2l6ZSBjYW4ndCBjaGFuZ2UgaW4gYSBzaGFyZWQgdGFibGUsIGV2ZW4gaWYg dW5wYXJ0aXRpb25lZCAqLwogCWxvbmcJCWRzaXplOwkJCS8qIGRpcmVjdG9yeSBzaXplICovCkBA IC0yMDgsNiArMTk2LDE4IEBAIHN0cnVjdCBIQVNISERSCiAJbG9uZwkJYWNjZXNzZXM7CiAJbG9u ZwkJY29sbGlzaW9uczsKICNlbmRpZgorCisJLyoKKwkgKiBUaGUgZnJlZWxpc3QgY2FuIGJlY29t ZSBhIHBvaW50IG9mIGNvbnRlbnRpb24gaW4gaGlnaC1jb25jdXJyZW5jeSBoYXNoCisJICogdGFi bGVzLCBzbyB3ZSB1c2UgYW4gYXJyYXkgb2YgZnJlZWxpc3RzLCBlYWNoIHdpdGggaXRzIG93biBt dXRleCBhbmQKKwkgKiBuZnJlZSBjb3VudCwgaW5zdGVhZCBvZiBqdXN0IGEgc2luZ2xlIG9uZS4g IEFsdGhvdWdoIHRoZSBmcmVlbGlzdHMKKwkgKiBub3JtYWxseSBvcGVyYXRlIGluZGVwZW5kZW50 bHksIHdlIHdpbGwgc2NhdmVuZ2UgZW50cmllcyBmcm9tIGZyZWVsaXN0cworCSAqIG90aGVyIHRo YW4gYSBoYXNoY29kZSdzIGRlZmF1bHQgZnJlZWxpc3Qgd2hlbiBuZWNlc3NhcnkuCisJICoKKwkg KiBJZiB0aGUgaGFzaCB0YWJsZSBpcyBub3QgcGFydGl0aW9uZWQsIG9ubHkgZnJlZUxpc3RbMF0g aXMgdXNlZCBhbmQgaXRzCisJICogc3BpbmxvY2sgaXMgbm90IHVzZWQgYXQgYWxsOyBjYWxsZXJz JyBsb2NraW5nIGlzIGFzc3VtZWQgc3VmZmljaWVudC4KKwkgKi8KKwlGcmVlTGlzdERhdGEgZnJl ZUxpc3RbTlVNX0ZSRUVMSVNUU107CiB9OwogCiAjZGVmaW5lIElTX1BBUlRJVElPTkVEKGhjdGwp ICAoKGhjdGwpLT5udW1fcGFydGl0aW9ucyAhPSAwKQpAQCAtMjgxLDcgKzI4MSw3IEBAIHN0YXRp YyBib29sIGVsZW1lbnRfYWxsb2MoSFRBQiAqaGFzaHAsIGludCBuZWxlbSwgaW50IGZyZWVsaXN0 X2lkeCk7CiBzdGF0aWMgYm9vbCBkaXJfcmVhbGxvYyhIVEFCICpoYXNocCk7CiBzdGF0aWMgYm9v bCBleHBhbmRfdGFibGUoSFRBQiAqaGFzaHApOwogc3RhdGljIEhBU0hCVUNLRVQgZ2V0X2hhc2hf ZW50cnkoSFRBQiAqaGFzaHAsIGludCBmcmVlbGlzdF9pZHgpOwotc3RhdGljIHZvaWQgaGRlZmF1 bHQoSFRBQiAqaGFzaHApOworc3RhdGljIHZvaWQgaGRlZmF1bHQoSFRBQiAqaGFzaHAsIGJvb2wg cGFydGl0aW9uZWQpOwogc3RhdGljIGludAljaG9vc2VfbmVsZW1fYWxsb2MoU2l6ZSBlbnRyeXNp emUpOwogc3RhdGljIGJvb2wgaW5pdF9odGFiKEhUQUIgKmhhc2hwLCBsb25nIG5lbGVtKTsKIHN0 YXRpYyB2b2lkIGhhc2hfY29ycnVwdGVkKEhUQUIgKmhhc2hwKTsKQEAgLTUyNCw3ICs1MjQsOCBA QCBoYXNoX2NyZWF0ZShjb25zdCBjaGFyICp0YWJuYW1lLCBsb25nIG5lbGVtLCBjb25zdCBIQVNI Q1RMICppbmZvLCBpbnQgZmxhZ3MpCiAKIAlpZiAoIWhhc2hwLT5oY3RsKQogCXsKLQkJaGFzaHAt PmhjdGwgPSAoSEFTSEhEUiAqKSBoYXNocC0+YWxsb2Moc2l6ZW9mKEhBU0hIRFIpKTsKKwkJQXNz ZXJ0KCEoZmxhZ3MgJiBIQVNIX1BBUlRJVElPTikpOworCQloYXNocC0+aGN0bCA9IChIQVNISERS ICopIGhhc2hwLT5hbGxvYyhvZmZzZXRvZihIQVNISERSLCBmcmVlTGlzdFsxXSkpOwogCQlpZiAo IWhhc2hwLT5oY3RsKQogCQkJZXJlcG9ydChFUlJPUiwKIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9P VVRfT0ZfTUVNT1JZKSwKQEAgLTUzMyw3ICs1MzQsNyBAQCBoYXNoX2NyZWF0ZShjb25zdCBjaGFy ICp0YWJuYW1lLCBsb25nIG5lbGVtLCBjb25zdCBIQVNIQ1RMICppbmZvLCBpbnQgZmxhZ3MpCiAK IAloYXNocC0+ZnJvemVuID0gZmFsc2U7CiAKLQloZGVmYXVsdChoYXNocCk7CisJaGRlZmF1bHQo aGFzaHAsIChmbGFncyAmIEhBU0hfUEFSVElUSU9OKSAhPSAwKTsKIAogCWhjdGwgPSBoYXNocC0+ aGN0bDsKIApAQCAtNjQxLDExICs2NDIsMTMgQEAgaGFzaF9jcmVhdGUoY29uc3QgY2hhciAqdGFi bmFtZSwgbG9uZyBuZWxlbSwgY29uc3QgSEFTSENUTCAqaW5mbywgaW50IGZsYWdzKQogICogU2V0 IGRlZmF1bHQgSEFTSEhEUiBwYXJhbWV0ZXJzLgogICovCiBzdGF0aWMgdm9pZAotaGRlZmF1bHQo SFRBQiAqaGFzaHApCitoZGVmYXVsdChIVEFCICpoYXNocCwgYm9vbCBwYXJ0aXRpb24pCiB7CiAJ SEFTSEhEUiAgICAqaGN0bCA9IGhhc2hwLT5oY3RsOwogCi0JTWVtU2V0KGhjdGwsIDAsIHNpemVv ZihIQVNISERSKSk7CisJTWVtU2V0KGhjdGwsIDAsIHBhcnRpdGlvbiA/CisJCSAgIHNpemVvZihI QVNISERSKSA6CisJCSAgIG9mZnNldG9mKEhBU0hIRFIsIGZyZWVMaXN0WzFdKSk7CiAKIAloY3Rs LT5kc2l6ZSA9IERFRl9ESVJTSVpFOwogCWhjdGwtPm5zZWdzID0gMDsKLS0gCjIuMzUuMQoK --=-7HObuuU5jr2ASy8O0Rd6--