1. Aug 06, 2021
  2. Aug 05, 2021
    • Jakub Kicinski's avatar
      Merge branch 'net-fix-use-after-free-bugs' · 6bb5318c
      Jakub Kicinski authored
      Pavel Skripkin says:
      
      ====================
      net: fix use-after-free bugs
      
      I've added new checker to smatch yesterday. It warns about using
      netdev_priv() pointer after free_{netdev,candev}() call. I hope, it will
      get into next smatch release.
      
      Some of the reported bugs are fixed and upstreamed already, but Dan ran new
      smatch with allmodconfig and found 2 more. Big thanks to Dan for doing it,
      because I totally forgot to do it.
      ====================
      
      Link: https://lore.kernel.org/r/cover.1628091954.git.paskripkin@gmail.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      6bb5318c
    • Pavel Skripkin's avatar
      net: vxge: fix use-after-free in vxge_device_unregister · 942e560a
      Pavel Skripkin authored
      Smatch says:
      drivers/net/ethernet/neterion/vxge/vxge-main.c:3518 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
      drivers/net/ethernet/neterion/vxge/vxge-main.c:3518 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
      drivers/net/ethernet/neterion/vxge/vxge-main.c:3520 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
      drivers/net/ethernet/neterion/vxge/vxge-main.c:3520 vxge_device_unregister() error: Using vdev after free_{netdev,candev}(dev);
      
      Since vdev pointer is netdev private data accessing it after free_netdev()
      call can cause use-after-free bug. Fix it by moving free_netdev() call at
      the end of the function
      
      Fixes: 6cca2003
      
       ("vxge: cleanup probe error paths")
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarPavel Skripkin <paskripkin@gmail.com>
      Reviewed-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      942e560a
    • Pavel Skripkin's avatar
      net: fec: fix use-after-free in fec_drv_remove · 44712965
      Pavel Skripkin authored
      
      
      Smatch says:
      	drivers/net/ethernet/freescale/fec_main.c:3994 fec_drv_remove() error: Using fep after free_{netdev,candev}(ndev);
      	drivers/net/ethernet/freescale/fec_main.c:3995 fec_drv_remove() error: Using fep after free_{netdev,candev}(ndev);
      
      Since fep pointer is netdev private data, accessing it after free_netdev()
      call can cause use-after-free bug. Fix it by moving free_netdev() call at
      the end of the function
      
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Fixes: a31eda65
      
       ("net: fec: fix clock count mis-match")
      Signed-off-by: default avatarPavel Skripkin <paskripkin@gmail.com>
      Reviewed-by: default avatarJoakim Zhang <qiangqing.zhang@nxp.com>
      Reviewed-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      44712965
    • Pavel Skripkin's avatar
      net: pegasus: fix uninit-value in get_interrupt_interval · af35fc37
      Pavel Skripkin authored
      
      
      Syzbot reported uninit value pegasus_probe(). The problem was in missing
      error handling.
      
      get_interrupt_interval() internally calls read_eprom_word() which can
      fail in some cases. For example: failed to receive usb control message.
      These cases should be handled to prevent uninit value bug, since
      read_eprom_word() will not initialize passed stack variable in case of
      internal failure.
      
      Fail log:
      
      BUG: KMSAN: uninit-value in get_interrupt_interval drivers/net/usb/pegasus.c:746 [inline]
      BUG: KMSAN: uninit-value in pegasus_probe+0x10e7/0x4080 drivers/net/usb/pegasus.c:1152
      CPU: 1 PID: 825 Comm: kworker/1:1 Not tainted 5.12.0-rc6-syzkaller #0
      ...
      Workqueue: usb_hub_wq hub_event
      Call Trace:
       __dump_stack lib/dump_stack.c:79 [inline]
       dump_stack+0x24c/0x2e0 lib/dump_stack.c:120
       kmsan_report+0xfb/0x1e0 mm/kmsan/kmsan_report.c:118
       __msan_warning+0x5c/0xa0 mm/kmsan/kmsan_instr.c:197
       get_interrupt_interval drivers/net/usb/pegasus.c:746 [inline]
       pegasus_probe+0x10e7/0x4080 drivers/net/usb/pegasus.c:1152
      ....
      
      Local variable ----data.i@pegasus_probe created at:
       get_interrupt_interval drivers/net/usb/pegasus.c:1151 [inline]
       pegasus_probe+0xe57/0x4080 drivers/net/usb/pegasus.c:1152
       get_interrupt_interval drivers/net/usb/pegasus.c:1151 [inline]
       pegasus_probe+0xe57/0x4080 drivers/net/usb/pegasus.c:1152
      
      Reported-and-tested-by: default avatar <syzbot+02c9f70f3afae308464a@syzkaller.appspotmail.com>
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarPavel Skripkin <paskripkin@gmail.com>
      Link: https://lore.kernel.org/r/20210804143005.439-1-paskripkin@gmail.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      af35fc37
    • Steven Rostedt (VMware)'s avatar
      tracing: Quiet smp_processor_id() use in preemptable warning in hwlat · 51397dc6
      Steven Rostedt (VMware) authored
      The hardware latency detector (hwlat) has a mode that it runs one thread
      across CPUs. The logic to move from the currently running CPU to the next
      one in the list does a smp_processor_id() to find where it currently is.
      Unfortunately, it's done with preemption enabled, and this triggers a
      warning for using smp_processor_id() in a preempt enabled section.
      
      As it is only using smp_processor_id() to get information on where it
      currently is in order to simply move it to the next CPU, it doesn't really
      care if it got moved in the mean time. It will simply balance out later if
      such a case arises.
      
      Switch smp_processor_id() to raw_smp_processor_id() to quiet that warning.
      
      Link: https://lkml.kernel.org/r/20210804141848.79edadc0@oasis.local.home
      
      
      
      Acked-by: default avatarDaniel Bristot de Oliveira <bristot@redhat.com>
      Fixes: 8fa826b7
      
       ("trace/hwlat: Implement the mode config option")
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      51397dc6
    • Grygorii Strashko's avatar
      net: ethernet: ti: am65-cpsw: fix crash in am65_cpsw_port_offload_fwd_mark_update() · ae03d189
      Grygorii Strashko authored
      The am65_cpsw_port_offload_fwd_mark_update() causes NULL exception crash
      when there is at least one disabled port and any other port added to the
      bridge first time.
      
      Unable to handle kernel NULL pointer dereference at virtual address 0000000000000858
      pc : am65_cpsw_port_offload_fwd_mark_update+0x54/0x68
      lr : am65_cpsw_netdevice_event+0x8c/0xf0
      Call trace:
      am65_cpsw_port_offload_fwd_mark_update+0x54/0x68
      notifier_call_chain+0x54/0x98
      raw_notifier_call_chain+0x14/0x20
      call_netdevice_notifiers_info+0x34/0x78
      __netdev_upper_dev_link+0x1c8/0x290
      netdev_master_upper_dev_link+0x1c/0x28
      br_add_if+0x3f0/0x6d0 [bridge]
      
      Fix it by adding proper check for port->ndev != NULL.
      
      Fixes: 2934db9b
      
       ("net: ti: am65-cpsw-nuss: Add netdevice notifiers")
      Signed-off-by: default avatarGrygorii Strashko <grygorii.strashko@ti.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ae03d189
    • Dan Carpenter's avatar
      bnx2x: fix an error code in bnx2x_nic_load() · fb653827
      Dan Carpenter authored
      Set the error code if bnx2x_alloc_fw_stats_mem() fails.  The current
      code returns success.
      
      Fixes: ad5afc89
      
       ("bnx2x: Separate VF and PF logic")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      fb653827
    • Leon Romanovsky's avatar
      netdevsim: Forbid devlink reload when adding or deleting ports · 23809a72
      Leon Romanovsky authored
      
      
      In order to remove complexity in devlink core related to
      devlink_reload_enable/disable, let's rewrite new_port/del_port
      logic to rely on internal to netdevsim lcok.
      
      We should protect only reload_down flow because it destroys nsim_dev,
      which is needed for nsim_dev_port_add/nsim_dev_port_del to hold
      port_list_lock.
      
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      23809a72
    • Vladimir Oltean's avatar
      net: dsa: tag_sja1105: optionally build as module when switch driver is module if PTP is enabled · f8b17a0b
      Vladimir Oltean authored
      TX timestamps are sent by SJA1110 as Ethernet packets containing
      metadata, so they are received by the tagging driver but must be
      processed by the switch driver - the one that is stateful since it
      keeps the TX timestamp queue.
      
      This means that there is an sja1110_process_meta_tstamp() symbol
      exported by the switch driver which is called by the tagging driver.
      
      There is a shim definition for that function when the switch driver is
      not compiled, which does nothing, but that shim is not effective when
      the tagging protocol driver is built-in and the switch driver is a
      module, because built-in code cannot call symbols exported by modules.
      
      So add an optional dependency between the tagger and the switch driver,
      if PTP support is enabled in the switch driver. If PTP is not enabled,
      sja1110_process_meta_tstamp() will translate into the shim "do nothing
      with these meta frames" function.
      
      Fixes: 566b18c8
      
       ("net: dsa: sja1105: implement TX timestamping for SJA1110")
      Reported-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      f8b17a0b
    • Yajun Deng's avatar
      netdevice: add the case if dev is NULL · b37a4668
      Yajun Deng authored
      
      
      Add the case if dev is NULL in dev_{put, hold}, so the caller doesn't
      need to care whether dev is NULL or not.
      
      Signed-off-by: default avatarYajun Deng <yajun.deng@linux.dev>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      b37a4668
    • Yajun Deng's avatar
      net: Remove redundant if statements · 1160dfa1
      Yajun Deng authored
      
      
      The 'if (dev)' statement already move into dev_{put , hold}, so remove
      redundant if statements.
      
      Signed-off-by: default avatarYajun Deng <yajun.deng@linux.dev>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1160dfa1
    • David S. Miller's avatar
      Revert "wwan: mhi: Fix build." · a85b99ab
      David S. Miller authored
      This reverts commit ab996c42
      
      .
      
      Only aplicable when net is merged into net-next.
      
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a85b99ab
    • David S. Miller's avatar
      Merge branch 'GRO-Toeplitz-selftests' · 6234219d
      David S. Miller authored
      
      
      Coco Li says:
      
      ====================
      GRO and Toeplitz hash selftests
      
      This patch contains two selftests in net, as well as respective
      scripts to run the tests on a single machine in loopback mode.
      GRO: tests the Linux kernel GRO behavior
      Toeplitz: tests the toeplitz hash implementation
      ====================
      
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      6234219d
    • Coco Li's avatar
      selftests/net: toeplitz test · 5ebfb4cc
      Coco Li authored
      
      
      To verify that this hash implements the Toeplitz hash function.
      
      Additionally, provide a script toeplitz.sh to run the test in loopback mode
      on a networking device of choice (see setup_loopback.sh). Since the
      script modifies the NIC setup, it will not be run by selftests
      automatically.
      
      Tested:
      ./toeplitz.sh -i eth0 -irq_prefix <eth0_pattern> -t -6
      carrier ready
      rxq 0: cpu 14
      rxq 1: cpu 20
      rxq 2: cpu 17
      rxq 3: cpu 23
      cpu 14: rx_hash 0x69103ebc [saddr fda8::2 daddr fda8::1 sport 58938 dport 8000] OK rxq 0 (cpu 14)
      ...
      cpu 20: rx_hash 0x257118b9 [saddr fda8::2 daddr fda8::1 sport 59258 dport 8000] OK rxq 1 (cpu 20)
      count: pass=111 nohash=0 fail=0
      Test Succeeded!
      
      Signed-off-by: default avatarCoco Li <lixiaoyan@google.com>
      Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5ebfb4cc
    • Coco Li's avatar
      selftests/net: GRO coalesce test · 7d157501
      Coco Li authored
      
      
      Implement a GRO testsuite that expects Linux kernel GRO behavior.
      All tests pass with the kernel software GRO stack. Run against a device
      with hardware GRO to verify that it matches the software stack.
      
      gro.c generates packets and sends them out through a packet socket. The
      receiver in gro.c (run separately) receives the packets on a packet
      socket, filters them by destination ports using BPF and checks the
      packet geometry to see whether GRO was applied.
      
      gro.sh provides a wrapper to run the gro.c in NIC loopback mode.
      It is not included in continuous testing because it modifies network
      configuration around a physical NIC: gro.sh sets the NIC in loopback
      mode, creates macvlan devices on the physical device in separate
      namespaces, and sends traffic generated by gro.c between the two
      namespaces to observe coalescing behavior.
      
      GRO coalescing is time sensitive.
      Some tests may prove flaky on some hardware.
      
      Note that this test suite tests for software GRO unless hardware GRO is
      enabled (ethtool -K $DEV rx-gro-hw on).
      
      To test, run ./gro.sh.
      The wrapper will output success or failed test names, and generate
      log.txt and stderr.
      
      Sample log.txt result:
      ...
      pure data packet of same size: Test succeeded
      
      large data packets followed by a smaller one: Test succeeded
      
      small data packets followed by a larger one: Test succeeded
      ...
      
      Sample stderr result:
      ...
      carrier ready
      running test ipv4 data
      Expected {200 }, Total 1 packets
      Received {200 }, Total 1 packets.
      ...
      
      Signed-off-by: default avatarCoco Li <lixiaoyan@google.com>
      Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      7d157501
    • David S. Miller's avatar
      wwan: mhi: Fix build. · ab996c42
      David S. Miller authored
      
      
      Reported-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      ab996c42
    • Gustavo A. R. Silva's avatar
      net/ipv6/mcast: Use struct_size() helper · e11c0e25
      Gustavo A. R. Silva authored
      
      
      Replace IP6_SFLSIZE() with struct_size() helper in order to avoid any
      potential type mistakes or integer overflows that, in the worst
      scenario, could lead to heap overflows.
      
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e11c0e25
    • Gustavo A. R. Silva's avatar
      net/ipv4/igmp: Use struct_size() helper · e6a1f7e0
      Gustavo A. R. Silva authored
      
      
      Replace IP_SFLSIZE() with struct_size() helper in order to avoid any
      potential type mistakes or integer overflows that, in the worst
      scenario, could lead to heap overflows.
      
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e6a1f7e0
    • Gustavo A. R. Silva's avatar
      net/ipv4/ipv6: Replace one-element arraya with flexible-array members · db243b79
      Gustavo A. R. Silva authored
      There is a regular need in the kernel to provide a way to declare having
      a dynamically sized set of trailing elements in a structure. Kernel code
      should always use “flexible array members”[1] for these cases. The older
      style of one-element or zero-length arrays should no longer be used[2].
      
      Use an anonymous union with a couple of anonymous structs in order to
      keep userspace unchanged and refactor the related code accordingly:
      
      $ pahole -C group_filter net/ipv4/ip_sockglue.o
      struct group_filter {
      	union {
      		struct {
      			__u32      gf_interface_aux;     /*     0     4 */
      
      			/* XXX 4 bytes hole, try to pack */
      
      			struct __kernel_sockaddr_storage gf_group_aux; /*     8   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
      			__u32      gf_fmode_aux;         /*   136     4 */
      			__u32      gf_numsrc_aux;        /*   140     4 */
      			struct __kernel_sockaddr_storage gf_slist[1]; /*   144   128 */
      		};                                       /*     0   272 */
      		struct {
      			__u32      gf_interface;         /*     0     4 */
      
      			/* XXX 4 bytes hole, try to pack */
      
      			struct __kernel_sockaddr_storage gf_group; /*     8   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 8 bytes ago --- */
      			__u32      gf_fmode;             /*   136     4 */
      			__u32      gf_numsrc;            /*   140     4 */
      			struct __kernel_sockaddr_storage gf_slist_flex[0]; /*   144     0 */
      		};                                       /*     0   144 */
      	};                                               /*     0   272 */
      
      	/* size: 272, cachelines: 5, members: 1 */
      	/* last cacheline: 16 bytes */
      };
      
      $ pahole -C compat_group_filter net/ipv4/ip_sockglue.o
      struct compat_group_filter {
      	union {
      		struct {
      			__u32      gf_interface_aux;     /*     0     4 */
      			struct __kernel_sockaddr_storage gf_group_aux __attribute__((__aligned__(4))); /*     4   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
      			__u32      gf_fmode_aux;         /*   132     4 */
      			__u32      gf_numsrc_aux;        /*   136     4 */
      			struct __kernel_sockaddr_storage gf_slist[1] __attribute__((__aligned__(4))); /*   140   128 */
      		} __attribute__((__packed__)) __attribute__((__aligned__(4)));                     /*     0   268 */
      		struct {
      			__u32      gf_interface;         /*     0     4 */
      			struct __kernel_sockaddr_storage gf_group __attribute__((__aligned__(4))); /*     4   128 */
      			/* --- cacheline 2 boundary (128 bytes) was 4 bytes ago --- */
      			__u32      gf_fmode;             /*   132     4 */
      			__u32      gf_numsrc;            /*   136     4 */
      			struct __kernel_sockaddr_storage gf_slist_flex[0] __attribute__((__aligned__(4))); /*   140     0 */
      		} __attribute__((__packed__)) __attribute__((__aligned__(4)));                     /*     0   140 */
      	} __attribute__((__aligned__(1)));               /*     0   268 */
      
      	/* size: 268, cachelines: 5, members: 1 */
      	/* forced alignments: 1 */
      	/* last cacheline: 12 bytes */
      } __attribute__((__packed__));
      
      This helps with the ongoing efforts to globally enable -Warray-bounds
      and get us closer to being able to tighten the FORTIFY_SOURCE routines
      on memcpy().
      
      [1] https://en.wikipedia.org/wiki/Flexible_array_member
      [2] https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
      
      Link: https://github.com/KSPP/linux/issues/79
      Link: https://github.com/KSPP/linux/issues/109
      
      
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      db243b79
    • David S. Miller's avatar
      Merge branch 'bridge-ioctl-fixes' · d15040a3
      David S. Miller authored
      Nikolay Aleksandrov says:
      
      ====================
      net: bridge: fix recent ioctl changes
      
      These are three fixes for the recent bridge removal of ndo_do_ioctl
      done by commit ad2f99ae
      
       ("net: bridge: move bridge ioctls out of
      .ndo_do_ioctl"). Patch 01 fixes a deadlock of the new bridge ioctl
      hook lock and rtnl by taking a netdev reference and always taking the
      bridge ioctl lock first then rtnl from within the bridge hook.
      Patch 02 fixes old_deviceless() bridge calls device name argument, and
      patch 03 checks in dev_ifsioc()'s SIOCBRADD/DELIF cases if the netdevice is
      actually a bridge before interpreting its private ptr as net_bridge.
      
      Patch 01 was tested by running old bridge-utils commands with lockdep
      enabled. Patch 02 was tested again by using bridge-utils and using the
      respective ioctl calls on a "up" bridge device. Patch 03 was tested by
      using the addif ioctl on a non-bridge device (e.g. loopback).
      ====================
      
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      d15040a3
    • Nikolay Aleksandrov's avatar
      net: core: don't call SIOCBRADD/DELIF for non-bridge devices · 9384eacd
      Nikolay Aleksandrov authored
      Commit ad2f99ae
      
       ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      changed SIOCBRADD/DELIF to use bridge's ioctl hook (br_ioctl_hook)
      without checking if the target netdevice is actually a bridge which can
      cause crashes and generally interpreting other devices' private pointers
      as net_bridge pointers.
      
      Crash example (lo - loopback):
      $ brctl addif lo ens16
       BUG: kernel NULL pointer dereference, address: 000000000000059898
       #PF: supervisor read access in kernel modede
       #PF: error_code(0x0000) - not-present pagege
       PGD 0 P4D 0 ^Ac
       Oops: 0000 [#1] SMP NOPTI
       CPU: 2 PID: 1376 Comm: brctl Kdump: loaded Tainted: G        W         5.14.0-rc3+ #405
       Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-4.fc34 04/01/2014
       RIP: 0010:add_del_if+0x1f/0x7c [bridge]
       Code: 80 bf 1b a0 41 5c e9 c0 3c 03 e1 0f 1f 44 00 00 41 55 41 54 41 89 f4 be 0c 00 00 00 55 48 89 fd 53 48 8b 87 88 00 00 00 89 d3 <4c> 8b a8 98 05 00 00 49 8b bd d0 00 00 00 e8 17 d7 f3 e0 84 c0 74
       RSP: 0018:ffff888109d97cb0 EFLAGS: 00010202^Ac
       RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
       RDX: 0000000000000000 RSI: 000000000000000c RDI: ffff888101239bc0
       RBP: ffff888101239bc0 R08: 0000000000000001 R09: 0000000000000000
       R10: ffff888109d97cd8 R11: 00000000000000a3 R12: 0000000000000012
       R13: 0000000000000000 R14: ffff888101239bc0 R15: ffff888109d97e10
       FS:  00007fc1e365b540(0000) GS:ffff88822be80000(0000) knlGS:0000000000000000
       CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
       CR2: 0000000000000598 CR3: 0000000106506000 CR4: 00000000000006e0
       Call Trace:
        br_ioctl_stub+0x7c/0x441 [bridge]
        br_ioctl_call+0x6d/0x8a
        dev_ifsioc+0x325/0x4e8
        dev_ioctl+0x46b/0x4e1
        sock_do_ioctl+0x7b/0xad
        sock_ioctl+0x2de/0x2f2
        vfs_ioctl+0x1e/0x2b
        __do_sys_ioctl+0x63/0x86
        do_syscall_64+0xcb/0xf2
        entry_SYSCALL_64_after_hwframe+0x44/0xae
       RIP: 0033:0x7fc1e3589427
       Code: 00 00 90 48 8b 05 69 aa 0c 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 b8 10 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 39 aa 0c 00 f7 d8 64 89 01 48
       RSP: 002b:00007ffc8d501d38 EFLAGS: 00000202 ORIG_RAX: 000000000000001010
       RAX: ffffffffffffffda RBX: 0000000000000012 RCX: 00007fc1e3589427
       RDX: 00007ffc8d501d60 RSI: 00000000000089a3 RDI: 0000000000000003
       RBP: 00007ffc8d501d60 R08: 0000000000000000 R09: fefefeff77686d74
       R10: fffffffffffff8f9 R11: 0000000000000202 R12: 00007ffc8d502e06
       R13: 00007ffc8d502e06 R14: 0000000000000000 R15: 0000000000000000
       Modules linked in: bridge stp llc bonding ipv6 virtio_net [last unloaded: llc]^Ac
       CR2: 0000000000000598
      
      Reported-by: default avatar <syzbot+79f4a8692e267bdb7227@syzkaller.appspotmail.com>
      Fixes: ad2f99ae
      
       ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      9384eacd
    • Nikolay Aleksandrov's avatar
      net: bridge: fix ioctl old_deviceless bridge argument · cbd7ad29
      Nikolay Aleksandrov authored
      Commit ad2f99ae ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      changed the source of the argument copy in bridge's old_deviceless() from
      args[1] (user ptr to device name) to uarg (ptr to ioctl arguments) causing
      wrong device name to be used.
      
      Example (broken, bridge exists but is up):
      $ brctl delbr bridge
      bridge bridge doesn't exist; can't delete it
      
      Example (working):
      $ brctl delbr bridge
      bridge bridge is still up; can't delete it
      
      Fixes: ad2f99ae
      
       ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      cbd7ad29
    • Nikolay Aleksandrov's avatar
      net: bridge: fix ioctl locking · 893b1958
      Nikolay Aleksandrov authored
      Before commit ad2f99ae
      
       ("net: bridge: move bridge ioctls out of
      .ndo_do_ioctl") the bridge ioctl calls were divided in two parts:
      one was deviceless called by sock_ioctl and didn't expect rtnl to be held,
      the other was with a device called by dev_ifsioc() and expected rtnl to be
      held. After the commit above they were united in a single ioctl stub, but
      it didn't take care of the locking expectations.
      For sock_ioctl now we acquire  (1) br_ioctl_mutex, (2) rtnl
      and for dev_ifsioc we acquire  (1) rtnl,           (2) br_ioctl_mutex
      
      The fix is to get a refcnt on the netdev for dev_ifsioc calls and drop rtnl
      then to reacquire it in the bridge ioctl stub after br_ioctl_mutex has
      been acquired. That will avoid playing locking games and make the rules
      straight-forward: we always take br_ioctl_mutex first, and then rtnl.
      
      Reported-by: default avatar <syzbot+34fe5894623c4ab1b379@syzkaller.appspotmail.com>
      Fixes: ad2f99ae
      
       ("net: bridge: move bridge ioctls out of .ndo_do_ioctl")
      Signed-off-by: default avatarNikolay Aleksandrov <nikolay@nvidia.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      893b1958
    • Gustavo A. R. Silva's avatar
      net/ipv4: Revert use of struct_size() helper · 4167a960
      Gustavo A. R. Silva authored
      Revert the use of structr_size() and stay with IP_MSFILTER_SIZE() for
      now, as in this case, the size of struct ip_msfilter didn't change with
      the addition of the flexible array imsf_slist_flex[]. So, if we use
      struct_size() we will be allocating and calculating the size of
      struct ip_msfilter with one too many items for imsf_slist_flex[].
      
      We might use struct_size() in the future, but for now let's stay
      with IP_MSFILTER_SIZE().
      
      Fixes: 	2d3e5caf
      
       ("net/ipv4: Replace one-element array with flexible-array member")
      Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4167a960
    • Paolo Abeni's avatar
      net: fix GRO skb truesize update · af352460
      Paolo Abeni authored
      commit 5e10da53
      
       ("skbuff: allow 'slow_gro' for skb carring sock
      reference") introduces a serious regression at the GRO layer setting
      the wrong truesize for stolen-head skbs.
      
      Restore the correct truesize: SKB_DATA_ALIGN(...) instead of
      SKB_TRUESIZE(...)
      
      Reported-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Fixes: 5e10da53
      
       ("skbuff: allow 'slow_gro' for skb carring sock reference")
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Tested-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      af352460
    • David S. Miller's avatar
      Merge branch 'eean-iosm-fixes' · afa00d3f
      David S. Miller authored
      
      
      M Chetan Kumar says:
      
      ====================
      net: wwan: iosm: fixes
      
      This patch series contains IOSM Driver fixes. Below is the patch
      series breakdown.
      
      PATCH1:
      * Correct the td buffer type casting & format specifier to fix lkp buildbot
      warning.
      
      PATCH2:
      * Endianness type correction for nr_of_bytes. This field is exchanged
      as part of host-device protocol communication.
      
      PATCH3:
      * Correct ul/dl data protocol mask bit to know which protocol capability
      does device implement.
      
      PATCH4:
      * Calling unregister_netdevice() inside wwan del link is trying to
      acquire the held lock in ndo_stop_cb(). Instead, queue net dev to
      be unregistered later.
      ====================
      
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      afa00d3f
    • M Chetan Kumar's avatar
      net: wwan: iosm: fix recursive lock acquire in unregister · 679505ba
      M Chetan Kumar authored
      
      
      Calling unregister_netdevice() inside wwan del link is trying to
      acquire the held lock in ndo_stop_cb(). Instead, queue net dev to
      be unregistered later.
      
      Signed-off-by: default avatarM Chetan Kumar <m.chetan.kumar@linux.intel.com>
      Reviewed-by: default avatarLoic Poulain <loic.poulain@linaro.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      679505ba