WARNING in f2fs_unlink
syzbot
syzbotHello,
syzbot found the following issue on:
HEAD commit: 43fb83c17ba2 Merge tag 'soc-arm-6.13' of git://git.kernel... git tree: upstream console+strace: https://syzkaller.appspot.com/x/log.txt?x=170f5930580000 kernel config: https://syzkaller.appspot.com/x/.config?x=e796b1bf154f93a7 dashboard link: https://syzkaller.appspot.com/bug?extid=b01a36acd7007e273a83 compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40 syz repro: https://syzkaller.appspot.com/x/repro.syz?x=1213fae8580000 C reproducer: https://syzkaller.appspot.com/x/repro.c?x=12b3a75f980000
Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/c93bb9014475/disk-43fb83c1.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/8116200f91e3/vmlinux-43fb83c1.xz
kernel image: https://storage.googleapis.com/syzbot-assets/d3a982ec74b0/bzImage-43fb83c1.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/43c22dda0085/mount_0.gz
The issue was bisected to:
commit 4c8ff7095bef64fc47e996a938f7d57f9e077da3
Author: Chao Yu <[email protected]> Date: Fri Nov 1 10:07:14 2019 +0000
f2fs: support data compression
bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=101e5b78580000 final oops: https://syzkaller.appspot.com/x/report.txt?x=121e5b78580000 console output: https://syzkaller.appspot.com/x/log.txt?x=141e5b78580000
IMPORTANT: if you fix the issue, please add the following tag to the commit:
F2FS-fs (loop0): Found nat_bits in checkpoint F2FS-fs (loop0): Mounted with checkpoint version = 48b305e4
------------[ cut here ]------------ WARNING: CPU: 0 PID: 5835 at fs/inode.c:407 drop_nlink+0xc4/0x110 fs/inode.c:407 Modules linked in: CPU: 0 UID: 0 PID: 5835 Comm: syz-executor152 Not tainted 6.12.0-syzkaller-03657-g43fb83c17ba2 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/30/2024 RIP: 0010:drop_nlink+0xc4/0x110 fs/inode.c:407 Code: bb 70 07 00 00 be 08 00 00 00 e8 07 df e5 ff f0 48 ff 83 70 07 00 00 5b 41 5c 41 5e 41 5f 5d c3 cc cc cc cc e8 ed e9 7e ff 90 <0f> 0b 90 eb 83 44 89 e1 80 e1 07 80 c1 03 38 c1 0f 8c 5c ff ff ff RSP: 0018:ffffc90003cafb98 EFLAGS: 00010293 RAX: ffffffff82160e93 RBX: 1ffff1100e63e009 RCX: ffff888035573c00 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 RBP: 0000000000000000 R08: ffffffff82160e13 R09: 1ffffffff203969e R10: dffffc0000000000 R11: fffffbfff203969f R12: ffff8880731f0048 R13: dffffc0000000000 R14: ffff8880731f0000 R15: dffffc0000000000 FS: 0000555576140380(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000000066c7e0 CR3: 00000000758b4000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> f2fs_i_links_write fs/f2fs/f2fs.h:3127 [inline] f2fs_drop_nlink+0xd6/0x380 fs/f2fs/dir.c:822 f2fs_unlink+0x47f/0x960 fs/f2fs/namei.c:572 vfs_unlink+0x365/0x650 fs/namei.c:4523 do_unlinkat+0x4ae/0x830 fs/namei.c:4587 __do_sys_unlinkat fs/namei.c:4630 [inline] __se_sys_unlinkat fs/namei.c:4623 [inline] __x64_sys_unlinkat+0xcc/0xf0 fs/namei.c:4623 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f71e4b355f9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 61 17 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007ffed28a90b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000107 RAX: ffffffffffffffda RBX: 00007ffed28a9298 RCX: 00007f71e4b355f9 RDX: 0000000000000000 RSI: 0000000020000380 RDI: 00000000ffffff9c RBP: 00007f71e4bb8610 R08: 00000000000105b7 R09: 0000000000000000 R10: 00007ffed28a8f80 R11: 0000000000000246 R12: 0000000000000001 R13: 00007ffed28a9288 R14: 0000000000000001 R15: 0000000000000001 </TASK>
---
This report is generated by a bot. It may contain errors. See https://goo.gl/tpsmEJ for more information about syzbot. syzbot engineers can be reached at [email protected].
syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot. For information about bisection process see: https://goo.gl/tpsmEJ#bisection
If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title
If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.
If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)
If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report
If you want to undo deduplication, reply with:
#syz undup
PATCH 1/1 f2fs: Add check for deleted inode
The syzbot reproducer mounts a f2fs image, then tries to unlink an existing file. However, the unlinked file already has a link count of 0 when it is read for the first time in do_read_inode().
Add a check to sanity_check_inode() for i_nlink == 0.
#syz test
--- fs/f2fs/inode.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/f2fs/inode.c +6 -0
@@ -372,6 +372,12 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)return false; } +if (inode->i_nlink ==0 ) { +f2fs_warn (sbi,"%s: inode (ino=%lx) has a link count of 0" , + __func__, inode->i_ino); +return false; + } +return true; }
Signature · 1 line
2.43.0
syzbot has tested the proposed patch and the reproducer did not trigger any issue:
Hello,
syzbot has tested the proposed patch and the reproducer did not trigger any issue:
Tested on:
commit: 9f16d5e6 Merge tag 'for-linus' of git://git.kernel.org.. git tree: upstream console output: https://syzkaller.appspot.com/x/log.txt?x=14d40778580000 kernel config: https://syzkaller.appspot.com/x/.config?x=e92fc420ca55fe33 dashboard link: https://syzkaller.appspot.com/bug?extid=b01a36acd7007e273a83 compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40 patch: https://syzkaller.appspot.com/x/patch.diff?x=15dd69c0580000
Note: testing is done by a robot and is best-effort only.
Chao Yu
maintainerRe: [PATCH] f2fs: Add check for deleted inode
In reply to Leo StoneQuoted 11 lines · Leo Stone
The syzbot reproducer mounts a f2fs image, then tries to unlink an existing file. However, the unlinked file already has a link count of 0 when it is read for the first time in
do_read_inode().Add a check to
sanity_check_inode()fori_nlink== 0.#syz test
Reported-by [email protected]Fixes 4c8ff7095bef ("f2fs: support data compression")
Hello Leo,
I'm fine w/ this change, but I didn't get it, how did above commit introduce this bug?
Thanks,
Quoted 22 lines
Signed-off-by Leo Stone <[email protected]>--- fs/f2fs/inode.c | 6 ++++++ 1 file changed, 6 insertions(+)fs/f2fs/inode.c +6
-0@@ -372,6 +372,12 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)return false; } +if (inode->i_nlink ==0 ) { +f2fs_warn (sbi,"%s: inode (ino=%lx) has a link count of 0" , + __func__, inode->i_ino); +return false; + } +return true; }
Re: [PATCH] f2fs: Add check for deleted inode
Quoted 3 lines · Chao Yu
I'm fine w/ this change, but I didn't get it, how did above commit introduce this bug?
Hello Chao,
The commit from the bisect didn't exactly introduce this bug, since it would still be possible to make a different image that does the exact same thing in the older code.
This commit was blamed in the bisect because it changes the layout of struct f2fs_inode:
Review struct f2fs_inode { · line 281
Quoted 11 lines
(quoted diff) +4
-0@@ -271,6 +272,10 @@ struct f2fs_inode { __le32 i_inode_checksum;/* inode meta checksum */ __le64 i_crtime; /* creation time */ __le32 i_crtime_nsec; /* creation time in nano scale */ + __le64 i_compr_blocks; /* # of compressed blocks */ + __u8 i_compress_algorithm; /* compress algorithm */ + __u8 i_log_cluster_size; /* log of cluster size */ + __le16 i_padding; /* padding */ __le32 i_extra_end[0]; /* for attribute size calculation */ } __packed; __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */
This changes F2FS_TOTAL_EXTRA_ATTR_SIZE, which allows the syzbot reproducer's inode to pass the sanity check for corrupted i_extra_size. Before this change, the inode gets rejected as corrupt:
Quoted 1 line
[ 62.794566][ T9662] F2FS-fs (loop0): sanity_check_inode: inode (ino=7) has corrupted i_extra_isize: 36, max: 24
Thanks,
Leo
Chao Yu
maintainerRe: [PATCH] f2fs: Add check for deleted inode
Quoted 14 lines · Leo Stone
Quoted 3 lines · Chao Yu
I'm fine w/ this change, but I didn't get it, how did above commit introduce this bug?
Hello Chao,
The commit from the bisect didn't exactly introduce this bug, since it would still be possible to make a different image that does the exact same thing in the older code.
This commit was blamed in the bisect because it changes the layout of struct
f2fs_inode:
Quoted 17 lines
Review struct f2fs_inode { · line 281
Quoted 11 lines
(quoted diff) +4
-0@@ -271,6 +272,10 @@ struct f2fs_inode { __le32 i_inode_checksum;/* inode meta checksum */ __le64 i_crtime; /* creation time */ __le32 i_crtime_nsec; /* creation time in nano scale */ + __le64 i_compr_blocks; /* # of compressed blocks */ + __u8 i_compress_algorithm; /* compress algorithm */ + __u8 i_log_cluster_size; /* log of cluster size */ + __le16 i_padding; /* padding */ __le32 i_extra_end[0]; /* for attribute size calculation */ } __packed; __le32 i_addr[DEF_ADDRS_PER_INODE]; /* Pointers to data blocks */This changes
F2FS_TOTAL_EXTRA_ATTR_SIZE, which allows the syzbot reproducer's inode to pass the sanity check for corruptedi_extra_size. Before this change, the inode gets rejected as corrupt:Quoted 1 line
[ 62.794566][ T9662] F2FS-fs (loop0): sanity_check_inode: inode (ino=7) has corrupted i_extra_isize: 36, max: 24
Leo,
Ah, right, thanks for the explanation, anyway, can you please correct this "Fixes line"?
Thanks,
Quoted 3 lines
Thanks,
Leo
Chao Yu
maintainer#syz fix: f2fs: add check for deleted inode
Quoted 104 lines · syzbot
Hello,
syzbot found the following issue on:
HEAD commit: 43fb83c17ba2 Merge tag 'soc-arm-6.13' of git://git.kernel... git tree: upstream console+strace: https://syzkaller.appspot.com/x/log.txt?x=170f5930580000 kernel config: https://syzkaller.appspot.com/x/.config?x=e796b1bf154f93a7 dashboard link: https://syzkaller.appspot.com/bug?extid=b01a36acd7007e273a83 compiler: Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40 syz repro: https://syzkaller.appspot.com/x/repro.syz?x=1213fae8580000 C reproducer: https://syzkaller.appspot.com/x/repro.c?x=12b3a75f980000Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/c93bb9014475/disk-43fb83c1.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/8116200f91e3/vmlinux-43fb83c1.xz
kernel image: https://storage.googleapis.com/syzbot-assets/d3a982ec74b0/bzImage-43fb83c1.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/43c22dda0085/mount_0.gzThe issue was bisected to:
commit
4c8ff7095bef64fc47e996a938f7d57f9e077da3Author: Chao Yu <[email protected]> Date: Fri Nov 1 10:07:14 2019 +0000f2fs: support data compression
bisection log: https://syzkaller.appspot.com/x/bisect.txt?x=101e5b78580000 final oops: https://syzkaller.appspot.com/x/report.txt?x=121e5b78580000 console output: https://syzkaller.appspot.com/x/log.txt?x=141e5b78580000IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by [email protected]Fixes 4c8ff7095bef ("f2fs: support data compression")F2FS-fs (loop0): Found
nat_bitsin checkpoint F2FS-fs (loop0): Mounted with checkpoint version =48b305e4------------[ cut here ]------------ WARNING: CPU: 0 PID: 5835 at fs/inode.c:407 drop_nlink+0xc4/0x110 fs/inode.c:407 Modules linked in: CPU: 0 UID: 0 PID: 5835 Comm: syz-executor152 Not tainted 6.12.0-syzkaller-03657-g43fb83c17ba2 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/30/2024 RIP: 0010:drop_nlink+0xc4/0x110 fs/inode.c:407 Code: bb 70 07 00 00 be 08 00 00 00 e8 07 df e5 ff f0 48 ff 83 70 07 00 00 5b 41 5c 41 5e 41 5f 5d c3 cc cc cc cc e8 ed e9 7e ff 90 <0f> 0b 90 eb 83 44 89 e1 80 e1 07 80 c1 03 38 c1 0f 8c 5c ff ff ff RSP: 0018:ffffc90003cafb98 EFLAGS: 00010293 RAX: ffffffff82160e93 RBX: 1ffff1100e63e009 RCX: ffff888035573c00 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 RBP: 0000000000000000 R08: ffffffff82160e13 R09: 1ffffffff203969e R10: dffffc0000000000 R11: fffffbfff203969f R12: ffff8880731f0048 R13: dffffc0000000000 R14: ffff8880731f0000 R15: dffffc0000000000 FS: 0000555576140380(0000) GS:ffff8880b8600000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 000000000066c7e0 CR3: 00000000758b4000 CR4: 00000000003526f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: <TASK> f2fs_i_links_write fs/f2fs/f2fs.h:3127 [inline] f2fs_drop_nlink+0xd6/0x380 fs/f2fs/dir.c:822 f2fs_unlink+0x47f/0x960 fs/f2fs/namei.c:572 vfs_unlink+0x365/0x650 fs/namei.c:4523 do_unlinkat+0x4ae/0x830 fs/namei.c:4587 __do_sys_unlinkat fs/namei.c:4630 [inline] __se_sys_unlinkat fs/namei.c:4623 [inline] __x64_sys_unlinkat+0xcc/0xf0 fs/namei.c:4623 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f71e4b355f9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 61 17 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007ffed28a90b8 EFLAGS: 00000246 ORIG_RAX: 0000000000000107 RAX: ffffffffffffffda RBX: 00007ffed28a9298 RCX: 00007f71e4b355f9 RDX: 0000000000000000 RSI: 0000000020000380 RDI: 00000000ffffff9c RBP: 00007f71e4bb8610 R08: 00000000000105b7 R09: 0000000000000000 R10: 00007ffed28a8f80 R11: 0000000000000246 R12: 0000000000000001 R13: 00007ffed28a9288 R14: 0000000000000001 R15: 0000000000000001 </TASK>---
This report is generated by a bot. It may contain errors. See https://goo.gl/tpsmEJ for more information about syzbot. syzbot engineers can be reached at [email protected].syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot. For information about bisection process see: https://goo.gl/tpsmEJ#bisectionIf the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-titleIf you want syzbot to run the reproducer, reply with:
#syz test:git://repo/address.gitbranch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-reportIf you want to undo deduplication, reply with:
#syz undup