23 Mar, 2018

4 commits

  • …kernel/git/jberg/mac80211

    Johannes Berg says:

    ====================
    Two more fixes (in three patches):
    * ath9k_htc doesn't like QoS NDP frames, use regular ones
    * hwsim: set up wmediumd for radios created later
    ====================

    Signed-off-by: David S. Miller <davem@davemloft.net>

    David S. Miller
     
  • For multipath routes the ONLINK flag can be specified per nexthop in
    rtnh_flags or globally in rtm_flags. Update ip6_route_multipath_add
    to consider the ONLINK setting coming from rtnh_flags. Each loop over
    nexthops the config for the sibling route is initialized to the global
    config and then per nexthop settings overlayed. The flag is 'or'ed into
    fib6_config to handle the ONLINK flag coming from either rtm_flags or
    rtnh_flags.

    Fixes: fc1e64e1092f ("net/ipv6: Add support for onlink flag")
    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     
  • When using seg6 in encap mode, we call ipv6_dev_get_saddr() to set the
    source address of the outer IPv6 header, in case none was specified.
    Using skb->dev can lead to BUG() when it is in an inconsistent state.
    This patch uses the net_device attached to the skb's dst instead.

    [940807.667429] BUG: unable to handle kernel NULL pointer dereference at 000000000000047c
    [940807.762427] IP: ipv6_dev_get_saddr+0x8b/0x1d0
    [940807.815725] PGD 0 P4D 0
    [940807.847173] Oops: 0000 [#1] SMP PTI
    [940807.890073] Modules linked in:
    [940807.927765] CPU: 6 PID: 0 Comm: swapper/6 Tainted: G W 4.16.0-rc1-seg6bpf+ #2
    [940808.028988] Hardware name: HP ProLiant DL120 G6/ProLiant DL120 G6, BIOS O26 09/06/2010
    [940808.128128] RIP: 0010:ipv6_dev_get_saddr+0x8b/0x1d0
    [940808.187667] RSP: 0018:ffff88043fd836b0 EFLAGS: 00010206
    [940808.251366] RAX: 0000000000000005 RBX: ffff88042cb1c860 RCX: 00000000000000fe
    [940808.338025] RDX: 00000000000002c0 RSI: ffff88042cb1c860 RDI: 0000000000004500
    [940808.424683] RBP: ffff88043fd83740 R08: 0000000000000000 R09: ffffffffffffffff
    [940808.511342] R10: 0000000000000040 R11: 0000000000000000 R12: ffff88042cb1c850
    [940808.598012] R13: ffffffff8208e380 R14: ffff88042ac8da00 R15: 0000000000000002
    [940808.684675] FS: 0000000000000000(0000) GS:ffff88043fd80000(0000) knlGS:0000000000000000
    [940808.783036] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [940808.852975] CR2: 000000000000047c CR3: 00000004255fe000 CR4: 00000000000006e0
    [940808.939634] Call Trace:
    [940808.970041]
    [940808.995250] ? ip6t_do_table+0x265/0x640
    [940809.043341] seg6_do_srh_encap+0x28f/0x300
    [940809.093516] ? seg6_do_srh+0x1a0/0x210
    [940809.139528] seg6_do_srh+0x1a0/0x210
    [940809.183462] seg6_output+0x28/0x1e0
    [940809.226358] lwtunnel_output+0x3f/0x70
    [940809.272370] ip6_xmit+0x2b8/0x530
    [940809.313185] ? ac6_proc_exit+0x20/0x20
    [940809.359197] inet6_csk_xmit+0x7d/0xc0
    [940809.404173] tcp_transmit_skb+0x548/0x9a0
    [940809.453304] __tcp_retransmit_skb+0x1a8/0x7a0
    [940809.506603] ? ip6_default_advmss+0x40/0x40
    [940809.557824] ? tcp_current_mss+0x24/0x90
    [940809.605925] tcp_retransmit_skb+0xd/0x80
    [940809.654016] tcp_xmit_retransmit_queue.part.17+0xf9/0x210
    [940809.719797] tcp_ack+0xa47/0x1110
    [940809.760612] tcp_rcv_established+0x13c/0x570
    [940809.812865] tcp_v6_do_rcv+0x151/0x3d0
    [940809.858879] tcp_v6_rcv+0xa5c/0xb10
    [940809.901770] ? seg6_output+0xdd/0x1e0
    [940809.946745] ip6_input_finish+0xbb/0x460
    [940809.994837] ip6_input+0x74/0x80
    [940810.034612] ? ip6_rcv_finish+0xb0/0xb0
    [940810.081663] ipv6_rcv+0x31c/0x4c0
    ...

    Fixes: 6c8702c60b886 ("ipv6: sr: add support for SRH encapsulation and injection with lwtunnels")
    Reported-by: Tom Herbert
    Signed-off-by: David Lebrun
    Signed-off-by: David S. Miller

    David Lebrun
     
  • The seg6_build_state() function is called with RCU read lock held,
    so we cannot use GFP_KERNEL. This patch uses GFP_ATOMIC instead.

    [ 92.770271] =============================
    [ 92.770628] WARNING: suspicious RCU usage
    [ 92.770921] 4.16.0-rc4+ #12 Not tainted
    [ 92.771277] -----------------------------
    [ 92.771585] ./include/linux/rcupdate.h:302 Illegal context switch in RCU read-side critical section!
    [ 92.772279]
    [ 92.772279] other info that might help us debug this:
    [ 92.772279]
    [ 92.773067]
    [ 92.773067] rcu_scheduler_active = 2, debug_locks = 1
    [ 92.773514] 2 locks held by ip/2413:
    [ 92.773765] #0: (rtnl_mutex){+.+.}, at: [] rtnetlink_rcv_msg+0x441/0x4d0
    [ 92.774377] #1: (rcu_read_lock){....}, at: [] lwtunnel_build_state+0x59/0x210
    [ 92.775065]
    [ 92.775065] stack backtrace:
    [ 92.775371] CPU: 0 PID: 2413 Comm: ip Not tainted 4.16.0-rc4+ #12
    [ 92.775791] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1.fc27 04/01/2014
    [ 92.776608] Call Trace:
    [ 92.776852] dump_stack+0x7d/0xbc
    [ 92.777130] __schedule+0x133/0xf00
    [ 92.777393] ? unwind_get_return_address_ptr+0x50/0x50
    [ 92.777783] ? __sched_text_start+0x8/0x8
    [ 92.778073] ? rcu_is_watching+0x19/0x30
    [ 92.778383] ? kernel_text_address+0x49/0x60
    [ 92.778800] ? __kernel_text_address+0x9/0x30
    [ 92.779241] ? unwind_get_return_address+0x29/0x40
    [ 92.779727] ? pcpu_alloc+0x102/0x8f0
    [ 92.780101] _cond_resched+0x23/0x50
    [ 92.780459] __mutex_lock+0xbd/0xad0
    [ 92.780818] ? pcpu_alloc+0x102/0x8f0
    [ 92.781194] ? seg6_build_state+0x11d/0x240
    [ 92.781611] ? save_stack+0x9b/0xb0
    [ 92.781965] ? __ww_mutex_wakeup_for_backoff+0xf0/0xf0
    [ 92.782480] ? seg6_build_state+0x11d/0x240
    [ 92.782925] ? lwtunnel_build_state+0x1bd/0x210
    [ 92.783393] ? ip6_route_info_create+0x687/0x1640
    [ 92.783846] ? ip6_route_add+0x74/0x110
    [ 92.784236] ? inet6_rtm_newroute+0x8a/0xd0

    Fixes: 6c8702c60b886 ("ipv6: sr: add support for SRH encapsulation and injection with lwtunnels")
    Signed-off-by: David Lebrun
    Signed-off-by: David S. Miller

    David Lebrun
     

22 Mar, 2018

8 commits

  • Simon Wunderlich says:

    ====================
    Here are some batman-adv bugfixes:

    - fix possible IPv6 packet loss when multicast extension is used, by Linus Luessing

    - fix SKB handling issues for TTVN and DAT, by Matthias Schiffer (two patches)

    - fix include for eventpoll, by Sven Eckelmann

    - fix skb checksum for ttvn reroutes, by Sven Eckelmann
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     
  • tcf_skbmod_init() can fail after the idr has been successfully reserved.
    When this happens, every subsequent attempt to configure skbmod rules
    using the same idr value will systematically fail with -ENOSPC, unless
    the first attempt was done using the 'replace' keyword:

    # tc action add action skbmod swap mac index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc action add action skbmod swap mac index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    # tc action add action skbmod swap mac index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    ...

    Fix this in tcf_skbmod_init(), ensuring that tcf_idr_release() is called
    on the error path when the idr has been reserved, but not yet inserted.
    Also, don't test 'ovr' in the error path, to avoid a 'replace' failure
    implicitly become a 'delete' that leaks refcount in act_skbmod module:

    # rmmod act_skbmod; modprobe act_skbmod
    # tc action add action skbmod swap mac index 100
    # tc action add action skbmod swap mac continue index 100
    RTNETLINK answers: File exists
    We have an error talking to the kernel
    # tc action replace action skbmod swap mac continue index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc action list action skbmod
    #
    # rmmod act_skbmod
    rmmod: ERROR: Module act_skbmod is in use

    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • tcf_vlan_init() can fail after the idr has been successfully reserved.
    When this happens, every subsequent attempt to configure vlan rules using
    the same idr value will systematically fail with -ENOSPC, unless the first
    attempt was done using the 'replace' keyword.

    # tc action add action vlan pop index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc action add action vlan pop index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    # tc action add action vlan pop index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    ...

    Fix this in tcf_vlan_init(), ensuring that tcf_idr_release() is called on
    the error path when the idr has been reserved, but not yet inserted. Also,
    don't test 'ovr' in the error path, to avoid a 'replace' failure implicitly
    become a 'delete' that leaks refcount in act_vlan module:

    # rmmod act_vlan; modprobe act_vlan
    # tc action add action vlan push id 5 index 100
    # tc action replace action vlan push id 7 index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc action list action vlan
    #
    # rmmod act_vlan
    rmmod: ERROR: Module act_vlan is in use

    Fixes: 4c5b9d9642c8 ("act_vlan: VLAN action rewrite to use RCU lock/unlock and update")
    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • __tcf_ipt_init() can fail after the idr has been successfully reserved.
    When this happens, subsequent attempts to configure xt/ipt rules using
    the same idr value systematically fail with -ENOSPC:

    # tc action add action xt -j LOG --log-prefix test1 index 100
    tablename: mangle hook: NF_IP_POST_ROUTING
    target: LOG level warning prefix "test1" index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    Command "(null)" is unknown, try "tc actions help".
    # tc action add action xt -j LOG --log-prefix test1 index 100
    tablename: mangle hook: NF_IP_POST_ROUTING
    target: LOG level warning prefix "test1" index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    Command "(null)" is unknown, try "tc actions help".
    # tc action add action xt -j LOG --log-prefix test1 index 100
    tablename: mangle hook: NF_IP_POST_ROUTING
    target: LOG level warning prefix "test1" index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    ...

    Fix this in the error path of __tcf_ipt_init(), calling tcf_idr_release()
    in place of tcf_idr_cleanup(). Since tcf_ipt_release() can now be called
    when tcfi_t is NULL, we also need to protect calls to ipt_destroy_target()
    to avoid NULL pointer dereference.

    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • tcf_pedit_init() can fail to allocate 'keys' after the idr has been
    successfully reserved. When this happens, subsequent attempts to configure
    a pedit rule using the same idr value systematically fail with -ENOSPC:

    # tc action add action pedit munge ip ttl set 63 index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc action add action pedit munge ip ttl set 63 index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    # tc action add action pedit munge ip ttl set 63 index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    ...

    Fix this in the error path of tcf_act_pedit_init(), calling
    tcf_idr_release() in place of tcf_idr_cleanup().

    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • tcf_act_police_init() can fail after the idr has been successfully
    reserved (e.g., qdisc_get_rtab() may return NULL). When this happens,
    subsequent attempts to configure a police rule using the same idr value
    systematiclly fail with -ENOSPC:

    # tc action add action police rate 1000 burst 1000 drop index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc action add action police rate 1000 burst 1000 drop index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    # tc action add action police rate 1000 burst 1000 drop index 100
    RTNETLINK answers: No space left on device
    ...

    Fix this in the error path of tcf_act_police_init(), calling
    tcf_idr_release() in place of tcf_idr_cleanup().

    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • if the kernel fails to duplicate 'sdata', creation of a new action fails
    with -ENOMEM. However, subsequent attempts to install the same action
    using the same value of 'index' systematically fail with -ENOSPC, and
    that value of 'index' will no more be usable by act_simple, until rmmod /
    insmod of act_simple.ko is done:

    # tc actions add action simple sdata hello index 100
    # tc actions list action simple

    action order 0: Simple
    index 100 ref 1 bind 0
    # tc actions flush action simple
    # tc actions add action simple sdata hello index 100
    RTNETLINK answers: Cannot allocate memory
    We have an error talking to the kernel
    # tc actions flush action simple
    # tc actions add action simple sdata hello index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    # tc actions add action simple sdata hello index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel
    ...

    Fix this in the error path of tcf_simp_init(), calling tcf_idr_release()
    in place of tcf_idr_cleanup().

    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Suggested-by: Cong Wang
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • when the following command sequence is entered

    # tc action add action bpf bytecode '4,40 0 0 12,31 0 1 2048,6 0 0 262144,6 0 0 0' index 100
    RTNETLINK answers: Invalid argument
    We have an error talking to the kernel
    # tc action add action bpf bytecode '4,40 0 0 12,21 0 1 2048,6 0 0 262144,6 0 0 0' index 100
    RTNETLINK answers: No space left on device
    We have an error talking to the kernel

    act_bpf correctly refuses to install the first TC rule, because 31 is not
    a valid instruction. However, it refuses to install the second TC rule,
    even if the BPF code is correct. Furthermore, it's no more possible to
    install any other rule having the same value of 'index' until act_bpf
    module is unloaded/inserted again. After the idr has been reserved, call
    tcf_idr_release() instead of tcf_idr_cleanup(), to fix this issue.

    Fixes: 65a206c01e8e ("net/sched: Change act_api and act_xxx modules to use IDR")
    Acked-by: Jamal Hadi Salim
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     

21 Mar, 2018

2 commits

  • Commit 7b6ddeaf27ec ("mac80211: use QoS NDP for AP probing") added an
    argument qos_ok to ieee80211_nullfunc_get to support QoS NDP. Despite
    the claim in the commit log "Change all the drivers to *not* allow
    QoS NDP for now, even though it looks like most of them should be OK
    with that", this commit enables QoS NDP in response to beacons (see
    change to mlme.c:ieee80211_send_nullfunc), causing ath9k_htc to lose
    IP connectivity. See:
    https://patchwork.kernel.org/patch/10241109/
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=891060

    Introduce a hardware flag to allow such buggy drivers to override the
    correct default behaviour of mac80211 of sending QoS NDP packets.

    Signed-off-by: Ben Caradoc-Davies
    Signed-off-by: Johannes Berg

    Ben Caradoc-Davies
     
  • Fixes: 2f987a76a977 ("net: ipv6: keep sk status consistent after datagram connect failure")
    Signed-off-by: Stefano Brivio
    Acked-by: Paolo Abeni
    Acked-by: Guillaume Nault
    Signed-off-by: David S. Miller

    Stefano Brivio
     

20 Mar, 2018

1 commit


18 Mar, 2018

8 commits

  • batadv_check_unicast_ttvn may redirect a packet to itself or another
    originator. This involves rewriting the ttvn and the destination address in
    the batadv unicast header. These field were not yet pulled (with skb rcsum
    update) and thus any change to them also requires a change in the receive
    checksum.

    Reported-by: Matthias Schiffer
    Fixes: a73105b8d4c7 ("batman-adv: improved client announcement mechanism")
    Signed-off-by: Sven Eckelmann
    Signed-off-by: Simon Wunderlich

    Sven Eckelmann
     
  • Fixes: a9a08845e9ac ("vfs: do bulk POLL* -> EPOLL* replacement")
    Signed-off-by: Sven Eckelmann
    Signed-off-by: Simon Wunderlich

    Sven Eckelmann
     
  • when the following command

    # tc action replace action skbmod swap mac index 100

    is run for the first time, and tcf_skbmod_init() fails to allocate struct
    tcf_skbmod_params, tcf_skbmod_cleanup() calls kfree_rcu(NULL), thus
    causing the following error:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    IP: __call_rcu+0x23/0x2b0
    PGD 8000000034057067 P4D 8000000034057067 PUD 74937067 PMD 0
    Oops: 0002 [#1] SMP PTI
    Modules linked in: act_skbmod(E) psample ip6table_filter ip6_tables iptable_filter binfmt_misc ext4 snd_hda_codec_generic snd_hda_intel snd_hda_codec crct10dif_pclmul mbcache jbd2 crc32_pclmul snd_hda_core ghash_clmulni_intel snd_hwdep pcbc snd_seq snd_seq_device snd_pcm aesni_intel snd_timer crypto_simd glue_helper snd cryptd virtio_balloon joydev soundcore pcspkr i2c_piix4 nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm drm virtio_console virtio_net virtio_blk ata_piix libata crc32c_intel virtio_pci serio_raw virtio_ring virtio i2c_core floppy dm_mirror dm_region_hash dm_log dm_mod [last unloaded: act_skbmod]
    CPU: 3 PID: 3144 Comm: tc Tainted: G E 4.16.0-rc4.act_vlan.orig+ #403
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    RIP: 0010:__call_rcu+0x23/0x2b0
    RSP: 0018:ffffbd2e403e7798 EFLAGS: 00010246
    RAX: ffffffffc0872080 RBX: ffff981d34bff780 RCX: 00000000ffffffff
    RDX: ffffffff922a5f00 RSI: 0000000000000000 RDI: 0000000000000000
    RBP: 0000000000000000 R08: 0000000000000001 R09: 000000000000021f
    R10: 000000003d003000 R11: 0000000000aaaaaa R12: 0000000000000000
    R13: ffffffff922a5f00 R14: 0000000000000001 R15: ffff981d3b698c2c
    FS: 00007f3678292740(0000) GS:ffff981d3fd80000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000008 CR3: 000000007c57a006 CR4: 00000000001606e0
    Call Trace:
    __tcf_idr_release+0x79/0xf0
    tcf_skbmod_init+0x1d1/0x210 [act_skbmod]
    tcf_action_init_1+0x2cc/0x430
    tcf_action_init+0xd3/0x1b0
    tc_ctl_action+0x18b/0x240
    rtnetlink_rcv_msg+0x29c/0x310
    ? _cond_resched+0x15/0x30
    ? __kmalloc_node_track_caller+0x1b9/0x270
    ? rtnl_calcit.isra.28+0x100/0x100
    netlink_rcv_skb+0xd2/0x110
    netlink_unicast+0x17c/0x230
    netlink_sendmsg+0x2cd/0x3c0
    sock_sendmsg+0x30/0x40
    ___sys_sendmsg+0x27a/0x290
    ? filemap_map_pages+0x34a/0x3a0
    ? __handle_mm_fault+0xbfd/0xe20
    __sys_sendmsg+0x51/0x90
    do_syscall_64+0x6e/0x1a0
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    RIP: 0033:0x7f36776a3ba0
    RSP: 002b:00007fff4703b618 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007fff4703b740 RCX: 00007f36776a3ba0
    RDX: 0000000000000000 RSI: 00007fff4703b690 RDI: 0000000000000003
    RBP: 000000005aaaba36 R08: 0000000000000002 R09: 0000000000000000
    R10: 00007fff4703b0a0 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007fff4703b754 R14: 0000000000000001 R15: 0000000000669f60
    Code: 5d e9 42 da ff ff 66 90 0f 1f 44 00 00 41 57 41 56 41 55 49 89 d5 41 54 55 48 89 fd 53 48 83 ec 08 40 f6 c7 07 0f 85 19 02 00 00 89 75 08 48 c7 45 00 00 00 00 00 9c 58 0f 1f 44 00 00 49 89
    RIP: __call_rcu+0x23/0x2b0 RSP: ffffbd2e403e7798
    CR2: 0000000000000008

    Fix it in tcf_skbmod_cleanup(), ensuring that kfree_rcu(p, ...) is called
    only when p is not NULL.

    Fixes: 86da71b57383 ("net_sched: Introduce skbmod action")
    Signed-off-by: Davide Caratti
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • when the following command

    # tc action add action sample rate 100 group 100 index 100

    is run for the first time, and psample_group_get(100) fails to create a
    new group, tcf_sample_cleanup() calls psample_group_put(NULL), thus
    causing the following error:

    BUG: unable to handle kernel NULL pointer dereference at 000000000000001c
    IP: psample_group_put+0x15/0x71 [psample]
    PGD 8000000075775067 P4D 8000000075775067 PUD 7453c067 PMD 0
    Oops: 0002 [#1] SMP PTI
    Modules linked in: act_sample(E) psample ip6table_filter ip6_tables iptable_filter binfmt_misc ext4 snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core mbcache jbd2 crct10dif_pclmul snd_hwdep crc32_pclmul snd_seq ghash_clmulni_intel pcbc snd_seq_device snd_pcm aesni_intel crypto_simd snd_timer glue_helper snd cryptd joydev pcspkr i2c_piix4 soundcore virtio_balloon nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm drm virtio_net ata_piix virtio_console virtio_blk libata serio_raw crc32c_intel virtio_pci i2c_core virtio_ring virtio floppy dm_mirror dm_region_hash dm_log dm_mod [last unloaded: act_tunnel_key]
    CPU: 2 PID: 5740 Comm: tc Tainted: G E 4.16.0-rc4.act_vlan.orig+ #403
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    RIP: 0010:psample_group_put+0x15/0x71 [psample]
    RSP: 0018:ffffb8a80032f7d0 EFLAGS: 00010246
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000024
    RDX: 0000000000000001 RSI: 0000000000000000 RDI: ffffffffc06d93c0
    RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000044
    R10: 00000000bd003000 R11: ffff979fba04aa59 R12: 0000000000000000
    R13: 0000000000000000 R14: 0000000000000000 R15: ffff979fbba3f22c
    FS: 00007f7638112740(0000) GS:ffff979fbfd00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 000000000000001c CR3: 00000000734ea001 CR4: 00000000001606e0
    Call Trace:
    __tcf_idr_release+0x79/0xf0
    tcf_sample_init+0x125/0x1d0 [act_sample]
    tcf_action_init_1+0x2cc/0x430
    tcf_action_init+0xd3/0x1b0
    tc_ctl_action+0x18b/0x240
    rtnetlink_rcv_msg+0x29c/0x310
    ? _cond_resched+0x15/0x30
    ? __kmalloc_node_track_caller+0x1b9/0x270
    ? rtnl_calcit.isra.28+0x100/0x100
    netlink_rcv_skb+0xd2/0x110
    netlink_unicast+0x17c/0x230
    netlink_sendmsg+0x2cd/0x3c0
    sock_sendmsg+0x30/0x40
    ___sys_sendmsg+0x27a/0x290
    ? filemap_map_pages+0x34a/0x3a0
    ? __handle_mm_fault+0xbfd/0xe20
    __sys_sendmsg+0x51/0x90
    do_syscall_64+0x6e/0x1a0
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    RIP: 0033:0x7f7637523ba0
    RSP: 002b:00007fff0473ef58 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007fff0473f080 RCX: 00007f7637523ba0
    RDX: 0000000000000000 RSI: 00007fff0473efd0 RDI: 0000000000000003
    RBP: 000000005aaaac80 R08: 0000000000000002 R09: 0000000000000000
    R10: 00007fff0473e9e0 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007fff0473f094 R14: 0000000000000001 R15: 0000000000669f60
    Code: be 02 00 00 00 48 89 df e8 a9 fe ff ff e9 7c ff ff ff 0f 1f 40 00 0f 1f 44 00 00 53 48 89 fb 48 c7 c7 c0 93 6d c0 e8 db 20 8c ef 6b 1c 01 74 10 48 c7 c7 c0 93 6d c0 ff 14 25 e8 83 83 b0 5b
    RIP: psample_group_put+0x15/0x71 [psample] RSP: ffffb8a80032f7d0
    CR2: 000000000000001c

    Fix it in tcf_sample_cleanup(), ensuring that calls to psample_group_put(p)
    are done only when p is not NULL.

    Fixes: cadb9c9fdbc6 ("net/sched: act_sample: Fix error path in init")
    Signed-off-by: Davide Caratti
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • when the following command

    # tc action add action tunnel_key unset index 100

    is run for the first time, and tunnel_key_init() fails to allocate struct
    tcf_tunnel_key_params, tunnel_key_release() dereferences NULL pointers.
    This causes the following error:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
    IP: tunnel_key_release+0xd/0x40 [act_tunnel_key]
    PGD 8000000033787067 P4D 8000000033787067 PUD 74646067 PMD 0
    Oops: 0000 [#1] SMP PTI
    Modules linked in: act_tunnel_key(E) act_csum ip6table_filter ip6_tables iptable_filter binfmt_misc ext4 mbcache jbd2 crct10dif_pclmul crc32_pclmul snd_hda_codec_generic ghash_clmulni_intel snd_hda_intel pcbc snd_hda_codec snd_hda_core snd_hwdep snd_seq aesni_intel snd_seq_device crypto_simd glue_helper snd_pcm cryptd joydev snd_timer pcspkr virtio_balloon snd i2c_piix4 soundcore nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm virtio_net virtio_blk drm virtio_console crc32c_intel ata_piix serio_raw i2c_core virtio_pci libata virtio_ring virtio floppy dm_mirror dm_region_hash dm_log dm_mod
    CPU: 2 PID: 3101 Comm: tc Tainted: G E 4.16.0-rc4.act_vlan.orig+ #403
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    RIP: 0010:tunnel_key_release+0xd/0x40 [act_tunnel_key]
    RSP: 0018:ffffba46803b7768 EFLAGS: 00010286
    RAX: ffffffffc09010a0 RBX: 0000000000000000 RCX: 0000000000000024
    RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffff99ee336d7480
    RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000044
    R10: 0000000000000220 R11: ffff99ee79d73131 R12: 0000000000000000
    R13: ffff99ee32d67610 R14: ffff99ee7671dc38 R15: 00000000fffffff4
    FS: 00007febcb2cd740(0000) GS:ffff99ee7fd00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000010 CR3: 000000007c8e4005 CR4: 00000000001606e0
    Call Trace:
    __tcf_idr_release+0x79/0xf0
    tunnel_key_init+0xd9/0x460 [act_tunnel_key]
    tcf_action_init_1+0x2cc/0x430
    tcf_action_init+0xd3/0x1b0
    tc_ctl_action+0x18b/0x240
    rtnetlink_rcv_msg+0x29c/0x310
    ? _cond_resched+0x15/0x30
    ? __kmalloc_node_track_caller+0x1b9/0x270
    ? rtnl_calcit.isra.28+0x100/0x100
    netlink_rcv_skb+0xd2/0x110
    netlink_unicast+0x17c/0x230
    netlink_sendmsg+0x2cd/0x3c0
    sock_sendmsg+0x30/0x40
    ___sys_sendmsg+0x27a/0x290
    __sys_sendmsg+0x51/0x90
    do_syscall_64+0x6e/0x1a0
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    RIP: 0033:0x7febca6deba0
    RSP: 002b:00007ffe7b0dd128 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007ffe7b0dd250 RCX: 00007febca6deba0
    RDX: 0000000000000000 RSI: 00007ffe7b0dd1a0 RDI: 0000000000000003
    RBP: 000000005aaa90cb R08: 0000000000000002 R09: 0000000000000000
    R10: 00007ffe7b0dcba0 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007ffe7b0dd264 R14: 0000000000000001 R15: 0000000000669f60
    Code: 44 00 00 8b 0d b5 23 00 00 48 8b 87 48 10 00 00 48 8b 3c c8 e9 a5 e5 d8 c3 0f 1f 44 00 00 0f 1f 44 00 00 53 48 8b 9f b0 00 00 00 7b 10 01 74 0b 48 89 df 31 f6 5b e9 f2 fa 7f c3 48 8b 7b 18
    RIP: tunnel_key_release+0xd/0x40 [act_tunnel_key] RSP: ffffba46803b7768
    CR2: 0000000000000010

    Fix this in tunnel_key_release(), ensuring 'param' is not NULL before
    dereferencing it.

    Fixes: d0f6dd8a914f ("net/sched: Introduce act_tunnel_key")
    Signed-off-by: Davide Caratti
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • when the following command

    # tc action add action csum udp continue index 100

    is run for the first time, and tcf_csum_init() fails allocating struct
    tcf_csum, tcf_csum_cleanup() calls kfree_rcu(NULL,...). This causes the
    following error:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000010
    IP: __call_rcu+0x23/0x2b0
    PGD 80000000740b4067 P4D 80000000740b4067 PUD 32e7f067 PMD 0
    Oops: 0002 [#1] SMP PTI
    Modules linked in: act_csum(E) act_vlan ip6table_filter ip6_tables iptable_filter binfmt_misc ext4 mbcache jbd2 crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_codec_generic pcbc snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer aesni_intel crypto_simd glue_helper cryptd snd joydev pcspkr virtio_balloon i2c_piix4 soundcore nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm virtio_blk drm virtio_net virtio_console ata_piix crc32c_intel libata virtio_pci serio_raw i2c_core virtio_ring virtio floppy dm_mirror dm_region_hash dm_log dm_mod [last unloaded: act_vlan]
    CPU: 2 PID: 5763 Comm: tc Tainted: G E 4.16.0-rc4.act_vlan.orig+ #403
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    RIP: 0010:__call_rcu+0x23/0x2b0
    RSP: 0018:ffffb275803e77c0 EFLAGS: 00010246
    RAX: ffffffffc057b080 RBX: ffff9674bc6f5240 RCX: 00000000ffffffff
    RDX: ffffffff928a5f00 RSI: 0000000000000008 RDI: 0000000000000008
    RBP: 0000000000000008 R08: 0000000000000001 R09: 0000000000000044
    R10: 0000000000000220 R11: ffff9674b9ab4821 R12: 0000000000000000
    R13: ffffffff928a5f00 R14: 0000000000000000 R15: 0000000000000001
    FS: 00007fa6368d8740(0000) GS:ffff9674bfd00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000010 CR3: 0000000073dec001 CR4: 00000000001606e0
    Call Trace:
    __tcf_idr_release+0x79/0xf0
    tcf_csum_init+0xfb/0x180 [act_csum]
    tcf_action_init_1+0x2cc/0x430
    tcf_action_init+0xd3/0x1b0
    tc_ctl_action+0x18b/0x240
    rtnetlink_rcv_msg+0x29c/0x310
    ? _cond_resched+0x15/0x30
    ? __kmalloc_node_track_caller+0x1b9/0x270
    ? rtnl_calcit.isra.28+0x100/0x100
    netlink_rcv_skb+0xd2/0x110
    netlink_unicast+0x17c/0x230
    netlink_sendmsg+0x2cd/0x3c0
    sock_sendmsg+0x30/0x40
    ___sys_sendmsg+0x27a/0x290
    ? filemap_map_pages+0x34a/0x3a0
    ? __handle_mm_fault+0xbfd/0xe20
    __sys_sendmsg+0x51/0x90
    do_syscall_64+0x6e/0x1a0
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    RIP: 0033:0x7fa635ce9ba0
    RSP: 002b:00007ffc185b0fc8 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007ffc185b10f0 RCX: 00007fa635ce9ba0
    RDX: 0000000000000000 RSI: 00007ffc185b1040 RDI: 0000000000000003
    RBP: 000000005aaa85e0 R08: 0000000000000002 R09: 0000000000000000
    R10: 00007ffc185b0a20 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007ffc185b1104 R14: 0000000000000001 R15: 0000000000669f60
    Code: 5d e9 42 da ff ff 66 90 0f 1f 44 00 00 41 57 41 56 41 55 49 89 d5 41 54 55 48 89 fd 53 48 83 ec 08 40 f6 c7 07 0f 85 19 02 00 00 89 75 08 48 c7 45 00 00 00 00 00 9c 58 0f 1f 44 00 00 49 89
    RIP: __call_rcu+0x23/0x2b0 RSP: ffffb275803e77c0
    CR2: 0000000000000010

    fix this in tcf_csum_cleanup(), ensuring that kfree_rcu(param, ...) is
    called only when param is not NULL.

    Fixes: 9c5f69bbd75a ("net/sched: act_csum: don't use spinlock in the fast path")
    Signed-off-by: Davide Caratti
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • when the following command

    # tc actions replace action vlan pop index 100

    is run for the first time, and tcf_vlan_init() fails allocating struct
    tcf_vlan_params, tcf_vlan_cleanup() calls kfree_rcu(NULL, ...). This causes
    the following error:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
    IP: __call_rcu+0x23/0x2b0
    PGD 80000000760a2067 P4D 80000000760a2067 PUD 742c1067 PMD 0
    Oops: 0002 [#1] SMP PTI
    Modules linked in: act_vlan(E) ip6table_filter ip6_tables iptable_filter binfmt_misc ext4 snd_hda_codec_generic snd_hda_intel mbcache snd_hda_codec jbd2 snd_hda_core crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc snd_hwdep snd_seq snd_seq_device snd_pcm aesni_intel crypto_simd snd_timer glue_helper snd cryptd joydev soundcore virtio_balloon pcspkr i2c_piix4 nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c ata_generic pata_acpi qxl drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm drm virtio_console virtio_blk virtio_net ata_piix crc32c_intel libata virtio_pci i2c_core virtio_ring serio_raw virtio floppy dm_mirror dm_region_hash dm_log dm_mod [last unloaded: act_vlan]
    CPU: 3 PID: 3119 Comm: tc Tainted: G E 4.16.0-rc4.act_vlan.orig+ #403
    Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
    RIP: 0010:__call_rcu+0x23/0x2b0
    RSP: 0018:ffffaac3005fb798 EFLAGS: 00010246
    RAX: ffffffffc0704080 RBX: ffff97f2b4bbe900 RCX: 00000000ffffffff
    RDX: ffffffffabca5f00 RSI: 0000000000000010 RDI: 0000000000000010
    RBP: 0000000000000010 R08: 0000000000000001 R09: 0000000000000044
    R10: 00000000fd003000 R11: ffff97f2faab5b91 R12: 0000000000000000
    R13: ffffffffabca5f00 R14: ffff97f2fb80202c R15: 00000000fffffff4
    FS: 00007f68f75b4740(0000) GS:ffff97f2ffd80000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000000000018 CR3: 0000000072b52001 CR4: 00000000001606e0
    Call Trace:
    __tcf_idr_release+0x79/0xf0
    tcf_vlan_init+0x168/0x270 [act_vlan]
    tcf_action_init_1+0x2cc/0x430
    tcf_action_init+0xd3/0x1b0
    tc_ctl_action+0x18b/0x240
    rtnetlink_rcv_msg+0x29c/0x310
    ? _cond_resched+0x15/0x30
    ? __kmalloc_node_track_caller+0x1b9/0x270
    ? rtnl_calcit.isra.28+0x100/0x100
    netlink_rcv_skb+0xd2/0x110
    netlink_unicast+0x17c/0x230
    netlink_sendmsg+0x2cd/0x3c0
    sock_sendmsg+0x30/0x40
    ___sys_sendmsg+0x27a/0x290
    ? filemap_map_pages+0x34a/0x3a0
    ? __handle_mm_fault+0xbfd/0xe20
    __sys_sendmsg+0x51/0x90
    do_syscall_64+0x6e/0x1a0
    entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    RIP: 0033:0x7f68f69c5ba0
    RSP: 002b:00007fffd79c1118 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007fffd79c1240 RCX: 00007f68f69c5ba0
    RDX: 0000000000000000 RSI: 00007fffd79c1190 RDI: 0000000000000003
    RBP: 000000005aaa708e R08: 0000000000000002 R09: 0000000000000000
    R10: 00007fffd79c0ba0 R11: 0000000000000246 R12: 0000000000000000
    R13: 00007fffd79c1254 R14: 0000000000000001 R15: 0000000000669f60
    Code: 5d e9 42 da ff ff 66 90 0f 1f 44 00 00 41 57 41 56 41 55 49 89 d5 41 54 55 48 89 fd 53 48 83 ec 08 40 f6 c7 07 0f 85 19 02 00 00 89 75 08 48 c7 45 00 00 00 00 00 9c 58 0f 1f 44 00 00 49 89
    RIP: __call_rcu+0x23/0x2b0 RSP: ffffaac3005fb798
    CR2: 0000000000000018

    fix this in tcf_vlan_cleanup(), ensuring that kfree_rcu(p, ...) is called
    only when p is not NULL.

    Fixes: 4c5b9d9642c8 ("act_vlan: VLAN action rewrite to use RCU lock/unlock and update")
    Acked-by: Jiri Pirko
    Acked-by: Manish Kurup
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti
     
  • syzbot reported one use-after-free in pfifo_fast_enqueue() [1]

    Issue here is that we can not reuse skb after a successful skb_array_produce()
    since another cpu might have consumed it already.

    I believe a similar problem exists in try_bulk_dequeue_skb_slow()
    in case we put an skb into qdisc_enqueue_skb_bad_txq() for lockless qdisc.

    [1]
    BUG: KASAN: use-after-free in qdisc_pkt_len include/net/sch_generic.h:610 [inline]
    BUG: KASAN: use-after-free in qdisc_qstats_cpu_backlog_inc include/net/sch_generic.h:712 [inline]
    BUG: KASAN: use-after-free in pfifo_fast_enqueue+0x4bc/0x5e0 net/sched/sch_generic.c:639
    Read of size 4 at addr ffff8801cede37e8 by task syzkaller717588/5543

    CPU: 1 PID: 5543 Comm: syzkaller717588 Not tainted 4.16.0-rc4+ #265
    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+0x194/0x24d lib/dump_stack.c:53
    print_address_description+0x73/0x250 mm/kasan/report.c:256
    kasan_report_error mm/kasan/report.c:354 [inline]
    kasan_report+0x23c/0x360 mm/kasan/report.c:412
    __asan_report_load4_noabort+0x14/0x20 mm/kasan/report.c:432
    qdisc_pkt_len include/net/sch_generic.h:610 [inline]
    qdisc_qstats_cpu_backlog_inc include/net/sch_generic.h:712 [inline]
    pfifo_fast_enqueue+0x4bc/0x5e0 net/sched/sch_generic.c:639
    __dev_xmit_skb net/core/dev.c:3216 [inline]

    Fixes: c5ad119fb6c0 ("net: sched: pfifo_fast use skb_array")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot+ed43b6903ab968b16f54@syzkaller.appspotmail.com
    Cc: John Fastabend
    Cc: Jamal Hadi Salim
    Cc: Cong Wang
    Cc: Jiri Pirko
    Acked-by: John Fastabend
    Signed-off-by: David S. Miller

    Eric Dumazet
     

17 Mar, 2018

4 commits

  • Checking for 0 is insufficient: when an SKB without a batadv header, but
    with a VLAN header is received, hdr_size will be 4, making the following
    code interpret the Ethernet header as a batadv header.

    Fixes: be1db4f6615b ("batman-adv: make the Distributed ARP Table vlan aware")
    Signed-off-by: Matthias Schiffer
    Signed-off-by: Sven Eckelmann
    Signed-off-by: Simon Wunderlich

    Matthias Schiffer
     
  • batadv_check_unicast_ttvn() calls skb_cow(), so pointers into the SKB data
    must be (re)set after calling it. The ethhdr variable is dropped
    altogether.

    Fixes: 7cdcf6dddc42 ("batman-adv: add UNICAST_4ADDR packet type")
    Signed-off-by: Matthias Schiffer
    Signed-off-by: Sven Eckelmann
    Signed-off-by: Simon Wunderlich

    Matthias Schiffer
     
  • When errors are enqueued to the error queue via sock_queue_err_skb()
    function, it is possible that the waiting application is not notified.

    Calling 'sk->sk_data_ready()' would not notify applications that
    selected only POLLERR events in poll() (for example).

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Reported-by: Randy E. Witt
    Reviewed-by: Eric Dumazet
    Signed-off-by: Vinicius Costa Gomes
    Signed-off-by: David S. Miller

    Vinicius Costa Gomes
     
  • nlmsg_multicast() consumes always the skb, thus the original skb must be
    freed only when this function is called with a clone.

    Fixes: cb9f7a9a5c96 ("netlink: ensure to loop over all netns in genlmsg_multicast_allns()")
    Reported-by: Ben Hutchings
    Signed-off-by: Nicolas Dichtel
    Signed-off-by: David S. Miller

    Nicolas Dichtel
     

16 Mar, 2018

5 commits

  • Free memory by calling put_device(), if afiucv_iucv_init is not
    successful.

    Signed-off-by: Arvind Yadav
    Reviewed-by: Cornelia Huck
    Signed-off-by: Ursula Braun
    Signed-off-by: Julian Wiedmann
    Signed-off-by: David S. Miller

    Arvind Yadav
     
  • Need to lock lower socket in order to provide mutual exclusion
    with kcm_unattach.

    v2: Add Reported-by for syzbot

    Fixes: ab7ac4eb9832e32a09f4e804 ("kcm: Kernel Connection Multiplexor module")
    Reported-by: syzbot+ea75c0ffcd353d32515f064aaebefc5279e6161e@syzkaller.appspotmail.com
    Signed-off-by: Tom Herbert
    Signed-off-by: David S. Miller

    Tom Herbert
     
  • With reorder header off, received packets are untagged in skb_vlan_untag()
    called from within __netif_receive_skb_core(), and later the tag will be
    inserted back in vlan_do_receive().

    This caused out of order vlan headers when we create a vlan device on top
    of another vlan device, because vlan_do_receive() inserts a tag as the
    outermost vlan tag. E.g. the outer tag is first removed in skb_vlan_untag()
    and inserted back in vlan_do_receive(), then the inner tag is next removed
    and inserted back as the outermost tag.

    This patch fixes the behaviour by inserting the inner tag at the right
    position.

    Signed-off-by: Toshiaki Makita
    Signed-off-by: David S. Miller

    Toshiaki Makita
     
  • When we have a bridge with vlan_filtering on and a vlan device on top of
    it, packets would be corrupted in skb_vlan_untag() called from
    br_dev_xmit().

    The problem sits in skb_reorder_vlan_header() used in skb_vlan_untag(),
    which makes use of skb->mac_len. In this function mac_len is meant for
    handling rx path with vlan devices with reorder_header disabled, but in
    tx path mac_len is typically 0 and cannot be used, which is the problem
    in this case.

    The current code even does not properly handle rx path (skb_vlan_untag()
    called from __netif_receive_skb_core()) with reorder_header off actually.

    In rx path single tag case, it works as follows:

    - Before skb_reorder_vlan_header()

    mac_header data
    v v
    +-------------------+-------------+------+----
    | ETH | VLAN | ETH |
    | ADDRS | TPID | TCI | TYPE |
    +-------------------+-------------+------+----


    to be removed

    - After skb_reorder_vlan_header()

    mac_header data
    v v
    +-------------------+------+----
    | ETH | ETH |
    | ADDRS | TYPE |
    +-------------------+------+----

    This is ok, but in rx double tag case, it corrupts packets:

    - Before skb_reorder_vlan_header()

    mac_header data
    v v
    +-------------------+-------------+-------------+------+----
    | ETH | VLAN | VLAN | ETH |
    | ADDRS | TPID | TCI | TPID | TCI | TYPE |
    +-------------------+-------------+-------------+------+----


    should be removed

    actually will be removed

    - After skb_reorder_vlan_header()

    mac_header data
    v v
    +-------------------+------+----
    | ETH | ETH |
    | ADDRS | TYPE |
    +-------------------+------+----

    So, two of vlan tags are both removed while only inner one should be
    removed and mac_header (and mac_len) is broken.

    skb_vlan_untag() is meant for removing the vlan header at (skb->data - 2),
    so use skb->data and skb->mac_header to calculate the right offset.

    Reported-by: Brandon Carpenter
    Fixes: a6e18ff11170 ("vlan: Fix untag operations of stacked vlans with REORDER_HEADER off")
    Signed-off-by: Toshiaki Makita
    Signed-off-by: David S. Miller

    Toshiaki Makita
     
  • If set/unset mode of the tunnel_key action is not provided, ->init() still
    returns 0, and the caller proceeds with bogus 'struct tc_action *' object,
    this results in crash:

    % tc actions add action tunnel_key src_ip 1.1.1.1 dst_ip 2.2.2.1 id 7 index 1

    [ 35.805515] general protection fault: 0000 [#1] SMP PTI
    [ 35.806161] Modules linked in: act_tunnel_key kvm_intel kvm irqbypass
    crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc aesni_intel aes_x86_64
    crypto_simd glue_helper cryptd serio_raw
    [ 35.808233] CPU: 1 PID: 428 Comm: tc Not tainted 4.16.0-rc4+ #286
    [ 35.808929] RIP: 0010:tcf_action_init+0x90/0x190
    [ 35.809457] RSP: 0018:ffffb8edc068b9a0 EFLAGS: 00010206
    [ 35.810053] RAX: 1320c000000a0003 RBX: 0000000000000001 RCX: 0000000000000000
    [ 35.810866] RDX: 0000000000000070 RSI: 0000000000007965 RDI: ffffb8edc068b910
    [ 35.811660] RBP: ffffb8edc068b9d0 R08: 0000000000000000 R09: ffffb8edc068b808
    [ 35.812463] R10: ffffffffc02bf040 R11: 0000000000000040 R12: ffffb8edc068bb38
    [ 35.813235] R13: 0000000000000000 R14: 0000000000000000 R15: ffffb8edc068b910
    [ 35.814006] FS: 00007f3d0d8556c0(0000) GS:ffff91d1dbc40000(0000)
    knlGS:0000000000000000
    [ 35.814881] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 35.815540] CR2: 000000000043f720 CR3: 0000000019248001 CR4: 00000000001606a0
    [ 35.816457] Call Trace:
    [ 35.817158] tc_ctl_action+0x11a/0x220
    [ 35.817795] rtnetlink_rcv_msg+0x23d/0x2e0
    [ 35.818457] ? __slab_alloc+0x1c/0x30
    [ 35.819079] ? __kmalloc_node_track_caller+0xb1/0x2b0
    [ 35.819544] ? rtnl_calcit.isra.30+0xe0/0xe0
    [ 35.820231] netlink_rcv_skb+0xce/0x100
    [ 35.820744] netlink_unicast+0x164/0x220
    [ 35.821500] netlink_sendmsg+0x293/0x370
    [ 35.822040] sock_sendmsg+0x30/0x40
    [ 35.822508] ___sys_sendmsg+0x2c5/0x2e0
    [ 35.823149] ? pagecache_get_page+0x27/0x220
    [ 35.823714] ? filemap_fault+0xa2/0x640
    [ 35.824423] ? page_add_file_rmap+0x108/0x200
    [ 35.825065] ? alloc_set_pte+0x2aa/0x530
    [ 35.825585] ? finish_fault+0x4e/0x70
    [ 35.826140] ? __handle_mm_fault+0xbc1/0x10d0
    [ 35.826723] ? __sys_sendmsg+0x41/0x70
    [ 35.827230] __sys_sendmsg+0x41/0x70
    [ 35.827710] do_syscall_64+0x68/0x120
    [ 35.828195] entry_SYSCALL_64_after_hwframe+0x3d/0xa2
    [ 35.828859] RIP: 0033:0x7f3d0ca4da67
    [ 35.829331] RSP: 002b:00007ffc9f284338 EFLAGS: 00000246 ORIG_RAX:
    000000000000002e
    [ 35.830304] RAX: ffffffffffffffda RBX: 00007ffc9f284460 RCX: 00007f3d0ca4da67
    [ 35.831247] RDX: 0000000000000000 RSI: 00007ffc9f2843b0 RDI: 0000000000000003
    [ 35.832167] RBP: 000000005aa6a7a9 R08: 0000000000000001 R09: 0000000000000000
    [ 35.833075] R10: 00000000000005f1 R11: 0000000000000246 R12: 0000000000000000
    [ 35.833997] R13: 00007ffc9f2884c0 R14: 0000000000000001 R15: 0000000000674640
    [ 35.834923] Code: 24 30 bb 01 00 00 00 45 31 f6 eb 5e 8b 50 08 83 c2 07 83 e2
    fc 83 c2 70 49 8b 07 48 8b 40 70 48 85 c0 74 10 48 89 14 24 4c 89 ff d0 48
    8b 14 24 48 01 c2 49 01 d6 45 85 ed 74 05 41 83 47 2c
    [ 35.837442] RIP: tcf_action_init+0x90/0x190 RSP: ffffb8edc068b9a0
    [ 35.838291] ---[ end trace a095c06ee4b97a26 ]---

    Fixes: d0f6dd8a914f ("net/sched: Introduce act_tunnel_key")
    Signed-off-by: Roman Mashak
    Acked-by: Cong Wang
    Signed-off-by: David S. Miller

    Roman Mashak
     

15 Mar, 2018

3 commits

  • Closing of a listen socket wakes up kernel_accept() of
    smc_tcp_listen_worker(), and then has to wait till smc_tcp_listen_worker()
    gives up the internal clcsock. The wait logic introduced with
    commit 127f49705823 ("net/smc: release clcsock from tcp_listen_worker")
    might wait longer than necessary. This patch implements the idea to
    implement the wait just with flush_work(), and gets rid of the extra
    smc_close_wait_listen_clcsock() function.

    Fixes: 127f49705823 ("net/smc: release clcsock from tcp_listen_worker")
    Reported-by: Hans Wippel
    Signed-off-by: Ursula Braun
    Signed-off-by: David S. Miller

    Ursula Braun
     
  • Prior to the rework of PMTU information storage in commit
    2c8cec5c10bc ("ipv4: Cache learned PMTU information in inetpeer."),
    when a PMTU event advertising a PMTU smaller than
    net.ipv4.route.min_pmtu was received, we would disable setting the DF
    flag on packets by locking the MTU metric, and set the PMTU to
    net.ipv4.route.min_pmtu.

    Since then, we don't disable DF, and set PMTU to
    net.ipv4.route.min_pmtu, so the intermediate router that has this link
    with a small MTU will have to drop the packets.

    This patch reestablishes pre-2.6.39 behavior by splitting
    rtable->rt_pmtu into a bitfield with rt_mtu_locked and rt_pmtu.
    rt_mtu_locked indicates that we shouldn't set the DF bit on that path,
    and is checked in ip_dont_fragment().

    One possible workaround is to set net.ipv4.route.min_pmtu to a value low
    enough to accommodate the lowest MTU encountered.

    Fixes: 2c8cec5c10bc ("ipv4: Cache learned PMTU information in inetpeer.")
    Signed-off-by: Sabrina Dubroca
    Reviewed-by: Stefano Brivio
    Signed-off-by: David S. Miller

    Sabrina Dubroca
     
  • Andrei Vagin reported a KASAN: slab-out-of-bounds error in
    skb_update_prio()

    Since SYNACK might be attached to a request socket, we need to
    get back to the listener socket.
    Since this listener is manipulated without locks, add const
    qualifiers to sock_cgroup_prioidx() so that the const can also
    be used in skb_update_prio()

    Also add the const qualifier to sock_cgroup_classid() for consistency.

    Fixes: ca6fb0651883 ("tcp: attach SYNACK messages to request sockets instead of listener")
    Signed-off-by: Eric Dumazet
    Reported-by: Andrei Vagin
    Signed-off-by: David S. Miller

    Eric Dumazet
     

13 Mar, 2018

5 commits

  • Steffen Klassert says:

    ====================
    pull request (net): ipsec 2018-03-13

    1) Refuse to insert 32 bit userspace socket policies on 64
    bit systems like we do it for standard policies. We don't
    have a compat layer, so inserting socket policies from
    32 bit userspace will lead to a broken configuration.

    2) Make the policy hold queue work without the flowcache.
    Dummy bundles are not chached anymore, so we need to
    generate a new one on each lookup as long as the SAs
    are not yet in place.

    3) Fix the validation of the esn replay attribute. The
    The sanity check in verify_replay() is bypassed if
    the XFRM_STATE_ESN flag is not set. Fix this by doing
    the sanity check uncoditionally.
    From Florian Westphal.

    4) After most of the dst_entry garbage collection code
    is removed, we may leak xfrm_dst entries as they are
    neither cached nor tracked somewhere. Fix this by
    reusing the 'uncached_list' to track xfrm_dst entries
    too. From Xin Long.

    5) Fix a rcu_read_lock/rcu_read_unlock imbalance in
    xfrm_get_tos() From Xin Long.

    6) Fix an infinite loop in xfrm_get_dst_nexthop. On
    transport mode we fetch the child dst_entry after
    we continue, so this pointer is never updated.
    Fix this by fetching it before we continue.

    7) Fix ESN sequence number gap after IPsec GSO packets.
    We accidentally increment the sequence number counter
    on the xfrm_state by one packet too much in the ESN
    case. Fix this by setting the sequence number to the
    correct value.

    8) Reset the ethernet protocol after decapsulation only if a
    mac header was set. Otherwise it breaks configurations
    with TUN devices. From Yossi Kuperman.

    9) Fix __this_cpu_read() usage in preemptible code. Use
    this_cpu_read() instead in ipcomp_alloc_tfms().
    From Greg Hackmann.

    Please pull or let me know if there are problems.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     
  • f7c83bcbfaf5 ("net: xfrm: use __this_cpu_read per-cpu helper") added a
    __this_cpu_read() call inside ipcomp_alloc_tfms().

    At the time, __this_cpu_read() required the caller to either not care
    about races or to handle preemption/interrupt issues. 3.15 tightened
    the rules around some per-cpu operations, and now __this_cpu_read()
    should never be used in a preemptible context. On 3.15 and later, we
    need to use this_cpu_read() instead.

    syzkaller reported this leading to the following kernel BUG while
    fuzzing sendmsg:

    BUG: using __this_cpu_read() in preemptible [00000000] code: repro/3101
    caller is ipcomp_init_state+0x185/0x990
    CPU: 3 PID: 3101 Comm: repro Not tainted 4.16.0-rc4-00123-g86f84779d8e9 #154
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014
    Call Trace:
    dump_stack+0xb9/0x115
    check_preemption_disabled+0x1cb/0x1f0
    ipcomp_init_state+0x185/0x990
    ? __xfrm_init_state+0x876/0xc20
    ? lock_downgrade+0x5e0/0x5e0
    ipcomp4_init_state+0xaa/0x7c0
    __xfrm_init_state+0x3eb/0xc20
    xfrm_init_state+0x19/0x60
    pfkey_add+0x20df/0x36f0
    ? pfkey_broadcast+0x3dd/0x600
    ? pfkey_sock_destruct+0x340/0x340
    ? pfkey_seq_stop+0x80/0x80
    ? __skb_clone+0x236/0x750
    ? kmem_cache_alloc+0x1f6/0x260
    ? pfkey_sock_destruct+0x340/0x340
    ? pfkey_process+0x62a/0x6f0
    pfkey_process+0x62a/0x6f0
    ? pfkey_send_new_mapping+0x11c0/0x11c0
    ? mutex_lock_io_nested+0x1390/0x1390
    pfkey_sendmsg+0x383/0x750
    ? dump_sp+0x430/0x430
    sock_sendmsg+0xc0/0x100
    ___sys_sendmsg+0x6c8/0x8b0
    ? copy_msghdr_from_user+0x3b0/0x3b0
    ? pagevec_lru_move_fn+0x144/0x1f0
    ? find_held_lock+0x32/0x1c0
    ? do_huge_pmd_anonymous_page+0xc43/0x11e0
    ? lock_downgrade+0x5e0/0x5e0
    ? get_kernel_page+0xb0/0xb0
    ? _raw_spin_unlock+0x29/0x40
    ? do_huge_pmd_anonymous_page+0x400/0x11e0
    ? __handle_mm_fault+0x553/0x2460
    ? __fget_light+0x163/0x1f0
    ? __sys_sendmsg+0xc7/0x170
    __sys_sendmsg+0xc7/0x170
    ? SyS_shutdown+0x1a0/0x1a0
    ? __do_page_fault+0x5a0/0xca0
    ? lock_downgrade+0x5e0/0x5e0
    SyS_sendmsg+0x27/0x40
    ? __sys_sendmsg+0x170/0x170
    do_syscall_64+0x19f/0x640
    entry_SYSCALL_64_after_hwframe+0x42/0xb7
    RIP: 0033:0x7f0ee73dfb79
    RSP: 002b:00007ffe14fc15a8 EFLAGS: 00000207 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f0ee73dfb79
    RDX: 0000000000000000 RSI: 00000000208befc8 RDI: 0000000000000004
    RBP: 00007ffe14fc15b0 R08: 00007ffe14fc15c0 R09: 00007ffe14fc15c0
    R10: 0000000000000000 R11: 0000000000000207 R12: 0000000000400440
    R13: 00007ffe14fc16b0 R14: 0000000000000000 R15: 0000000000000000

    Signed-off-by: Greg Hackmann
    Signed-off-by: Steffen Klassert

    Greg Hackmann
     
  • During the conversion to dsa_is_user_port(), a condition ended up being
    reversed, which would prevent the creation of any user port when using
    the legacy binding and/or platform data, fix that.

    Fixes: 4a5b85ffe2a0 ("net: dsa: use dsa_is_user_port everywhere")
    Signed-off-by: Florian Fainelli
    Signed-off-by: David S. Miller

    Florian Fainelli
     
  • The l2tp_tunnel_create() function checks for v4mapped ipv6
    sockets and cache that flag, so that l2tp core code can
    reusing it at xmit time.

    If the socket is provided by the userspace, the connection
    status of the tunnel sockets can change between the tunnel
    creation and the xmit call, so that syzbot is able to
    trigger the following splat:

    BUG: KASAN: use-after-free in ip6_dst_idev include/net/ip6_fib.h:192
    [inline]
    BUG: KASAN: use-after-free in ip6_xmit+0x1f76/0x2260
    net/ipv6/ip6_output.c:264
    Read of size 8 at addr ffff8801bd949318 by task syz-executor4/23448

    CPU: 0 PID: 23448 Comm: syz-executor4 Not tainted 4.16.0-rc4+ #65
    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+0x194/0x24d lib/dump_stack.c:53
    print_address_description+0x73/0x250 mm/kasan/report.c:256
    kasan_report_error mm/kasan/report.c:354 [inline]
    kasan_report+0x23c/0x360 mm/kasan/report.c:412
    __asan_report_load8_noabort+0x14/0x20 mm/kasan/report.c:433
    ip6_dst_idev include/net/ip6_fib.h:192 [inline]
    ip6_xmit+0x1f76/0x2260 net/ipv6/ip6_output.c:264
    inet6_csk_xmit+0x2fc/0x580 net/ipv6/inet6_connection_sock.c:139
    l2tp_xmit_core net/l2tp/l2tp_core.c:1053 [inline]
    l2tp_xmit_skb+0x105f/0x1410 net/l2tp/l2tp_core.c:1148
    pppol2tp_sendmsg+0x470/0x670 net/l2tp/l2tp_ppp.c:341
    sock_sendmsg_nosec net/socket.c:630 [inline]
    sock_sendmsg+0xca/0x110 net/socket.c:640
    ___sys_sendmsg+0x767/0x8b0 net/socket.c:2046
    __sys_sendmsg+0xe5/0x210 net/socket.c:2080
    SYSC_sendmsg net/socket.c:2091 [inline]
    SyS_sendmsg+0x2d/0x50 net/socket.c:2087
    do_syscall_64+0x281/0x940 arch/x86/entry/common.c:287
    entry_SYSCALL_64_after_hwframe+0x42/0xb7
    RIP: 0033:0x453e69
    RSP: 002b:00007f819593cc68 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007f819593d6d4 RCX: 0000000000453e69
    RDX: 0000000000000081 RSI: 000000002037ffc8 RDI: 0000000000000004
    RBP: 000000000072bea0 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00000000ffffffff
    R13: 00000000000004c3 R14: 00000000006f72e8 R15: 0000000000000000

    This change addresses the issues:
    * explicitly checking for TCP_ESTABLISHED for user space provided sockets
    * dropping the v4mapped flag usage - it can become outdated - and
    explicitly invoking ipv6_addr_v4mapped() instead

    The issue is apparently there since ancient times.

    v1 -> v2: (many thanks to Guillaume)
    - with csum issue introduced in v1
    - replace pr_err with pr_debug
    - fix build issue with IPV6 disabled
    - move l2tp_sk_is_v4mapped in l2tp_core.c

    v2 -> v3:
    - don't update inet_daddr for v4mapped address, unneeded
    - drop rendundant check at creation time

    Reported-and-tested-by: syzbot+92fa328176eb07e4ac1a@syzkaller.appspotmail.com
    Fixes: 3557baabf280 ("[L2TP]: PPP over L2TP driver core")
    Signed-off-by: Paolo Abeni
    Signed-off-by: David S. Miller

    Paolo Abeni
     
  • On unsuccesful ip6_datagram_connect(), if the failure is caused by
    ip6_datagram_dst_update(), the sk peer information are cleared, but
    the sk->sk_state is preserved.

    If the socket was already in an established status, the overall sk
    status is inconsistent and fouls later checks in datagram code.

    Fix this saving the old peer information and restoring them in
    case of failure. This also aligns ipv6 datagram connect() behavior
    with ipv4.

    v1 -> v2:
    - added missing Fixes tag

    Fixes: 85cb73ff9b74 ("net: ipv6: reset daddr and dport in sk if connect() fails")
    Signed-off-by: Paolo Abeni
    Signed-off-by: David S. Miller

    Paolo Abeni