08 Mar, 2020

1 commit

  • Merge Linux stable release v5.4.24 into imx_5.4.y

    * tag 'v5.4.24': (3306 commits)
    Linux 5.4.24
    blktrace: Protect q->blk_trace with RCU
    kvm: nVMX: VMWRITE checks unsupported field before read-only field
    ...

    Signed-off-by: Jason Liu

    Conflicts:
    arch/arm/boot/dts/imx6sll-evk.dts
    arch/arm/boot/dts/imx7ulp.dtsi
    arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
    drivers/clk/imx/clk-composite-8m.c
    drivers/gpio/gpio-mxc.c
    drivers/irqchip/Kconfig
    drivers/mmc/host/sdhci-of-esdhc.c
    drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c
    drivers/net/can/flexcan.c
    drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
    drivers/net/ethernet/mscc/ocelot.c
    drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
    drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
    drivers/net/phy/realtek.c
    drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
    drivers/perf/fsl_imx8_ddr_perf.c
    drivers/tee/optee/shm_pool.c
    drivers/usb/cdns3/gadget.c
    kernel/sched/cpufreq.c
    net/core/xdp.c
    sound/soc/fsl/fsl_esai.c
    sound/soc/fsl/fsl_sai.c
    sound/soc/sof/core.c
    sound/soc/sof/imx/Kconfig
    sound/soc/sof/loader.c

    Jason Liu
     

05 Mar, 2020

1 commit

  • [ Upstream commit 8a9093c79863b58cc2f9874d7ae788f0d622a596 ]

    tc flower rules that are based on src or dst port blocking are sometimes
    ineffective due to uninitialized stack data. __skb_flow_dissect() extracts
    ports from the skb for tc flower to match against. However, the port
    dissection is not done when when the FLOW_DIS_IS_FRAGMENT bit is set in
    key_control->flags. All callers of __skb_flow_dissect(), zero-out the
    key_control field except for fl_classify() as used by the flower
    classifier. Thus, the FLOW_DIS_IS_FRAGMENT may be set on entry to
    __skb_flow_dissect(), since key_control is allocated on the stack
    and may not be initialized.

    Since key_basic and key_control are present for all flow keys, let's
    make sure they are initialized.

    Fixes: 62230715fd24 ("flow_dissector: do not dissect l4 ports for fragments")
    Co-developed-by: Eric Dumazet
    Signed-off-by: Eric Dumazet
    Acked-by: Cong Wang
    Signed-off-by: Jason Baron
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Jason Baron
     

24 Feb, 2020

2 commits

  • [ Upstream commit e2debf0852c4d66ba1a8bde12869b196094c70a7 ]

    unlike other classifiers that can be offloaded (i.e. users can set flags
    like 'skip_hw' and 'skip_sw'), 'cls_flower' doesn't validate the size of
    netlink attribute 'TCA_FLOWER_FLAGS' provided by user: add a proper entry
    to fl_policy.

    Fixes: 5b33f48842fa ("net/flower: Introduce hardware offload support")
    Signed-off-by: Davide Caratti
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Davide Caratti
     
  • [ Upstream commit 1afa3cc90f8fb745c777884d79eaa1001d6927a6 ]

    unlike other classifiers that can be offloaded (i.e. users can set flags
    like 'skip_hw' and 'skip_sw'), 'cls_matchall' doesn't validate the size
    of netlink attribute 'TCA_MATCHALL_FLAGS' provided by user: add a proper
    entry to mall_policy.

    Fixes: b87f7936a932 ("net/sched: Add match-all classifier hw offloading.")
    Signed-off-by: Davide Caratti
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Davide Caratti
     

11 Feb, 2020

8 commits

  • [ Upstream commit bfabd41da34180d05382312533a3adc2e012dee0 ]

    When using taprio offloading together with ETF offloading, configured
    like this, for example:

    $ tc qdisc replace dev $IFACE parent root handle 100 taprio \
    num_tc 4 \
    map 2 2 1 0 3 2 2 2 2 2 2 2 2 2 2 2 \
    queues 1@0 1@1 1@2 1@3 \
    base-time $BASE_TIME \
    sched-entry S 01 1000000 \
    sched-entry S 0e 1000000 \
    flags 0x2

    $ tc qdisc replace dev $IFACE parent 100:1 etf \
    offload delta 300000 clockid CLOCK_TAI

    During enqueue, it works out that the verification added for the
    "txtime" assisted mode is run when using taprio + ETF offloading, the
    only thing missing is initializing the 'next_txtime' of all the cycle
    entries. (if we don't set 'next_txtime' all packets from SO_TXTIME
    sockets are dropped)

    Fixes: 4cfd5779bd6e ("taprio: Add support for txtime-assist mode")
    Signed-off-by: Vinicius Costa Gomes
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Vinicius Costa Gomes
     
  • [ Upstream commit 7c16680a08ee1e444a67d232c679ccf5b30fad16 ]

    When destroying the current taprio instance, which can happen when the
    creation of one fails, we should reset the traffic class configuration
    back to the default state.

    netdev_reset_tc() is a better way because in addition to setting the
    number of traffic classes to zero, it also resets the priority to
    traffic classes mapping to the default value.

    Fixes: 5a781ccbd19e ("tc: Add support for configuring the taprio scheduler")
    Signed-off-by: Vinicius Costa Gomes
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Vinicius Costa Gomes
     
  • [ Upstream commit 49c684d79cfdc3032344bf6f3deeea81c4efedbf ]

    netlink policy validation for the 'flags' argument was missing.

    Fixes: 4cfd5779bd6e ("taprio: Add support for txtime-assist mode")
    Signed-off-by: Vinicius Costa Gomes
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Vinicius Costa Gomes
     
  • [ Upstream commit a9d6227436f32142209f4428f2dc616761485112 ]

    Because 'q->flags' starts as zero, and zero is a valid value, we
    aren't able to detect the transition from zero to something else
    during "runtime".

    The solution is to initialize 'q->flags' with an invalid value, so we
    can detect if 'q->flags' was set by the user or not.

    To better solidify the behavior, 'flags' handling is moved to a
    separate function. The behavior is:
    - 'flags' if unspecified by the user, is assumed to be zero;
    - 'flags' cannot change during "runtime" (i.e. a change() request
    cannot modify it);

    With this new function we can remove taprio_flags, which should reduce
    the risk of future accidents.

    Allowing flags to be changed was causing the following RCU stall:

    [ 1730.558249] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
    [ 1730.558258] rcu: 6-...0: (190 ticks this GP) idle=922/0/0x1 softirq=25580/25582 fqs=16250
    [ 1730.558264] (detected by 2, t=65002 jiffies, g=33017, q=81)
    [ 1730.558269] Sending NMI from CPU 2 to CPUs 6:
    [ 1730.559277] NMI backtrace for cpu 6
    [ 1730.559277] CPU: 6 PID: 0 Comm: swapper/6 Tainted: G E 5.5.0-rc6+ #35
    [ 1730.559278] Hardware name: Gigabyte Technology Co., Ltd. Z390 AORUS ULTRA/Z390 AORUS ULTRA-CF, BIOS F7 03/14/2019
    [ 1730.559278] RIP: 0010:__hrtimer_run_queues+0xe2/0x440
    [ 1730.559278] Code: 48 8b 43 28 4c 89 ff 48 8b 75 c0 48 89 45 c8 e8 f4 bb 7c 00 0f 1f 44 00 00 65 8b 05 40 31 f0 68 89 c0 48 0f a3 05 3e 5c 25 01 82 fc 01 00 00 48 8b 45 c8 48 89 df ff d0 89 45 c8 0f 1f 44 00
    [ 1730.559279] RSP: 0018:ffff9970802d8f10 EFLAGS: 00000083
    [ 1730.559279] RAX: 0000000000000006 RBX: ffff8b31645bff38 RCX: 0000000000000000
    [ 1730.559280] RDX: 0000000000000000 RSI: ffffffff9710f2ec RDI: ffffffff978daf0e
    [ 1730.559280] RBP: ffff9970802d8f68 R08: 0000000000000000 R09: 0000000000000000
    [ 1730.559280] R10: 0000018336d7944e R11: 0000000000000001 R12: ffff8b316e39f9c0
    [ 1730.559281] R13: ffff8b316e39f940 R14: ffff8b316e39f998 R15: ffff8b316e39f7c0
    [ 1730.559281] FS: 0000000000000000(0000) GS:ffff8b316e380000(0000) knlGS:0000000000000000
    [ 1730.559281] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 1730.559281] CR2: 00007f1105303760 CR3: 0000000227210005 CR4: 00000000003606e0
    [ 1730.559282] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 1730.559282] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    [ 1730.559282] Call Trace:
    [ 1730.559282]
    [ 1730.559283] ? taprio_dequeue_soft+0x2d0/0x2d0 [sch_taprio]
    [ 1730.559283] hrtimer_interrupt+0x104/0x220
    [ 1730.559283] ? irqtime_account_irq+0x34/0xa0
    [ 1730.559283] smp_apic_timer_interrupt+0x6d/0x230
    [ 1730.559284] apic_timer_interrupt+0xf/0x20
    [ 1730.559284]
    [ 1730.559284] RIP: 0010:cpu_idle_poll+0x35/0x1a0
    [ 1730.559285] Code: 88 82 ff 65 44 8b 25 12 7d 73 68 0f 1f 44 00 00 e8 90 c3 89 ff fb 65 48 8b 1c 25 c0 7e 01 00 48 8b 03 a8 08 74 0b eb 1c f3 90 8b 03 a8 08 75 13 8b 05 be a8 a8 00 85 c0 75 ed e8 75 48 84 ff
    [ 1730.559285] RSP: 0018:ffff997080137ea8 EFLAGS: 00000202 ORIG_RAX: ffffffffffffff13
    [ 1730.559285] RAX: 0000000000000001 RBX: ffff8b316bc3c580 RCX: 0000000000000000
    [ 1730.559286] RDX: 0000000000000001 RSI: 000000002819aad9 RDI: ffffffff978da730
    [ 1730.559286] RBP: ffff997080137ec0 R08: 0000018324a6d387 R09: 0000000000000000
    [ 1730.559286] R10: 0000000000000400 R11: 0000000000000001 R12: 0000000000000006
    [ 1730.559286] R13: ffff8b316bc3c580 R14: 0000000000000000 R15: 0000000000000000
    [ 1730.559287] ? cpu_idle_poll+0x20/0x1a0
    [ 1730.559287] ? cpu_idle_poll+0x20/0x1a0
    [ 1730.559287] do_idle+0x4d/0x1f0
    [ 1730.559287] ? complete+0x44/0x50
    [ 1730.559288] cpu_startup_entry+0x1b/0x20
    [ 1730.559288] start_secondary+0x142/0x180
    [ 1730.559288] secondary_startup_64+0xb6/0xc0
    [ 1776.686313] nvme nvme0: I/O 96 QID 1 timeout, completion polled

    Fixes: 4cfd5779bd6e ("taprio: Add support for txtime-assist mode")
    Signed-off-by: Vinicius Costa Gomes
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Vinicius Costa Gomes
     
  • [ Upstream commit 5652e63df3303c2a702bac25fbf710b9cb64dfba ]

    If the driver implementing taprio offloading depends on the value of
    the network device number of traffic classes (dev->num_tc) for
    whatever reason, it was going to receive the value zero. The value was
    only set after the offloading function is called.

    So, moving setting the number of traffic classes to before the
    offloading function is called fixes this issue. This is safe because
    this only happens when taprio is instantiated (we don't allow this
    configuration to be changed without first removing taprio).

    Fixes: 9c66d1564676 ("taprio: Add support for hardware offloading")
    Reported-by: Po Liu
    Signed-off-by: Vinicius Costa Gomes
    Acked-by: Vladimir Oltean
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Vinicius Costa Gomes
     
  • [ Upstream commit 52b5ae501c045010aeeb1d5ac0373ff161a88291 ]

    Jakub noticed there is a potential resource leak in
    tcindex_set_parms(): when tcindex_filter_result_init() fails
    and it jumps to 'errout1' which doesn't release the memory
    and resources allocated by tcindex_alloc_perfect_hash().

    We should just jump to 'errout_alloc' which calls
    tcindex_free_perfect_hash().

    Fixes: b9a24bb76bf6 ("net_sched: properly handle failure case of tcf_exts_init()")
    Reported-by: Jakub Kicinski
    Cc: Jamal Hadi Salim
    Cc: Jiri Pirko
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit 599be01ee567b61f4471ee8078870847d0a11e8e ]

    As Eric noticed, tcindex_alloc_perfect_hash() uses cp->hash
    to compute the size of memory allocation, but cp->hash is
    set again after the allocation, this caused an out-of-bound
    access.

    So we have to move all cp->hash initialization and computation
    before the memory allocation. Move cp->mask and cp->shift together
    as cp->hash may need them for computation too.

    Reported-and-tested-by: syzbot+35d4dea36c387813ed31@syzkaller.appspotmail.com
    Fixes: 331b72922c5f ("net: sched: RCU cls_tcindex")
    Cc: Eric Dumazet
    Cc: John Fastabend
    Cc: Jamal Hadi Salim
    Cc: Jiri Pirko
    Cc: Jakub Kicinski
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit cb3c0e6bdf64d0d124e94ce43cbe4ccbb9b37f51 ]

    NLA_BINARY can be confusing, since .len value represents
    the max size of the blob.

    cls_rsvp really wants user space to provide long enough data
    for TCA_RSVP_DST and TCA_RSVP_SRC attributes.

    BUG: KMSAN: uninit-value in rsvp_get net/sched/cls_rsvp.h:258 [inline]
    BUG: KMSAN: uninit-value in gen_handle net/sched/cls_rsvp.h:402 [inline]
    BUG: KMSAN: uninit-value in rsvp_change+0x1ae9/0x4220 net/sched/cls_rsvp.h:572
    CPU: 1 PID: 13228 Comm: syz-executor.1 Not tainted 5.5.0-rc5-syzkaller #0
    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+0x1c9/0x220 lib/dump_stack.c:118
    kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:118
    __msan_warning+0x58/0xa0 mm/kmsan/kmsan_instr.c:215
    rsvp_get net/sched/cls_rsvp.h:258 [inline]
    gen_handle net/sched/cls_rsvp.h:402 [inline]
    rsvp_change+0x1ae9/0x4220 net/sched/cls_rsvp.h:572
    tc_new_tfilter+0x31fe/0x5010 net/sched/cls_api.c:2104
    rtnetlink_rcv_msg+0xcb7/0x1570 net/core/rtnetlink.c:5415
    netlink_rcv_skb+0x451/0x650 net/netlink/af_netlink.c:2477
    rtnetlink_rcv+0x50/0x60 net/core/rtnetlink.c:5442
    netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
    netlink_unicast+0xf9e/0x1100 net/netlink/af_netlink.c:1328
    netlink_sendmsg+0x1248/0x14d0 net/netlink/af_netlink.c:1917
    sock_sendmsg_nosec net/socket.c:639 [inline]
    sock_sendmsg net/socket.c:659 [inline]
    ____sys_sendmsg+0x12b6/0x1350 net/socket.c:2330
    ___sys_sendmsg net/socket.c:2384 [inline]
    __sys_sendmsg+0x451/0x5f0 net/socket.c:2417
    __do_sys_sendmsg net/socket.c:2426 [inline]
    __se_sys_sendmsg+0x97/0xb0 net/socket.c:2424
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2424
    do_syscall_64+0xb8/0x160 arch/x86/entry/common.c:296
    entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x45b349
    Code: ad b6 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 7b b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007f269d43dc78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007f269d43e6d4 RCX: 000000000045b349
    RDX: 0000000000000000 RSI: 00000000200001c0 RDI: 0000000000000003
    RBP: 000000000075bfc8 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00000000ffffffff
    R13: 00000000000009c2 R14: 00000000004cb338 R15: 000000000075bfd4

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:144 [inline]
    kmsan_internal_poison_shadow+0x66/0xd0 mm/kmsan/kmsan.c:127
    kmsan_slab_alloc+0x8a/0xe0 mm/kmsan/kmsan_hooks.c:82
    slab_alloc_node mm/slub.c:2774 [inline]
    __kmalloc_node_track_caller+0xb40/0x1200 mm/slub.c:4382
    __kmalloc_reserve net/core/skbuff.c:141 [inline]
    __alloc_skb+0x2fd/0xac0 net/core/skbuff.c:209
    alloc_skb include/linux/skbuff.h:1049 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1174 [inline]
    netlink_sendmsg+0x7d3/0x14d0 net/netlink/af_netlink.c:1892
    sock_sendmsg_nosec net/socket.c:639 [inline]
    sock_sendmsg net/socket.c:659 [inline]
    ____sys_sendmsg+0x12b6/0x1350 net/socket.c:2330
    ___sys_sendmsg net/socket.c:2384 [inline]
    __sys_sendmsg+0x451/0x5f0 net/socket.c:2417
    __do_sys_sendmsg net/socket.c:2426 [inline]
    __se_sys_sendmsg+0x97/0xb0 net/socket.c:2424
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2424
    do_syscall_64+0xb8/0x160 arch/x86/entry/common.c:296
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Fixes: 6fa8c0144b77 ("[NET_SCHED]: Use nla_policy for attribute validation in classifiers")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot
    Acked-by: Cong Wang
    Signed-off-by: Jakub Kicinski
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     

01 Feb, 2020

3 commits

  • [ Upstream commit 760d228e322e99cdf6d81b4b60a268b8f13cf67a ]

    In a complex TC class hierarchy like this:

    tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit \
    avpkt 1000 cell 8
    tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit \
    rate 6Mbit weight 0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 \
    avpkt 1000 bounded

    tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \
    sport 80 0xffff flowid 1:3
    tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip \
    sport 25 0xffff flowid 1:4

    tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit \
    rate 5Mbit weight 0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 \
    avpkt 1000
    tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit \
    rate 3Mbit weight 0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 \
    avpkt 1000

    where filters are installed on qdisc 1:0, so we can't merely
    search from class 1:1 when creating class 1:3 and class 1:4. We have
    to walk through all the child classes of the direct parent qdisc.
    Otherwise we would miss filters those need reverse binding.

    Fixes: 07d79fc7d94e ("net_sched: add reverse binding for tc class")
    Cc: Jamal Hadi Salim
    Cc: Jiri Pirko
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit 2e24cd755552350b94a7617617c6877b8cbcb701 ]

    The current implementations of ops->bind_class() are merely
    searching for classid and updating class in the struct tcf_result,
    without invoking either of cl_ops->bind_tcf() or
    cl_ops->unbind_tcf(). This breaks the design of them as qdisc's
    like cbq use them to count filters too. This is why syzbot triggered
    the warning in cbq_destroy_class().

    In order to fix this, we have to call cl_ops->bind_tcf() and
    cl_ops->unbind_tcf() like the filter binding path. This patch does
    so by refactoring out two helper functions __tcf_bind_filter()
    and __tcf_unbind_filter(), which are lockless and accept a Qdisc
    pointer, then teaching each implementation to call them correctly.

    Note, we merely pass the Qdisc pointer as an opaque pointer to
    each filter, they only need to pass it down to the helper
    functions without understanding it at all.

    Fixes: 07d79fc7d94e ("net_sched: add reverse binding for tc class")
    Reported-and-tested-by: syzbot+0a0596220218fcb603a8@syzkaller.appspotmail.com
    Reported-and-tested-by: syzbot+63bdb6006961d8c917c6@syzkaller.appspotmail.com
    Cc: Jamal Hadi Salim
    Cc: Jiri Pirko
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     
  • [ Upstream commit 55cd9f67f1e45de8517cdaab985fb8e56c0bc1d8 ]

    It is possible for malicious userspace to set TCF_EM_SIMPLE bit
    even for matches that should not have this bit set.

    This can fool two places using tcf_em_is_simple()

    1) tcf_em_tree_destroy() -> memory leak of em->data
    if ops->destroy() is NULL

    2) tcf_em_tree_dump() wrongly report/leak 4 low-order bytes
    of a kernel pointer.

    BUG: memory leak
    unreferenced object 0xffff888121850a40 (size 32):
    comm "syz-executor927", pid 7193, jiffies 4294941655 (age 19.840s)
    hex dump (first 32 bytes):
    00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    backtrace:
    [] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
    [] slab_post_alloc_hook mm/slab.h:586 [inline]
    [] slab_alloc mm/slab.c:3320 [inline]
    [] __do_kmalloc mm/slab.c:3654 [inline]
    [] __kmalloc_track_caller+0x165/0x300 mm/slab.c:3671
    [] kmemdup+0x27/0x60 mm/util.c:127
    [] kmemdup include/linux/string.h:453 [inline]
    [] em_nbyte_change+0x5b/0x90 net/sched/em_nbyte.c:32
    [] tcf_em_validate net/sched/ematch.c:241 [inline]
    [] tcf_em_tree_validate net/sched/ematch.c:359 [inline]
    [] tcf_em_tree_validate+0x332/0x46f net/sched/ematch.c:300
    [] basic_set_parms net/sched/cls_basic.c:157 [inline]
    [] basic_change+0x1d7/0x5f0 net/sched/cls_basic.c:219
    [] tc_new_tfilter+0x566/0xf70 net/sched/cls_api.c:2104
    [] rtnetlink_rcv_msg+0x3b2/0x4b0 net/core/rtnetlink.c:5415
    [] netlink_rcv_skb+0x61/0x170 net/netlink/af_netlink.c:2477
    [] rtnetlink_rcv+0x1d/0x30 net/core/rtnetlink.c:5442
    [] netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
    [] netlink_unicast+0x223/0x310 net/netlink/af_netlink.c:1328
    [] netlink_sendmsg+0x2c0/0x570 net/netlink/af_netlink.c:1917
    [] sock_sendmsg_nosec net/socket.c:639 [inline]
    [] sock_sendmsg+0x54/0x70 net/socket.c:659
    [] ____sys_sendmsg+0x2d0/0x300 net/socket.c:2330
    [] ___sys_sendmsg+0x8a/0xd0 net/socket.c:2384
    [] __sys_sendmsg+0x80/0xf0 net/socket.c:2417
    [] __do_sys_sendmsg net/socket.c:2426 [inline]
    [] __se_sys_sendmsg net/socket.c:2424 [inline]
    [] __x64_sys_sendmsg+0x23/0x30 net/socket.c:2424

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot+03c4738ed29d5d366ddf@syzkaller.appspotmail.com
    Cc: Cong Wang
    Acked-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     

29 Jan, 2020

2 commits

  • [ Upstream commit 36d79af7fb59d6d9106feb9c1855eb93d6d53fe6 ]

    sysbot found another issue in tc_new_tfilter().
    We probably should use @name which contains the sanitized
    version of TCA_KIND.

    BUG: KMSAN: uninit-value in string_nocheck lib/vsprintf.c:608 [inline]
    BUG: KMSAN: uninit-value in string+0x522/0x690 lib/vsprintf.c:689
    CPU: 1 PID: 10753 Comm: syz-executor.1 Not tainted 5.5.0-rc5-syzkaller #0
    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+0x1c9/0x220 lib/dump_stack.c:118
    kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:118
    __msan_warning+0x58/0xa0 mm/kmsan/kmsan_instr.c:215
    string_nocheck lib/vsprintf.c:608 [inline]
    string+0x522/0x690 lib/vsprintf.c:689
    vsnprintf+0x207d/0x31b0 lib/vsprintf.c:2574
    __request_module+0x2ad/0x11c0 kernel/kmod.c:143
    tcf_proto_lookup_ops+0x241/0x720 net/sched/cls_api.c:139
    tcf_proto_create net/sched/cls_api.c:262 [inline]
    tc_new_tfilter+0x2a4e/0x5010 net/sched/cls_api.c:2058
    rtnetlink_rcv_msg+0xcb7/0x1570 net/core/rtnetlink.c:5415
    netlink_rcv_skb+0x451/0x650 net/netlink/af_netlink.c:2477
    rtnetlink_rcv+0x50/0x60 net/core/rtnetlink.c:5442
    netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
    netlink_unicast+0xf9e/0x1100 net/netlink/af_netlink.c:1328
    netlink_sendmsg+0x1248/0x14d0 net/netlink/af_netlink.c:1917
    sock_sendmsg_nosec net/socket.c:639 [inline]
    sock_sendmsg net/socket.c:659 [inline]
    ____sys_sendmsg+0x12b6/0x1350 net/socket.c:2330
    ___sys_sendmsg net/socket.c:2384 [inline]
    __sys_sendmsg+0x451/0x5f0 net/socket.c:2417
    __do_sys_sendmsg net/socket.c:2426 [inline]
    __se_sys_sendmsg+0x97/0xb0 net/socket.c:2424
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2424
    do_syscall_64+0xb8/0x160 arch/x86/entry/common.c:296
    entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x45b349
    Code: ad b6 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 7b b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007f88b3948c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 00007f88b39496d4 RCX: 000000000045b349
    RDX: 0000000000000000 RSI: 00000000200001c0 RDI: 0000000000000003
    RBP: 000000000075bfc8 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00000000ffffffff
    R13: 000000000000099f R14: 00000000004cb163 R15: 000000000075bfd4

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:144 [inline]
    kmsan_internal_poison_shadow+0x66/0xd0 mm/kmsan/kmsan.c:127
    kmsan_slab_alloc+0x8a/0xe0 mm/kmsan/kmsan_hooks.c:82
    slab_alloc_node mm/slub.c:2774 [inline]
    __kmalloc_node_track_caller+0xb40/0x1200 mm/slub.c:4382
    __kmalloc_reserve net/core/skbuff.c:141 [inline]
    __alloc_skb+0x2fd/0xac0 net/core/skbuff.c:209
    alloc_skb include/linux/skbuff.h:1049 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1174 [inline]
    netlink_sendmsg+0x7d3/0x14d0 net/netlink/af_netlink.c:1892
    sock_sendmsg_nosec net/socket.c:639 [inline]
    sock_sendmsg net/socket.c:659 [inline]
    ____sys_sendmsg+0x12b6/0x1350 net/socket.c:2330
    ___sys_sendmsg net/socket.c:2384 [inline]
    __sys_sendmsg+0x451/0x5f0 net/socket.c:2417
    __do_sys_sendmsg net/socket.c:2426 [inline]
    __se_sys_sendmsg+0x97/0xb0 net/socket.c:2424
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2424
    do_syscall_64+0xb8/0x160 arch/x86/entry/common.c:296
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Fixes: 6f96c3c6904c ("net_sched: fix backward compatibility for TCA_KIND")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot
    Cc: Cong Wang
    Cc: Marcelo Ricardo Leitner
    Cc: Jamal Hadi Salim
    Cc: Jiri Pirko
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     
  • [ Upstream commit 61678d28d4a45ef376f5d02a839cc37509ae9281 ]

    syzbot reported an out-of-bound access in em_nbyte. As initially
    analyzed by Eric, this is because em_nbyte sets its own em->datalen
    in em_nbyte_change() other than the one specified by user, but this
    value gets overwritten later by its caller tcf_em_validate().
    We should leave em->datalen untouched to respect their choices.

    I audit all the in-tree ematch users, all of those implement
    ->change() set em->datalen, so we can just avoid setting it twice
    in this case.

    Reported-and-tested-by: syzbot+5af9a90dad568aa9f611@syzkaller.appspotmail.com
    Reported-by: syzbot+2f07903a5b05e7f36410@syzkaller.appspotmail.com
    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Cc: Eric Dumazet
    Signed-off-by: Cong Wang
    Reviewed-by: Eric Dumazet
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Cong Wang
     

23 Jan, 2020

2 commits

  • [ Upstream commit 09d4f10a5e78d76a53e3e584f1e6a701b6d24108 ]

    Implement a cleanup method to properly free ci->params

    BUG: memory leak
    unreferenced object 0xffff88811746e2c0 (size 64):
    comm "syz-executor617", pid 7106, jiffies 4294943055 (age 14.250s)
    hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    c0 34 60 84 ff ff ff ff 00 00 00 00 00 00 00 00 .4`.............
    backtrace:
    [] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
    [] slab_post_alloc_hook mm/slab.h:586 [inline]
    [] slab_alloc mm/slab.c:3320 [inline]
    [] kmem_cache_alloc_trace+0x145/0x2c0 mm/slab.c:3549
    [] kmalloc include/linux/slab.h:556 [inline]
    [] kzalloc include/linux/slab.h:670 [inline]
    [] tcf_ctinfo_init+0x21a/0x530 net/sched/act_ctinfo.c:236
    [] tcf_action_init_1+0x400/0x5b0 net/sched/act_api.c:944
    [] tcf_action_init+0x135/0x1c0 net/sched/act_api.c:1000
    [] tcf_action_add+0x9a/0x200 net/sched/act_api.c:1410
    [] tc_ctl_action+0x14d/0x1bb net/sched/act_api.c:1465
    [] rtnetlink_rcv_msg+0x178/0x4b0 net/core/rtnetlink.c:5424
    [] netlink_rcv_skb+0x61/0x170 net/netlink/af_netlink.c:2477
    [] rtnetlink_rcv+0x1d/0x30 net/core/rtnetlink.c:5442
    [] netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
    [] netlink_unicast+0x223/0x310 net/netlink/af_netlink.c:1328
    [] netlink_sendmsg+0x2c0/0x570 net/netlink/af_netlink.c:1917
    [] sock_sendmsg_nosec net/socket.c:639 [inline]
    [] sock_sendmsg+0x54/0x70 net/socket.c:659
    [] ____sys_sendmsg+0x2d0/0x300 net/socket.c:2330
    [] ___sys_sendmsg+0x8a/0xd0 net/socket.c:2384
    [] __sys_sendmsg+0x80/0xf0 net/socket.c:2417
    [] __do_sys_sendmsg net/socket.c:2426 [inline]
    [] __se_sys_sendmsg net/socket.c:2424 [inline]
    [] __x64_sys_sendmsg+0x23/0x30 net/socket.c:2424

    Fixes: 24ec483cec98 ("net: sched: Introduce act_ctinfo action")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot
    Cc: Kevin 'ldir' Darbyshire-Bryant
    Cc: Cong Wang
    Cc: Toke Høiland-Jørgensen
    Acked-by: Kevin 'ldir' Darbyshire-Bryant
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     
  • [ Upstream commit 44c23d71599f81a1c7fe8389e0319822dd50c37c ]

    It seems better to init ife->metalist earlier in tcf_ife_init()
    to avoid the following crash :

    kasan: CONFIG_KASAN_INLINE enabled
    kasan: GPF could be caused by NULL-ptr deref or user memory access
    general protection fault: 0000 [#1] PREEMPT SMP KASAN
    CPU: 0 PID: 10483 Comm: syz-executor216 Not tainted 5.5.0-rc5-syzkaller #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
    RIP: 0010:_tcf_ife_cleanup net/sched/act_ife.c:412 [inline]
    RIP: 0010:tcf_ife_cleanup+0x6e/0x400 net/sched/act_ife.c:431
    Code: 48 c1 ea 03 80 3c 02 00 0f 85 94 03 00 00 49 8b bd f8 00 00 00 48 b8 00 00 00 00 00 fc ff df 4c 8d 67 e8 48 89 fa 48 c1 ea 03 3c 02 00 0f 85 5c 03 00 00 48 bb 00 00 00 00 00 fc ff df 48 8b
    RSP: 0018:ffffc90001dc6d00 EFLAGS: 00010246
    RAX: dffffc0000000000 RBX: ffffffff864619c0 RCX: ffffffff815bfa09
    RDX: 0000000000000000 RSI: 0000000000000004 RDI: 0000000000000000
    RBP: ffffc90001dc6d50 R08: 0000000000000004 R09: fffff520003b8d8e
    R10: fffff520003b8d8d R11: 0000000000000003 R12: ffffffffffffffe8
    R13: ffff8880a79fc000 R14: ffff88809aba0e00 R15: 0000000000000000
    FS: 0000000001b51880(0000) GS:ffff8880ae800000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000563f52cce140 CR3: 0000000093541000 CR4: 00000000001406f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Call Trace:
    tcf_action_cleanup+0x62/0x1b0 net/sched/act_api.c:119
    __tcf_action_put+0xfa/0x130 net/sched/act_api.c:135
    __tcf_idr_release net/sched/act_api.c:165 [inline]
    __tcf_idr_release+0x59/0xf0 net/sched/act_api.c:145
    tcf_idr_release include/net/act_api.h:171 [inline]
    tcf_ife_init+0x97c/0x1870 net/sched/act_ife.c:616
    tcf_action_init_1+0x6b6/0xa40 net/sched/act_api.c:944
    tcf_action_init+0x21a/0x330 net/sched/act_api.c:1000
    tcf_action_add+0xf5/0x3b0 net/sched/act_api.c:1410
    tc_ctl_action+0x390/0x488 net/sched/act_api.c:1465
    rtnetlink_rcv_msg+0x45e/0xaf0 net/core/rtnetlink.c:5424
    netlink_rcv_skb+0x177/0x450 net/netlink/af_netlink.c:2477
    rtnetlink_rcv+0x1d/0x30 net/core/rtnetlink.c:5442
    netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
    netlink_unicast+0x58c/0x7d0 net/netlink/af_netlink.c:1328
    netlink_sendmsg+0x91c/0xea0 net/netlink/af_netlink.c:1917
    sock_sendmsg_nosec net/socket.c:639 [inline]
    sock_sendmsg+0xd7/0x130 net/socket.c:659
    ____sys_sendmsg+0x753/0x880 net/socket.c:2330
    ___sys_sendmsg+0x100/0x170 net/socket.c:2384
    __sys_sendmsg+0x105/0x1d0 net/socket.c:2417
    __do_sys_sendmsg net/socket.c:2426 [inline]
    __se_sys_sendmsg net/socket.c:2424 [inline]
    __x64_sys_sendmsg+0x78/0xb0 net/socket.c:2424
    do_syscall_64+0xfa/0x790 arch/x86/entry/common.c:294
    entry_SYSCALL_64_after_hwframe+0x49/0xbe

    Fixes: 11a94d7fd80f ("net/sched: act_ife: validate the control action inside init()")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot
    Cc: Davide Caratti
    Reviewed-by: Davide Caratti
    Acked-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     

18 Jan, 2020

1 commit

  • commit b3c424eb6a1a3c485de64619418a471dee6ce849 upstream.

    This field has never been checked since introduction in mainline kernel

    Signed-off-by: Victorien Molle
    Signed-off-by: Florent Fourcot
    Fixes: 2db6dc2662ba "sch_cake: Make gso-splitting configurable from userspace"
    Acked-by: Toke Høiland-Jørgensen
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Victorien Molle
     

12 Jan, 2020

3 commits

  • [ Upstream commit 240ce7f6428ff5188b9eedc066e1e4d645b8635f ]

    When a child Qdisc is removed from one of the PRIO Qdisc's bands, it is
    replaced unconditionally by a NOOP qdisc. As a result, any traffic hitting
    that band gets dropped. That is incorrect--no Qdisc was explicitly added
    when PRIO was created, and after removal, none should have to be added
    either.

    Fix PRIO by first attempting to create a default Qdisc and only falling
    back to noop when that fails. This pattern of attempting to create an
    invisible FIFO, using NOOP only as a fallback, is also seen in other
    Qdiscs.

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Petr Machata
    Acked-by: Jiri Pirko
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Petr Machata
     
  • [ Upstream commit 68aab823c223646fab311f8a6581994facee66a0 ]

    The variables 'window_interval' is u64 and do_div()
    truncates it to 32 bits, which means it can test
    non-zero and be truncated to zero for division.
    The unit of window_interval is nanoseconds,
    so its lower 32-bit is relatively easy to exceed.
    Fix this issue by using div64_u64() instead.

    Fixes: 7298de9cd725 ("sch_cake: Add ingress mode")
    Signed-off-by: Wen Yang
    Cc: Kevin Darbyshire-Bryant
    Cc: Toke Høiland-Jørgensen
    Cc: David S. Miller
    Cc: Cong Wang
    Cc: cake@lists.bufferbloat.net
    Cc: netdev@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Acked-by: Toke Høiland-Jørgensen
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Wen Yang
     
  • [ Upstream commit d9e15a2733067c9328fb56d98fe8e574fa19ec31 ]

    As diagnosed by Florian :

    If TCA_FQ_QUANTUM is set to 0x80000000, fq_deueue()
    can loop forever in :

    if (f->credit credit += q->quantum;
    goto begin;
    }

    ... because f->credit is either 0 or -2147483648.

    Let's limit TCA_FQ_QUANTUM to no more than 1 << 20 :
    This max value should limit risks of breaking user setups
    while fixing this bug.

    Fixes: afe4fd062416 ("pkt_sched: fq: Fair Queue packet scheduler")
    Signed-off-by: Eric Dumazet
    Diagnosed-by: Florian Westphal
    Reported-by: syzbot+dc9071cc5a85950bdfce@syzkaller.appspotmail.com
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     

09 Jan, 2020

1 commit

  • commit 90b2be27bb0e56483f335cc10fb59ec66882b949 upstream.

    KCSAN reported the following race [1]

    BUG: KCSAN: data-race in __dev_queue_xmit / net_tx_action

    read to 0xffff8880ba403508 of 1 bytes by task 21814 on cpu 1:
    __dev_xmit_skb net/core/dev.c:3389 [inline]
    __dev_queue_xmit+0x9db/0x1b40 net/core/dev.c:3761
    dev_queue_xmit+0x21/0x30 net/core/dev.c:3825
    neigh_hh_output include/net/neighbour.h:500 [inline]
    neigh_output include/net/neighbour.h:509 [inline]
    ip6_finish_output2+0x873/0xec0 net/ipv6/ip6_output.c:116
    __ip6_finish_output net/ipv6/ip6_output.c:142 [inline]
    __ip6_finish_output+0x2d7/0x330 net/ipv6/ip6_output.c:127
    ip6_finish_output+0x41/0x160 net/ipv6/ip6_output.c:152
    NF_HOOK_COND include/linux/netfilter.h:294 [inline]
    ip6_output+0xf2/0x280 net/ipv6/ip6_output.c:175
    dst_output include/net/dst.h:436 [inline]
    ip6_local_out+0x74/0x90 net/ipv6/output_core.c:179
    ip6_send_skb+0x53/0x110 net/ipv6/ip6_output.c:1795
    udp_v6_send_skb.isra.0+0x3ec/0xa70 net/ipv6/udp.c:1173
    udpv6_sendmsg+0x1906/0x1c20 net/ipv6/udp.c:1471
    inet6_sendmsg+0x6d/0x90 net/ipv6/af_inet6.c:576
    sock_sendmsg_nosec net/socket.c:637 [inline]
    sock_sendmsg+0x9f/0xc0 net/socket.c:657
    ___sys_sendmsg+0x2b7/0x5d0 net/socket.c:2311
    __sys_sendmmsg+0x123/0x350 net/socket.c:2413
    __do_sys_sendmmsg net/socket.c:2442 [inline]
    __se_sys_sendmmsg net/socket.c:2439 [inline]
    __x64_sys_sendmmsg+0x64/0x80 net/socket.c:2439
    do_syscall_64+0xcc/0x370 arch/x86/entry/common.c:290
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    write to 0xffff8880ba403508 of 1 bytes by interrupt on cpu 0:
    qdisc_run_begin include/net/sch_generic.h:160 [inline]
    qdisc_run include/net/pkt_sched.h:120 [inline]
    net_tx_action+0x2b1/0x6c0 net/core/dev.c:4551
    __do_softirq+0x115/0x33f kernel/softirq.c:292
    do_softirq_own_stack+0x2a/0x40 arch/x86/entry/entry_64.S:1082
    do_softirq.part.0+0x6b/0x80 kernel/softirq.c:337
    do_softirq kernel/softirq.c:329 [inline]
    __local_bh_enable_ip+0x76/0x80 kernel/softirq.c:189
    local_bh_enable include/linux/bottom_half.h:32 [inline]
    rcu_read_unlock_bh include/linux/rcupdate.h:688 [inline]
    ip6_finish_output2+0x7bb/0xec0 net/ipv6/ip6_output.c:117
    __ip6_finish_output net/ipv6/ip6_output.c:142 [inline]
    __ip6_finish_output+0x2d7/0x330 net/ipv6/ip6_output.c:127
    ip6_finish_output+0x41/0x160 net/ipv6/ip6_output.c:152
    NF_HOOK_COND include/linux/netfilter.h:294 [inline]
    ip6_output+0xf2/0x280 net/ipv6/ip6_output.c:175
    dst_output include/net/dst.h:436 [inline]
    ip6_local_out+0x74/0x90 net/ipv6/output_core.c:179
    ip6_send_skb+0x53/0x110 net/ipv6/ip6_output.c:1795
    udp_v6_send_skb.isra.0+0x3ec/0xa70 net/ipv6/udp.c:1173
    udpv6_sendmsg+0x1906/0x1c20 net/ipv6/udp.c:1471
    inet6_sendmsg+0x6d/0x90 net/ipv6/af_inet6.c:576
    sock_sendmsg_nosec net/socket.c:637 [inline]
    sock_sendmsg+0x9f/0xc0 net/socket.c:657
    ___sys_sendmsg+0x2b7/0x5d0 net/socket.c:2311
    __sys_sendmmsg+0x123/0x350 net/socket.c:2413
    __do_sys_sendmmsg net/socket.c:2442 [inline]
    __se_sys_sendmmsg net/socket.c:2439 [inline]
    __x64_sys_sendmmsg+0x64/0x80 net/socket.c:2439
    do_syscall_64+0xcc/0x370 arch/x86/entry/common.c:290
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Reported by Kernel Concurrency Sanitizer on:
    CPU: 0 PID: 21817 Comm: syz-executor.2 Not tainted 5.4.0-rc6+ #0
    Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011

    Fixes: d518d2ed8640 ("net/sched: fix race between deactivation and dequeue for NOLOCK qdisc")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot
    Cc: Paolo Abeni
    Cc: Davide Caratti
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     

05 Jan, 2020

3 commits

  • [ Upstream commit bb3d0b8bf5be61ab1d6f472c43cbf34de17e796b ]

    If fq_classify() recycles a struct fq_flow because
    a socket structure has been reallocated, we do not
    set sk->sk_pacing_status immediately, but later if the
    flow becomes detached.

    This means that any flow requiring pacing (BBR, or SO_MAX_PACING_RATE)
    might fallback to TCP internal pacing, which requires a per-socket
    high resolution timer, and therefore more cpu cycles.

    Fixes: 218af599fa63 ("tcp: internal implementation for pacing")
    Signed-off-by: Eric Dumazet
    Cc: Soheil Hassas Yeganeh
    Cc: Neal Cardwell
    Acked-by: Soheil Hassas Yeganeh
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     
  • [ Upstream commit a5b72a083da197b493c7ed1e5730d62d3199f7d6 ]

    Revert "net/sched: cls_u32: fix refcount leak in the error path of
    u32_change()", and fix the u32 refcount leak in a more generic way that
    preserves the semantic of rule dumping.
    On tc filters that don't support lockless insertion/removal, there is no
    need to guard against concurrent insertion when a removal is in progress.
    Therefore, for most of them we can avoid a full walk() when deleting, and
    just decrease the refcount, like it was done on older Linux kernels.
    This fixes situations where walk() was wrongly detecting a non-empty
    filter, like it happened with cls_u32 in the error path of change(), thus
    leading to failures in the following tdc selftests:

    6aa7: (filter, u32) Add/Replace u32 with source match and invalid indev
    6658: (filter, u32) Add/Replace u32 with custom hash table and invalid handle
    74c2: (filter, u32) Add/Replace u32 filter with invalid hash table id

    On cls_flower, and on (future) lockless filters, this check is necessary:
    move all the check_empty() logic in a callback so that each filter
    can have its own implementation. For cls_flower, it's sufficient to check
    if no IDRs have been allocated.

    This reverts commit 275c44aa194b7159d1191817b20e076f55f0e620.

    Changes since v1:
    - document the need for delete_empty() when TCF_PROTO_OPS_DOIT_UNLOCKED
    is used, thanks to Vlad Buslov
    - implement delete_empty() without doing fl_walk(), thanks to Vlad Buslov
    - squash revert and new fix in a single patch, to be nice with bisect
    tests that run tdc on u32 filter, thanks to Dave Miller

    Fixes: 275c44aa194b ("net/sched: cls_u32: fix refcount leak in the error path of u32_change()")
    Fixes: 6676d5e416ee ("net: sched: set dedicated tcf_walker flag when tp is empty")
    Suggested-by: Jamal Hadi Salim
    Suggested-by: Vlad Buslov
    Signed-off-by: Davide Caratti
    Reviewed-by: Vlad Buslov
    Tested-by: Jamal Hadi Salim
    Acked-by: Jamal Hadi Salim
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Davide Caratti
     
  • [ Upstream commit 70cf3dc7313207816255b9acb0dffb19dae78144 ]

    There's no skb_pull performed when a mirred action is set at egress of a
    mac device, with a target device/action that expects skb->data to point
    at the network header.

    As a result, either the target device is errornously given an skb with
    data pointing to the mac (egress case), or the net stack receives the
    skb with data pointing to the mac (ingress case).

    E.g:
    # tc qdisc add dev eth9 root handle 1: prio
    # tc filter add dev eth9 parent 1: prio 9 protocol ip handle 9 basic \
    action mirred egress redirect dev tun0

    (tun0 is a tun device. result: tun0 errornously gets the eth header
    instead of the iph)

    Revise the push/pull logic of tcf_mirred_act() to not rely on the
    skb_at_tc_ingress() vs tcf_mirred_act_wants_ingress() comparison, as it
    does not cover all "pull" cases.

    Instead, calculate whether the required action on the target device
    requires the data to point at the network header, and compare this to
    whether skb->data points to network header - and make the push/pull
    adjustments as necessary.

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Shmulik Ladkani
    Tested-by: Jamal Hadi Salim
    Acked-by: Jamal Hadi Salim
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Shmulik Ladkani
     

18 Dec, 2019

9 commits

  • [ Upstream commit 95219afbb980f10934de9f23a3e199be69c5ed09 ]

    The act_ct TC module shares a common conntrack and NAT infrastructure
    exposed via netfilter. It's possible that a packet needs both SNAT and
    DNAT manipulation, due to e.g. tuple collision. Netfilter can support
    this because it runs through the NAT table twice - once on ingress and
    again after egress. The act_ct action doesn't have such capability.

    Like netfilter hook infrastructure, we should run through NAT twice to
    keep the symmetry.

    Fixes: b57dc7c13ea9 ("net/sched: Introduce action ct")
    Signed-off-by: Aaron Conole
    Acked-by: Marcelo Ricardo Leitner
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Aaron Conole
     
  • [ Upstream commit d04ac224b1688f005a84f764cfe29844f8e9da08 ]

    The skb_mpls_push was not updating ethertype of an ethernet packet if
    the packet was originally received from a non ARPHRD_ETHER device.

    In the below OVS data path flow, since the device corresponding to
    port 7 is an l3 device (ARPHRD_NONE) the skb_mpls_push function does
    not update the ethertype of the packet even though the previous
    push_eth action had added an ethernet header to the packet.

    recirc_id(0),in_port(7),eth_type(0x0800),ipv4(tos=0/0xfc,ttl=64,frag=no),
    actions:push_eth(src=00:00:00:00:00:00,dst=00:00:00:00:00:00),
    push_mpls(label=13,tc=0,ttl=64,bos=1,eth_type=0x8847),4

    Fixes: 8822e270d697 ("net: core: move push MPLS functionality from OvS to core helper")
    Signed-off-by: Martin Varghese
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Martin Varghese
     
  • [ Upstream commit 040b5cfbcefa263ccf2c118c4938308606bb7ed8 ]

    The skb_mpls_pop was not updating ethertype of an ethernet packet if the
    packet was originally received from a non ARPHRD_ETHER device.

    In the below OVS data path flow, since the device corresponding to port 7
    is an l3 device (ARPHRD_NONE) the skb_mpls_pop function does not update
    the ethertype of the packet even though the previous push_eth action had
    added an ethernet header to the packet.

    recirc_id(0),in_port(7),eth_type(0x8847),
    mpls(label=12/0xfffff,tc=0/0,ttl=0/0x0,bos=1/1),
    actions:push_eth(src=00:00:00:00:00:00,dst=00:00:00:00:00:00),
    pop_mpls(eth_type=0x800),4

    Fixes: ed246cee09b9 ("net: core: move pop MPLS functionality from OvS to core helper")
    Signed-off-by: Martin Varghese
    Acked-by: Pravin B Shelar
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Martin Varghese
     
  • [ Upstream commit 8ffb055beae58574d3e77b4bf9d4d15eace1ca27 ]

    The recent commit 5c72299fba9d ("net: sched: cls_flower: Classify
    packets using port ranges") had added filtering based on port ranges
    to tc flower. However the commit missed necessary changes in hw-offload
    code, so the feature gave rise to generating incorrect offloaded flow
    keys in NIC.

    One more detailed example is below:

    $ tc qdisc add dev eth0 ingress
    $ tc filter add dev eth0 ingress protocol ip flower ip_proto tcp \
    dst_port 100-200 action drop

    With the setup above, an exact match filter with dst_port == 0 will be
    installed in NIC by hw-offload. IOW, the NIC will have a rule which is
    equivalent to the following one.

    $ tc qdisc add dev eth0 ingress
    $ tc filter add dev eth0 ingress protocol ip flower ip_proto tcp \
    dst_port 0 action drop

    The behavior was caused by the flow dissector which extracts packet
    data into the flow key in the tc flower. More specifically, regardless
    of exact match or specified port ranges, fl_init_dissector() set the
    FLOW_DISSECTOR_KEY_PORTS flag in struct flow_dissector to extract port
    numbers from skb in skb_flow_dissect() called by fl_classify(). Note
    that device drivers received the same struct flow_dissector object as
    used in skb_flow_dissect(). Thus, offloaded drivers could not identify
    which of these is used because the FLOW_DISSECTOR_KEY_PORTS flag was
    set to struct flow_dissector in either case.

    This patch adds the new FLOW_DISSECTOR_KEY_PORTS_RANGE flag and the new
    tp_range field in struct fl_flow_key to recognize which filters are applied
    to offloaded drivers. At this point, when filters based on port ranges
    passed to drivers, drivers return the EOPNOTSUPP error because they do
    not support the feature (the newly created FLOW_DISSECTOR_KEY_PORTS_RANGE
    flag).

    Fixes: 5c72299fba9d ("net: sched: cls_flower: Classify packets using port ranges")
    Signed-off-by: Yoshiki Komachi
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Yoshiki Komachi
     
  • [ Upstream commit 25a443f74bcff2c4d506a39eae62fc15ad7c618a ]

    When a device is bound to a clsact qdisc, bind events are triggered to
    registered drivers for both ingress and egress. However, if a driver
    registers to such a device using the indirect block routines then it is
    assumed that it is only interested in ingress offload and so only replays
    ingress bind/unbind messages.

    The NFP driver supports the offload of some egress filters when
    registering to a block with qdisc of type clsact. However, on unregister,
    if the block is still active, it will not receive an unbind egress
    notification which can prevent proper cleanup of other registered
    callbacks.

    Modify the indirect block callback command in TC to send messages of
    ingress and/or egress bind depending on the qdisc in use. NFP currently
    supports egress offload for TC flower offload so the changes are only
    added to TC.

    Fixes: 4d12ba42787b ("nfp: flower: allow offloading of matches on 'internal' ports")
    Signed-off-by: John Hurley
    Acked-by: Jakub Kicinski
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    John Hurley
     
  • [ Upstream commit dbad3408896c3c5722ec9cda065468b3df16c5bf ]

    With indirect blocks, a driver can register for callbacks from a device
    that is does not 'own', for example, a tunnel device. When registering to
    or unregistering from a new device, a callback is triggered to generate
    a bind/unbind event. This, in turn, allows the driver to receive any
    existing rules or to properly clean up installed rules.

    When first added, it was assumed that all indirect block registrations
    would be for ingress offloads. However, the NFP driver can, in some
    instances, support clsact qdisc binds for egress offload.

    Change the name of the indirect block callback command in flow_offload to
    remove the 'ingress' identifier from it. While this does not change
    functionality, a follow up patch will implement a more more generic
    callback than just those currently just supporting ingress offload.

    Fixes: 4d12ba42787b ("nfp: flower: allow offloading of matches on 'internal' ports")
    Signed-off-by: John Hurley
    Acked-by: Jakub Kicinski
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    John Hurley
     
  • [ Upstream commit 2dd5616ecdcebdf5a8d007af64e040d4e9214efe ]

    Use the new tcf_proto_check_kind() helper to make sure user
    provided value is well formed.

    BUG: KMSAN: uninit-value in string_nocheck lib/vsprintf.c:606 [inline]
    BUG: KMSAN: uninit-value in string+0x4be/0x600 lib/vsprintf.c:668
    CPU: 0 PID: 12358 Comm: syz-executor.1 Not tainted 5.4.0-rc8-syzkaller #0
    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+0x1c9/0x220 lib/dump_stack.c:118
    kmsan_report+0x128/0x220 mm/kmsan/kmsan_report.c:108
    __msan_warning+0x64/0xc0 mm/kmsan/kmsan_instr.c:245
    string_nocheck lib/vsprintf.c:606 [inline]
    string+0x4be/0x600 lib/vsprintf.c:668
    vsnprintf+0x218f/0x3210 lib/vsprintf.c:2510
    __request_module+0x2b1/0x11c0 kernel/kmod.c:143
    tcf_proto_lookup_ops+0x171/0x700 net/sched/cls_api.c:139
    tc_chain_tmplt_add net/sched/cls_api.c:2730 [inline]
    tc_ctl_chain+0x1904/0x38a0 net/sched/cls_api.c:2850
    rtnetlink_rcv_msg+0x115a/0x1580 net/core/rtnetlink.c:5224
    netlink_rcv_skb+0x431/0x620 net/netlink/af_netlink.c:2477
    rtnetlink_rcv+0x50/0x60 net/core/rtnetlink.c:5242
    netlink_unicast_kernel net/netlink/af_netlink.c:1302 [inline]
    netlink_unicast+0xf3e/0x1020 net/netlink/af_netlink.c:1328
    netlink_sendmsg+0x110f/0x1330 net/netlink/af_netlink.c:1917
    sock_sendmsg_nosec net/socket.c:637 [inline]
    sock_sendmsg net/socket.c:657 [inline]
    ___sys_sendmsg+0x14ff/0x1590 net/socket.c:2311
    __sys_sendmsg net/socket.c:2356 [inline]
    __do_sys_sendmsg net/socket.c:2365 [inline]
    __se_sys_sendmsg+0x305/0x460 net/socket.c:2363
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2363
    do_syscall_64+0xb6/0x160 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x44/0xa9
    RIP: 0033:0x45a649
    Code: ad b6 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 7b b6 fb ff c3 66 2e 0f 1f 84 00 00 00 00
    RSP: 002b:00007f0790795c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
    RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 000000000045a649
    RDX: 0000000000000000 RSI: 0000000020000300 RDI: 0000000000000006
    RBP: 000000000075bfc8 R08: 0000000000000000 R09: 0000000000000000
    R10: 0000000000000000 R11: 0000000000000246 R12: 00007f07907966d4
    R13: 00000000004c8db5 R14: 00000000004df630 R15: 00000000ffffffff

    Uninit was created at:
    kmsan_save_stack_with_flags mm/kmsan/kmsan.c:149 [inline]
    kmsan_internal_poison_shadow+0x5c/0x110 mm/kmsan/kmsan.c:132
    kmsan_slab_alloc+0x97/0x100 mm/kmsan/kmsan_hooks.c:86
    slab_alloc_node mm/slub.c:2773 [inline]
    __kmalloc_node_track_caller+0xe27/0x11a0 mm/slub.c:4381
    __kmalloc_reserve net/core/skbuff.c:141 [inline]
    __alloc_skb+0x306/0xa10 net/core/skbuff.c:209
    alloc_skb include/linux/skbuff.h:1049 [inline]
    netlink_alloc_large_skb net/netlink/af_netlink.c:1174 [inline]
    netlink_sendmsg+0x783/0x1330 net/netlink/af_netlink.c:1892
    sock_sendmsg_nosec net/socket.c:637 [inline]
    sock_sendmsg net/socket.c:657 [inline]
    ___sys_sendmsg+0x14ff/0x1590 net/socket.c:2311
    __sys_sendmsg net/socket.c:2356 [inline]
    __do_sys_sendmsg net/socket.c:2365 [inline]
    __se_sys_sendmsg+0x305/0x460 net/socket.c:2363
    __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2363
    do_syscall_64+0xb6/0x160 arch/x86/entry/common.c:291
    entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Fixes: 6f96c3c6904c ("net_sched: fix backward compatibility for TCA_KIND")
    Signed-off-by: Eric Dumazet
    Reported-by: syzbot
    Acked-by: Cong Wang
    Cc: Marcelo Ricardo Leitner
    Cc: Jamal Hadi Salim
    Cc: Jiri Pirko
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric Dumazet
     
  • [ Upstream commit 2f23cd42e19c22c24ff0e221089b7b6123b117c5 ]

    sch->q.len hasn't been set if the subqueue is a NOLOCK qdisc
    in mq_dump() and mqprio_dump().

    Fixes: ce679e8df7ed ("net: sched: add support for TCQ_F_NOLOCK subqueues to sch_mqprio")
    Signed-off-by: Dust Li
    Signed-off-by: Tony Lu
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Dust Li
     
  • [ Upstream commit 9f104c7736904ac72385bbb48669e0c923ca879b ]

    When user runs a command like
    tc qdisc add dev eth1 root mqprio
    KASAN stack-out-of-bounds warning is emitted.
    Currently, NLA_ALIGN macro used in mqprio_dump provides too large
    buffer size as argument for nla_put and memcpy down the call stack.
    The flow looks like this:
    1. nla_put expects exact object size as an argument;
    2. Later it provides this size to memcpy;
    3. To calculate correct padding for SKB, nla_put applies NLA_ALIGN
    macro itself.

    Therefore, NLA_ALIGN should not be applied to the nla_put parameter.
    Otherwise it will lead to out-of-bounds memory access in memcpy.

    Fixes: 4e8b86c06269 ("mqprio: Introduce new hardware offload mode and shaper in mqprio")
    Signed-off-by: Vladyslav Tarasiuk
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Vladyslav Tarasiuk
     

16 Dec, 2019

1 commit

  • This is the 5.4.3 stable release

    Conflicts:
    drivers/cpufreq/imx-cpufreq-dt.c
    drivers/spi/spi-fsl-qspi.c

    The conflict is very minor, fixed it when do the merge. The imx-cpufreq-dt.c
    is just one line code-style change, using upstream one, no any function change.

    The spi-fsl-qspi.c has minor conflicts when merge upstream fixes: c69b17da53b2
    spi: spi-fsl-qspi: Clear TDH bits in FLSHCR register

    After merge, basic boot sanity test and basic qspi test been done on i.mx

    Signed-off-by: Jason Liu

    Jason Liu
     

05 Dec, 2019

1 commit

  • [ Upstream commit 14e54ab9143fa60794d13ea0a66c792a2046a8f3 ]

    When a classful qdisc's child qdisc has set the flag
    TCQ_F_CPUSTATS (pfifo_fast for example), the child qdisc's
    cpu_bstats should be passed to gnet_stats_copy_basic(),
    but many classful qdisc didn't do that. As a result,
    `tc -s class show dev DEV` always return 0 for bytes and
    packets in this case.

    Pass the child qdisc's cpu_bstats to gnet_stats_copy_basic()
    to fix this issue.

    The qstats also has this problem, but it has been fixed
    in 5dd431b6b9 ("net: sched: introduce and use qstats read...")
    and bstats still remains buggy.

    Fixes: 22e0f8b9322c ("net: sched: make bstats per cpu and estimator RCU safe")
    Signed-off-by: Dust Li
    Signed-off-by: Tony Lu
    Acked-by: Cong Wang
    Signed-off-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Dust Li
     

02 Dec, 2019

1 commit


20 Nov, 2019

1 commit

  • when configuring act_pedit rules, the number of keys is validated only on
    addition of a new entry. This is not sufficient to avoid hitting a WARN()
    in the traffic path: for example, it is possible to replace a valid entry
    with a new one having 0 extended keys, thus causing splats in dmesg like:

    pedit BUG: index 42
    WARNING: CPU: 2 PID: 4054 at net/sched/act_pedit.c:410 tcf_pedit_act+0xc84/0x1200 [act_pedit]
    [...]
    RIP: 0010:tcf_pedit_act+0xc84/0x1200 [act_pedit]
    Code: 89 fa 48 c1 ea 03 0f b6 04 02 84 c0 74 08 3c 03 0f 8e ac 00 00 00 48 8b 44 24 10 48 c7 c7 a0 c4 e4 c0 8b 70 18 e8 1c 30 95 ea 0b e9 a0 fa ff ff e8 00 03 f5 ea e9 14 f4 ff ff 48 89 58 40 e9
    RSP: 0018:ffff888077c9f320 EFLAGS: 00010286
    RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffffac2983a2
    RDX: 0000000000000001 RSI: 0000000000000008 RDI: ffff888053927bec
    RBP: dffffc0000000000 R08: ffffed100a726209 R09: ffffed100a726209
    R10: 0000000000000001 R11: ffffed100a726208 R12: ffff88804beea780
    R13: ffff888079a77400 R14: ffff88804beea780 R15: ffff888027ab2000
    FS: 00007fdeec9bd740(0000) GS:ffff888053900000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007ffdb3dfd000 CR3: 000000004adb4006 CR4: 00000000001606e0
    Call Trace:
    tcf_action_exec+0x105/0x3f0
    tcf_classify+0xf2/0x410
    __dev_queue_xmit+0xcbf/0x2ae0
    ip_finish_output2+0x711/0x1fb0
    ip_output+0x1bf/0x4b0
    ip_send_skb+0x37/0xa0
    raw_sendmsg+0x180c/0x2430
    sock_sendmsg+0xdb/0x110
    __sys_sendto+0x257/0x2b0
    __x64_sys_sendto+0xdd/0x1b0
    do_syscall_64+0xa5/0x4e0
    entry_SYSCALL_64_after_hwframe+0x49/0xbe
    RIP: 0033:0x7fdeeb72e993
    Code: 48 8b 0d e0 74 2c 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 0d d6 2c 00 00 75 13 49 89 ca b8 2c 00 00 00 0f 05 3d 01 f0 ff ff 73 34 c3 48 83 ec 08 e8 4b cc 00 00 48 89 04 24
    RSP: 002b:00007ffdb3de8a18 EFLAGS: 00000246 ORIG_RAX: 000000000000002c
    RAX: ffffffffffffffda RBX: 000055c81972b700 RCX: 00007fdeeb72e993
    RDX: 0000000000000040 RSI: 000055c81972b700 RDI: 0000000000000003
    RBP: 00007ffdb3dea130 R08: 000055c819728510 R09: 0000000000000010
    R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000040
    R13: 000055c81972b6c0 R14: 000055c81972969c R15: 0000000000000080

    Fix this moving the check on 'nkeys' earlier in tcf_pedit_init(), so that
    attempts to install rules having 0 keys are always rejected with -EINVAL.

    Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
    Signed-off-by: Davide Caratti
    Signed-off-by: David S. Miller

    Davide Caratti