linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* net: BUG in unix_notinflight
@ 2016-11-26 18:05 Dmitry Vyukov
  2017-03-06 10:40 ` Dmitry Vyukov
  0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Vyukov @ 2016-11-26 18:05 UTC (permalink / raw)
  To: David Miller, Hannes Frederic Sowa, Willy Tarreau, netdev, LKML,
	Eric Dumazet
  Cc: syzkaller

Hello,

I am hitting the following BUG while running syzkaller fuzzer:

kernel BUG at net/unix/garbage.c:149!
invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN
Dumping ftrace buffer:
   (ftrace buffer empty)
Modules linked in:
CPU: 0 PID: 23491 Comm: syz-executor Not tainted 4.9.0-rc5+ #41
Hardware name: Google Google Compute Engine/Google Compute Engine,
BIOS Google 01/01/2011
task: ffff8801c16b06c0 task.stack: ffff8801c2928000
RIP: 0010:[<ffffffff8717ebf4>]  [<ffffffff8717ebf4>]
unix_notinflight+0x3b4/0x490 net/unix/garbage.c:149
RSP: 0018:ffff8801c292ea40  EFLAGS: 00010297
RAX: ffff8801c16b06c0 RBX: 1ffff10038525d4a RCX: dffffc0000000000
RDX: 0000000000000000 RSI: 1ffff10038525d4e RDI: ffffffff8a6e9d84
RBP: ffff8801c292eb18 R08: 0000000000000000 R09: 0000000000000000
R10: cdca594876e035a1 R11: 0000000000000005 R12: 1ffff10038525d4e
R13: ffffffff899156e0 R14: ffff8801c292eaf0 R15: ffff88018b7cd780
FS:  00007f10420fa700(0000) GS:ffff8801d9800000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 000000002000a000 CR3: 00000001c2ecc000 CR4: 00000000001406f0
DR0: 0000000000000000 DR1: 0000000000000400 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000600
Stack:
 dffffc0000000000 ffff88019f036970 0000000041b58ab3 ffffffff894c5120
 ffffffff8717e840 ffff8801c16b06c0 ffff88018b7cdcf0 ffffffff894c51e2
 ffffffff81576d50 0000000000000000 ffffffff00000000 1ffff10000000000
Call Trace:
 [<ffffffff8716cfbf>] unix_detach_fds.isra.19+0xff/0x170 net/unix/af_unix.c:1487
 [<ffffffff8716f6a9>] unix_destruct_scm+0xf9/0x210 net/unix/af_unix.c:1496
 [<ffffffff86a90a01>] skb_release_head_state+0x101/0x200 net/core/skbuff.c:655
 [<ffffffff86a9808a>] skb_release_all+0x1a/0x60 net/core/skbuff.c:668
 [<ffffffff86a980ea>] __kfree_skb+0x1a/0x30 net/core/skbuff.c:684
 [<ffffffff86a98284>] kfree_skb+0x184/0x570 net/core/skbuff.c:705
 [<ffffffff871789d5>] unix_release_sock+0x5b5/0xbd0 net/unix/af_unix.c:559
 [<ffffffff87179039>] unix_release+0x49/0x90 net/unix/af_unix.c:836
 [<ffffffff86a694b2>] sock_release+0x92/0x1f0 net/socket.c:570
 [<ffffffff86a6962b>] sock_close+0x1b/0x20 net/socket.c:1017
 [<ffffffff81a76b8e>] __fput+0x34e/0x910 fs/file_table.c:208
 [<ffffffff81a771da>] ____fput+0x1a/0x20 fs/file_table.c:244
 [<ffffffff81483ab0>] task_work_run+0x1a0/0x280 kernel/task_work.c:116
 [<     inline     >] exit_task_work include/linux/task_work.h:21
 [<ffffffff8141287a>] do_exit+0x183a/0x2640 kernel/exit.c:828
 [<ffffffff8141383e>] do_group_exit+0x14e/0x420 kernel/exit.c:931
 [<ffffffff814429d3>] get_signal+0x663/0x1880 kernel/signal.c:2307
 [<ffffffff81239b45>] do_signal+0xc5/0x2190 arch/x86/kernel/signal.c:807
 [<ffffffff8100666a>] exit_to_usermode_loop+0x1ea/0x2d0
arch/x86/entry/common.c:156
 [<     inline     >] prepare_exit_to_usermode arch/x86/entry/common.c:190
 [<ffffffff81009693>] syscall_return_slowpath+0x4d3/0x570
arch/x86/entry/common.c:259
 [<ffffffff881478e6>] entry_SYSCALL_64_fastpath+0xc4/0xc6
Code: df 49 89 87 70 05 00 00 41 c6 04 14 f8 48 89 f9 48 c1 e9 03 80
3c 11 00 75 64 49 89 87 78 05 00 00 e9 65 ff ff ff e8 ac 94 56 fa <0f>
0b 48 89 d7 48 89 95 30 ff ff ff e8 bb 22 87 fa 48 8b 95 30
RIP  [<ffffffff8717ebf4>] unix_notinflight+0x3b4/0x490 net/unix/garbage.c:149
 RSP <ffff8801c292ea40>
---[ end trace 4cbbd52674b68dab ]---


On commit 16ae16c6e5616c084168740990fc508bda6655d4 (Nov 24).
Unfortunately this is not reproducible outside of syzkaller.
But easily reproducible with syzkaller. If you need to reproduce it,
follow instructions described here:
https://github.com/google/syzkaller/wiki/How-to-execute-syzkaller-programs
With the following as the program:

mmap(&(0x7f0000000000/0xdd5000)=nil, (0xdd5000), 0x3, 0x32,
0xffffffffffffffff, 0x0)
socketpair$unix(0x1, 0x5, 0x0, &(0x7f0000dc7000-0x8)={<r0=>0x0, <r1=>0x0})
sendmmsg$unix(r1,
&(0x7f0000dbf000-0xa8)=[{&(0x7f0000dbe000)=@file={0x1, ""}, 0x2,
&(0x7f0000dbe000)=[], 0x0, &(0x7f0000dc4000)=[@rights={0x20, 0x1, 0x1,
[r0, r0, r0, r1]}, @rights={0x14, 0x1, 0x1, [0xffffffffffffffff]},
@cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}, @cred={0x20, 0x1, 0x2, 0x0,
0x0, 0x0}, @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}], 0x5, 0x800},
{&(0x7f0000dbf000-0x7d)=@file={0x1, ""}, 0x2, &(0x7f0000dbe000)=[],
0x0, &(0x7f0000dbf000-0x80)=[@rights={0x20, 0x1, 0x1,
[0xffffffffffffffff, r1, 0xffffffffffffffff, r0]}, @cred={0x20, 0x1,
0x2, 0x0, 0x0, 0x0}, @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0},
@cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}], 0x4, 0x4},
{&(0x7f0000dbf000-0x8)=@abs={0x0, 0x0, 0x8}, 0x8,
&(0x7f0000dbe000)=[{&(0x7f0000dc0000-0x27)="", 0x0},
{&(0x7f0000dc1000-0xb0)="", 0x0}, {&(0x7f0000dc2000-0xc4)="", 0x0},
{&(0x7f0000dc2000)="", 0x0}, {&(0x7f0000dc3000)="", 0x0}], 0x5,
&(0x7f0000dbe000)=[@cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0},
@rights={0x14, 0x1, 0x1, [r1]}, @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0},
@cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}], 0x4, 0x4}], 0x3, 0x800)
dup3(r1, r0, 0x80000)
close(r1)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2016-11-26 18:05 net: BUG in unix_notinflight Dmitry Vyukov
@ 2017-03-06 10:40 ` Dmitry Vyukov
  2017-03-06 22:34   ` Cong Wang
  0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Vyukov @ 2017-03-06 10:40 UTC (permalink / raw)
  To: David Miller, Hannes Frederic Sowa, Willy Tarreau, netdev, LKML,
	Eric Dumazet, Al Viro, Cong Wang
  Cc: syzkaller

On Sat, Nov 26, 2016 at 7:05 PM, Dmitry Vyukov <dvyukov@google.com> wrote:
> Hello,
>
> I am hitting the following BUG while running syzkaller fuzzer:
>
> kernel BUG at net/unix/garbage.c:149!
> invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN
> Dumping ftrace buffer:
>    (ftrace buffer empty)
> Modules linked in:
> CPU: 0 PID: 23491 Comm: syz-executor Not tainted 4.9.0-rc5+ #41
> Hardware name: Google Google Compute Engine/Google Compute Engine,
> BIOS Google 01/01/2011
> task: ffff8801c16b06c0 task.stack: ffff8801c2928000
> RIP: 0010:[<ffffffff8717ebf4>]  [<ffffffff8717ebf4>]
> unix_notinflight+0x3b4/0x490 net/unix/garbage.c:149
> RSP: 0018:ffff8801c292ea40  EFLAGS: 00010297
> RAX: ffff8801c16b06c0 RBX: 1ffff10038525d4a RCX: dffffc0000000000
> RDX: 0000000000000000 RSI: 1ffff10038525d4e RDI: ffffffff8a6e9d84
> RBP: ffff8801c292eb18 R08: 0000000000000000 R09: 0000000000000000
> R10: cdca594876e035a1 R11: 0000000000000005 R12: 1ffff10038525d4e
> R13: ffffffff899156e0 R14: ffff8801c292eaf0 R15: ffff88018b7cd780
> FS:  00007f10420fa700(0000) GS:ffff8801d9800000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 000000002000a000 CR3: 00000001c2ecc000 CR4: 00000000001406f0
> DR0: 0000000000000000 DR1: 0000000000000400 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000600
> Stack:
>  dffffc0000000000 ffff88019f036970 0000000041b58ab3 ffffffff894c5120
>  ffffffff8717e840 ffff8801c16b06c0 ffff88018b7cdcf0 ffffffff894c51e2
>  ffffffff81576d50 0000000000000000 ffffffff00000000 1ffff10000000000
> Call Trace:
>  [<ffffffff8716cfbf>] unix_detach_fds.isra.19+0xff/0x170 net/unix/af_unix.c:1487
>  [<ffffffff8716f6a9>] unix_destruct_scm+0xf9/0x210 net/unix/af_unix.c:1496
>  [<ffffffff86a90a01>] skb_release_head_state+0x101/0x200 net/core/skbuff.c:655
>  [<ffffffff86a9808a>] skb_release_all+0x1a/0x60 net/core/skbuff.c:668
>  [<ffffffff86a980ea>] __kfree_skb+0x1a/0x30 net/core/skbuff.c:684
>  [<ffffffff86a98284>] kfree_skb+0x184/0x570 net/core/skbuff.c:705
>  [<ffffffff871789d5>] unix_release_sock+0x5b5/0xbd0 net/unix/af_unix.c:559
>  [<ffffffff87179039>] unix_release+0x49/0x90 net/unix/af_unix.c:836
>  [<ffffffff86a694b2>] sock_release+0x92/0x1f0 net/socket.c:570
>  [<ffffffff86a6962b>] sock_close+0x1b/0x20 net/socket.c:1017
>  [<ffffffff81a76b8e>] __fput+0x34e/0x910 fs/file_table.c:208
>  [<ffffffff81a771da>] ____fput+0x1a/0x20 fs/file_table.c:244
>  [<ffffffff81483ab0>] task_work_run+0x1a0/0x280 kernel/task_work.c:116
>  [<     inline     >] exit_task_work include/linux/task_work.h:21
>  [<ffffffff8141287a>] do_exit+0x183a/0x2640 kernel/exit.c:828
>  [<ffffffff8141383e>] do_group_exit+0x14e/0x420 kernel/exit.c:931
>  [<ffffffff814429d3>] get_signal+0x663/0x1880 kernel/signal.c:2307
>  [<ffffffff81239b45>] do_signal+0xc5/0x2190 arch/x86/kernel/signal.c:807
>  [<ffffffff8100666a>] exit_to_usermode_loop+0x1ea/0x2d0
> arch/x86/entry/common.c:156
>  [<     inline     >] prepare_exit_to_usermode arch/x86/entry/common.c:190
>  [<ffffffff81009693>] syscall_return_slowpath+0x4d3/0x570
> arch/x86/entry/common.c:259
>  [<ffffffff881478e6>] entry_SYSCALL_64_fastpath+0xc4/0xc6
> Code: df 49 89 87 70 05 00 00 41 c6 04 14 f8 48 89 f9 48 c1 e9 03 80
> 3c 11 00 75 64 49 89 87 78 05 00 00 e9 65 ff ff ff e8 ac 94 56 fa <0f>
> 0b 48 89 d7 48 89 95 30 ff ff ff e8 bb 22 87 fa 48 8b 95 30
> RIP  [<ffffffff8717ebf4>] unix_notinflight+0x3b4/0x490 net/unix/garbage.c:149
>  RSP <ffff8801c292ea40>
> ---[ end trace 4cbbd52674b68dab ]---
>
>
> On commit 16ae16c6e5616c084168740990fc508bda6655d4 (Nov 24).
> Unfortunately this is not reproducible outside of syzkaller.
> But easily reproducible with syzkaller. If you need to reproduce it,
> follow instructions described here:
> https://github.com/google/syzkaller/wiki/How-to-execute-syzkaller-programs
> With the following as the program:
>
> mmap(&(0x7f0000000000/0xdd5000)=nil, (0xdd5000), 0x3, 0x32,
> 0xffffffffffffffff, 0x0)
> socketpair$unix(0x1, 0x5, 0x0, &(0x7f0000dc7000-0x8)={<r0=>0x0, <r1=>0x0})
> sendmmsg$unix(r1,
> &(0x7f0000dbf000-0xa8)=[{&(0x7f0000dbe000)=@file={0x1, ""}, 0x2,
> &(0x7f0000dbe000)=[], 0x0, &(0x7f0000dc4000)=[@rights={0x20, 0x1, 0x1,
> [r0, r0, r0, r1]}, @rights={0x14, 0x1, 0x1, [0xffffffffffffffff]},
> @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}, @cred={0x20, 0x1, 0x2, 0x0,
> 0x0, 0x0}, @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}], 0x5, 0x800},
> {&(0x7f0000dbf000-0x7d)=@file={0x1, ""}, 0x2, &(0x7f0000dbe000)=[],
> 0x0, &(0x7f0000dbf000-0x80)=[@rights={0x20, 0x1, 0x1,
> [0xffffffffffffffff, r1, 0xffffffffffffffff, r0]}, @cred={0x20, 0x1,
> 0x2, 0x0, 0x0, 0x0}, @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0},
> @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}], 0x4, 0x4},
> {&(0x7f0000dbf000-0x8)=@abs={0x0, 0x0, 0x8}, 0x8,
> &(0x7f0000dbe000)=[{&(0x7f0000dc0000-0x27)="", 0x0},
> {&(0x7f0000dc1000-0xb0)="", 0x0}, {&(0x7f0000dc2000-0xc4)="", 0x0},
> {&(0x7f0000dc2000)="", 0x0}, {&(0x7f0000dc3000)="", 0x0}], 0x5,
> &(0x7f0000dbe000)=[@cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0},
> @rights={0x14, 0x1, 0x1, [r1]}, @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0},
> @cred={0x20, 0x1, 0x2, 0x0, 0x0, 0x0}], 0x4, 0x4}], 0x3, 0x800)
> dup3(r1, r0, 0x80000)
> close(r1)



Now with a nice single-threaded C reproducer!

// autogenerated by syzkaller (http://github.com/google/syzkaller)
#define _GNU_SOURCE
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void test()
{
  long r[54];
  memset(r, -1, sizeof(r));
  syscall(__NR_mmap, 0x20000000ul, 0xfff000ul, 0x3ul, 0x32ul, -1, 0);
  r[1] = syscall(__NR_socketpair, 0x1ul, 0x5ul, 0x0ul, 0x20521ff8ul);
  r[2] = *(uint32_t*)0x20521ff8;
  r[3] = *(uint32_t*)0x20521ffc;
  r[5] = syscall(__NR_open, "/dev/net/tun", 0x200000ul);
  r[6] = syscall(__NR_socketpair, 0x1ul, 0x5ul, 0x0ul,
                         0x20d85000ul, 0, 0, 0, 0, 0);
  r[7] = *(uint32_t*)0x20d85000;
  (*(uint64_t*)0x20000fc8 = (uint64_t)0x20000000);
  (*(uint32_t*)0x20000fd0 = (uint32_t)0xa);
  (*(uint64_t*)0x20000fd8 = (uint64_t)0x2005d000);
  (*(uint64_t*)0x20000fe0 = (uint64_t)0x8);
  (*(uint64_t*)0x20000fe8 = (uint64_t)0x20000ff0);
  (*(uint64_t*)0x20000ff0 = (uint64_t)0x1);
  (*(uint32_t*)0x20000ff8 = (uint32_t)0x0);
  (*(uint16_t*)0x20000000 = (uint16_t)0x1);
  memcpy((void*)0x20000002, "\x2e\x2f\x66\x69\x6c\x65\x30\x00", 8);
  (*(uint64_t*)0x2005d000 = (uint64_t)0x20784f06);
  (*(uint64_t*)0x2005d008 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d010 = (uint64_t)0x209a5f78);
  (*(uint64_t*)0x2005d018 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d020 = (uint64_t)0x20ec3ffc);
  (*(uint64_t*)0x2005d028 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d030 = (uint64_t)0x2057e000);
  (*(uint64_t*)0x2005d038 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d040 = (uint64_t)0x200c9f9d);
  (*(uint64_t*)0x2005d048 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d050 = (uint64_t)0x20331000);
  (*(uint64_t*)0x2005d058 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d060 = (uint64_t)0x206a1f7b);
  (*(uint64_t*)0x2005d068 = (uint64_t)0x0);
  (*(uint64_t*)0x2005d070 = (uint64_t)0x20e7f000);
  (*(uint64_t*)0x2005d078 = (uint64_t)0x0);
  (*(uint64_t*)0x20000ff0 = (uint64_t)0x18);
  (*(uint32_t*)0x20000ff8 = (uint32_t)0x1);
  (*(uint32_t*)0x20000ffc = (uint32_t)0x1);
  (*(uint32_t*)0x20001000 = r[5]);
  (*(uint32_t*)0x20001004 = r[7]);
  syscall(__NR_sendmsg, r[7], 0x20000fc8ul, 0x0ul);
  (*(uint64_t*)0x20000fc8 = (uint64_t)0x20000000);
  (*(uint32_t*)0x20000fd0 = (uint32_t)0x8);
  (*(uint64_t*)0x20000fd8 = (uint64_t)0x20026000);
  (*(uint64_t*)0x20000fe0 = (uint64_t)0x0);
  (*(uint64_t*)0x20000fe8 = (uint64_t)0x20000ff0);
  (*(uint64_t*)0x20000ff0 = (uint64_t)0x1);
  (*(uint32_t*)0x20000ff8 = (uint32_t)0x0);
  (*(uint16_t*)0x20000000 = (uint16_t)0x0);
  (*(uint8_t*)0x20000002 = (uint8_t)0x0);
  (*(uint32_t*)0x20000004 = (uint32_t)0x4e20);
  (*(uint64_t*)0x20000ff0 = (uint64_t)0x18);
  (*(uint32_t*)0x20000ff8 = (uint32_t)0x1);
  (*(uint32_t*)0x20000ffc = (uint32_t)0x1);
  (*(uint32_t*)0x20001000 = r[2]);
  syscall(__NR_sendmsg, r[3], 0x20000fc8ul, 0x0ul);
}

int main()
{
  int i, pid, status;
  for (i = 0; i < 4; i++) {
    if (fork() == 0) {
      for (;;) {
        pid = fork();
        if (pid == 0) {
          test();
          exit(0);
        }
        while (waitpid(pid, &status, __WALL) != pid) {}
      }
    }
  }
  sleep(1000000);
  return 0;
}



New report from linux-next/c0b7b2b33bd17f7155956d0338ce92615da686c9

------------[ cut here ]------------
kernel BUG at net/unix/garbage.c:149!
invalid opcode: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
   (ftrace buffer empty)
Modules linked in:
CPU: 0 PID: 1806 Comm: syz-executor7 Not tainted 4.10.0-next-20170303+ #6
Hardware name: Google Google Compute Engine/Google Compute Engine,
BIOS Google 01/01/2011
task: ffff880121c64740 task.stack: ffff88012c9e8000
RIP: 0010:unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149
RSP: 0018:ffff88012c9ef0f8 EFLAGS: 00010297
RAX: ffff880121c64740 RBX: 1ffff1002593de23 RCX: ffff8801c490c628
RDX: 0000000000000000 RSI: 1ffff1002593de27 RDI: ffffffff8557e504
RBP: ffff88012c9ef220 R08: 0000000000000001 R09: 0000000000000000
R10: dffffc0000000000 R11: ffffed002593de55 R12: ffff8801c490c0c0
R13: ffff88012c9ef1f8 R14: ffffffff85101620 R15: dffffc0000000000
FS:  00000000013d3940(0000) GS:ffff8801dbe00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000000001fd8cd8 CR3: 00000001cce69000 CR4: 00000000001426f0
Call Trace:
 unix_detach_fds.isra.23+0xfa/0x170 net/unix/af_unix.c:1490
 unix_destruct_scm+0xf4/0x200 net/unix/af_unix.c:1499
 skb_release_head_state+0xfc/0x200 net/core/skbuff.c:654
 skb_release_all+0x15/0x60 net/core/skbuff.c:667
 __kfree_skb+0x15/0x20 net/core/skbuff.c:683
 kfree_skb+0x16e/0x4c0 net/core/skbuff.c:704
 unix_release_sock+0x5b0/0xbb0 net/unix/af_unix.c:560
 unix_release+0x44/0x90 net/unix/af_unix.c:834
 sock_release+0x8d/0x1e0 net/socket.c:597
 sock_close+0x16/0x20 net/socket.c:1061
 __fput+0x332/0x7f0 fs/file_table.c:208
 ____fput+0x15/0x20 fs/file_table.c:244
 task_work_run+0x18a/0x260 kernel/task_work.c:116
 exit_task_work include/linux/task_work.h:21 [inline]
 do_exit+0x1956/0x2900 kernel/exit.c:873
 do_group_exit+0x149/0x420 kernel/exit.c:977
 SYSC_exit_group kernel/exit.c:988 [inline]
 SyS_exit_group+0x1d/0x20 kernel/exit.c:986
 entry_SYSCALL_64_fastpath+0x1f/0xbe
RIP: 0033:0x44fb79
RSP: 002b:0000000000a5fe20 EFLAGS: 00000216 ORIG_RAX: 00000000000000e7
RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 000000000044fb79
RDX: 000000000044fb79 RSI: 0000000000753618 RDI: 0000000000000000
RBP: 0000000000002d2b R08: 0000000000708000 R09: 0000000000000000
R10: 0000000000753610 R11: 0000000000000216 R12: 00000000013d390c
R13: 0000000000000000 R14: 00000000000003aa R15: 000000000000001d
Code: 00 00 41 c6 04 07 f8 80 3c 01 00 75 70 49 89 94 24 70 05 00 00
e8 da ef c6 fd 83 2d 03 17 57 03 01 e9 db fc ff ff e8 c9 ef c6 fd <0f>
0b 4c 89 ff e8 5f a6 f7 fd e9 a4 fc ff ff e8 85 a6 f7 fd e9
RIP: unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149 RSP: ffff88012c9ef0f8
---[ end trace db99655ac68455d5 ]---

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2017-03-06 10:40 ` Dmitry Vyukov
@ 2017-03-06 22:34   ` Cong Wang
  2017-03-07  8:37     ` Dmitry Vyukov
  2017-03-07 22:23     ` Nikolay Borisov
  0 siblings, 2 replies; 8+ messages in thread
From: Cong Wang @ 2017-03-06 22:34 UTC (permalink / raw)
  To: Dmitry Vyukov
  Cc: David Miller, Hannes Frederic Sowa, Willy Tarreau, netdev, LKML,
	Eric Dumazet, Al Viro, syzkaller

On Mon, Mar 6, 2017 at 2:40 AM, Dmitry Vyukov <dvyukov@google.com> wrote:
> Now with a nice single-threaded C reproducer!

Excellent...

>
> // autogenerated by syzkaller (http://github.com/google/syzkaller)
> #define _GNU_SOURCE
> #include <sys/syscall.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <stddef.h>
> #include <stdint.h>
> #include <stdlib.h>
> #include <string.h>
> #include <unistd.h>
>
> void test()
> {
>   long r[54];
>   memset(r, -1, sizeof(r));
>   syscall(__NR_mmap, 0x20000000ul, 0xfff000ul, 0x3ul, 0x32ul, -1, 0);
>   r[1] = syscall(__NR_socketpair, 0x1ul, 0x5ul, 0x0ul, 0x20521ff8ul);
>   r[2] = *(uint32_t*)0x20521ff8;
>   r[3] = *(uint32_t*)0x20521ffc;
>   r[5] = syscall(__NR_open, "/dev/net/tun", 0x200000ul);
>   r[6] = syscall(__NR_socketpair, 0x1ul, 0x5ul, 0x0ul,
>                          0x20d85000ul, 0, 0, 0, 0, 0);
>   r[7] = *(uint32_t*)0x20d85000;
>   (*(uint64_t*)0x20000fc8 = (uint64_t)0x20000000);
>   (*(uint32_t*)0x20000fd0 = (uint32_t)0xa);
>   (*(uint64_t*)0x20000fd8 = (uint64_t)0x2005d000);
>   (*(uint64_t*)0x20000fe0 = (uint64_t)0x8);
>   (*(uint64_t*)0x20000fe8 = (uint64_t)0x20000ff0);
>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x1);
>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x0);
>   (*(uint16_t*)0x20000000 = (uint16_t)0x1);
>   memcpy((void*)0x20000002, "\x2e\x2f\x66\x69\x6c\x65\x30\x00", 8);
>   (*(uint64_t*)0x2005d000 = (uint64_t)0x20784f06);
>   (*(uint64_t*)0x2005d008 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d010 = (uint64_t)0x209a5f78);
>   (*(uint64_t*)0x2005d018 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d020 = (uint64_t)0x20ec3ffc);
>   (*(uint64_t*)0x2005d028 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d030 = (uint64_t)0x2057e000);
>   (*(uint64_t*)0x2005d038 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d040 = (uint64_t)0x200c9f9d);
>   (*(uint64_t*)0x2005d048 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d050 = (uint64_t)0x20331000);
>   (*(uint64_t*)0x2005d058 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d060 = (uint64_t)0x206a1f7b);
>   (*(uint64_t*)0x2005d068 = (uint64_t)0x0);
>   (*(uint64_t*)0x2005d070 = (uint64_t)0x20e7f000);
>   (*(uint64_t*)0x2005d078 = (uint64_t)0x0);
>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x18);
>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x1);
>   (*(uint32_t*)0x20000ffc = (uint32_t)0x1);
>   (*(uint32_t*)0x20001000 = r[5]);
>   (*(uint32_t*)0x20001004 = r[7]);
>   syscall(__NR_sendmsg, r[7], 0x20000fc8ul, 0x0ul);
>   (*(uint64_t*)0x20000fc8 = (uint64_t)0x20000000);
>   (*(uint32_t*)0x20000fd0 = (uint32_t)0x8);
>   (*(uint64_t*)0x20000fd8 = (uint64_t)0x20026000);
>   (*(uint64_t*)0x20000fe0 = (uint64_t)0x0);
>   (*(uint64_t*)0x20000fe8 = (uint64_t)0x20000ff0);
>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x1);
>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x0);
>   (*(uint16_t*)0x20000000 = (uint16_t)0x0);
>   (*(uint8_t*)0x20000002 = (uint8_t)0x0);
>   (*(uint32_t*)0x20000004 = (uint32_t)0x4e20);
>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x18);
>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x1);
>   (*(uint32_t*)0x20000ffc = (uint32_t)0x1);
>   (*(uint32_t*)0x20001000 = r[2]);
>   syscall(__NR_sendmsg, r[3], 0x20000fc8ul, 0x0ul);
> }
>
> int main()
> {
>   int i, pid, status;
>   for (i = 0; i < 4; i++) {
>     if (fork() == 0) {
>       for (;;) {
>         pid = fork();
>         if (pid == 0) {
>           test();
>           exit(0);
>         }
>         while (waitpid(pid, &status, __WALL) != pid) {}
>       }
>     }
>   }
>   sleep(1000000);
>   return 0;
> }
>
>
>
> New report from linux-next/c0b7b2b33bd17f7155956d0338ce92615da686c9
>
> ------------[ cut here ]------------
> kernel BUG at net/unix/garbage.c:149!
> invalid opcode: 0000 [#1] SMP KASAN
> Dumping ftrace buffer:
>    (ftrace buffer empty)
> Modules linked in:
> CPU: 0 PID: 1806 Comm: syz-executor7 Not tainted 4.10.0-next-20170303+ #6
> Hardware name: Google Google Compute Engine/Google Compute Engine,
> BIOS Google 01/01/2011
> task: ffff880121c64740 task.stack: ffff88012c9e8000
> RIP: 0010:unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149
> RSP: 0018:ffff88012c9ef0f8 EFLAGS: 00010297
> RAX: ffff880121c64740 RBX: 1ffff1002593de23 RCX: ffff8801c490c628
> RDX: 0000000000000000 RSI: 1ffff1002593de27 RDI: ffffffff8557e504
> RBP: ffff88012c9ef220 R08: 0000000000000001 R09: 0000000000000000
> R10: dffffc0000000000 R11: ffffed002593de55 R12: ffff8801c490c0c0
> R13: ffff88012c9ef1f8 R14: ffffffff85101620 R15: dffffc0000000000
> FS:  00000000013d3940(0000) GS:ffff8801dbe00000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 0000000001fd8cd8 CR3: 00000001cce69000 CR4: 00000000001426f0
> Call Trace:
>  unix_detach_fds.isra.23+0xfa/0x170 net/unix/af_unix.c:1490
>  unix_destruct_scm+0xf4/0x200 net/unix/af_unix.c:1499

The problem here is there is no lock protecting concurrent unix_detach_fds()
even though unix_notinflight() is already serialized, if we call
unix_notinflight()
twice on the same file pointer, we trigger this bug...

I don't know what is the right lock here to serialize it.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2017-03-06 22:34   ` Cong Wang
@ 2017-03-07  8:37     ` Dmitry Vyukov
  2017-03-07 22:04       ` Cong Wang
  2017-03-07 22:23     ` Nikolay Borisov
  1 sibling, 1 reply; 8+ messages in thread
From: Dmitry Vyukov @ 2017-03-07  8:37 UTC (permalink / raw)
  To: Cong Wang
  Cc: David Miller, Hannes Frederic Sowa, Willy Tarreau, netdev, LKML,
	Eric Dumazet, Al Viro, syzkaller

On Mon, Mar 6, 2017 at 11:34 PM, Cong Wang <xiyou.wangcong@gmail.com> wrote:
> On Mon, Mar 6, 2017 at 2:40 AM, Dmitry Vyukov <dvyukov@google.com> wrote:
>> Now with a nice single-threaded C reproducer!
>
> Excellent...
>
>>
>> // autogenerated by syzkaller (http://github.com/google/syzkaller)
>> #define _GNU_SOURCE
>> #include <sys/syscall.h>
>> #include <sys/types.h>
>> #include <sys/wait.h>
>> #include <stddef.h>
>> #include <stdint.h>
>> #include <stdlib.h>
>> #include <string.h>
>> #include <unistd.h>
>>
>> void test()
>> {
>>   long r[54];
>>   memset(r, -1, sizeof(r));
>>   syscall(__NR_mmap, 0x20000000ul, 0xfff000ul, 0x3ul, 0x32ul, -1, 0);
>>   r[1] = syscall(__NR_socketpair, 0x1ul, 0x5ul, 0x0ul, 0x20521ff8ul);
>>   r[2] = *(uint32_t*)0x20521ff8;
>>   r[3] = *(uint32_t*)0x20521ffc;
>>   r[5] = syscall(__NR_open, "/dev/net/tun", 0x200000ul);
>>   r[6] = syscall(__NR_socketpair, 0x1ul, 0x5ul, 0x0ul,
>>                          0x20d85000ul, 0, 0, 0, 0, 0);
>>   r[7] = *(uint32_t*)0x20d85000;
>>   (*(uint64_t*)0x20000fc8 = (uint64_t)0x20000000);
>>   (*(uint32_t*)0x20000fd0 = (uint32_t)0xa);
>>   (*(uint64_t*)0x20000fd8 = (uint64_t)0x2005d000);
>>   (*(uint64_t*)0x20000fe0 = (uint64_t)0x8);
>>   (*(uint64_t*)0x20000fe8 = (uint64_t)0x20000ff0);
>>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x1);
>>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x0);
>>   (*(uint16_t*)0x20000000 = (uint16_t)0x1);
>>   memcpy((void*)0x20000002, "\x2e\x2f\x66\x69\x6c\x65\x30\x00", 8);
>>   (*(uint64_t*)0x2005d000 = (uint64_t)0x20784f06);
>>   (*(uint64_t*)0x2005d008 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d010 = (uint64_t)0x209a5f78);
>>   (*(uint64_t*)0x2005d018 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d020 = (uint64_t)0x20ec3ffc);
>>   (*(uint64_t*)0x2005d028 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d030 = (uint64_t)0x2057e000);
>>   (*(uint64_t*)0x2005d038 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d040 = (uint64_t)0x200c9f9d);
>>   (*(uint64_t*)0x2005d048 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d050 = (uint64_t)0x20331000);
>>   (*(uint64_t*)0x2005d058 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d060 = (uint64_t)0x206a1f7b);
>>   (*(uint64_t*)0x2005d068 = (uint64_t)0x0);
>>   (*(uint64_t*)0x2005d070 = (uint64_t)0x20e7f000);
>>   (*(uint64_t*)0x2005d078 = (uint64_t)0x0);
>>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x18);
>>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x1);
>>   (*(uint32_t*)0x20000ffc = (uint32_t)0x1);
>>   (*(uint32_t*)0x20001000 = r[5]);
>>   (*(uint32_t*)0x20001004 = r[7]);
>>   syscall(__NR_sendmsg, r[7], 0x20000fc8ul, 0x0ul);
>>   (*(uint64_t*)0x20000fc8 = (uint64_t)0x20000000);
>>   (*(uint32_t*)0x20000fd0 = (uint32_t)0x8);
>>   (*(uint64_t*)0x20000fd8 = (uint64_t)0x20026000);
>>   (*(uint64_t*)0x20000fe0 = (uint64_t)0x0);
>>   (*(uint64_t*)0x20000fe8 = (uint64_t)0x20000ff0);
>>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x1);
>>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x0);
>>   (*(uint16_t*)0x20000000 = (uint16_t)0x0);
>>   (*(uint8_t*)0x20000002 = (uint8_t)0x0);
>>   (*(uint32_t*)0x20000004 = (uint32_t)0x4e20);
>>   (*(uint64_t*)0x20000ff0 = (uint64_t)0x18);
>>   (*(uint32_t*)0x20000ff8 = (uint32_t)0x1);
>>   (*(uint32_t*)0x20000ffc = (uint32_t)0x1);
>>   (*(uint32_t*)0x20001000 = r[2]);
>>   syscall(__NR_sendmsg, r[3], 0x20000fc8ul, 0x0ul);
>> }
>>
>> int main()
>> {
>>   int i, pid, status;
>>   for (i = 0; i < 4; i++) {
>>     if (fork() == 0) {
>>       for (;;) {
>>         pid = fork();
>>         if (pid == 0) {
>>           test();
>>           exit(0);
>>         }
>>         while (waitpid(pid, &status, __WALL) != pid) {}
>>       }
>>     }
>>   }
>>   sleep(1000000);
>>   return 0;
>> }
>>
>>
>>
>> New report from linux-next/c0b7b2b33bd17f7155956d0338ce92615da686c9
>>
>> ------------[ cut here ]------------
>> kernel BUG at net/unix/garbage.c:149!
>> invalid opcode: 0000 [#1] SMP KASAN
>> Dumping ftrace buffer:
>>    (ftrace buffer empty)
>> Modules linked in:
>> CPU: 0 PID: 1806 Comm: syz-executor7 Not tainted 4.10.0-next-20170303+ #6
>> Hardware name: Google Google Compute Engine/Google Compute Engine,
>> BIOS Google 01/01/2011
>> task: ffff880121c64740 task.stack: ffff88012c9e8000
>> RIP: 0010:unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149
>> RSP: 0018:ffff88012c9ef0f8 EFLAGS: 00010297
>> RAX: ffff880121c64740 RBX: 1ffff1002593de23 RCX: ffff8801c490c628
>> RDX: 0000000000000000 RSI: 1ffff1002593de27 RDI: ffffffff8557e504
>> RBP: ffff88012c9ef220 R08: 0000000000000001 R09: 0000000000000000
>> R10: dffffc0000000000 R11: ffffed002593de55 R12: ffff8801c490c0c0
>> R13: ffff88012c9ef1f8 R14: ffffffff85101620 R15: dffffc0000000000
>> FS:  00000000013d3940(0000) GS:ffff8801dbe00000(0000) knlGS:0000000000000000
>> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>> CR2: 0000000001fd8cd8 CR3: 00000001cce69000 CR4: 00000000001426f0
>> Call Trace:
>>  unix_detach_fds.isra.23+0xfa/0x170 net/unix/af_unix.c:1490
>>  unix_destruct_scm+0xf4/0x200 net/unix/af_unix.c:1499
>
> The problem here is there is no lock protecting concurrent unix_detach_fds()
> even though unix_notinflight() is already serialized, if we call
> unix_notinflight()
> twice on the same file pointer, we trigger this bug...
>
> I don't know what is the right lock here to serialize it.


What exactly here needs to be protected?

1484 static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
1485 {
1486         int i;
1487
1488         scm->fp = UNIXCB(skb).fp;
1489         UNIXCB(skb).fp = NULL;
1490
1491         for (i = scm->fp->count-1; i >= 0; i--)
1492                 unix_notinflight(scm->fp->user, scm->fp->fp[i]);
1493 }

Whole unix_notinflight happens under global unix_gc_lock.

Is it that 2 threads call unix_detach_fds for the same skb, and then
call unix_notinflight for the same fd twice?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2017-03-07  8:37     ` Dmitry Vyukov
@ 2017-03-07 22:04       ` Cong Wang
  0 siblings, 0 replies; 8+ messages in thread
From: Cong Wang @ 2017-03-07 22:04 UTC (permalink / raw)
  To: Dmitry Vyukov
  Cc: David Miller, Hannes Frederic Sowa, Willy Tarreau, netdev, LKML,
	Eric Dumazet, Al Viro, syzkaller

On Tue, Mar 7, 2017 at 12:37 AM, Dmitry Vyukov <dvyukov@google.com> wrote:
> On Mon, Mar 6, 2017 at 11:34 PM, Cong Wang <xiyou.wangcong@gmail.com> wrote:
>> The problem here is there is no lock protecting concurrent unix_detach_fds()
>> even though unix_notinflight() is already serialized, if we call
>> unix_notinflight()
>> twice on the same file pointer, we trigger this bug...
>>
>> I don't know what is the right lock here to serialize it.
>
>
> What exactly here needs to be protected?
>
> 1484 static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb)
> 1485 {
> 1486         int i;
> 1487
> 1488         scm->fp = UNIXCB(skb).fp;
> 1489         UNIXCB(skb).fp = NULL;
> 1490
> 1491         for (i = scm->fp->count-1; i >= 0; i--)
> 1492                 unix_notinflight(scm->fp->user, scm->fp->fp[i]);
> 1493 }
>
> Whole unix_notinflight happens under global unix_gc_lock.
>
> Is it that 2 threads call unix_detach_fds for the same skb, and then
> call unix_notinflight for the same fd twice?

Not the same skb, but their UNIXCB(skb).fp points to the same place,
therefore we call unix_notinflight() twice on the same fp->user and
fp->fp[i], although we have refcounting but still able to trigger this
warning.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2017-03-06 22:34   ` Cong Wang
  2017-03-07  8:37     ` Dmitry Vyukov
@ 2017-03-07 22:23     ` Nikolay Borisov
  2017-03-07 22:30       ` Willy Tarreau
  2017-03-10 17:46       ` Cong Wang
  1 sibling, 2 replies; 8+ messages in thread
From: Nikolay Borisov @ 2017-03-07 22:23 UTC (permalink / raw)
  To: Cong Wang, Dmitry Vyukov
  Cc: David Miller, Hannes Frederic Sowa, Willy Tarreau, netdev, LKML,
	Eric Dumazet, Al Viro, syzkaller


>>
>>
>> New report from linux-next/c0b7b2b33bd17f7155956d0338ce92615da686c9
>>
>> ------------[ cut here ]------------
>> kernel BUG at net/unix/garbage.c:149!
>> invalid opcode: 0000 [#1] SMP KASAN
>> Dumping ftrace buffer:
>>    (ftrace buffer empty)
>> Modules linked in:
>> CPU: 0 PID: 1806 Comm: syz-executor7 Not tainted 4.10.0-next-20170303+ #6
>> Hardware name: Google Google Compute Engine/Google Compute Engine,
>> BIOS Google 01/01/2011
>> task: ffff880121c64740 task.stack: ffff88012c9e8000
>> RIP: 0010:unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149
>> RSP: 0018:ffff88012c9ef0f8 EFLAGS: 00010297
>> RAX: ffff880121c64740 RBX: 1ffff1002593de23 RCX: ffff8801c490c628
>> RDX: 0000000000000000 RSI: 1ffff1002593de27 RDI: ffffffff8557e504
>> RBP: ffff88012c9ef220 R08: 0000000000000001 R09: 0000000000000000
>> R10: dffffc0000000000 R11: ffffed002593de55 R12: ffff8801c490c0c0
>> R13: ffff88012c9ef1f8 R14: ffffffff85101620 R15: dffffc0000000000
>> FS:  00000000013d3940(0000) GS:ffff8801dbe00000(0000) knlGS:0000000000000000
>> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>> CR2: 0000000001fd8cd8 CR3: 00000001cce69000 CR4: 00000000001426f0
>> Call Trace:
>>  unix_detach_fds.isra.23+0xfa/0x170 net/unix/af_unix.c:1490
>>  unix_destruct_scm+0xf4/0x200 net/unix/af_unix.c:1499
> 
> The problem here is there is no lock protecting concurrent unix_detach_fds()
> even though unix_notinflight() is already serialized, if we call
> unix_notinflight()
> twice on the same file pointer, we trigger this bug...
> 
> I don't know what is the right lock here to serialize it.
> 


I reported something similar a while ago
https://lists.gt.net/linux/kernel/2534612

And Miklos Szeredi then produced the following patch :

https://patchwork.kernel.org/patch/9305121/

However, this was never applied. I wonder if the patch makes sense?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2017-03-07 22:23     ` Nikolay Borisov
@ 2017-03-07 22:30       ` Willy Tarreau
  2017-03-10 17:46       ` Cong Wang
  1 sibling, 0 replies; 8+ messages in thread
From: Willy Tarreau @ 2017-03-07 22:30 UTC (permalink / raw)
  To: Nikolay Borisov
  Cc: Cong Wang, Dmitry Vyukov, David Miller, Hannes Frederic Sowa,
	netdev, LKML, Eric Dumazet, Al Viro, syzkaller

On Wed, Mar 08, 2017 at 12:23:56AM +0200, Nikolay Borisov wrote:
> 
> >>
> >>
> >> New report from linux-next/c0b7b2b33bd17f7155956d0338ce92615da686c9
> >>
> >> ------------[ cut here ]------------
> >> kernel BUG at net/unix/garbage.c:149!
> >> invalid opcode: 0000 [#1] SMP KASAN
> >> Dumping ftrace buffer:
> >>    (ftrace buffer empty)
> >> Modules linked in:
> >> CPU: 0 PID: 1806 Comm: syz-executor7 Not tainted 4.10.0-next-20170303+ #6
> >> Hardware name: Google Google Compute Engine/Google Compute Engine,
> >> BIOS Google 01/01/2011
> >> task: ffff880121c64740 task.stack: ffff88012c9e8000
> >> RIP: 0010:unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149
> >> RSP: 0018:ffff88012c9ef0f8 EFLAGS: 00010297
> >> RAX: ffff880121c64740 RBX: 1ffff1002593de23 RCX: ffff8801c490c628
> >> RDX: 0000000000000000 RSI: 1ffff1002593de27 RDI: ffffffff8557e504
> >> RBP: ffff88012c9ef220 R08: 0000000000000001 R09: 0000000000000000
> >> R10: dffffc0000000000 R11: ffffed002593de55 R12: ffff8801c490c0c0
> >> R13: ffff88012c9ef1f8 R14: ffffffff85101620 R15: dffffc0000000000
> >> FS:  00000000013d3940(0000) GS:ffff8801dbe00000(0000) knlGS:0000000000000000
> >> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> >> CR2: 0000000001fd8cd8 CR3: 00000001cce69000 CR4: 00000000001426f0
> >> Call Trace:
> >>  unix_detach_fds.isra.23+0xfa/0x170 net/unix/af_unix.c:1490
> >>  unix_destruct_scm+0xf4/0x200 net/unix/af_unix.c:1499
> > 
> > The problem here is there is no lock protecting concurrent unix_detach_fds()
> > even though unix_notinflight() is already serialized, if we call
> > unix_notinflight()
> > twice on the same file pointer, we trigger this bug...
> > 
> > I don't know what is the right lock here to serialize it.
> > 
> 
> 
> I reported something similar a while ago
> https://lists.gt.net/linux/kernel/2534612
> 
> And Miklos Szeredi then produced the following patch :
> 
> https://patchwork.kernel.org/patch/9305121/
> 
> However, this was never applied. I wonder if the patch makes sense?

I don't know but there's a hint at the bottom of the thread with
Davem's response to which there was no followup :

  "Why would I apply a patch that's an RFC, doesn't have a proper commit
   message, lacks a proper signoff, and also lacks ACK's and feedback
   from other knowledgable developers?"

So at least this point makes sense, maybe the patch is fine but was
not sufficiently reviewed or acked ? Maybe it was proposed as an RFC
to start a discussion and never went to the final status of a patch
waiting for being applied ?

Willy

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: net: BUG in unix_notinflight
  2017-03-07 22:23     ` Nikolay Borisov
  2017-03-07 22:30       ` Willy Tarreau
@ 2017-03-10 17:46       ` Cong Wang
  1 sibling, 0 replies; 8+ messages in thread
From: Cong Wang @ 2017-03-10 17:46 UTC (permalink / raw)
  To: Nikolay Borisov
  Cc: Dmitry Vyukov, David Miller, Hannes Frederic Sowa, Willy Tarreau,
	netdev, LKML, Eric Dumazet, Al Viro, syzkaller

On Tue, Mar 7, 2017 at 2:23 PM, Nikolay Borisov
<n.borisov.lkml@gmail.com> wrote:
>
>>>
>>>
>>> New report from linux-next/c0b7b2b33bd17f7155956d0338ce92615da686c9
>>>
>>> ------------[ cut here ]------------
>>> kernel BUG at net/unix/garbage.c:149!
>>> invalid opcode: 0000 [#1] SMP KASAN
>>> Dumping ftrace buffer:
>>>    (ftrace buffer empty)
>>> Modules linked in:
>>> CPU: 0 PID: 1806 Comm: syz-executor7 Not tainted 4.10.0-next-20170303+ #6
>>> Hardware name: Google Google Compute Engine/Google Compute Engine,
>>> BIOS Google 01/01/2011
>>> task: ffff880121c64740 task.stack: ffff88012c9e8000
>>> RIP: 0010:unix_notinflight+0x417/0x5d0 net/unix/garbage.c:149
>>> RSP: 0018:ffff88012c9ef0f8 EFLAGS: 00010297
>>> RAX: ffff880121c64740 RBX: 1ffff1002593de23 RCX: ffff8801c490c628
>>> RDX: 0000000000000000 RSI: 1ffff1002593de27 RDI: ffffffff8557e504
>>> RBP: ffff88012c9ef220 R08: 0000000000000001 R09: 0000000000000000
>>> R10: dffffc0000000000 R11: ffffed002593de55 R12: ffff8801c490c0c0
>>> R13: ffff88012c9ef1f8 R14: ffffffff85101620 R15: dffffc0000000000
>>> FS:  00000000013d3940(0000) GS:ffff8801dbe00000(0000) knlGS:0000000000000000
>>> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
>>> CR2: 0000000001fd8cd8 CR3: 00000001cce69000 CR4: 00000000001426f0
>>> Call Trace:
>>>  unix_detach_fds.isra.23+0xfa/0x170 net/unix/af_unix.c:1490
>>>  unix_destruct_scm+0xf4/0x200 net/unix/af_unix.c:1499
>>
>> The problem here is there is no lock protecting concurrent unix_detach_fds()
>> even though unix_notinflight() is already serialized, if we call
>> unix_notinflight()
>> twice on the same file pointer, we trigger this bug...
>>
>> I don't know what is the right lock here to serialize it.
>>
>
>
> I reported something similar a while ago
> https://lists.gt.net/linux/kernel/2534612
>
> And Miklos Szeredi then produced the following patch :
>
> https://patchwork.kernel.org/patch/9305121/
>
> However, this was never applied. I wonder if the patch makes sense?

I doubt it is the same case. According to Miklos' description,
the case he tried to fix is MSG_PEEK, but Dmitry's test case does not
set it... They are different problems probably.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2017-03-10 17:47 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-11-26 18:05 net: BUG in unix_notinflight Dmitry Vyukov
2017-03-06 10:40 ` Dmitry Vyukov
2017-03-06 22:34   ` Cong Wang
2017-03-07  8:37     ` Dmitry Vyukov
2017-03-07 22:04       ` Cong Wang
2017-03-07 22:23     ` Nikolay Borisov
2017-03-07 22:30       ` Willy Tarreau
2017-03-10 17:46       ` Cong Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).