From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934768AbaGYPpE (ORCPT ); Fri, 25 Jul 2014 11:45:04 -0400 Received: from mail-pd0-f177.google.com ([209.85.192.177]:54016 "EHLO mail-pd0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760942AbaGYPh5 convert rfc822-to-8bit (ORCPT ); Fri, 25 Jul 2014 11:37:57 -0400 MIME-Version: 1.0 In-Reply-To: <53D1EFD3.3070905@cn.fujitsu.com> References: <52F320FC.50803@ispras.ru> <534BC29B.3020408@ispras.ru> <53CCF1EC.30008@ispras.ru> <53CDC9AF.2050605@cn.fujitsu.com> <53CE3722.60307@ispras.ru> <000001cfa61b$c693b350$53bb19f0$@samsung.com> <53CF2E61.3000601@cn.fujitsu.com> <53D0DC8C.7050406@ispras.ru> <002a01cfa7b7$d79edc40$86dc94c0$@samsung.com> <53D1EFD3.3070905@cn.fujitsu.com> Date: Fri, 25 Jul 2014 08:37:56 -0700 Message-ID: Subject: Re: [f2fs-dev] f2fs: Possible use-after-free when umount filesystem From: Jaegeuk Kim To: Gu Zheng Cc: Chao Yu , Andrey Tsyvarev , Jaegeuk Kim , linux-kernel , Alexey Khoroshilov , "linux-f2fs-devel@lists.sourceforge.net" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Thank you guys. I merged two patches. :) -- Jaegeuk Kim 2014-07-24 22:49 GMT-07:00 Gu Zheng : > On 07/25/2014 11:22 AM, Chao Yu wrote: > >> Hi, >> >> To Andrey: >> Thanks for your test on this patch! >> >> To Gu: >> If you do not object, let me make and resend a patch base on the one which >> skip invalidating pages. > > Please go ahead.:) > > Thanks, > Gu > >> >> Regards, >> Yu >> >>> -----Original Message----- >>> From: Andrey Tsyvarev [mailto:tsyvarev@ispras.ru] >>> Sent: Thursday, July 24, 2014 6:15 PM >>> To: Gu Zheng; Chao Yu >>> Cc: 'Jaegeuk Kim'; 'linux-kernel'; 'Alexey Khoroshilov'; >>> linux-f2fs-devel@lists.sourceforge.net >>> Subject: Re: [f2fs-dev] f2fs: Possible use-after-free when umount filesystem >>> >>> Hi, >>> >>> With patch skipping invalidating pages for node_inode and meta_inode >>> use-after-free error disappears too. >>> >>> 23.07.2014 7:39, Gu Zheng пишет: >>>> Hi, >>>> On 07/23/2014 10:12 AM, Chao Yu wrote: >>>> >>>>> Hi Andrey Gu, >>>>> >>>>>> -----Original Message----- >>>>>> From: Andrey Tsyvarev [mailto:tsyvarev@ispras.ru] >>>>>> Sent: Tuesday, July 22, 2014 6:04 PM >>>>>> To: Gu Zheng >>>>>> Cc: Jaegeuk Kim; linux-kernel; Alexey Khoroshilov; linux-f2fs-devel@lists.sourceforge.net >>>>>> Subject: Re: [f2fs-dev] f2fs: Possible use-after-free when umount filesystem >>>>>> >>>>>> Hi Gu, >>>>>> >>>>>>>> Investigation shows, that f2fs_evict_inode, when called for 'meta_inode', uses >>>>>> invalidate_mapping_pages() for 'node_inode'. >>>>>>>> But 'node_inode' is deleted before 'meta_inode' in f2fs_put_super via iput(). >>>>>>>> >>>>>>>> It seems that in common usage scenario this use-after-free is benign, because 'node_inode' >>>>>> remains partially valid data even after kmem_cache_free(). >>>>>>>> But things may change if, while 'meta_inode' is evicted in one f2fs filesystem, another >>> (mounted) >>>>>> f2fs filesystem requests inode from cache, and formely >>>>>>>> 'node_inode' of the first filesystem is returned. >>>>>>> The analysis seems reasonable. Have you tried to swap the reclaim order of node_inde >>>>>>> and meta_inode? >>>>>>> >>>>>>> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c >>>>>>> index 870fe19..e114418 100644 >>>>>>> --- a/fs/f2fs/super.c >>>>>>> +++ b/fs/f2fs/super.c >>>>>>> @@ -430,8 +430,8 @@ static void f2fs_put_super(struct super_block *sb) >>>>>>> if (sbi->s_dirty && get_pages(sbi, F2FS_DIRTY_NODES)) >>>>>>> write_checkpoint(sbi, true); >>>>>>> >>>>>>> - iput(sbi->node_inode); >>>>>>> iput(sbi->meta_inode); >>>>>>> + iput(sbi->node_inode); >>>>>>> >>>>>>> /* destroy f2fs internal modules */ >>>>>>> destroy_node_manager(sbi); >>>>>>> >>>>>>> Thanks, >>>>>>> Gu >>>>>> With reclaim order of node_inode and meta_inode swapped, use-after-free >>>>>> error disappears. >>>>>> >>>>>> But shouldn't initialization order of these inodes be swapped too? >>>>>> As meta_inode uses node_inode, it seems logical that it should be >>>>>> initialized after it. >>>> The initialization order dose not affect anything, so swapping the order dose not >>>> make more sense here. >>>> >>>>> IMO, it's not easy to exchange order of initialization between meta_inode and >>>>> node_inode, because we should use meta_inode in get_valid_checkpoint for valid >>>>> cp first for usual verification, then init node_inode. >>>> Yeah, but I think just moving node_inode's initialization to the front of meta_inode >>>> dose not break anything. >>>> >>>>> As I checked, nids for both meta_inode and node_inode are reservation, so it's not >>>>> necessary for us to invalidate pages which will never alloced. >>>>> >>>>> How about skipping it as following? >>>> It seems the right way to fix this issue. >>>> >>>> To Andrey: >>>> Could you please try this one? >>>> >>>> Thanks, >>>> Gu >>>> >>>>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c >>>>> index 2cf6962..cafba3c 100644 >>>>> --- a/fs/f2fs/inode.c >>>>> +++ b/fs/f2fs/inode.c >>>>> @@ -273,7 +273,7 @@ void f2fs_evict_inode(struct inode *inode) >>>>> >>>>> if (inode->i_ino == F2FS_NODE_INO(sbi) || >>>>> inode->i_ino == F2FS_META_INO(sbi)) >>>>> - goto no_delete; >>>>> + goto out_clear; >>>>> >>>>> f2fs_bug_on(get_dirty_dents(inode)); >>>>> remove_dirty_dir_inode(inode); >>>>> @@ -295,6 +295,7 @@ void f2fs_evict_inode(struct inode *inode) >>>>> >>>>> sb_end_intwrite(inode->i_sb); >>>>> no_delete: >>>>> - clear_inode(inode); >>>>> invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino, inode->i_ino); >>>>> +out_clear: >>>>> + clear_inode(inode); >>>>> } >>>>> >>>>>> -- >>>>>> Best regards, >>>>>> >>>>>> Andrey Tsyvarev >>>>>> Linux Verification Center, ISPRAS >>>>>> web:http://linuxtesting.org >>>>>> >>>>>> >>>>>> ------------------------------------------------------------------------------ >>>>>> Want fast and easy access to all the code in your enterprise? Index and >>>>>> search up to 200,000 lines of code with a free copy of Black Duck >>>>>> Code Sight - the same software that powers the world's largest code >>>>>> search on Ohloh, the Black Duck Open Hub! Try it now. >>>>>> http://p.sf.net/sfu/bds >>>>>> _______________________________________________ >>>>>> Linux-f2fs-devel mailing list >>>>>> Linux-f2fs-devel@lists.sourceforge.net >>>>>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel >>>>> . >>>>> >>>> >>>> >>> >>> -- >>> Best regards, >>> >>> Andrey Tsyvarev >>> Linux Verification Center, ISPRAS >>> web:http://linuxtesting.org >> >> . >> > > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaegeuk Kim Subject: Re: f2fs: Possible use-after-free when umount filesystem Date: Fri, 25 Jul 2014 08:37:56 -0700 Message-ID: References: <52F320FC.50803@ispras.ru> <534BC29B.3020408@ispras.ru> <53CCF1EC.30008@ispras.ru> <53CDC9AF.2050605@cn.fujitsu.com> <53CE3722.60307@ispras.ru> <000001cfa61b$c693b350$53bb19f0$@samsung.com> <53CF2E61.3000601@cn.fujitsu.com> <53D0DC8C.7050406@ispras.ru> <002a01cfa7b7$d79edc40$86dc94c0$@samsung.com> <53D1EFD3.3070905@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from sog-mx-4.v43.ch3.sourceforge.com ([172.29.43.194] helo=mx.sourceforge.net) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1XAhZM-0008SL-O3 for linux-f2fs-devel@lists.sourceforge.net; Fri, 25 Jul 2014 15:38:04 +0000 Received: from mail-pd0-f178.google.com ([209.85.192.178]) by sog-mx-4.v43.ch3.sourceforge.com with esmtps (TLSv1:RC4-SHA:128) (Exim 4.76) id 1XAhZK-0007EI-PG for linux-f2fs-devel@lists.sourceforge.net; Fri, 25 Jul 2014 15:38:04 +0000 Received: by mail-pd0-f178.google.com with SMTP id w10so5818799pde.23 for ; Fri, 25 Jul 2014 08:37:56 -0700 (PDT) In-Reply-To: <53D1EFD3.3070905@cn.fujitsu.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net To: Gu Zheng Cc: Andrey Tsyvarev , linux-kernel , "linux-f2fs-devel@lists.sourceforge.net" , Jaegeuk Kim , Alexey Khoroshilov VGhhbmsgeW91IGd1eXMuCkkgbWVyZ2VkIHR3byBwYXRjaGVzLiA6KQoKLS0KSmFlZ2V1ayBLaW0K CjIwMTQtMDctMjQgMjI6NDkgR01ULTA3OjAwIEd1IFpoZW5nIDxndXouZm5zdEBjbi5mdWppdHN1 LmNvbT46Cj4gT24gMDcvMjUvMjAxNCAxMToyMiBBTSwgQ2hhbyBZdSB3cm90ZToKPgo+PiBIaSwK Pj4KPj4gVG8gQW5kcmV5Ogo+PiBUaGFua3MgZm9yIHlvdXIgdGVzdCBvbiB0aGlzIHBhdGNoIQo+ Pgo+PiBUbyBHdToKPj4gSWYgeW91IGRvIG5vdCBvYmplY3QsIGxldCBtZSBtYWtlIGFuZCByZXNl bmQgYSBwYXRjaCBiYXNlIG9uIHRoZSBvbmUgd2hpY2gKPj4gc2tpcCBpbnZhbGlkYXRpbmcgcGFn ZXMuCj4KPiBQbGVhc2UgZ28gYWhlYWQuOikKPgo+IFRoYW5rcywKPiBHdQo+Cj4+Cj4+IFJlZ2Fy ZHMsCj4+IFl1Cj4+Cj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+Pj4gRnJvbTogQW5k cmV5IFRzeXZhcmV2IFttYWlsdG86dHN5dmFyZXZAaXNwcmFzLnJ1XQo+Pj4gU2VudDogVGh1cnNk YXksIEp1bHkgMjQsIDIwMTQgNjoxNSBQTQo+Pj4gVG86IEd1IFpoZW5nOyBDaGFvIFl1Cj4+PiBD YzogJ0phZWdldWsgS2ltJzsgJ2xpbnV4LWtlcm5lbCc7ICdBbGV4ZXkgS2hvcm9zaGlsb3YnOwo+ Pj4gbGludXgtZjJmcy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKPj4+IFN1YmplY3Q6IFJl OiBbZjJmcy1kZXZdIGYyZnM6IFBvc3NpYmxlIHVzZS1hZnRlci1mcmVlIHdoZW4gdW1vdW50IGZp bGVzeXN0ZW0KPj4+Cj4+PiBIaSwKPj4+Cj4+PiBXaXRoIHBhdGNoIHNraXBwaW5nIGludmFsaWRh dGluZyBwYWdlcyBmb3Igbm9kZV9pbm9kZSBhbmQgbWV0YV9pbm9kZQo+Pj4gdXNlLWFmdGVyLWZy ZWUgZXJyb3IgZGlzYXBwZWFycyB0b28uCj4+Pgo+Pj4gMjMuMDcuMjAxNCA3OjM5LCBHdSBaaGVu ZyDQv9C40YjQtdGCOgo+Pj4+IEhpLAo+Pj4+IE9uIDA3LzIzLzIwMTQgMTA6MTIgQU0sIENoYW8g WXUgd3JvdGU6Cj4+Pj4KPj4+Pj4gSGkgQW5kcmV5IEd1LAo+Pj4+Pgo+Pj4+Pj4gLS0tLS1Pcmln aW5hbCBNZXNzYWdlLS0tLS0KPj4+Pj4+IEZyb206IEFuZHJleSBUc3l2YXJldiBbbWFpbHRvOnRz eXZhcmV2QGlzcHJhcy5ydV0KPj4+Pj4+IFNlbnQ6IFR1ZXNkYXksIEp1bHkgMjIsIDIwMTQgNjow NCBQTQo+Pj4+Pj4gVG86IEd1IFpoZW5nCj4+Pj4+PiBDYzogSmFlZ2V1ayBLaW07IGxpbnV4LWtl cm5lbDsgQWxleGV5IEtob3Jvc2hpbG92OyBsaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZv cmdlLm5ldAo+Pj4+Pj4gU3ViamVjdDogUmU6IFtmMmZzLWRldl0gZjJmczogUG9zc2libGUgdXNl LWFmdGVyLWZyZWUgd2hlbiB1bW91bnQgZmlsZXN5c3RlbQo+Pj4+Pj4KPj4+Pj4+IEhpIEd1LAo+ Pj4+Pj4KPj4+Pj4+Pj4gSW52ZXN0aWdhdGlvbiBzaG93cywgdGhhdCBmMmZzX2V2aWN0X2lub2Rl LCB3aGVuIGNhbGxlZCBmb3IgJ21ldGFfaW5vZGUnLCB1c2VzCj4+Pj4+PiBpbnZhbGlkYXRlX21h cHBpbmdfcGFnZXMoKSBmb3IgJ25vZGVfaW5vZGUnLgo+Pj4+Pj4+PiBCdXQgJ25vZGVfaW5vZGUn IGlzIGRlbGV0ZWQgYmVmb3JlICdtZXRhX2lub2RlJyBpbiBmMmZzX3B1dF9zdXBlciB2aWEgaXB1 dCgpLgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJdCBzZWVtcyB0aGF0IGluIGNvbW1vbiB1c2FnZSBzY2Vu YXJpbyB0aGlzIHVzZS1hZnRlci1mcmVlIGlzIGJlbmlnbiwgYmVjYXVzZSAnbm9kZV9pbm9kZScK Pj4+Pj4+IHJlbWFpbnMgcGFydGlhbGx5IHZhbGlkIGRhdGEgZXZlbiBhZnRlciBrbWVtX2NhY2hl X2ZyZWUoKS4KPj4+Pj4+Pj4gQnV0IHRoaW5ncyBtYXkgY2hhbmdlIGlmLCB3aGlsZSAnbWV0YV9p bm9kZScgaXMgZXZpY3RlZCBpbiBvbmUgZjJmcyBmaWxlc3lzdGVtLCBhbm90aGVyCj4+PiAobW91 bnRlZCkKPj4+Pj4+IGYyZnMgZmlsZXN5c3RlbSByZXF1ZXN0cyBpbm9kZSBmcm9tIGNhY2hlLCBh bmQgZm9ybWVseQo+Pj4+Pj4+PiAnbm9kZV9pbm9kZScgb2YgdGhlIGZpcnN0IGZpbGVzeXN0ZW0g aXMgcmV0dXJuZWQuCj4+Pj4+Pj4gVGhlIGFuYWx5c2lzIHNlZW1zIHJlYXNvbmFibGUuIEhhdmUg eW91IHRyaWVkIHRvIHN3YXAgdGhlIHJlY2xhaW0gb3JkZXIgb2Ygbm9kZV9pbmRlCj4+Pj4+Pj4g YW5kIG1ldGFfaW5vZGU/Cj4+Pj4+Pj4KPj4+Pj4+PiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zdXBl ci5jIGIvZnMvZjJmcy9zdXBlci5jCj4+Pj4+Pj4gaW5kZXggODcwZmUxOS4uZTExNDQxOCAxMDA2 NDQKPj4+Pj4+PiAtLS0gYS9mcy9mMmZzL3N1cGVyLmMKPj4+Pj4+PiArKysgYi9mcy9mMmZzL3N1 cGVyLmMKPj4+Pj4+PiBAQCAtNDMwLDggKzQzMCw4IEBAIHN0YXRpYyB2b2lkIGYyZnNfcHV0X3N1 cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCj4+Pj4+Pj4gICAgICAgICAgIGlmIChzYmktPnNf ZGlydHkgJiYgZ2V0X3BhZ2VzKHNiaSwgRjJGU19ESVJUWV9OT0RFUykpCj4+Pj4+Pj4gICAgICAg ICAgICAgICAgICAgd3JpdGVfY2hlY2twb2ludChzYmksIHRydWUpOwo+Pj4+Pj4+Cj4+Pj4+Pj4g LSAgICAgICBpcHV0KHNiaS0+bm9kZV9pbm9kZSk7Cj4+Pj4+Pj4gICAgICAgICAgIGlwdXQoc2Jp LT5tZXRhX2lub2RlKTsKPj4+Pj4+PiArICAgICAgIGlwdXQoc2JpLT5ub2RlX2lub2RlKTsKPj4+ Pj4+Pgo+Pj4+Pj4+ICAgICAgICAgICAvKiBkZXN0cm95IGYyZnMgaW50ZXJuYWwgbW9kdWxlcyAq Lwo+Pj4+Pj4+ICAgICAgICAgICBkZXN0cm95X25vZGVfbWFuYWdlcihzYmkpOwo+Pj4+Pj4+Cj4+ Pj4+Pj4gVGhhbmtzLAo+Pj4+Pj4+IEd1Cj4+Pj4+PiBXaXRoIHJlY2xhaW0gb3JkZXIgb2Ygbm9k ZV9pbm9kZSBhbmQgbWV0YV9pbm9kZSBzd2FwcGVkLCB1c2UtYWZ0ZXItZnJlZQo+Pj4+Pj4gZXJy b3IgZGlzYXBwZWFycy4KPj4+Pj4+Cj4+Pj4+PiBCdXQgc2hvdWxkbid0IGluaXRpYWxpemF0aW9u IG9yZGVyIG9mIHRoZXNlIGlub2RlcyBiZSBzd2FwcGVkIHRvbz8KPj4+Pj4+IEFzIG1ldGFfaW5v ZGUgdXNlcyBub2RlX2lub2RlLCBpdCBzZWVtcyBsb2dpY2FsIHRoYXQgaXQgc2hvdWxkIGJlCj4+ Pj4+PiBpbml0aWFsaXplZCBhZnRlciBpdC4KPj4+PiBUaGUgaW5pdGlhbGl6YXRpb24gb3JkZXIg ZG9zZSBub3QgYWZmZWN0IGFueXRoaW5nLCBzbyBzd2FwcGluZyB0aGUgb3JkZXIgZG9zZSBub3QK Pj4+PiBtYWtlIG1vcmUgc2Vuc2UgaGVyZS4KPj4+Pgo+Pj4+PiBJTU8sIGl0J3Mgbm90IGVhc3kg dG8gZXhjaGFuZ2Ugb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gYmV0d2VlbiBtZXRhX2lub2RlIGFu ZAo+Pj4+PiBub2RlX2lub2RlLCBiZWNhdXNlIHdlIHNob3VsZCB1c2UgbWV0YV9pbm9kZSBpbiBn ZXRfdmFsaWRfY2hlY2twb2ludCBmb3IgdmFsaWQKPj4+Pj4gY3AgZmlyc3QgZm9yIHVzdWFsIHZl cmlmaWNhdGlvbiwgdGhlbiBpbml0IG5vZGVfaW5vZGUuCj4+Pj4gWWVhaCwgYnV0IEkgdGhpbmsg anVzdCBtb3Zpbmcgbm9kZV9pbm9kZSdzIGluaXRpYWxpemF0aW9uIHRvIHRoZSBmcm9udCBvZiBt ZXRhX2lub2RlCj4+Pj4gZG9zZSBub3QgYnJlYWsgYW55dGhpbmcuCj4+Pj4KPj4+Pj4gQXMgSSBj aGVja2VkLCBuaWRzIGZvciBib3RoIG1ldGFfaW5vZGUgYW5kIG5vZGVfaW5vZGUgYXJlIHJlc2Vy dmF0aW9uLCBzbyBpdCdzIG5vdAo+Pj4+PiBuZWNlc3NhcnkgZm9yIHVzIHRvIGludmFsaWRhdGUg cGFnZXMgd2hpY2ggd2lsbCBuZXZlciBhbGxvY2VkLgo+Pj4+Pgo+Pj4+PiBIb3cgYWJvdXQgc2tp cHBpbmcgaXQgYXMgZm9sbG93aW5nPwo+Pj4+IEl0IHNlZW1zIHRoZSByaWdodCB3YXkgdG8gZml4 IHRoaXMgaXNzdWUuCj4+Pj4KPj4+PiBUbyBBbmRyZXk6Cj4+Pj4gQ291bGQgeW91IHBsZWFzZSB0 cnkgdGhpcyBvbmU/Cj4+Pj4KPj4+PiBUaGFua3MsCj4+Pj4gR3UKPj4+Pgo+Pj4+PiBkaWZmIC0t Z2l0IGEvZnMvZjJmcy9pbm9kZS5jIGIvZnMvZjJmcy9pbm9kZS5jCj4+Pj4+IGluZGV4IDJjZjY5 NjIuLmNhZmJhM2MgMTAwNjQ0Cj4+Pj4+IC0tLSBhL2ZzL2YyZnMvaW5vZGUuYwo+Pj4+PiArKysg Yi9mcy9mMmZzL2lub2RlLmMKPj4+Pj4gQEAgLTI3Myw3ICsyNzMsNyBAQCB2b2lkIGYyZnNfZXZp Y3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKPj4+Pj4KPj4+Pj4gICAgaWYgKGlub2RlLT5p X2lubyA9PSBGMkZTX05PREVfSU5PKHNiaSkgfHwKPj4+Pj4gICAgICAgICAgICAgICAgICAgIGlu b2RlLT5pX2lubyA9PSBGMkZTX01FVEFfSU5PKHNiaSkpCj4+Pj4+IC0gICAgICAgICAgZ290byBu b19kZWxldGU7Cj4+Pj4+ICsgICAgICAgICAgZ290byBvdXRfY2xlYXI7Cj4+Pj4+Cj4+Pj4+ICAg IGYyZnNfYnVnX29uKGdldF9kaXJ0eV9kZW50cyhpbm9kZSkpOwo+Pj4+PiAgICByZW1vdmVfZGly dHlfZGlyX2lub2RlKGlub2RlKTsKPj4+Pj4gQEAgLTI5NSw2ICsyOTUsNyBAQCB2b2lkIGYyZnNf ZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKPj4+Pj4KPj4+Pj4gICAgc2JfZW5kX2lu dHdyaXRlKGlub2RlLT5pX3NiKTsKPj4+Pj4gICBub19kZWxldGU6Cj4+Pj4+IC0gIGNsZWFyX2lu b2RlKGlub2RlKTsKPj4+Pj4gICAgaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKE5PREVfTUFQUElO RyhzYmkpLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX2lubyk7Cj4+Pj4+ICtvdXRfY2xlYXI6Cj4+ Pj4+ICsgIGNsZWFyX2lub2RlKGlub2RlKTsKPj4+Pj4gICB9Cj4+Pj4+Cj4+Pj4+PiAtLQo+Pj4+ Pj4gQmVzdCByZWdhcmRzLAo+Pj4+Pj4KPj4+Pj4+IEFuZHJleSBUc3l2YXJldgo+Pj4+Pj4gTGlu dXggVmVyaWZpY2F0aW9uIENlbnRlciwgSVNQUkFTCj4+Pj4+PiB3ZWI6aHR0cDovL2xpbnV4dGVz dGluZy5vcmcKPj4+Pj4+Cj4+Pj4+Pgo+Pj4+Pj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+Pj4+ PiBXYW50IGZhc3QgYW5kIGVhc3kgYWNjZXNzIHRvIGFsbCB0aGUgY29kZSBpbiB5b3VyIGVudGVy cHJpc2U/IEluZGV4IGFuZAo+Pj4+Pj4gc2VhcmNoIHVwIHRvIDIwMCwwMDAgbGluZXMgb2YgY29k ZSB3aXRoIGEgZnJlZSBjb3B5IG9mIEJsYWNrIER1Y2sKPj4+Pj4+IENvZGUgU2lnaHQgLSB0aGUg c2FtZSBzb2Z0d2FyZSB0aGF0IHBvd2VycyB0aGUgd29ybGQncyBsYXJnZXN0IGNvZGUKPj4+Pj4+ IHNlYXJjaCBvbiBPaGxvaCwgdGhlIEJsYWNrIER1Y2sgT3BlbiBIdWIhIFRyeSBpdCBub3cuCj4+ Pj4+PiBodHRwOi8vcC5zZi5uZXQvc2Z1L2Jkcwo+Pj4+Pj4gX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KPj4+Pj4+IExpbnV4LWYyZnMtZGV2ZWwgbWFpbGlu ZyBsaXN0Cj4+Pj4+PiBMaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAo+Pj4+ Pj4gaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vbGludXgtZjJm cy1kZXZlbAo+Pj4+PiAuCj4+Pj4+Cj4+Pj4KPj4+Pgo+Pj4KPj4+IC0tCj4+PiBCZXN0IHJlZ2Fy ZHMsCj4+Pgo+Pj4gQW5kcmV5IFRzeXZhcmV2Cj4+PiBMaW51eCBWZXJpZmljYXRpb24gQ2VudGVy LCBJU1BSQVMKPj4+IHdlYjpodHRwOi8vbGludXh0ZXN0aW5nLm9yZwo+Pgo+PiAuCj4+Cj4KPgoK LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCldhbnQgZmFzdCBhbmQgZWFzeSBhY2Nlc3MgdG8gYWxsIHRo ZSBjb2RlIGluIHlvdXIgZW50ZXJwcmlzZT8gSW5kZXggYW5kCnNlYXJjaCB1cCB0byAyMDAsMDAw IGxpbmVzIG9mIGNvZGUgd2l0aCBhIGZyZWUgY29weSBvZiBCbGFjayBEdWNrCkNvZGUgU2lnaHQg LSB0aGUgc2FtZSBzb2Z0d2FyZSB0aGF0IHBvd2VycyB0aGUgd29ybGQncyBsYXJnZXN0IGNvZGUK c2VhcmNoIG9uIE9obG9oLCB0aGUgQmxhY2sgRHVjayBPcGVuIEh1YiEgVHJ5IGl0IG5vdy4KaHR0 cDovL3Auc2YubmV0L3NmdS9iZHMKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KTGludXgtZjJmcy1kZXZlbCBtYWlsaW5nIGxpc3QKTGludXgtZjJmcy1kZXZl bEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlz dHMvbGlzdGluZm8vbGludXgtZjJmcy1kZXZlbAo=