• Rustam Kovhaev's avatar
    bpf: Fix false positive kmemleak report in bpf_ringbuf_area_alloc() · ccff81e1
    Rustam Kovhaev authored
    kmemleak scans struct page, but it does not scan the page content. If we
    allocate some memory with kmalloc(), then allocate page with alloc_page(),
    and if we put kmalloc pointer somewhere inside that page, kmemleak will
    report kmalloc pointer as a false positive.
    
    We can instruct kmemleak to scan the memory area by calling kmemleak_alloc()
    and kmemleak_free(), but part of struct bpf_ringbuf is mmaped to user space,
    and if struct bpf_ringbuf changes we would have to revisit and review size
    argument in kmemleak_alloc(), because we do not want kmemleak to scan the
    user space memory. Let's simplify things and use kmemleak_not_leak() here.
    
    For posterity, also adding additional prior analysis from Andrii:
    
      I think either kmemleak or syzbot are misreporting this. I've added a
      bunch of printks around all allocations performed by BPF ringbuf. [...]
      On repro side I get these two warnings:
    
      [vmuser@archvm bpf]$ sudo ./repro
      BUG: memory leak
      unreferenced object 0xffff88810d538c00 (size 64):
        comm "repro", pid 2140, jiffies 4294692933 (age 14.540s)
        hex dump (first 32 bytes):
          00 af 19 04 00 ea ff ff c0 ae 19 04 00 ea ff ff  ................
          80 ae 19 04 00 ea ff ff c0 29 2e 04 00 ea ff ff  .........)......
        backtrace:
          [<0000000077bfbfbd>] __bpf_map_area_alloc+0x31/0xc0
          [<00000000587fa522>] ringbuf_map_alloc.cold.4+0x48/0x218
          [<0000000044d49e96>] __do_sys_bpf+0x359/0x1d90
          [<00000000f601d565>] do_syscall_64+0x2d/0x40
          [<0000000043d3112a>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
      BUG: memory leak
      unreferenced object 0xffff88810d538c80 (size 64):
        comm "repro", pid 2143, jiffies 4294699025 (age 8.448s)
        hex dump (first 32 bytes):
          80 aa 19 04 00 ea ff ff 00 ab 19 04 00 ea ff ff  ................
          c0 ab 19 04 00 ea ff ff 80 44 28 04 00 ea ff ff  .........D(.....
        backtrace:
          [<0000000077bfbfbd>] __bpf_map_area_alloc+0x31/0xc0
          [<00000000587fa522>] ringbuf_map_alloc.cold.4+0x48/0x218
          [<0000000044d49e96>] __do_sys_bpf+0x359/0x1d90
          [<00000000f601d565>] do_syscall_64+0x2d/0x40
          [<0000000043d3112a>] entry_SYSCALL_64_after_hwframe+0x44/0xae
    
      Note that both reported leaks (ffff88810d538c80 and ffff88810d538c00)
      correspond to pages array bpf_ringbuf is allocating and tracking properly
      internally. Note also that syzbot repro doesn't close FD of created BPF
      ringbufs, and even when ./repro itself exits with error, there are still
      two forked processes hanging around in my system. So clearly ringbuf maps
      are alive at that point. So reporting any memory leak looks weird at that
      point, because that memory is being used by active referenced BPF ringbuf.
    
      It's also a question why repro doesn't clean up its forks. But if I do a
      `pkill repro`, I do see that all the allocated memory is /properly/ cleaned
      up [and the] "leaks" are deallocated properly.
    
      BTW, if I add close() right after bpf() syscall in syzbot repro, I see that
      everything is immediately deallocated, like designed. And no memory leak
      is reported. So I don't think the problem is anywhere in bpf_ringbuf code,
      rather in the leak detection and/or repro itself.
    
    Reported-by: syzbot+5d895828587f49e7fe9b@syzkaller.appspotmail.com
    Signed-off-by: default avatarRustam Kovhaev <rkovhaev@gmail.com>
    [ Daniel: also included analysis from Andrii to the commit log ]
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Tested-by: syzbot+5d895828587f49e7fe9b@syzkaller.appspotmail.com
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Andrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/CAEf4BzYk+dqs+jwu6VKXP-RttcTEGFe+ySTGWT9CRNkagDiJVA@mail.gmail.com
    Link: https://lore.kernel.org/lkml/YNTAqiE7CWJhOK2M@nuc10
    Link: https://lore.kernel.org/lkml/20210615101515.GC26027@arm.com
    Link: https://syzkaller.appspot.com/bug?extid=5d895828587f49e7fe9b
    Link: https://lore.kernel.org/bpf/20210626181156.1873604-1-rkovhaev@gmail.com
    ccff81e1
ringbuf.c 12.7 KB