public inbox for linux-bcachefs@vger.kernel.org
 help / color / mirror / Atom feed
From: Gianfranco Trad <gianf.trad@gmail.com>
To: Kent Overstreet <kent.overstreet@linux.dev>
Cc: linux-bcachefs@vger.kernel.org, linux-kernel@vger.kernel.org,
	skhan@linuxfoundation.org,
	syzbot+8689d10f1894eedf774d@syzkaller.appspotmail.com
Subject: Re: [PATCH] bcachefs: zero-init move_bucket struct in bch2_copygc_get_buckets()
Date: Sun, 15 Dec 2024 02:58:26 +0100	[thread overview]
Message-ID: <60464a9b-aa46-40b3-b8fa-0567f86f6747@gmail.com> (raw)
In-Reply-To: <382408d3-21ed-4bb3-87a2-60ad61583726@gmail.com>

On 12/11/24 16:08, Gianfranco Trad wrote:
> On 11/11/24 21:09, Kent Overstreet wrote:
>> On Mon, Nov 11, 2024 at 03:42:44PM +0100, Gianfranco Trad wrote:
>>> zero-init move_bucket struct b fields in bch2_copygc_get_buckets()
>>> to mitigate later uninit-value-use KMSAN reported bug.
>>>
>>> Reported-by: syzbot+8689d10f1894eedf774d@syzkaller.appspotmail.com
>>> Closes: https://syzkaller.appspot.com/bug?extid=8689d10f1894eedf774d
>>> Tested-by: syzbot+8689d10f1894eedf774d@syzkaller.appspotmail.com
>>> Signed-off-by: Gianfranco Trad <gianf.trad@gmail.com>
>>> ---
>>>   fs/bcachefs/movinggc.c | 3 ++-
>>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c
>>> index d658be90f737..cdc456b03bec 100644
>>> --- a/fs/bcachefs/movinggc.c
>>> +++ b/fs/bcachefs/movinggc.c
>>> @@ -171,7 +171,8 @@ static int bch2_copygc_get_buckets(struct 
>>> moving_context *ctxt,
>>>                     lru_pos(BCH_LRU_FRAGMENTATION_START, 0, 0),
>>>                     lru_pos(BCH_LRU_FRAGMENTATION_START, U64_MAX, 
>>> LRU_TIME_MAX),
>>>                     0, k, ({
>>> -        struct move_bucket b = { .k.bucket = u64_to_bucket(k.k- 
>>> >p.offset) };
>>> +        struct move_bucket b = { 0 };
>>> +        b.k.bucket = u64_to_bucket(k.k->p.offset);
>>>           int ret2 = 0;
>>
>> Providing any sort of initializer should cause the whole struct to be
>> initialized, are you and syzbot sure this is the right fix?
> You are right, there's no need to initialize the whole struct.
> I'm still in the process of fully understanding what reproducer is 
> trying to do.
> So far with the additional findings, b.k seems not to be initialized 
> prior usage in repro case, therefore memset to 0 only the b.k field 
> seems enough:
> 
> diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c
> index d658be90f737..515b05d26d11 100644
> --- a/fs/bcachefs/movinggc.c
> +++ b/fs/bcachefs/movinggc.c
> @@ -171,7 +171,9 @@ static int bch2_copygc_get_buckets(struct 
> moving_context *ctxt,
>                     lru_pos(BCH_LRU_FRAGMENTATION_START, 0, 0),
>                     lru_pos(BCH_LRU_FRAGMENTATION_START, U64_MAX, 
> LRU_TIME_MAX),
>                     0, k, ({
> -        struct move_bucket b = { .k.bucket = u64_to_bucket(k.k- 
>  >p.offset) };
> +        struct move_bucket b;
> +        memset(&b.k, 0, sizeof(b.k));
> +        b.k.bucket = u64_to_bucket(k.k->p.offset);
>           int ret2 = 0;
> 
>           saw++;
> 
> The above patch was already tested-by syzbot[1].
> 
> Let me know if the patch looks good enough or if I should work on it more.
> 
> Thanks for your time,
> 
> [1] https://syzkaller.appspot.com/x/log.txt?x=1733b8c0580000
> 
> --Gian

Hi Kent,

I wanted to follow up on this patch. Over the last few days, I've 
investigated it further and observed the following that might be of help:

1- zero-initing whole b struct (as the first patch version) leads to a 
clean log [1].
While if trying to memset to 0 only b.k field log reports [2]:

bcachefs (da441363-bb6a-4ab9-999b-c1f40db4fee2): filesystem UUID already 
open
bcachefs (da441363-bb6a-4ab9-999b-c1f40db4fee2): shutdown complete
bcachefs: bch2_fs_get_tree() error: EINVAL


2- Given both versions of the patch didn't trigger the uninit issue 
anymore I checked whether inner fields of b.k.bucket are correctly 
inited, just before the bug triggers.
b.k.bucket fields seeming to look correctly inited: snapshot = 0, offset 
= 34, inode = 0, gen = 0.

3- The first of the 2 reproducers causes a segfault:

==9335== Invalid[  264.802101][ T9346] read of size 1
==9335==    at 0x483BC39: strnlen (vg_replace_strmem.c:426)
==9335==    by 0x1098F0: netlink_query_family_id (repro.c:176)
==9335==    by 0x109A51: syz_genetlink_get_family_id (repro.c:211)
==9335==    by 0x10B476: execute_one (repro.c:2071)
==9335==    by 0x10B1A5: loop (repro.c:745)
==9335==    by 0x10B52F: main (repro.c:2088)
==9335==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

As of now, it seems unrelated to the root cause of the reported syzbot bug.


At this point, zero-initializing the entire struct seems to work 
reliably, thought I'm still trying to get the full picture on this bug.

I know you are busy, but I'd highly appreciate your thoughts on this.
I hope it might help.

[1] https://syzkaller.appspot.com/x/log.txt?x=1724b4e8580000
[2] https://syzkaller.appspot.com/x/log.txt?x=1733b8c0580000

Thanks for your time,
--Gian

  reply	other threads:[~2024-12-15  1:58 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-11 14:42 [PATCH] bcachefs: zero-init move_bucket struct in bch2_copygc_get_buckets() Gianfranco Trad
2024-11-11 20:09 ` Kent Overstreet
2024-11-12 15:08   ` Gianfranco Trad
2024-12-15  1:58     ` Gianfranco Trad [this message]
2024-12-15  6:20       ` Kent Overstreet

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=60464a9b-aa46-40b3-b8fa-0567f86f6747@gmail.com \
    --to=gianf.trad@gmail.com \
    --cc=kent.overstreet@linux.dev \
    --cc=linux-bcachefs@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=skhan@linuxfoundation.org \
    --cc=syzbot+8689d10f1894eedf774d@syzkaller.appspotmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox