Re: [syzbot] [mm?] WARNING in vma_merge_existing_range

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jan 02, 2025 at 06:19:06PM +0100, Aleksandr Nogikh wrote:
> On Thu, Jan 2, 2025 at 11:26 AM 'Lorenzo Stoakes' via syzkaller-bugs
> <syzkaller-bugs@xxxxxxxxxxxxxxxx> wrote:
> >
> > Happy new year!
>
> Happy New Year! :)

Thanks :)

I am submitting a series to add additional information to the debug output
here by the way, so if this non-repro case recurs we have more to go on.

>
> >
> > On Tue, Dec 31, 2024 at 08:50:23PM -0800, syzbot wrote:
> > > Hello,
> > >
> > > syzbot found the following issue on:
> > >
> > > HEAD commit:    8379578b11d5 Merge tag 'for-v6.13-rc' of git://git.kernel...
> > > git tree:       upstream
> > > console output: https://syzkaller.appspot.com/x/log.txt?x=16113018580000
> > > kernel config:  https://syzkaller.appspot.com/x/.config?x=d269ef41b9262400
> > > dashboard link: https://syzkaller.appspot.com/bug?extid=46423ed8fa1f1148c6e4
> > > compiler:       Debian clang version 15.0.6, GNU ld (GNU Binutils for Debian) 2.40
> > > userspace arch: i386
> >
> > Hmmmm 32-bit? But kernel reports give 64-bit registers? So I guess 32-bit
> > userland, 64-bit kernel?
>
> Yes, that's a 32-bit userspace binary running on a 64-bit kernel.
>
> >
> > >
> > > Unfortunately, I don't have any reproducer for this issue yet.
> >
> > Hmm. Racey thing?
> >
> > >
> > > Downloadable assets:
> > > disk image: https://storage.googleapis.com/syzbot-assets/86d2e3352aff/disk-8379578b.raw.xz
> > > vmlinux: https://storage.googleapis.com/syzbot-assets/345570cd3573/vmlinux-8379578b.xz
> > > kernel image: https://storage.googleapis.com/syzbot-assets/01da37a51505/bzImage-8379578b.xz
> > >
> > > IMPORTANT: if you fix the issue, please add the following tag to the commit:
> > > Reported-by: syzbot+46423ed8fa1f1148c6e4@xxxxxxxxxxxxxxxxxxxxxxxxx
> > >
> > > RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
> > > R10: 0000000000000000 R11: 0000000000000206 R12: 0000000000000000
> > > R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
> > >  </TASK>
> > > ------------[ cut here ]------------
> > > WARNING: CPU: 1 PID: 20504 at mm/vma.c:734 vma_merge_existing_range+0x1145/0x16f0 mm/vma.c:734
> >
> > It'd be nice if syzbot could actually print the code that generates the
> > warning :) a nice-to-have perhaps.
>
> Thanks for the suggestion!
> I've filed https://github.com/google/syzkaller/issues/5654

Great thanks!

>
> >
> > This is:
> >
> >         VM_WARN_ON(start >= end);
> >
> > I suspect start == end, because start > end would be some drastic and
> > god-awful bug.
> >
> > > Modules linked in:
> > > CPU: 1 UID: 0 PID: 20504 Comm: syz.6.5485 Not tainted 6.13.0-rc4-syzkaller-00069-g8379578b11d5 #0
> > > Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024
> > > RIP: 0010:vma_merge_existing_range+0x1145/0x16f0 mm/vma.c:734
> > > Code: e8 20 24 0f 00 4d 2b 7d 00 4d 89 ec 48 8b 7c 24 38 e9 7f 01 00 00 e8 3a bc a8 ff 90 0f 0b 90 e9 a8 f1 ff ff e8 2c bc a8 ff 90 <0f> 0b 90 e9 0e f2 ff ff e8 1e bc a8 ff 90 0f 0b 90 4d 85 ed 0f 85
> >
> > Be useful to get the kernel disassembly too :)
> >
> > Best guess wranging a python script and objdump:
> >
> >    0:   e8 20 24 0f 00          call   0xf2425
> >    5:   4d 2b 7d 00             sub    0x0(%r13),%r15
> >    9:   4d 89 ec                mov    %r13,%r12
> >    c:   48 8b 7c 24 38          mov    0x38(%rsp),%rdi
> >   11:   e9 7f 01 00 00          jmp    0x195
> >   16:   e8 3a bc a8 ff          call   0xffffffffffa8bc55
> >   1b:   90                      nop
> >   1c:   0f 0b                   ud2
> >   1e:   90                      nop
> >   1f:   e9 a8 f1 ff ff          jmp    0xfffffffffffff1cc
> >   24:   e8 2c bc a8 ff          call   0xffffffffffa8bc55
> >   29:   90                      nop
> >   2a:   <0f> 0b                 ud2   <-- presumably here? This is an undefined instruction...
> >   2c:   90                      nop
> >   2d:   e9 0e f2 ff ff          jmp    0xfffffffffffff240
> >   32:   e8 1e bc a8 ff          call   0xffffffffffa8bc55
> >   37:   90                      nop
> >   38:   0f 0b                   ud2
> >   3a:   90                      nop
> >   3b:   4d 85 ed                test   %r13,%r13
> >   3e:   0f                      .byte 0xf
> >   3f:   85                      .byte 0x85
> >
> > Yeah this might be a mix of data and code somehow or just garbage? Not sure
> > there's anything discernable there unfortunately.
>
> Syzbot also did some disassembly at the bottom of the report. I wonder
> what's the difference between the two "Code" fields and if there's a
> way to automatically select the right one for the disassembly.
>

Yeah looks like the userland side (the 2nd code block below). Would be
handy to have kernel bit too.

> >
> > > RSP: 0018:ffffc9000ba274a0 EFLAGS: 00010293
> > > RAX: ffffffff81f6b804 RBX: 0000000020c25000 RCX: ffff888060ad1e00
> > > RDX: 0000000000000000 RSI: 0000000020c25000 RDI: 0000000020c25000
> > > RBP: ffffc9000ba275f8 R08: ffffffff81f6aa0d R09: 00000000280000fa
> > > R10: ffffc9000ba27810 R11: fffff52001744f07 R12: 0000000020c25000
> > > R13: ffff888069b666c8 R14: ffffc9000ba276a0 R15: ffff888068d0b1f0
> > > FS:  0000000000000000(0000) GS:ffff8880b8700000(0063) knlGS:00000000f5116b40
> > > CS:  0010 DS: 002b ES: 002b CR0: 0000000080050033
> > > CR2: 00007fa9de2c0018 CR3: 000000006b562000 CR4: 00000000003526f0
> >
> > > Call Trace:
> > >  <TASK>
> > >  vma_modify+0x41/0x330 mm/vma.c:1514
> >
> > Just passes through start, end (in vmg).
> >
> > >  vma_modify_flags_name+0x3a6/0x430 mm/vma.c:1563
> >
> > Just passes through start, end.
> >
> > >  madvise_update_vma+0x2fe/0xc10 mm/madvise.c:159
> >
> > Just passes through start, end.
> >
> > This means it was one of MADV_NORMAL, MADV_RANDOM, MADV_DONTFORK,
> > MADV_DOFORK, MADV_WIPEONFORK, MADV_KEEPONFORK, MADV_DONTDUMP, MADV_DODUMP,
> > MADV_MERGEABLE, MADV_UNMERGEABLE, MADV_HUGEPAGE, MADV_NOHUGEPAGE.
> >
> > Yeah we need better error handling here, because this report is just giving
> > us very little to go on especially for a non-repro. Will add to TODO.
> >
> > >  madvise_vma_behavior mm/madvise.c:1325 [inline]
> >
> > Just passes through start, end.
> >
> > >  madvise_walk_vmas mm/madvise.c:1497 [inline]
> >
> > OK here we find VMAs and walk them.
> >
> > We explicitly check for start >= send if start < vma->vm_start.
> >
> > I wonder if the visit() call is splitting the VMA which confuses the logic
> > here.
> >
> >       s  e
> >       |  |
> >       v  v
> > |-------------|
> > |             |
> > |-------------|
> >
> > Split:
> >
> >       s  e
> >       |  |
> >       v  v
> > |--------|----|
> > |        |    |
> > |--------|----|
> >
> > prev = this VMA.
> >
> >         if (prev && start < prev->vm_end)
> >                 start = prev->vm_end;
> >
> > So we end up with:
> >
> >
> >          s,e
> >          |
> >          v
> > |--------|----|
> > |        |    |
> > |--------|----|
> >
> >         tmp = vma->vm_end;
> >         if (end < tmp)
> >                 tmp = end;
> >
> > That tmp assignment will reinstate the broken end
> >
> > And... boom.
> >
> > Let me check this out and see if I can trigger it.
> >
> > I may be missing some safeguard that prevents this...
> >
> >
> > >  do_madvise+0x1e64/0x4d10 mm/madvise.c:1684
> >
> > Here we explicitly check for start >= end:
> >
> >         end = start + len;
> >         if (end < start)
> >                 return -EINVAL;
> >
> >         if (end == start)
> >                 return 0;
> >
> > So overflow is accounted for also. But since this is a 64-bit kernel not
> > really a concern.
> >
> > >  __do_sys_madvise mm/madvise.c:1700 [inline]
> > >  __se_sys_madvise mm/madvise.c:1698 [inline]
> > >  __ia32_sys_madvise+0xa6/0xc0 mm/madvise.c:1698
> > >  do_syscall_32_irqs_on arch/x86/entry/common.c:165 [inline]
> > >  __do_fast_syscall_32+0xb4/0x110 arch/x86/entry/common.c:386
> > >  do_fast_syscall_32+0x34/0x80 arch/x86/entry/common.c:411
> > >  entry_SYSENTER_compat_after_hwframe+0x84/0x8e
> > > RIP: 0023:0xf7fc2579
> > > Code: b8 01 10 06 03 74 b4 01 10 07 03 74 b0 01 10 08 03 74 d8 01 00 00 00 00 00 00 00 00 00 00 00 00 00 51 52 55 89 e5 0f 34 cd 80 <5d> 5a 59 c3 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
> > > RSP: 002b:00000000f511655c EFLAGS: 00000206 ORIG_RAX: 00000000000000db
> > > RAX: ffffffffffffffda RBX: 0000000020c00000 RCX: 0000000000400000
> > > RDX: 000000000000000e RSI: 0000000000000000 RDI: 0000000000000000
> > > RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
> > > R10: 0000000000000000 R11: 0000000000000206 R12: 0000000000000000
> > > R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
> > >  </TASK>
> > > ----------------
> > > Code disassembly (best guess), 2 bytes skipped:
> > >    0: 10 06                   adc    %al,(%rsi)
> > >    2: 03 74 b4 01             add    0x1(%rsp,%rsi,4),%esi
> > >    6: 10 07                   adc    %al,(%rdi)
> > >    8: 03 74 b0 01             add    0x1(%rax,%rsi,4),%esi
> > >    c: 10 08                   adc    %cl,(%rax)
> > >    e: 03 74 d8 01             add    0x1(%rax,%rbx,8),%esi
> > >   1e: 00 51 52                add    %dl,0x52(%rcx)
> > >   21: 55                      push   %rbp
> > >   22: 89 e5                   mov    %esp,%ebp
> > >   24: 0f 34                   sysenter
> > >   26: cd 80                   int    $0x80
> > > * 28: 5d                      pop    %rbp <-- trapping instruction
> > >   29: 5a                      pop    %rdx
> > >   2a: 59                      pop    %rcx
> > >   2b: c3                      ret
> > >   2c: 90                      nop
> > >   2d: 90                      nop
> > >   2e: 90                      nop
> > >   2f: 90                      nop
> > >   30: 90                      nop
> > >   31: 90                      nop
> > >   32: 90                      nop
> > >   33: 90                      nop
> > >   34: 90                      nop
> > >   35: 90                      nop
> > >   36: 90                      nop
> > >   37: 90                      nop
> > >   38: 90                      nop
> > >   39: 90                      nop
> > >   3a: 90                      nop
> > >   3b: 90                      nop
> > >   3c: 90                      nop
> > >   3d: 90                      nop
> > >
> > >
> > > ---
> > > 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 syzkaller@xxxxxxxxxxxxxxxx.
> > >
> > > syzbot will keep track of this issue. See:
> > > https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
> > >
> > > If the report is already addressed, let syzbot know by replying with:
> > > #syz fix: exact-commit-title
> > >
> > > 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
> >




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux