03 Apr, 2019

3 commits

  • [ Upstream commit 33872d79f5d1cbedaaab79669cc38f16097a9450 ]

    When cancelling a subscription, we have to clear the cancel bit in the
    request before iterating over any established subscriptions with memcmp.
    Otherwise no subscription will ever be found, and it will not be
    possible to explicitly unsubscribe individual subscriptions.

    Fixes: 8985ecc7c1e0 ("tipc: simplify endianness handling in topology subscriber")
    Signed-off-by: Erik Hugne
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Erik Hugne
     
  • [ Upstream commit 9926cb5f8b0f0aea535735185600d74db7608550 ]

    When running a syz script, a panic occurred:

    [ 156.088228] BUG: KASAN: use-after-free in tipc_disc_timeout+0x9c9/0xb20 [tipc]
    [ 156.094315] Call Trace:
    [ 156.094844]
    [ 156.095306] dump_stack+0x7c/0xc0
    [ 156.097346] print_address_description+0x65/0x22e
    [ 156.100445] kasan_report.cold.3+0x37/0x7a
    [ 156.102402] tipc_disc_timeout+0x9c9/0xb20 [tipc]
    [ 156.106517] call_timer_fn+0x19a/0x610
    [ 156.112749] run_timer_softirq+0xb51/0x1090

    It was caused by the netns freed without deleting the discoverer timer,
    while later on the netns would be accessed in the timer handler.

    The timer should have been deleted by tipc_net_stop() when cleaning up a
    netns. However, tipc has been able to enable a bearer and start d->timer
    without the local node_addr set since Commit 52dfae5c85a4 ("tipc: obtain
    node identity from interface by default"), which caused the timer not to
    be deleted in tipc_net_stop() then.

    So fix it in tipc_net_stop() by changing to check local node_id instead
    of local node_addr, as Jon suggested.

    While at it, remove the calling of tipc_nametbl_withdraw() there, since
    tipc_nametbl_stop() will take of the nametbl's freeing after.

    Fixes: 52dfae5c85a4 ("tipc: obtain node identity from interface by default")
    Reported-by: syzbot+a25307ad099309f1c2b9@syzkaller.appspotmail.com
    Signed-off-by: Xin Long
    Acked-by: Ying Xue
    Acked-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Xin Long
     
  • [ Upstream commit ea239314fe42ace880bdd834256834679346c80e ]

    We move the check that prevents connecting service ranges to after
    the RDM/DGRAM check, and move address sanity control to a separate
    function that also validates the service range.

    Fixes: 23998835be98 ("tipc: improve address sanity check in tipc_connect()")
    Signed-off-by: Erik Hugne
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Erik Hugne
     

10 Mar, 2019

2 commits

  • [ Upstream commit bfd07f3dd4f111b884d7922b37eb239280f83d8c ]

    When sending multicast messages via blocking socket,
    if sending link is congested (tsk->cong_link_cnt is set to 1),
    the sending thread will be put into sleeping state. However,
    tipc_sk_filter_rcv() is called under socket spin lock but
    tipc_wait_for_cond() is not. So, there is no guarantee that
    the setting of tsk->cong_link_cnt to 0 in tipc_sk_proto_rcv() in
    CPU-1 will be perceived by CPU-0. If that is the case, the sending
    thread in CPU-0 after being waken up, will continue to see
    tsk->cong_link_cnt as 1 and put the sending thread into sleeping
    state again. The sending thread will sleep forever.

    CPU-0 | CPU-1
    tipc_wait_for_cond() |
    { |
    // condition_ = !tsk->cong_link_cnt |
    while ((rc_ = !(condition_))) { |
    ... |
    release_sock(sk_); |
    wait_woken(); |
    | if (!sock_owned_by_user(sk))
    | tipc_sk_filter_rcv()
    | {
    | ...
    | tipc_sk_proto_rcv()
    | {
    | ...
    | tsk->cong_link_cnt--;
    | ...
    | sk->sk_write_space(sk);
    | ...
    | }
    | ...
    | }
    sched_annotate_sleep(); |
    lock_sock(sk_); |
    remove_wait_queue(); |
    } |
    } |

    This commit fixes it by adding memory barrier to tipc_sk_proto_rcv()
    and tipc_wait_for_cond().

    Acked-by: Jon Maloy
    Signed-off-by: Tung Nguyen
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Tung Nguyen
     
  • [ Upstream commit 0e63208915a8d7590d0a6218dadb2a6a00ac705a ]

    Fix regression bug introduced in
    commit 365ad353c256 ("tipc: reduce risk of user starvation during link
    congestion")

    Only signal -EDESTADDRREQ for RDM/DGRAM if we don't have a cached
    sockaddr.

    Fixes: 365ad353c256 ("tipc: reduce risk of user starvation during link congestion")
    Signed-off-by: Erik Hugne
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Erik Hugne
     

13 Feb, 2019

1 commit

  • [ Upstream commit f5d6c3e5a359c0507800e7ac68d565c21de9b5a1 ]

    When setting LINK tolerance, node timer interval will be calculated
    base on the LINK with lowest tolerance.

    But when calculated, the old node timer interval only updated if current
    setting value (tolerance/4) less than old ones regardless of number of
    links as well as links' lowest tolerance value.

    This caused to two cases missing if tolerance changed as following:
    Case 1:
    1.1/ There is one link (L1) available in the system
    1.2/ Set L1's tolerance from 1500ms => lower (i.e 500ms)
    1.3/ Then, fallback to default (1500ms) or higher (i.e 2000ms)

    Expected:
    node timer interval is 1500/4=375ms after 1.3

    Result:
    node timer interval will not being updated after changing tolerance at 1.3
    since its value 1500/4=375ms is not less than 500/4=125ms at 1.2.

    Case 2:
    2.1/ There are two links (L1, L2) available in the system
    2.2/ L1 and L2 tolerance value are 2000ms as initial
    2.3/ Set L2's tolerance from 2000ms => lower 1500ms
    2.4/ Disable link L2 (bring down its bearer)

    Expected:
    node timer interval is 2000ms/4=500ms after 2.4

    Result:
    node timer interval will not being updated after disabling L2 since
    its value 2000ms/4=500ms is still not less than 1500/4=375ms at 2.3
    although L2 is already not available in the system.

    To fix this, we start the node interval calculation by initializing it to
    a value larger than any conceivable calculated value. This way, the link
    with the lowest tolerance will always determine the calculated value.

    Acked-by: Jon Maloy
    Signed-off-by: Hoang Le
    Signed-off-by: David S. Miller
    Signed-off-by: Sasha Levin

    Hoang Le
     

23 Jan, 2019

6 commits

  • commit 2753ca5d9009c180dbfd4c802c80983b4b6108d1 upstream.

    BUG: KMSAN: uninit-value in tipc_nl_compat_doit+0x404/0xa10 net/tipc/netlink_compat.c:335
    CPU: 0 PID: 4514 Comm: syz-executor485 Not tainted 4.16.0+ #87
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
    __dump_stack lib/dump_stack.c:17 [inline]
    dump_stack+0x185/0x1d0 lib/dump_stack.c:53
    kmsan_report+0x142/0x240 mm/kmsan/kmsan.c:1067
    __msan_warning_32+0x6c/0xb0 mm/kmsan/kmsan_instr.c:683
    tipc_nl_compat_doit+0x404/0xa10 net/tipc/netlink_compat.c:335
    tipc_nl_compat_recv+0x164b/0x2700 net/tipc/netlink_compat.c:1153
    genl_family_rcv_msg net/netlink/genetlink.c:599 [inline]
    genl_rcv_msg+0x1686/0x1810 net/netlink/genetlink.c:624
    netlink_rcv_skb+0x378/0x600 net/netlink/af_netlink.c:2447
    genl_rcv+0x63/0x80 net/netlink/genetlink.c:635
    netlink_unicast_kernel net/netlink/af_netlink.c:1311 [inline]
    netlink_unicast+0x166b/0x1740 net/netlink/af_netlink.c:1337
    netlink_sendmsg+0x1048/0x1310 net/netlink/af_netlink.c:1900
    sock_sendmsg_nosec net/socket.c:630 [inline]
    sock_sendmsg net/socket.c:640 [inline]
    ___sys_sendmsg+0xec0/0x1310 net/socket.c:2046
    __sys_sendmsg net/socket.c:2080 [inline]
    SYSC_sendmsg+0x2a3/0x3d0 net/socket.c:2091
    SyS_sendmsg+0x54/0x80 net/socket.c:2087
    do_syscall_64+0x309/0x430 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    RIP: 0033:0x43fda9
    RSP: 002b:00007ffd0c184ba8 EFLAGS: 00000213 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 000000000043fda9
    RDX: 0000000000000000 RSI: 0000000020023000 RDI: 0000000000000003
    RBP: 00000000006ca018 R08: 00000000004002c8 R09: 00000000004002c8
    R10: 00000000004002c8 R11: 0000000000000213 R12: 00000000004016d0
    R13: 0000000000401760 R14: 0000000000000000 R15: 0000000000000000

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:278 [inline]
    kmsan_internal_poison_shadow+0xb8/0x1b0 mm/kmsan/kmsan.c:188
    kmsan_kmalloc+0x94/0x100 mm/kmsan/kmsan.c:314
    kmsan_slab_alloc+0x11/0x20 mm/kmsan/kmsan.c:321
    slab_post_alloc_hook mm/slab.h:445 [inline]
    slab_alloc_node mm/slub.c:2737 [inline]
    __kmalloc_node_track_caller+0xaed/0x11c0 mm/slub.c:4369
    __kmalloc_reserve net/core/skbuff.c:138 [inline]
    __alloc_skb+0x2cf/0x9f0 net/core/skbuff.c:206
    alloc_skb include/linux/skbuff.h:984 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1183 [inline]
    netlink_sendmsg+0x9a6/0x1310 net/netlink/af_netlink.c:1875
    sock_sendmsg_nosec net/socket.c:630 [inline]
    sock_sendmsg net/socket.c:640 [inline]
    ___sys_sendmsg+0xec0/0x1310 net/socket.c:2046
    __sys_sendmsg net/socket.c:2080 [inline]
    SYSC_sendmsg+0x2a3/0x3d0 net/socket.c:2091
    SyS_sendmsg+0x54/0x80 net/socket.c:2087
    do_syscall_64+0x309/0x430 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2

    In tipc_nl_compat_recv(), when the len variable returned by
    nlmsg_attrlen() is 0, the message is still treated as a valid one,
    which is obviously unresonable. When len is zero, it means the
    message not only doesn't contain any valid TLV payload, but also
    TLV header is not included. Under this stituation, tlv_type field
    in TLV header is still accessed in tipc_nl_compat_dumpit() or
    tipc_nl_compat_doit(), but the field space is obviously illegal.
    Of course, it is not initialized.

    Reported-by: syzbot+bca0dc46634781f08b38@syzkaller.appspotmail.com
    Reported-by: syzbot+6bdb590321a7ae40c1a6@syzkaller.appspotmail.com
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Ying Xue
     
  • commit 974cb0e3e7c963ced06c4e32c5b2884173fa5e01 upstream.

    syzbot reported:

    BUG: KMSAN: uninit-value in __arch_swab32 arch/x86/include/uapi/asm/swab.h:10 [inline]
    BUG: KMSAN: uninit-value in __fswab32 include/uapi/linux/swab.h:59 [inline]
    BUG: KMSAN: uninit-value in tipc_nl_compat_name_table_dump+0x4a8/0xba0 net/tipc/netlink_compat.c:826
    CPU: 0 PID: 6290 Comm: syz-executor848 Not tainted 4.19.0-rc8+ #70
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x306/0x460 lib/dump_stack.c:113
    kmsan_report+0x1a2/0x2e0 mm/kmsan/kmsan.c:917
    __msan_warning+0x7c/0xe0 mm/kmsan/kmsan_instr.c:500
    __arch_swab32 arch/x86/include/uapi/asm/swab.h:10 [inline]
    __fswab32 include/uapi/linux/swab.h:59 [inline]
    tipc_nl_compat_name_table_dump+0x4a8/0xba0 net/tipc/netlink_compat.c:826
    __tipc_nl_compat_dumpit+0x59e/0xdb0 net/tipc/netlink_compat.c:205
    tipc_nl_compat_dumpit+0x63a/0x820 net/tipc/netlink_compat.c:270
    tipc_nl_compat_handle net/tipc/netlink_compat.c:1151 [inline]
    tipc_nl_compat_recv+0x1402/0x2760 net/tipc/netlink_compat.c:1210
    genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
    genl_rcv_msg+0x185c/0x1a20 net/netlink/genetlink.c:626
    netlink_rcv_skb+0x394/0x640 net/netlink/af_netlink.c:2454
    genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
    netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline]
    netlink_unicast+0x166d/0x1720 net/netlink/af_netlink.c:1343
    netlink_sendmsg+0x1391/0x1420 net/netlink/af_netlink.c:1908
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7
    RIP: 0033:0x440179
    Code: 18 89 d0 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 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 3d 01 f0 ff ff 0f 83 fb 13 fc ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007ffecec49318 EFLAGS: 00000213 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 0000000000440179
    RDX: 0000000000000000 RSI: 0000000020000100 RDI: 0000000000000003
    RBP: 00000000006ca018 R08: 0000000000000000 R09: 00000000004002c8
    R10: 0000000000000000 R11: 0000000000000213 R12: 0000000000401a00
    R13: 0000000000401a90 R14: 0000000000000000 R15: 0000000000000000

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:255 [inline]
    kmsan_internal_poison_shadow+0xc8/0x1d0 mm/kmsan/kmsan.c:180
    kmsan_kmalloc+0xa4/0x120 mm/kmsan/kmsan_hooks.c:104
    kmsan_slab_alloc+0x10/0x20 mm/kmsan/kmsan_hooks.c:113
    slab_post_alloc_hook mm/slab.h:446 [inline]
    slab_alloc_node mm/slub.c:2727 [inline]
    __kmalloc_node_track_caller+0xb43/0x1400 mm/slub.c:4360
    __kmalloc_reserve net/core/skbuff.c:138 [inline]
    __alloc_skb+0x422/0xe90 net/core/skbuff.c:206
    alloc_skb include/linux/skbuff.h:996 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1189 [inline]
    netlink_sendmsg+0xcaf/0x1420 net/netlink/af_netlink.c:1883
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7

    We cannot take for granted the thing that the length of data contained
    in TLV is longer than the size of struct tipc_name_table_query in
    tipc_nl_compat_name_table_dump().

    Reported-by: syzbot+06e771a754829716a327@syzkaller.appspotmail.com
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Ying Xue
     
  • commit edf5ff04a45750ac8ce2435974f001dc9cfbf055 upstream.

    syzbot reports following splat:

    BUG: KMSAN: uninit-value in strlen+0x3b/0xa0 lib/string.c:486
    CPU: 1 PID: 9306 Comm: syz-executor172 Not tainted 4.20.0-rc7+ #2
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
    Google 01/01/2011
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x173/0x1d0 lib/dump_stack.c:113
    kmsan_report+0x12e/0x2a0 mm/kmsan/kmsan.c:613
    __msan_warning+0x82/0xf0 mm/kmsan/kmsan_instr.c:313
    strlen+0x3b/0xa0 lib/string.c:486
    nla_put_string include/net/netlink.h:1154 [inline]
    __tipc_nl_compat_link_set net/tipc/netlink_compat.c:708 [inline]
    tipc_nl_compat_link_set+0x929/0x1220 net/tipc/netlink_compat.c:744
    __tipc_nl_compat_doit net/tipc/netlink_compat.c:311 [inline]
    tipc_nl_compat_doit+0x3aa/0xaf0 net/tipc/netlink_compat.c:344
    tipc_nl_compat_handle net/tipc/netlink_compat.c:1107 [inline]
    tipc_nl_compat_recv+0x14d7/0x2760 net/tipc/netlink_compat.c:1210
    genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
    genl_rcv_msg+0x185f/0x1a60 net/netlink/genetlink.c:626
    netlink_rcv_skb+0x444/0x640 net/netlink/af_netlink.c:2477
    genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
    netlink_unicast_kernel net/netlink/af_netlink.c:1310 [inline]
    netlink_unicast+0xf40/0x1020 net/netlink/af_netlink.c:1336
    netlink_sendmsg+0x127f/0x1300 net/netlink/af_netlink.c:1917
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xdb9/0x11b0 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x305/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbc/0xf0 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7

    The uninitialised access happened in
    nla_put_string(skb, TIPC_NLA_LINK_NAME, lc->name)

    This is because lc->name string is not validated before it's used.

    Reported-by: syzbot+d78b8a29241a195aefb8@syzkaller.appspotmail.com
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Ying Xue
     
  • commit 0762216c0ad2a2fccd63890648eca491f2c83d9a upstream.

    syzbot reported:

    BUG: KMSAN: uninit-value in strlen+0x3b/0xa0 lib/string.c:484
    CPU: 1 PID: 6371 Comm: syz-executor652 Not tainted 4.19.0-rc8+ #70
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x306/0x460 lib/dump_stack.c:113
    kmsan_report+0x1a2/0x2e0 mm/kmsan/kmsan.c:917
    __msan_warning+0x7c/0xe0 mm/kmsan/kmsan_instr.c:500
    strlen+0x3b/0xa0 lib/string.c:484
    nla_put_string include/net/netlink.h:1011 [inline]
    tipc_nl_compat_bearer_enable+0x238/0x7b0 net/tipc/netlink_compat.c:389
    __tipc_nl_compat_doit net/tipc/netlink_compat.c:311 [inline]
    tipc_nl_compat_doit+0x39f/0xae0 net/tipc/netlink_compat.c:344
    tipc_nl_compat_recv+0x147c/0x2760 net/tipc/netlink_compat.c:1107
    genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
    genl_rcv_msg+0x185c/0x1a20 net/netlink/genetlink.c:626
    netlink_rcv_skb+0x394/0x640 net/netlink/af_netlink.c:2454
    genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
    netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline]
    netlink_unicast+0x166d/0x1720 net/netlink/af_netlink.c:1343
    netlink_sendmsg+0x1391/0x1420 net/netlink/af_netlink.c:1908
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7
    RIP: 0033:0x440179
    Code: 18 89 d0 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 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 3d 01 f0 ff ff 0f 83 fb 13 fc ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007fffef7beee8 EFLAGS: 00000213 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 0000000000440179
    RDX: 0000000000000000 RSI: 0000000020000100 RDI: 0000000000000003
    RBP: 00000000006ca018 R08: 0000000000000000 R09: 00000000004002c8
    R10: 0000000000000000 R11: 0000000000000213 R12: 0000000000401a00
    R13: 0000000000401a90 R14: 0000000000000000 R15: 0000000000000000

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:255 [inline]
    kmsan_internal_poison_shadow+0xc8/0x1d0 mm/kmsan/kmsan.c:180
    kmsan_kmalloc+0xa4/0x120 mm/kmsan/kmsan_hooks.c:104
    kmsan_slab_alloc+0x10/0x20 mm/kmsan/kmsan_hooks.c:113
    slab_post_alloc_hook mm/slab.h:446 [inline]
    slab_alloc_node mm/slub.c:2727 [inline]
    __kmalloc_node_track_caller+0xb43/0x1400 mm/slub.c:4360
    __kmalloc_reserve net/core/skbuff.c:138 [inline]
    __alloc_skb+0x422/0xe90 net/core/skbuff.c:206
    alloc_skb include/linux/skbuff.h:996 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1189 [inline]
    netlink_sendmsg+0xcaf/0x1420 net/netlink/af_netlink.c:1883
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7

    The root cause is that we don't validate whether bear name is a valid
    string in tipc_nl_compat_bearer_enable().

    Meanwhile, we also fix the same issue in the following functions:
    tipc_nl_compat_bearer_disable()
    tipc_nl_compat_link_stat_dump()
    tipc_nl_compat_media_set()
    tipc_nl_compat_bearer_set()

    Reported-by: syzbot+b33d5cae0efd35dbfe77@syzkaller.appspotmail.com
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Ying Xue
     
  • commit 8b66fee7f8ee18f9c51260e7a43ab37db5177a05 upstream.

    syzbot reports following splat:

    BUG: KMSAN: uninit-value in strlen+0x3b/0xa0 lib/string.c:486
    CPU: 1 PID: 11057 Comm: syz-executor0 Not tainted 4.20.0-rc7+ #2
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x173/0x1d0 lib/dump_stack.c:113
    kmsan_report+0x12e/0x2a0 mm/kmsan/kmsan.c:613
    __msan_warning+0x82/0xf0 mm/kmsan/kmsan_instr.c:295
    strlen+0x3b/0xa0 lib/string.c:486
    nla_put_string include/net/netlink.h:1154 [inline]
    tipc_nl_compat_link_reset_stats+0x1f0/0x360 net/tipc/netlink_compat.c:760
    __tipc_nl_compat_doit net/tipc/netlink_compat.c:311 [inline]
    tipc_nl_compat_doit+0x3aa/0xaf0 net/tipc/netlink_compat.c:344
    tipc_nl_compat_handle net/tipc/netlink_compat.c:1107 [inline]
    tipc_nl_compat_recv+0x14d7/0x2760 net/tipc/netlink_compat.c:1210
    genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
    genl_rcv_msg+0x185f/0x1a60 net/netlink/genetlink.c:626
    netlink_rcv_skb+0x444/0x640 net/netlink/af_netlink.c:2477
    genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
    netlink_unicast_kernel net/netlink/af_netlink.c:1310 [inline]
    netlink_unicast+0xf40/0x1020 net/netlink/af_netlink.c:1336
    netlink_sendmsg+0x127f/0x1300 net/netlink/af_netlink.c:1917
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xdb9/0x11b0 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x305/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbc/0xf0 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7
    RIP: 0033:0x457ec9
    Code: 6d b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 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 3d 01 f0 ff ff 0f 83 3b b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007f2557338c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 0000000000457ec9
    RDX: 0000000000000000 RSI: 00000000200001c0 RDI: 0000000000000003
    RBP: 000000000073bf00 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00007f25573396d4
    R13: 00000000004cb478 R14: 00000000004d86c8 R15: 00000000ffffffff

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:204 [inline]
    kmsan_internal_poison_shadow+0x92/0x150 mm/kmsan/kmsan.c:158
    kmsan_kmalloc+0xa6/0x130 mm/kmsan/kmsan_hooks.c:176
    kmsan_slab_alloc+0xe/0x10 mm/kmsan/kmsan_hooks.c:185
    slab_post_alloc_hook mm/slab.h:446 [inline]
    slab_alloc_node mm/slub.c:2759 [inline]
    __kmalloc_node_track_caller+0xe18/0x1030 mm/slub.c:4383
    __kmalloc_reserve net/core/skbuff.c:137 [inline]
    __alloc_skb+0x309/0xa20 net/core/skbuff.c:205
    alloc_skb include/linux/skbuff.h:998 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1182 [inline]
    netlink_sendmsg+0xb82/0x1300 net/netlink/af_netlink.c:1892
    sock_sendmsg_nosec net/socket.c:621 [inline]
    sock_sendmsg net/socket.c:631 [inline]
    ___sys_sendmsg+0xdb9/0x11b0 net/socket.c:2116
    __sys_sendmsg net/socket.c:2154 [inline]
    __do_sys_sendmsg net/socket.c:2163 [inline]
    __se_sys_sendmsg+0x305/0x460 net/socket.c:2161
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
    do_syscall_64+0xbc/0xf0 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x63/0xe7

    The uninitialised access happened in tipc_nl_compat_link_reset_stats:
    nla_put_string(skb, TIPC_NLA_LINK_NAME, name)

    This is because name string is not validated before it's used.

    Reported-by: syzbot+e01d94b5a4c266be6e4c@syzkaller.appspotmail.com
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Ying Xue
     
  • commit a88289f4ddee4165d5f796bd99e09eec3133c16b upstream.

    syzbot reported:

    BUG: KMSAN: uninit-value in tipc_conn_rcv_sub+0x184/0x950 net/tipc/topsrv.c:373
    CPU: 0 PID: 66 Comm: kworker/u4:4 Not tainted 4.17.0-rc3+ #88
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    Workqueue: tipc_rcv tipc_conn_recv_work
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x185/0x1d0 lib/dump_stack.c:113
    kmsan_report+0x142/0x240 mm/kmsan/kmsan.c:1067
    __msan_warning_32+0x6c/0xb0 mm/kmsan/kmsan_instr.c:683
    tipc_conn_rcv_sub+0x184/0x950 net/tipc/topsrv.c:373
    tipc_conn_rcv_from_sock net/tipc/topsrv.c:409 [inline]
    tipc_conn_recv_work+0x3cd/0x560 net/tipc/topsrv.c:424
    process_one_work+0x12c6/0x1f60 kernel/workqueue.c:2145
    worker_thread+0x113c/0x24f0 kernel/workqueue.c:2279
    kthread+0x539/0x720 kernel/kthread.c:239
    ret_from_fork+0x35/0x40 arch/x86/entry/entry_64.S:412

    Local variable description: ----s.i@tipc_conn_recv_work
    Variable was created at:
    tipc_conn_recv_work+0x65/0x560 net/tipc/topsrv.c:419
    process_one_work+0x12c6/0x1f60 kernel/workqueue.c:2145

    In tipc_conn_rcv_from_sock(), it always supposes the length of message
    received from sock_recvmsg() is not smaller than the size of struct
    tipc_subscr. However, this assumption is false. Especially when the
    length of received message is shorter than struct tipc_subscr size,
    we will end up touching uninitialized fields in tipc_conn_rcv_sub().

    Reported-by: syzbot+8951a3065ee7fd6d6e23@syzkaller.appspotmail.com
    Reported-by: syzbot+75e6e042c5bbf691fc82@syzkaller.appspotmail.com
    Signed-off-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Ying Xue
     

10 Jan, 2019

6 commits

  • [ Upstream commit 3c6306d44082ef007a258ae1b86ea58e6974ee3f ]

    Similar to commit 143ece654f9f ("tipc: check tsk->group in tipc_wait_for_cond()")
    we have to reload grp->dests too after we re-take the sock lock.
    This means we need to move the dsts check after tipc_wait_for_cond()
    too.

    Fixes: 75da2163dbb6 ("tipc: introduce communication groups")
    Reported-and-tested-by: syzbot+99f20222fc5018d2b97a@syzkaller.appspotmail.com
    Cc: Ying Xue
    Cc: Jon Maloy
    Signed-off-by: Cong Wang
    Acked-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit 15ef70e286176165d28b0b8a969b422561a68dfc ]

    lock_sock() must be used in process context to be race-free with
    other lock_sock() callers, for example, tipc_release(). Otherwise
    using the spinlock directly can't serialize a parallel tipc_release().

    As it is blocking, we have to hold the sock refcnt before
    rhashtable_walk_stop() and release it after rhashtable_walk_start().

    Fixes: 07f6c4bc048a ("tipc: convert tipc reference table to use generic rhashtable")
    Reported-by: Dmitry Vyukov
    Cc: Ying Xue
    Cc: Jon Maloy
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit acb4a33e9856d5fa3384b87d3d8369229be06d31 ]

    tipc_udp_xmit() drops the packet on error, there is no
    need to drop it again.

    Fixes: ef20cd4dd163 ("tipc: introduce UDP replicast")
    Reported-and-tested-by: syzbot+eae585ba2cc2752d3704@syzkaller.appspotmail.com
    Cc: Ying Xue
    Cc: Jon Maloy
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit dc4501ff287547dea7ca10f1c580c741291a8760 ]

    bearer_disable() already calls kfree_rcu() to free struct tipc_bearer,
    we don't need to call kfree() again.

    Fixes: cb30a63384bc ("tipc: refactor function tipc_enable_bearer()")
    Reported-by: syzbot+b981acf1fb240c0c128b@syzkaller.appspotmail.com
    Cc: Ying Xue
    Cc: Jon Maloy
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit fb83ed496b9a654f60cd1d58a0e1e79ec5694808 ]

    When TIPC_NLA_UDP_REMOTE is an IPv6 mcast address but
    TIPC_NLA_UDP_LOCAL is an IPv4 address, a NULL-ptr deref is triggered
    as the UDP tunnel sock is initialized to IPv4 or IPv6 sock merely
    based on the protocol in local address.

    We should just error out when the remote address and local address
    have different protocols.

    Reported-by: syzbot+eb4da3a20fad2e52555d@syzkaller.appspotmail.com
    Cc: Ying Xue
    Cc: Jon Maloy
    Signed-off-by: Cong Wang
    Acked-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit 143ece654f9f5b37bedea252a990be37e48ae3a5 ]

    tipc_wait_for_cond() drops socket lock before going to sleep,
    but tsk->group could be freed right after that release_sock().
    So we have to re-check and reload tsk->group after it wakes up.

    After this patch, tipc_wait_for_cond() returns -ERESTARTSYS when
    tsk->group is NULL, instead of continuing with the assumption of
    a non-NULL tsk->group.

    (It looks like 'dsts' should be re-checked and reloaded too, but
    it is a different bug.)

    Similar for tipc_send_group_unicast() and tipc_send_group_anycast().

    Reported-by: syzbot+10a9db47c3a0e13eb31c@syzkaller.appspotmail.com
    Fixes: b7d42635517f ("tipc: introduce flow control for group broadcast messages")
    Fixes: ee106d7f942d ("tipc: introduce group anycast messaging")
    Fixes: 27bd9ec027f3 ("tipc: introduce group unicast messaging")
    Cc: Ying Xue
    Cc: Jon Maloy
    Signed-off-by: Cong Wang
    Acked-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     

08 Dec, 2018

1 commit

  • commit 29e270fc32192e7729057963ae7120663856c93e upstream.

    Got below warning with gcc 8.2 compiler.

    net/tipc/topsrv.c: In function ‘tipc_topsrv_start’:
    net/tipc/topsrv.c:660:2: warning: ‘strncpy’ specified bound depends on the length of the source argument [-Wstringop-overflow=]
    strncpy(srv->name, name, strlen(name) + 1);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    net/tipc/topsrv.c:660:27: note: length computed here
    strncpy(srv->name, name, strlen(name) + 1);
    ^~~~~~~~~~~~
    So change it to correct length and use strscpy.

    Signed-off-by: Guoqing Jiang
    Acked-by: Ying Xue
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Guoqing Jiang
     

06 Dec, 2018

1 commit

  • [ Upstream commit ec835f891232d7763dea9da0358f31e24ca6dfb7 ]

    We see the following lockdep warning:

    [ 2284.078521] ======================================================
    [ 2284.078604] WARNING: possible circular locking dependency detected
    [ 2284.078604] 4.19.0+ #42 Tainted: G E
    [ 2284.078604] ------------------------------------------------------
    [ 2284.078604] rmmod/254 is trying to acquire lock:
    [ 2284.078604] 00000000acd94e28 ((&n->timer)#2){+.-.}, at: del_timer_sync+0x5/0xa0
    [ 2284.078604]
    [ 2284.078604] but task is already holding lock:
    [ 2284.078604] 00000000f997afc0 (&(&tn->node_list_lock)->rlock){+.-.}, at: tipc_node_stop+0xac/0x190 [tipc]
    [ 2284.078604]
    [ 2284.078604] which lock already depends on the new lock.
    [ 2284.078604]
    [ 2284.078604]
    [ 2284.078604] the existing dependency chain (in reverse order) is:
    [ 2284.078604]
    [ 2284.078604] -> #1 (&(&tn->node_list_lock)->rlock){+.-.}:
    [ 2284.078604] tipc_node_timeout+0x20a/0x330 [tipc]
    [ 2284.078604] call_timer_fn+0xa1/0x280
    [ 2284.078604] run_timer_softirq+0x1f2/0x4d0
    [ 2284.078604] __do_softirq+0xfc/0x413
    [ 2284.078604] irq_exit+0xb5/0xc0
    [ 2284.078604] smp_apic_timer_interrupt+0xac/0x210
    [ 2284.078604] apic_timer_interrupt+0xf/0x20
    [ 2284.078604] default_idle+0x1c/0x140
    [ 2284.078604] do_idle+0x1bc/0x280
    [ 2284.078604] cpu_startup_entry+0x19/0x20
    [ 2284.078604] start_secondary+0x187/0x1c0
    [ 2284.078604] secondary_startup_64+0xa4/0xb0
    [ 2284.078604]
    [ 2284.078604] -> #0 ((&n->timer)#2){+.-.}:
    [ 2284.078604] del_timer_sync+0x34/0xa0
    [ 2284.078604] tipc_node_delete+0x1a/0x40 [tipc]
    [ 2284.078604] tipc_node_stop+0xcb/0x190 [tipc]
    [ 2284.078604] tipc_net_stop+0x154/0x170 [tipc]
    [ 2284.078604] tipc_exit_net+0x16/0x30 [tipc]
    [ 2284.078604] ops_exit_list.isra.8+0x36/0x70
    [ 2284.078604] unregister_pernet_operations+0x87/0xd0
    [ 2284.078604] unregister_pernet_subsys+0x1d/0x30
    [ 2284.078604] tipc_exit+0x11/0x6f2 [tipc]
    [ 2284.078604] __x64_sys_delete_module+0x1df/0x240
    [ 2284.078604] do_syscall_64+0x66/0x460
    [ 2284.078604] entry_SYSCALL_64_after_hwframe+0x49/0xbe
    [ 2284.078604]
    [ 2284.078604] other info that might help us debug this:
    [ 2284.078604]
    [ 2284.078604] Possible unsafe locking scenario:
    [ 2284.078604]
    [ 2284.078604] CPU0 CPU1
    [ 2284.078604] ---- ----
    [ 2284.078604] lock(&(&tn->node_list_lock)->rlock);
    [ 2284.078604] lock((&n->timer)#2);
    [ 2284.078604] lock(&(&tn->node_list_lock)->rlock);
    [ 2284.078604] lock((&n->timer)#2);
    [ 2284.078604]
    [ 2284.078604] *** DEADLOCK ***
    [ 2284.078604]
    [ 2284.078604] 3 locks held by rmmod/254:
    [ 2284.078604] #0: 000000003368be9b (pernet_ops_rwsem){+.+.}, at: unregister_pernet_subsys+0x15/0x30
    [ 2284.078604] #1: 0000000046ed9c86 (rtnl_mutex){+.+.}, at: tipc_net_stop+0x144/0x170 [tipc]
    [ 2284.078604] #2: 00000000f997afc0 (&(&tn->node_list_lock)->rlock){+.-.}, at: tipc_node_stop+0xac/0x19
    [...}

    The reason is that the node timer handler sometimes needs to delete a
    node which has been disconnected for too long. To do this, it grabs
    the lock 'node_list_lock', which may at the same time be held by the
    generic node cleanup function, tipc_node_stop(), during module removal.
    Since the latter is calling del_timer_sync() inside the same lock, we
    have a potential deadlock.

    We fix this letting the timer cleanup function use spin_trylock()
    instead of just spin_lock(), and when it fails to grab the lock it
    just returns so that the timer handler can terminate its execution.
    This is safe to do, since tipc_node_stop() anyway is about to
    delete both the timer and the node instance.

    Fixes: 6a939f365bdb ("tipc: Auto removal of peer down node instance")
    Acked-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Jon Maloy
     

23 Nov, 2018

3 commits

  • [ Upstream commit 7ab412d33b4c7ff3e0148d3db25dd861edd1283d ]

    When a link failure is detected locally, the link is reset, the flag
    link->in_session is set to false, and a RESET_MSG with the 'stopping'
    bit set is sent to the peer.

    The purpose of this bit is to inform the peer that this endpoint just
    is going down, and that the peer should handle the reception of this
    particular RESET message as a local failure. This forces the peer to
    accept another RESET or ACTIVATE message from this endpoint before it
    can re-establish the link. This again is necessary to ensure that
    link session numbers are properly exchanged before the link comes up
    again.

    If a failure is detected locally at the same time at the peer endpoint
    this will do the same, which is also a correct behavior.

    However, when receiving such messages, the endpoints will not
    distinguish between 'stopping' RESETs and ordinary ones when it comes
    to updating session numbers. Both endpoints will copy the received
    session number and set their 'in_session' flags to true at the
    reception, while they are still expecting another RESET from the
    peer before they can go ahead and re-establish. This is contradictory,
    since, after applying the validation check referred to below, the
    'in_session' flag will cause rejection of all such messages, and the
    link will never come up again.

    We now fix this by not only handling received RESET/STOPPING messages
    as a local failure, but also by omitting to set a new session number
    and the 'in_session' flag in such cases.

    Fixes: 7ea817f4e832 ("tipc: check session number before accepting link protocol messages")
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Jon Maloy
     
  • [ Upstream commit adba75be0d23cca92a028749d92c60c8909bbdb3 ]

    We get the following warning:

    [ 47.926140] 32-bit node address hash set to 2010a0a
    [ 47.927202]
    [ 47.927433] ================================
    [ 47.928050] WARNING: inconsistent lock state
    [ 47.928661] 4.19.0+ #37 Tainted: G E
    [ 47.929346] --------------------------------
    [ 47.929954] inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
    [ 47.930116] swapper/3/0 [HC0[0]:SC1[3]:HE1:SE0] takes:
    [ 47.930116] 00000000af8bc31e (&(&ht->lock)->rlock){+.?.}, at: rhashtable_walk_enter+0x36/0xb0
    [ 47.930116] {SOFTIRQ-ON-W} state was registered at:
    [ 47.930116] _raw_spin_lock+0x29/0x60
    [ 47.930116] rht_deferred_worker+0x556/0x810
    [ 47.930116] process_one_work+0x1f5/0x540
    [ 47.930116] worker_thread+0x64/0x3e0
    [ 47.930116] kthread+0x112/0x150
    [ 47.930116] ret_from_fork+0x3a/0x50
    [ 47.930116] irq event stamp: 14044
    [ 47.930116] hardirqs last enabled at (14044): [] __local_bh_enable_ip+0x7a/0xf0
    [ 47.938117] hardirqs last disabled at (14043): [] __local_bh_enable_ip+0x41/0xf0
    [ 47.938117] softirqs last enabled at (14028): [] irq_enter+0x5e/0x60
    [ 47.938117] softirqs last disabled at (14029): [] irq_exit+0xb5/0xc0
    [ 47.938117]
    [ 47.938117] other info that might help us debug this:
    [ 47.938117] Possible unsafe locking scenario:
    [ 47.938117]
    [ 47.938117] CPU0
    [ 47.938117] ----
    [ 47.938117] lock(&(&ht->lock)->rlock);
    [ 47.938117]
    [ 47.938117] lock(&(&ht->lock)->rlock);
    [ 47.938117]
    [ 47.938117] *** DEADLOCK ***
    [ 47.938117]
    [ 47.938117] 2 locks held by swapper/3/0:
    [ 47.938117] #0: 0000000062c64f90 ((&d->timer)){+.-.}, at: call_timer_fn+0x5/0x280
    [ 47.938117] #1: 00000000ee39619c (&(&d->lock)->rlock){+.-.}, at: tipc_disc_timeout+0xc8/0x540 [tipc]
    [ 47.938117]
    [ 47.938117] stack backtrace:
    [ 47.938117] CPU: 3 PID: 0 Comm: swapper/3 Tainted: G E 4.19.0+ #37
    [ 47.938117] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
    [ 47.938117] Call Trace:
    [ 47.938117]
    [ 47.938117] dump_stack+0x5e/0x8b
    [ 47.938117] print_usage_bug+0x1ed/0x1ff
    [ 47.938117] mark_lock+0x5b5/0x630
    [ 47.938117] __lock_acquire+0x4c0/0x18f0
    [ 47.938117] ? lock_acquire+0xa6/0x180
    [ 47.938117] lock_acquire+0xa6/0x180
    [ 47.938117] ? rhashtable_walk_enter+0x36/0xb0
    [ 47.938117] _raw_spin_lock+0x29/0x60
    [ 47.938117] ? rhashtable_walk_enter+0x36/0xb0
    [ 47.938117] rhashtable_walk_enter+0x36/0xb0
    [ 47.938117] tipc_sk_reinit+0xb0/0x410 [tipc]
    [ 47.938117] ? mark_held_locks+0x6f/0x90
    [ 47.938117] ? __local_bh_enable_ip+0x7a/0xf0
    [ 47.938117] ? lockdep_hardirqs_on+0x20/0x1a0
    [ 47.938117] tipc_net_finalize+0xbf/0x180 [tipc]
    [ 47.938117] tipc_disc_timeout+0x509/0x540 [tipc]
    [ 47.938117] ? call_timer_fn+0x5/0x280
    [ 47.938117] ? tipc_disc_msg_xmit.isra.19+0xa0/0xa0 [tipc]
    [ 47.938117] ? tipc_disc_msg_xmit.isra.19+0xa0/0xa0 [tipc]
    [ 47.938117] call_timer_fn+0xa1/0x280
    [ 47.938117] ? tipc_disc_msg_xmit.isra.19+0xa0/0xa0 [tipc]
    [ 47.938117] run_timer_softirq+0x1f2/0x4d0
    [ 47.938117] __do_softirq+0xfc/0x413
    [ 47.938117] irq_exit+0xb5/0xc0
    [ 47.938117] smp_apic_timer_interrupt+0xac/0x210
    [ 47.938117] apic_timer_interrupt+0xf/0x20
    [ 47.938117]
    [ 47.938117] RIP: 0010:default_idle+0x1c/0x140
    [ 47.938117] Code: 90 90 90 90 90 90 90 90 90 90 90 90 90 90 0f 1f 44 00 00 41 54 55 53 65 8b 2d d8 2b 74 65 0f 1f 44 00 00 e8 c6 2c 8b ff fb f4 8b 2d c5 2b 74 65 0f 1f 44 00 00 5b 5d 41 5c c3 65 8b 05 b4 2b
    [ 47.938117] RSP: 0018:ffffaf6ac0207ec8 EFLAGS: 00000206 ORIG_RAX: ffffffffffffff13
    [ 47.938117] RAX: ffff8f5b3735e200 RBX: 0000000000000003 RCX: 0000000000000001
    [ 47.938117] RDX: 0000000000000001 RSI: 0000000000000001 RDI: ffff8f5b3735e200
    [ 47.938117] RBP: 0000000000000003 R08: 0000000000000001 R09: 0000000000000000
    [ 47.938117] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
    [ 47.938117] R13: 0000000000000000 R14: ffff8f5b3735e200 R15: ffff8f5b3735e200
    [ 47.938117] ? default_idle+0x1a/0x140
    [ 47.938117] do_idle+0x1bc/0x280
    [ 47.938117] cpu_startup_entry+0x19/0x20
    [ 47.938117] start_secondary+0x187/0x1c0
    [ 47.938117] secondary_startup_64+0xa4/0xb0

    The reason seems to be that tipc_net_finalize()->tipc_sk_reinit() is
    calling the function rhashtable_walk_enter() within a timer interrupt.
    We fix this by executing tipc_net_finalize() in work queue context.

    Acked-by: Ying Xue
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Jon Maloy
     
  • [ Upstream commit 1c1274a56999fbdf9cf84e332b28448bb2d55221 ]

    The code for reading ancillary data from a received buffer is assuming
    the buffer is linear. To make this assumption true we have to linearize
    the buffer before message data is read.

    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Jon Maloy
     

04 Nov, 2018

1 commit

  • [ Upstream commit 89ab066d4229acd32e323f1569833302544a4186 ]

    This reverts commit dd979b4df817e9976f18fb6f9d134d6bc4a3c317.

    This broke tcp_poll for SMC fallback: An AF_SMC socket establishes an
    internal TCP socket for the initial handshake with the remote peer.
    Whenever the SMC connection can not be established this TCP socket is
    used as a fallback. All socket operations on the SMC socket are then
    forwarded to the TCP socket. In case of poll, the file->private_data
    pointer references the SMC socket because the TCP socket has no file
    assigned. This causes tcp_poll to wait on the wrong socket.

    Signed-off-by: Karsten Graul
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Karsten Graul
     

19 Oct, 2018

1 commit


16 Oct, 2018

2 commits

  • The binding table's 'cluster_scope' list is rcu protected to handle
    races between threads changing the list and those traversing the list at
    the same moment. We have now found that the function named_distribute()
    uses the regular list_for_each() macro to traverse the said list.
    Likewise, the function tipc_named_withdraw() is removing items from the
    same list using the regular list_del() call. When these two functions
    execute in parallel we see occasional crashes.

    This commit fixes this by adding the missing _rcu() suffixes.

    Signed-off-by: Tung Nguyen
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Tung Nguyen
     
  • In the commit referred to below we added link tolerance as an additional
    criteria for declaring broadcast transmission "stale" and resetting the
    unicast links to the affected node.

    Unfortunately, this 'improvement' introduced two bugs, which each and
    one alone cause only limited problems, but combined lead to seemingly
    stochastic unicast link resets, depending on the amount of broadcast
    traffic transmitted.

    The first issue, a missing initialization of the 'tolerance' field of
    the receiver broadcast link, was recently fixed by commit 047491ea334a
    ("tipc: set link tolerance correctly in broadcast link").

    Ths second issue, where we omit to reset the 'stale_cnt' field of
    the same link after a 'stale' period is over, leads to this counter
    accumulating over time, and in the absence of the 'tolerance' criteria
    leads to the above described symptoms. This commit adds the missing
    initialization.

    Fixes: a4dc70d46cf1 ("tipc: extend link reset criteria for stale packet retransmission")
    Signed-off-by: Jon Maloy
    Acked-by: Ying Xue
    Signed-off-by: David S. Miller

    Jon Maloy
     

12 Oct, 2018

1 commit

  • When booting kernel with LOCKDEP option, below warning info was found:

    WARNING: possible recursive locking detected
    4.19.0-rc7+ #14 Not tainted
    --------------------------------------------
    swapper/0/1 is trying to acquire lock:
    00000000dcfc0fc8 (&(&list->lock)->rlock#4){+...}, at: spin_lock_bh
    include/linux/spinlock.h:334 [inline]
    00000000dcfc0fc8 (&(&list->lock)->rlock#4){+...}, at:
    tipc_link_reset+0x125/0xdf0 net/tipc/link.c:850

    but task is already holding lock:
    00000000cbb9b036 (&(&list->lock)->rlock#4){+...}, at: spin_lock_bh
    include/linux/spinlock.h:334 [inline]
    00000000cbb9b036 (&(&list->lock)->rlock#4){+...}, at:
    tipc_link_reset+0xfa/0xdf0 net/tipc/link.c:849

    other info that might help us debug this:
    Possible unsafe locking scenario:

    CPU0
    ----
    lock(&(&list->lock)->rlock#4);
    lock(&(&list->lock)->rlock#4);

    *** DEADLOCK ***

    May be due to missing lock nesting notation

    2 locks held by swapper/0/1:
    #0: 00000000f7539d34 (pernet_ops_rwsem){+.+.}, at:
    register_pernet_subsys+0x19/0x40 net/core/net_namespace.c:1051
    #1: 00000000cbb9b036 (&(&list->lock)->rlock#4){+...}, at:
    spin_lock_bh include/linux/spinlock.h:334 [inline]
    #1: 00000000cbb9b036 (&(&list->lock)->rlock#4){+...}, at:
    tipc_link_reset+0xfa/0xdf0 net/tipc/link.c:849

    stack backtrace:
    CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.19.0-rc7+ #14
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014
    Call Trace:
    __dump_stack lib/dump_stack.c:77 [inline]
    dump_stack+0x1af/0x295 lib/dump_stack.c:113
    print_deadlock_bug kernel/locking/lockdep.c:1759 [inline]
    check_deadlock kernel/locking/lockdep.c:1803 [inline]
    validate_chain kernel/locking/lockdep.c:2399 [inline]
    __lock_acquire+0xf1e/0x3c60 kernel/locking/lockdep.c:3411
    lock_acquire+0x1db/0x520 kernel/locking/lockdep.c:3900
    __raw_spin_lock_bh include/linux/spinlock_api_smp.h:135 [inline]
    _raw_spin_lock_bh+0x31/0x40 kernel/locking/spinlock.c:168
    spin_lock_bh include/linux/spinlock.h:334 [inline]
    tipc_link_reset+0x125/0xdf0 net/tipc/link.c:850
    tipc_link_bc_create+0xb5/0x1f0 net/tipc/link.c:526
    tipc_bcast_init+0x59b/0xab0 net/tipc/bcast.c:521
    tipc_init_net+0x472/0x610 net/tipc/core.c:82
    ops_init+0xf7/0x520 net/core/net_namespace.c:129
    __register_pernet_operations net/core/net_namespace.c:940 [inline]
    register_pernet_operations+0x453/0xac0 net/core/net_namespace.c:1011
    register_pernet_subsys+0x28/0x40 net/core/net_namespace.c:1052
    tipc_init+0x83/0x104 net/tipc/core.c:140
    do_one_initcall+0x109/0x70a init/main.c:885
    do_initcall_level init/main.c:953 [inline]
    do_initcalls init/main.c:961 [inline]
    do_basic_setup init/main.c:979 [inline]
    kernel_init_freeable+0x4bd/0x57f init/main.c:1144
    kernel_init+0x13/0x180 init/main.c:1063
    ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:413

    The reason why the noise above was complained by LOCKDEP is because we
    nested to hold l->wakeupq.lock and l->inputq->lock in tipc_link_reset
    function. In fact it's unnecessary to move skb buffer from l->wakeupq
    queue to l->inputq queue while holding the two locks at the same time.
    Instead, we can move skb buffers in l->wakeupq queue to a temporary
    list first and then move the buffers of the temporary list to l->inputq
    queue, which is also safe for us.

    Fixes: 3f32d0be6c16 ("tipc: lock wakeup & inputq at tipc_link_reset()")
    Reported-by: Dmitry Vyukov
    Signed-off-by: Ying Xue
    Acked-by: Jon Maloy

    Signed-off-by: David S. Miller

    Ying Xue
     

11 Oct, 2018

2 commits

  • In tipc_sk_filter_rcv(), when we detect protocol messages with error we
    call tipc_sk_conn_proto_rcv() and let it reset the connection and notify
    the socket by calling sk->sk_state_change().

    However, tipc_sk_filter_rcv() may have been called from the function
    tipc_backlog_rcv(), in which case the socket lock is held and the socket
    already awake. This means that the sk_state_change() call is ignored and
    the error notification lost. Now the receive queue will remain empty and
    the socket sleeps forever.

    In this commit, we convert the protocol message into a connection abort
    message and enqueue it into the socket's receive queue. By this addition
    to the above state change we cover all conditions.

    Acked-by: Ying Xue
    Signed-off-by: Parthasarathy Bhuvaragan
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Parthasarathy Bhuvaragan
     
  • In the patch referred to below we added link tolerance as an additional
    criteria for declaring broadcast transmission "stale" and resetting the
    affected links.

    However, the 'tolerance' field of the broadcast link is never set, and
    remains at zero. This renders the whole commit without the intended
    improving effect, but luckily also with no negative effect.

    In this commit we add the missing initialization.

    Fixes: a4dc70d46cf1 ("tipc: extend link reset criteria for stale packet retransmission")
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Jon Maloy
     

02 Oct, 2018

1 commit

  • The initial session number when a link is created is based on a random
    value, taken from struct tipc_net->random. It is then incremented for
    each link reset to avoid mixing protocol messages from different link
    sessions.

    However, when a bearer is reset all its links are deleted, and will
    later be re-created using the same random value as the first time.
    This means that if the link never went down between creation and
    deletion we will still sometimes have two subsequent sessions with
    the same session number. In virtual environments with potentially
    long transmission times this has turned out to be a real problem.

    We now fix this by randomizing the session number each time a link
    is created.

    With a session number size of 16 bits this gives a risk of session
    collision of 1/64k. To reduce this further, we also introduce a sanity
    check on the very first STATE message arriving at a link. If this has
    an acknowledge value differing from 0, which is logically impossible,
    we ignore the message. The final risk for session collision is hence
    reduced to 1/4G, which should be sufficient.

    Signed-off-by: LUU Duc Canh
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    LUU Duc Canh
     

30 Sep, 2018

1 commit

  • We see the following scenario:
    1) Link endpoint B on node 1 discovers that its peer endpoint is gone.
    Since there is a second working link, failover procedure is started.
    2) Link endpoint A on node 1 sends a FAILOVER message to peer endpoint
    A on node 2. The node item 1->2 goes to state FAILINGOVER.
    3) Linke endpoint A/2 receives the failover, and is supposed to take
    down its parallell link endpoint B/2, while producing a FAILOVER
    message to send back to A/1.
    4) However, B/2 has already been deleted, so no FAILOVER message can
    created.
    5) Node 1->2 remains in state FAILINGOVER forever, refusing to receive
    any messages that can bring B/1 up again. We are left with a non-
    redundant link between node 1 and 2.

    We fix this with letting endpoint A/2 build a dummy FAILOVER message
    to send to back to A/1, so that the situation can be resolved.

    Signed-off-by: LUU Duc Canh
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    LUU Duc Canh
     

26 Sep, 2018

3 commits

  • In tipc_link_reset() we copy the wakeup queue to input queue using
    skb_queue_splice_init(link->wakeupq, link->inputq).
    This is performed without holding any locks. The lists might be
    simultaneously be accessed by other cpu threads in tipc_sk_rcv(),
    something leading to to random missing packets.

    Signed-off-by: Parthasarathy Bhuvaragan
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Parthasarathy Bhuvaragan
     
  • If we detect that under lying carrier detects errors and goes down,
    we reset the bearer.

    Signed-off-by: Parthasarathy Bhuvaragan
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Parthasarathy Bhuvaragan
     
  • In the case of implicit connect message with data > 1K, the flow
    control accounting is incorrect. At this state, the socket does not
    know the peer nodes capability and falls back to legacy flow control
    by return 1, however the receiver of this message will perform the
    new block accounting. This leads to a slack and eventually traffic
    disturbance.

    In this commit, we perform tipc_node_get_capabilities() at implicit
    connect and perform accounting based on the peer's capability.

    Signed-off-by: Parthasarathy Bhuvaragan
    Signed-off-by: Jon Maloy
    Signed-off-by: David S. Miller

    Parthasarathy Bhuvaragan
     

13 Sep, 2018

1 commit

  • When __tipc_dump_start() fails with running out of memory,
    we have no reason to continue, especially we should avoid
    calling tipc_dump_done().

    Fixes: 8f5c5fcf3533 ("tipc: call start and done ops directly in __tipc_nl_compat_dumpit()")
    Reported-and-tested-by: syzbot+3f8324abccfbf8c74a9f@syzkaller.appspotmail.com
    Cc: Jon Maloy
    Cc: Ying Xue
    Signed-off-by: Cong Wang
    Acked-by: Ying Xue
    Signed-off-by: David S. Miller

    Cong Wang
     

07 Sep, 2018

1 commit

  • __tipc_nl_compat_dumpit() uses a netlink_callback on stack,
    so the only way to align it with other ->dumpit() call path
    is calling tipc_dump_start() and tipc_dump_done() directly
    inside it. Otherwise ->dumpit() would always get NULL from
    cb->args[].

    But tipc_dump_start() uses sock_net(cb->skb->sk) to retrieve
    net pointer, the cb->skb here doesn't set skb->sk, the net pointer
    is saved in msg->net instead, so introduce a helper function
    __tipc_dump_start() to pass in msg->net.

    Ying pointed out cb->args[0...3] are already used by other
    callbacks on this call path, so we can't use cb->args[0] any
    more, use cb->args[4] instead.

    Fixes: 9a07efa9aea2 ("tipc: switch to rhashtable iterator")
    Reported-and-tested-by: syzbot+e93a2c41f91b8e2c7d9b@syzkaller.appspotmail.com
    Cc: Jon Maloy
    Cc: Ying Xue
    Signed-off-by: Cong Wang
    Acked-by: Ying Xue
    Signed-off-by: David S. Miller

    Cong Wang
     

06 Sep, 2018

1 commit

  • Before we unlock the sock in tipc_release(), we have to
    detach sk->sk_socket from sk, otherwise a parallel
    tipc_sk_fill_sock_diag() could stil read it after we
    free this socket.

    Fixes: c30b70deb5f4 ("tipc: implement socket diagnostics for AF_TIPC")
    Reported-and-tested-by: syzbot+48804b87c16588ad491d@syzkaller.appspotmail.com
    Cc: Jon Maloy
    Cc: Ying Xue
    Signed-off-by: Cong Wang
    Acked-by: Ying Xue
    Signed-off-by: David S. Miller

    Cong Wang
     

04 Sep, 2018

2 commits