4.19.224-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 4.19.224-rc1 review
This is the start of the stable review cycle for the 4.19.224 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 05 Jan 2022 14:20:40 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.224-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.19.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.19.224-rc1
Muchun Song <[email protected]>
net: fix use-after-free in tw_timer_handler
Leo L. Schwab <[email protected]>
Input: spaceball - fix parsing of movement data packets
Pavel Skripkin <[email protected]>
Input: appletouch - initialize work before device registration
Alexey Makhalov <[email protected]>
scsi: vmw_pvscsi: Set residual data length conditionally
Todd Kjos <[email protected]>
binder: fix async_free_space accounting for empty parcels
Chunfeng Yun <[email protected]>
usb: mtu3: set interval of FS intr and isoc endpoint
Vincent Pelletier <[email protected]>
usb: gadget: f_fs: Clear ffs_eventfd in ffs_data_clear.
Mathias Nyman <[email protected]>
xhci: Fresco FL1100 controller should not have BROKEN_MSI quirk set.
Dmitry V. Levin <[email protected]>
uapi: fix linux/nfc.h userspace compilation errors
Krzysztof Kozlowski <[email protected]>
nfc: uapi: use kernel size_t to fix user-space builds
Pavel Skripkin <[email protected]>
i2c: validate user data in compat ioctl
Miaoqian Lin <[email protected]>
fsl/fman: Fix missing put_device() call in fman_port_probe
wujianguo <[email protected]>
selftests/net: udpgso_bench_tx: fix dst ip argument
Gal Pressman <[email protected]>
net/mlx5e: Fix wrong features assignment in case of error
Wei Yongjun <[email protected]>
NFC: st21nfca: Fix memory leak in device probe and remove
Matthias-Christian Ott <[email protected]>
net: usb: pegasus: Do not drop long Ethernet frames
Xin Long <[email protected]>
sctp: use call_rcu to free endpoint
Coco Li <[email protected]>
selftests: Calculate udpgso segment count without header adjustment
Coco Li <[email protected]>
udp: using datalen to cap ipv6 udp max gso segments
Dan Carpenter <[email protected]>
scsi: lpfc: Terminate string in lpfc_debugfs_nvmeio_trc_write()
Tom Rix <[email protected]>
selinux: initialize proto variable in selinux_ip_postroute_compat()
Heiko Carstens <[email protected]>
recordmcount.pl: fix typo in s390 mcount regex
Wang Qing <[email protected]>
platform/x86: apple-gmux: use resource_size() with res
Samuel Čavoj <[email protected]>
Input: i8042 - enable deferred probe quirk for ASUS UM325UA
Takashi Iwai <[email protected]>
Input: i8042 - add deferred probe support
Jens Wiklander <[email protected]>
tee: handle lookup of shm with reference count 0
Hans de Goede <[email protected]>
HID: asus: Add depends on USB_HID to HID_ASUS Kconfig option
-------------
Diffstat:
Documentation/admin-guide/kernel-parameters.txt | 2 + Makefile | 4 +- drivers/android/binder_alloc.c | 2 +- drivers/hid/Kconfig | 1 + drivers/i2c/i2c-dev.c | 3 + drivers/input/joystick/spaceball.c | 11 +- drivers/input/mouse/appletouch.c | 4 +- drivers/input/serio/i8042-x86ia64io.h | 21 +++ drivers/input/serio/i8042.c | 54 ++++--- drivers/net/ethernet/freescale/fman/fman_port.c | 12 +- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 11 +- drivers/net/usb/pegasus.c | 4 +- drivers/nfc/st21nfca/i2c.c | 29 ++-- drivers/platform/x86/apple-gmux.c | 2 +- drivers/scsi/lpfc/lpfc_debugfs.c | 4 +- drivers/scsi/vmw_pvscsi.c | 7 +- drivers/tee/tee_shm.c | 177 ++++++++-------------- drivers/usb/gadget/function/f_fs.c | 9 +- drivers/usb/host/xhci-pci.c | 5 +- drivers/usb/mtu3/mtu3_gadget.c | 7 + include/linux/tee_drv.h | 4 +- include/net/sctp/sctp.h | 6 +- include/net/sctp/structs.h | 3 +- include/uapi/linux/nfc.h | 6 +- net/ipv4/af_inet.c | 10 +- net/ipv6/udp.c | 2 +- net/sctp/diag.c | 12 +- net/sctp/endpointola.c | 23 ++- net/sctp/socket.c | 23 ++- scripts/recordmcount.pl | 2 +- security/selinux/hooks.c | 2 +- tools/testing/selftests/net/udpgso.c | 12 +- tools/testing/selftests/net/udpgso_bench_tx.c | 8 +- 33 files changed, 268 insertions(+), 214 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/27 HID: asus: Add depends on USB_HID to HID_ASUS Kconfig option
From: Hans de Goede <[email protected]>
commit c4f0126d487f3c68ab19ccb7c561e8fbf3ea2247 upstream.
Since commit 4bc43a421218 ("HID: asus: Add hid_is_using_ll_driver(usb_hid_driver) check") the hid-asus.c depends on the usb_hid_driver symbol. Add a depends on USB_HID to Kconfig to fix missing symbols errors in hid-asus when USB_HID is not enabled.
--- drivers/hid/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/hid/Kconfig +1 -0
@@ -148,6 +148,7 @@ config HID_APPLEIR config HID_ASUS tristate "Asus" + depends on USB_HID depends on LEDS_CLASS ---help--- Support for Asus notebook built-in keyboard and touchpad via i2c, and
Greg Kroah-Hartman
maintainerPATCH 2/27 tee: handle lookup of shm with reference count 0
In reply to Greg Kroah-HartmanFrom: Jens Wiklander <[email protected]>
commit dfd0743f1d9ea76931510ed150334d571fbab49d upstream.
Since the tee subsystem does not keep a strong reference to its idle shared memory buffers, it races with other threads that try to destroy a shared memory through a close of its dma-buf fd or by unmapping the memory.
In tee_shm_get_from_id() when a lookup in teedev->idr has been successful, it is possible that the tee_shm is in the dma-buf teardown path, but that path is blocked by the teedev mutex. Since we don't have an API to tell if the tee_shm is in the dma-buf teardown path or not we must find another way of detecting this condition.
Fix this by doing the reference counting directly on the tee_shm using a new refcount_t refcount field. dma-buf is replaced by using anon_inode_getfd() instead, this separates the life-cycle of the underlying file from the tee_shm. tee_shm_put() is updated to hold the mutex when decreasing the refcount to 0 and then remove the tee_shm from teedev->idr before releasing the mutex. This means that the tee_shm can never be found unless it has a refcount larger than 0.
--- drivers/tee/tee_shm.c | 177 ++++++++++++++++++------------------------------ include/linux/tee_drv.h | 4 - 2 files changed, 69 insertions(+), 112 deletions(-)
drivers/tee/tee_shm.c +67 -110
@@ -1,5 +1,5 @@/* -* Copyright (c) 2015-2016, Linaro Limited +* Copyright (c) 2015-2017, 2019-2021 Linaro Limited * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and
@@ -11,25 +11,17 @@* GNU General Public License for more details. * */ +#include <linux/anon_inodes.h> #include <linux/device.h> -#include <linux/dma-buf.h> -#include <linux/fdtable.h> #include <linux/idr.h> +#include <linux/mm.h> #include <linux/sched.h> #include <linux/slab.h> #include <linux/tee_drv.h> #include "tee_private.h" -static void tee_shm_release (struct tee_shm *shm) +static void tee_shm_release (struct tee_device *teedev,struct tee_shm *shm) { -struct tee_device *teedev = shm->teedev; - -mutex_lock (&teedev->mutex); -idr_remove (&teedev->idr, shm->id); -if (shm->ctx) -list_del (&shm->link); -mutex_unlock (&teedev->mutex); -if (shm->flags &TEE_SHM_POOL ) {struct tee_shm_pool_mgr *poolm;
@@ -61,51 +53,6 @@ static void tee_shm_release(struct tee_stee_device_put (teedev); } -static struct sg_table *tee_shm_op_map_dma_buf (struct dma_buf_attachment - *attach,enum dma_data_direction dir) -{ -return NULL ; -} - -static void tee_shm_op_unmap_dma_buf (struct dma_buf_attachment *attach, -struct sg_table *table, -enum dma_data_direction dir) -{ -} - -static void tee_shm_op_release (struct dma_buf *dmabuf) -{ -struct tee_shm *shm = dmabuf->priv; - -tee_shm_release (shm); -} - -static void *tee_shm_op_map (struct dma_buf *dmabuf,unsigned long pgnum) -{ -return NULL ; -} - -static int tee_shm_op_mmap (struct dma_buf *dmabuf,struct vm_area_struct *vma) -{ -struct tee_shm *shm = dmabuf->priv; -size_t size = vma->vm_end - vma->vm_start; - -/* Refuse sharing shared memory provided by application */ -if (shm->flags &TEE_SHM_REGISTER ) -return -EINVAL ; - -return remap_pfn_range (vma, vma->vm_start, shm->paddr >>PAGE_SHIFT , - size, vma->vm_page_prot); -} - -static const struct dma_buf_ops tee_shm_dma_buf_ops = { - .map_dma_buf = tee_shm_op_map_dma_buf, - .unmap_dma_buf = tee_shm_op_unmap_dma_buf, - .release = tee_shm_op_release, - .map = tee_shm_op_map, - .mmap = tee_shm_op_mmap, -}; -static struct tee_shm *__tee_shm_alloc (struct tee_context *ctx,struct tee_device *teedev,size_t size,u32 flags)
@@ -146,6 +93,7 @@ static struct tee_shm *__tee_shm_alloc(s goto err_dev_put; } +refcount_set (&shm->refcount,1 ); shm->flags = flags |TEE_SHM_POOL ; shm->teedev = teedev; shm->ctx = ctx;
@@ -168,21 +116,6 @@ static struct tee_shm *__tee_shm_alloc(s goto err_pool_free; } -if (flags &TEE_SHM_DMA_BUF ) { -DEFINE_DMA_BUF_EXPORT_INFO (exp_info); - - exp_info.ops = &tee_shm_dma_buf_ops; - exp_info.size = shm->size; - exp_info.flags =O_RDWR ; - exp_info.priv = shm; - - shm->dmabuf =dma_buf_export (&exp_info); -if (IS_ERR (shm->dmabuf)) { - ret =ERR_CAST (shm->dmabuf); - goto err_rem; - } - } -if (ctx) {teedev_ctx_get (ctx);mutex_lock (&teedev->mutex);
@@ -191,10 +124,6 @@ static struct tee_shm *__tee_shm_alloc(s }return shm; -err_rem: -mutex_lock (&teedev->mutex); -idr_remove (&teedev->idr, shm->id); -mutex_unlock (&teedev->mutex); err_pool_free: poolm->ops->free (poolm, shm); err_kfree:
@@ -259,6 +188,7 @@ struct tee_shm *tee_shm_register(struct goto err; } +refcount_set (&shm->refcount,1 ); shm->flags = flags |TEE_SHM_REGISTER ; shm->teedev = teedev; shm->ctx = ctx;
@@ -299,22 +229,6 @@ struct tee_shm *tee_shm_register(struct goto err; } -if (flags &TEE_SHM_DMA_BUF ) { -DEFINE_DMA_BUF_EXPORT_INFO (exp_info); - - exp_info.ops = &tee_shm_dma_buf_ops; - exp_info.size = shm->size; - exp_info.flags =O_RDWR ; - exp_info.priv = shm; - - shm->dmabuf =dma_buf_export (&exp_info); -if (IS_ERR (shm->dmabuf)) { - ret =ERR_CAST (shm->dmabuf); - teedev->desc->ops->shm_unregister (ctx, shm); - goto err; - } - } -mutex_lock (&teedev->mutex);list_add_tail (&shm->link, &ctx->list_shm);mutex_unlock (&teedev->mutex);
@@ -342,6 +256,35 @@ err: }EXPORT_SYMBOL_GPL (tee_shm_register); +static int tee_shm_fop_release (struct inode *inode,struct file *filp) +{ +tee_shm_put (filp->private_data); +return 0 ; +} + +static int tee_shm_fop_mmap (struct file *filp,struct vm_area_struct *vma) +{ +struct tee_shm *shm = filp->private_data; +size_t size = vma->vm_end - vma->vm_start; + +/* Refuse sharing shared memory provided by application */ +if (shm->flags &TEE_SHM_USER_MAPPED ) +return -EINVAL ; + +/* check for overflowing the buffer's size */ +if (vma->vm_pgoff +vma_pages (vma) > shm->size >>PAGE_SHIFT ) +return -EINVAL ; + +return remap_pfn_range (vma, vma->vm_start, shm->paddr >>PAGE_SHIFT , + size, vma->vm_page_prot); +} + +static const struct file_operations tee_shm_fops = { + .owner =THIS_MODULE , + .release = tee_shm_fop_release, + .mmap = tee_shm_fop_mmap, +}; +/** * tee_shm_get_fd() - Increase reference count and return file descriptor * @shm: Shared memory handle
@@ -354,10 +297,11 @@ int tee_shm_get_fd(struct tee_shm *shm)if (!(shm->flags &TEE_SHM_DMA_BUF ))return -EINVAL ; -get_dma_buf (shm->dmabuf); - fd =dma_buf_fd (shm->dmabuf,O_CLOEXEC ); +/* matched by tee_shm_put() in tee_shm_op_release() */ +refcount_inc (&shm->refcount); + fd =anon_inode_getfd ("tee_shm" , &tee_shm_fops, shm,O_RDWR );if (fd <0 ) -dma_buf_put (shm->dmabuf); +tee_shm_put (shm);return fd; }
@@ -367,17 +311,7 @@ int tee_shm_get_fd(struct tee_shm *shm)*/ void tee_shm_free (struct tee_shm *shm) { -/* -* dma_buf_put() decreases the dmabuf reference counter and will -* call tee_shm_release() when the last reference is gone. -* -* In the case of driver private memory we call tee_shm_release -* directly instead as it doesn't have a reference counter. -*/ -if (shm->flags &TEE_SHM_DMA_BUF ) -dma_buf_put (shm->dmabuf); -else -tee_shm_release (shm); +tee_shm_put (shm); }EXPORT_SYMBOL_GPL (tee_shm_free);
@@ -484,10 +418,15 @@ struct tee_shm *tee_shm_get_from_id(stru teedev = ctx->teedev;mutex_lock (&teedev->mutex); shm =idr_find (&teedev->idr, id); +/* +* If the tee_shm was found in the IDR it must have a refcount +* larger than 0 due to the guarantee in tee_shm_put() below. So +* it's safe to use refcount_inc(). +*/ if (!shm || shm->ctx != ctx) shm =ERR_PTR (-EINVAL ); -else if (shm->flags &TEE_SHM_DMA_BUF ) -get_dma_buf (shm->dmabuf); +else +refcount_inc (&shm->refcount);mutex_unlock (&teedev->mutex);return shm; }
@@ -499,7 +438,25 @@ EXPORT_SYMBOL_GPL(tee_shm_get_from_id);*/ void tee_shm_put (struct tee_shm *shm) { -if (shm->flags &TEE_SHM_DMA_BUF ) -dma_buf_put (shm->dmabuf); +struct tee_device *teedev = shm->teedev; +bool do_release = false; + +mutex_lock (&teedev->mutex); +if (refcount_dec_and_test (&shm->refcount)) { +/* +* refcount has reached 0, we must now remove it from the +* IDR before releasing the mutex. This will guarantee that +* the refcount_inc() in tee_shm_get_from_id() never starts +* from 0. +*/ +idr_remove (&teedev->idr, shm->id); +if (shm->ctx) +list_del (&shm->link); + do_release = true; + } +mutex_unlock (&teedev->mutex); + +if (do_release) +tee_shm_release (teedev, shm); }EXPORT_SYMBOL_GPL (tee_shm_put);
include/linux/tee_drv.h +2 -2
@@ -177,7 +177,7 @@ void tee_device_unregister(struct tee_de* @offset: offset of buffer in user space * @pages: locked pages from userspace * @num_pages: number of locked pages -* @dmabuf: dmabuf used to for exporting to user space +* @refcount: reference counter * @flags: defined by TEE_SHM_* in tee_drv.h * @id: unique id of a shared memory object on this device *
@@ -194,7 +194,7 @@ struct tee_shm {unsigned int offset;struct page **pages;size_t num_pages; -struct dma_buf *dmabuf; +refcount_t refcount;u32 flags;int id; };
Greg Kroah-Hartman
maintainerPATCH 3/27 Input: i8042 - add deferred probe support
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit 9222ba68c3f4065f6364b99cc641b6b019ef2d42 ]
We've got a bug report about the non-working keyboard on ASUS ZenBook UX425UA. It seems that the PS/2 device isn't ready immediately at boot but takes some seconds to get ready. Until now, the only workaround is to defer the probe, but it's available only when the driver is a module. However, many distros, including openSUSE as in the original report, build the PS/2 input drivers into kernel, hence it won't work easily.
This patch adds the support for the deferred probe for i8042 stuff as a workaround of the problem above. When the deferred probe mode is enabled and the device couldn't be probed, it'll be repeated with the standard deferred probe mechanism.
The deferred probe mode is enabled either via the new option i8042.probe_defer or via the quirk table entry. As of this patch, the quirk table contains only ASUS ZenBook UX425UA.
The deferred probe part is based on Fabio's initial work.
--- .../admin-guide/kernel-parameters.txt | 2 + drivers/input/serio/i8042-x86ia64io.h | 14 +++++ drivers/input/serio/i8042.c | 54 ++++++++++++------- 3 files changed, 51 insertions(+), 19 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +2 -0
@@ -1439,6 +1439,8 @@ architectures force reset to be always executed i8042.unlock [HW] Unlock (ignore) the keylock i8042.kbdreset [HW] Reset device connected to KBD port + i8042.probe_defer + [HW] Allow deferred probing upon i8042 probe errors i810= [HW,DRM]
drivers/input/serio/i8042-x86ia64io.h +14 -0
@@ -999,6 +999,17 @@ static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = { { } }; +static const struct dmi_system_id i8042_dmi_probe_defer_table[]__initconst = { + { +/* ASUS ZenBook UX425UA */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"ASUSTeK COMPUTER INC." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"ZenBook UX425UA" ), + }, + }, + { } +}; +#endif /* CONFIG_X86 */ #ifdef CONFIG_PNP
@@ -1318,6 +1329,9 @@ static int __init i8042_platform_init(void)if (dmi_check_system (i8042_dmi_kbdreset_table)) i8042_kbdreset = true; +if (dmi_check_system (i8042_dmi_probe_defer_table)) + i8042_probe_defer = true; +/* * A20 was already enabled during early kernel init. But some buggy * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to
drivers/input/serio/i8042.c +35 -19
164 lines not on this page · raw message
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 4/27 Input: i8042 - enable deferred probe quirk for ASUS UM325UA
In reply to Greg Kroah-HartmanFrom: Samuel Čavoj <[email protected]>
[ Upstream commit 44ee250aeeabb28b52a10397ac17ffb8bfe94839 ]
The ASUS UM325UA suffers from the same issue as the ASUS UX425UA, which is a very similar laptop. The i8042 device is not usable immediately after boot and fails to initialize, requiring a deferred retry.
Enable the deferred probe quirk for the UM325UA.
--- drivers/input/serio/i8042-x86ia64io.h | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/input/serio/i8042-x86ia64io.h +7 -0
@@ -1007,6 +1007,13 @@ static const struct dmi_system_id i8042_dmi_probe_defer_table[] __initconst = { DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"), }, }, + { + /* ASUS ZenBook UM325UA */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"), + }, + }, { } };
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 5/27 platform/x86: apple-gmux: use resource_size() with res
In reply to Greg Kroah-HartmanFrom: Wang Qing <[email protected]>
[ Upstream commit eb66fb03a727cde0ab9b1a3858de55c26f3007da ]
This should be (res->end - res->start + 1) here actually, use resource_size() derectly.
--- drivers/platform/x86/apple-gmux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/apple-gmux.c +1 -1
@@ -628,7 +628,7 @@ static int gmux_probe(struct pnp_dev *pnp, const struct pnp_device_id *id) } gmux_data->iostart = res->start; - gmux_data->iolen = res->end - res->start; + gmux_data->iolen =resource_size (res);if (gmux_data->iolen <GMUX_MIN_IO_LEN ) { pr_err("gmux I/O region too small (%lu < %u)\n",
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 6/27 recordmcount.pl: fix typo in s390 mcount regex
In reply to Greg Kroah-HartmanFrom: Heiko Carstens <[email protected]>
commit 4eb1782eaa9fa1c224ad1fa0d13a9f09c3ab2d80 upstream.
Commit 85bf17b28f97 ("recordmcount.pl: look for jgnop instruction as well as bcrl on s390") added a new alternative mnemonic for the existing brcl instruction. This is required for the combination old gcc version (pre 9.0) and binutils since version 2.37.
However at the same time this commit introduced a typo, replacing brcl with bcrl. As a result no mcount locations are detected anymore with old gcc versions (pre 9.0) and binutils before version 2.37.
Fix this by using the correct mnemonic again.
--- scripts/recordmcount.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/recordmcount.pl +1 -1
@@ -252,7 +252,7 @@ if ($arch eq "x86_64") { } elsif ($arch eq "s390" && $bits == 64) { if ($cc =~ /-DCC_USING_HOTPATCH/) { - $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*(bcrl\\s*0,|jgnop\\s*)[0-9a-f]+ <([^\+]*)>\$"; + $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*c0 04 00 00 00 00\\s*(brcl\\s*0,|jgnop\\s*)[0-9a-f]+ <([^\+]*)>\$"; $mcount_adjust = 0; } else { $mcount_regex = "^\\s*([0-9a-fA-F]+):\\s*R_390_(PC|PLT)32DBL\\s+_mcount\\+0x2\$";
Greg Kroah-Hartman
maintainerPATCH 7/27 selinux: initialize proto variable in selinux_ip_postroute_compat()
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
commit 732bc2ff080c447f8524f40c970c481f5da6eed3 upstream.
Clang static analysis reports this warning
hooks.c:5765:6: warning: 4th function call argument is an uninitialized
value
if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~selinux_parse_skb() can return ok without setting proto. The later call to selinux_xfrm_postroute_last() does an early check of proto and can return ok if the garbage proto value matches. So initialize proto.
--- security/selinux/hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/selinux/hooks.c +1 -1
@@ -5808,7 +5808,7 @@ static unsigned int selinux_ip_postroutestruct common_audit_data ad;struct lsm_network_audit net = {0 ,};char *addrp; -u8 proto; +u8 proto =0 ;if (sk ==NULL )return NF_ACCEPT ;
Greg Kroah-Hartman
maintainerPATCH 8/27 scsi: lpfc: Terminate string in lpfc_debugfs_nvmeio_trc_write()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 9020be114a47bf7ff33e179b3bb0016b91a098e6 ]
The "mybuf" string comes from the user, so we need to ensure that it is NUL terminated.
--- drivers/scsi/lpfc/lpfc_debugfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/lpfc/lpfc_debugfs.c +2 -2
@@ -2267,8 +2267,8 @@ lpfc_debugfs_nvmeio_trc_write(struct file *file, const char __user *buf,char mybuf[64 ];char *pbuf; -if (nbytes >64 ) - nbytes =64 ; +if (nbytes >63 ) + nbytes =63 ;memset (mybuf,0 ,sizeof (mybuf));
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 9/27 udp: using datalen to cap ipv6 udp max gso segments
In reply to Greg Kroah-HartmanFrom: Coco Li <[email protected]>
[ Upstream commit 736ef37fd9a44f5966e25319d08ff7ea99ac79e8 ]
The max number of UDP gso segments is intended to cap to UDP_MAX_SEGMENTS, this is checked in udp_send_skb().
skb->len contains network and transport header len here, we should use only data len instead.
This is the ipv6 counterpart to the below referenced commit, which missed the ipv6 change
--- net/ipv6/udp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv6/udp.c +1 -1
@@ -1069,7 +1069,7 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,kfree_skb (skb);return -EINVAL ; } -if (skb->len > cork->gso_size *UDP_MAX_SEGMENTS ) { +if (datalen > cork->gso_size *UDP_MAX_SEGMENTS ) {kfree_skb (skb);return -EINVAL ; }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 10/27 selftests: Calculate udpgso segment count without header adjustment
In reply to Greg Kroah-HartmanFrom: Coco Li <[email protected]>
[ Upstream commit 5471d5226c3b39b3d2f7011c082d5715795bd65c ]
The below referenced commit correctly updated the computation of number of segments (gso_size) by using only the gso payload size and removing the header lengths.
With this change the regression test started failing. Update the tests to match this new behavior.
Both IPv4 and IPv6 tests are updated, as a separate patch in this series will update udp_v6_send_skb to match this change in udp_send_skb.
--- tools/testing/selftests/net/udpgso.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/testing/selftests/net/udpgso.c +6 -6
@@ -157,13 +157,13 @@ struct testcase testcases_v4[] = { }, { /* send max number of min sized segments */ - .tlen = UDP_MAX_SEGMENTS - CONST_HDRLEN_V4, + .tlen = UDP_MAX_SEGMENTS, .gso_len = 1, - .r_num_mss = UDP_MAX_SEGMENTS - CONST_HDRLEN_V4, + .r_num_mss = UDP_MAX_SEGMENTS, }, { /* send max number + 1 of min sized segments: fail */ - .tlen = UDP_MAX_SEGMENTS - CONST_HDRLEN_V4 + 1, + .tlen = UDP_MAX_SEGMENTS + 1, .gso_len = 1, .tfail = true, },
@@ -260,13 +260,13 @@ struct testcase testcases_v6[] = { }, { /* send max number of min sized segments */ - .tlen = UDP_MAX_SEGMENTS - CONST_HDRLEN_V6, + .tlen = UDP_MAX_SEGMENTS, .gso_len = 1, - .r_num_mss = UDP_MAX_SEGMENTS - CONST_HDRLEN_V6, + .r_num_mss = UDP_MAX_SEGMENTS, }, { /* send max number + 1 of min sized segments: fail */ - .tlen = UDP_MAX_SEGMENTS - CONST_HDRLEN_V6 + 1, + .tlen = UDP_MAX_SEGMENTS + 1, .gso_len = 1, .tfail = true, },
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 11/27 sctp: use call_rcu to free endpoint
In reply to Greg Kroah-HartmanFrom: Xin Long <[email protected]>
[ Upstream commit 5ec7d18d1813a5bead0b495045606c93873aecbb ]
This patch is to delay the endpoint free by calling call_rcu() to fix another use-after-free issue in sctp_sock_dump():
BUG: KASAN: use-after-free in __lock_acquire+0x36d9/0x4c20
Call Trace:
__lock_acquire+0x36d9/0x4c20 kernel/locking/lockdep.c:3218
lock_acquire+0x1ed/0x520 kernel/locking/lockdep.c:3844
__raw_spin_lock_bh include/linux/spinlock_api_smp.h:135 [inline]
_raw_spin_lock_bh+0x31/0x40 kernel/locking/spinlock.c:168
spin_lock_bh include/linux/spinlock.h:334 [inline]
__lock_sock+0x203/0x350 net/core/sock.c:2253
lock_sock_nested+0xfe/0x120 net/core/sock.c:2774
lock_sock include/net/sock.h:1492 [inline]
sctp_sock_dump+0x122/0xb20 net/sctp/diag.c:324
sctp_for_each_transport+0x2b5/0x370 net/sctp/socket.c:5091
sctp_diag_dump+0x3ac/0x660 net/sctp/diag.c:527
__inet_diag_dump+0xa8/0x140 net/ipv4/inet_diag.c:1049
inet_diag_dump+0x9b/0x110 net/ipv4/inet_diag.c:1065
netlink_dump+0x606/0x1080 net/netlink/af_netlink.c:2244
__netlink_dump_start+0x59a/0x7c0 net/netlink/af_netlink.c:2352
netlink_dump_start include/linux/netlink.h:216 [inline]
inet_diag_handler_cmd+0x2ce/0x3f0 net/ipv4/inet_diag.c:1170
__sock_diag_cmd net/core/sock_diag.c:232 [inline]
sock_diag_rcv_msg+0x31d/0x410 net/core/sock_diag.c:263
netlink_rcv_skb+0x172/0x440 net/netlink/af_netlink.c:2477
sock_diag_rcv+0x2a/0x40 net/core/sock_diag.c:274This issue occurs when asoc is peeled off and the old sk is freed after getting it by asoc->base.sk and before calling lock_sock(sk).
To prevent the sk free, as a holder of the sk, ep should be alive when calling lock_sock(). This patch uses call_rcu() and moves sock_put and ep free into sctp_endpoint_destroy_rcu(), so that it's safe to try to hold the ep under rcu_read_lock in sctp_transport_traverse_process().
If sctp_endpoint_hold() returns true, it means this ep is still alive and we have held it and can continue to dump it; If it returns false, it means this ep is dead and can be freed after rcu_read_unlock, and we should skip it.
In sctp_sock_dump(), after locking the sk, if this ep is different from tsp->asoc->ep, it means during this dumping, this asoc was peeled off before calling lock_sock(), and the sk should be skipped; If this ep is the same with tsp->asoc->ep, it means no peeloff happens on this asoc, and due to lock_sock, no peeloff will happen either until release_sock.
Note that delaying endpoint free won't delay the port release, as the port release happens in sctp_endpoint_destroy() before calling call_rcu(). Also, freeing endpoint by call_rcu() makes it safe to access the sk by asoc->base.sk in sctp_assocs_seq_show() and sctp_rcv().
Thanks Jones to bring this issue up.
v1->v2:
- improve the changelog.
- add kfree(ep) into sctp_endpoint_destroy_rcu(), as Jakub noticed.
--- include/net/sctp/sctp.h | 6 +++--- include/net/sctp/structs.h | 3 ++- net/sctp/diag.c | 12 ++++++------ net/sctp/endpointola.c | 23 +++++++++++++++-------- net/sctp/socket.c | 23 +++++++++++++++-------- 5 files changed, 41 insertions(+), 26 deletions(-)
include/net/sctp/sctp.h +3 -3
@@ -118,6 +118,7 @@ extern struct percpu_counter sctp_sockets_allocated;int sctp_asconf_mgmt (struct sctp_sock *,struct sctp_sockaddr_entry *);struct sk_buff *sctp_skb_recv_datagram (struct sock *,int ,int ,int *); +typedef int (*sctp_callback_t )(struct sctp_endpoint *,struct sctp_transport *,void *);void sctp_transport_walk_start (struct rhashtable_iter *iter);void sctp_transport_walk_stop (struct rhashtable_iter *iter); struct sctp_transport *sctp_transport_get_next(struct net *net,
@@ -128,9 +129,8 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),struct net *net, const union sctp_addr *laddr, const union sctp_addr *paddr, void *p); -int sctp_for_each_transport (int (*cb)(struct sctp_transport *,void *), -int (*cb_done)(struct sctp_transport *,void *), -struct net *net,int *pos,void *p); +int sctp_transport_traverse_process (sctp_callback_t cb,sctp_callback_t cb_done, +struct net *net,int *pos,void *p);int sctp_for_each_endpoint (int (*cb)(struct sctp_endpoint *,void *),void *p);int sctp_get_sctp_info (struct sock *sk,struct sctp_association *asoc,struct sctp_info *info);
include/net/sctp/structs.h +2 -1
@@ -1348,6 +1348,7 @@ struct sctp_endpoint {u32 secid;u32 peer_secid; +struct rcu_head rcu; };/* Recover the outter endpoint structure. */
@@ -1363,7 +1364,7 @@ static inline struct sctp_endpoint *sctp_ep(struct sctp_ep_common *base)struct sctp_endpoint *sctp_endpoint_new (struct sock *,gfp_t );void sctp_endpoint_free (struct sctp_endpoint *);void sctp_endpoint_put (struct sctp_endpoint *); -void sctp_endpoint_hold (struct sctp_endpoint *); +int sctp_endpoint_hold (struct sctp_endpoint *ep);void sctp_endpoint_add_asoc (struct sctp_endpoint *,struct sctp_association *); struct sctp_association *sctp_endpoint_lookup_assoc( const struct sctp_endpoint *ep,
net/sctp/diag.c +6 -6
@@ -307,9 +307,8 @@ out:return err; } -static int sctp_sock_dump (struct sctp_transport *tsp,void *p) +static int sctp_sock_dump (struct sctp_endpoint *ep,struct sctp_transport *tsp,void *p) { -struct sctp_endpoint *ep = tsp->asoc->ep;struct sctp_comm_param *commp = p;struct sock *sk = ep->base.sk;struct sk_buff *skb = commp->skb;
@@ -319,6 +318,8 @@ static int sctp_sock_dump(struct sctp_transport *tsp, void *p)int err =0 ;lock_sock (sk); +if (ep != tsp->asoc->ep) + goto release;list_for_each_entry (assoc, &ep->asocs, asocs) {if (cb->args[4 ] < cb->args[1 ]) goto next;
@@ -361,9 +362,8 @@ release:return err; } -static int sctp_sock_filter (struct sctp_transport *tsp,void *p) +static int sctp_sock_filter (struct sctp_endpoint *ep,struct sctp_transport *tsp,void *p) { -struct sctp_endpoint *ep = tsp->asoc->ep;struct sctp_comm_param *commp = p;struct sock *sk = ep->base.sk;const struct inet_diag_req_v2 *r = commp->r;
@@ -521,8 +521,8 @@ skip:if (!(idiag_states & ~(TCPF_LISTEN |TCPF_CLOSE ))) goto done; -sctp_for_each_transport (sctp_sock_filter, sctp_sock_dump, - net, &pos, &commp); +sctp_transport_traverse_process (sctp_sock_filter, sctp_sock_dump, + net, &pos, &commp); cb->args[2 ] = pos; done:
net/sctp/endpointola.c +15 -8
@@ -242,6 +242,18 @@ void sctp_endpoint_free(struct sctp_endpoint *ep) }/* Final destructor for endpoint. */ +static void sctp_endpoint_destroy_rcu (struct rcu_head *head) +{ + struct sctp_endpoint *ep = container_of(head, struct sctp_endpoint, rcu); +struct sock *sk = ep->base.sk; + +sctp_sk (sk)->ep =NULL ; +sock_put (sk); + +kfree (ep); +SCTP_DBG_OBJCNT_DEC (ep); +} +static void sctp_endpoint_destroy (struct sctp_endpoint *ep) {struct sock *sk;
@@ -275,18 +287,13 @@ static void sctp_endpoint_destroy(struct sctp_endpoint *ep)if (sctp_sk (sk)->bind_hash)sctp_put_port (sk); -sctp_sk (sk)->ep =NULL ; -/* Give up our hold on the sock */ -sock_put (sk); - -kfree (ep); -SCTP_DBG_OBJCNT_DEC (ep); +call_rcu (&ep->rcu, sctp_endpoint_destroy_rcu); }/* Hold a reference to an endpoint. */ -void sctp_endpoint_hold (struct sctp_endpoint *ep) +int sctp_endpoint_hold (struct sctp_endpoint *ep) { -refcount_inc (&ep->base.refcnt); +return refcount_inc_not_zero (&ep->base.refcnt); }/* Release a reference to an endpoint and clean up if there are
net/sctp/socket.c +15 -8
@@ -5056,11 +5056,12 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *), }EXPORT_SYMBOL_GPL (sctp_transport_lookup_process); -int sctp_for_each_transport (int (*cb)(struct sctp_transport *,void *), -int (*cb_done)(struct sctp_transport *,void *), -struct net *net,int *pos,void *p) { +int sctp_transport_traverse_process (sctp_callback_t cb,sctp_callback_t cb_done, +struct net *net,int *pos,void *p) +{struct rhashtable_iter hti;struct sctp_transport *tsp; +struct sctp_endpoint *ep;int ret; again:
@@ -5069,26 +5070,32 @@ again: tsp =sctp_transport_get_idx (net, &hti, *pos +1 );for (; !IS_ERR_OR_NULL (tsp); tsp =sctp_transport_get_next (net, &hti)) { - ret =cb (tsp, p); -if (ret) -break ; + ep = tsp->asoc->ep; +if (sctp_endpoint_hold (ep)) {/* asoc can be peeled off */ + ret =cb (ep, tsp, p); +if (ret) +break ; +sctp_endpoint_put (ep); + } (*pos)++;sctp_transport_put (tsp); }sctp_transport_walk_stop (&hti);if (ret) { -if (cb_done && !cb_done (tsp, p)) { +if (cb_done && !cb_done (ep, tsp, p)) { (*pos)++; +sctp_endpoint_put (ep);sctp_transport_put (tsp); goto again; } +sctp_endpoint_put (ep);sctp_transport_put (tsp); }return ret; } -EXPORT_SYMBOL_GPL (sctp_for_each_transport); +EXPORT_SYMBOL_GPL (sctp_transport_traverse_process);/* 7.2.1 Association Status (SCTP_STATUS)
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 12/27 net: usb: pegasus: Do not drop long Ethernet frames
In reply to Greg Kroah-HartmanFrom: Matthias-Christian Ott <[email protected]>
[ Upstream commit ca506fca461b260ab32952b610c3d4aadc6c11fd ]
The D-Link DSB-650TX (2001:4002) is unable to receive Ethernet frames that are longer than 1518 octets, for example, Ethernet frames that contain 802.1Q VLAN tags.
The frames are sent to the pegasus driver via USB but the driver discards them because they have the Long_pkt field set to 1 in the received status report. The function read_bulk_callback of the pegasus driver treats such received "packets" (in the terminology of the hardware) as errors but the field simply does just indicate that the Ethernet frame (MAC destination to FCS) is longer than 1518 octets.
It seems that in the 1990s there was a distinction between "giant" (> 1518) and "runt" (< 64) frames and the hardware includes flags to indicate this distinction. It seems that the purpose of the distinction "giant" frames was to not allow infinitely long frames due to transmission errors and to allow hardware to have an upper limit of the frame size. However, the hardware already has such limit with its 2048 octet receive buffer and, therefore, Long_pkt is merely a convention and should not be treated as a receive error.
Actually, the hardware is even able to receive Ethernet frames with 2048 octets which exceeds the claimed limit frame size limit of the driver of 1536 octets (PEGASUS_MTU).
--- drivers/net/usb/pegasus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/usb/pegasus.c +2 -2
@@ -498,11 +498,11 @@ static void read_bulk_callback(struct urb *urb) goto goon; rx_status = buf[count -2 ]; -if (rx_status &0x1e ) { +if (rx_status &0x1c ) {netif_dbg (pegasus, rx_err, net,"RX packet error %x\n" , rx_status); net->stats.rx_errors++; -if (rx_status &0x06 )/* long or runt */ +if (rx_status &0x04 )/* runt */ net->stats.rx_length_errors++;if (rx_status &0x08 ) net->stats.rx_crc_errors++;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 13/27 NFC: st21nfca: Fix memory leak in device probe and remove
In reply to Greg Kroah-HartmanFrom: Wei Yongjun <[email protected]>
[ Upstream commit 1b9dadba502234eea7244879b8d5d126bfaf9f0c ]
'phy->pending_skb' is alloced when device probe, but forgot to free in the error handling path and remove path, this cause memory leak as follows:
unreferenced object 0xffff88800bc06800 (size 512):
comm "8", pid 11775, jiffies 4295159829 (age 9.032s) hex dump (first 32 bytes):
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 00 00 00 00 00 ................
backtrace:
[<00000000d66c09ce>] __kmalloc_node_track_caller+0x1ed/0x450
[<00000000c93382b3>] kmalloc_reserve+0x37/0xd0
[<000000005fea522c>] __alloc_skb+0x124/0x380
[<0000000019f29f9a>] st21nfca_hci_i2c_probe+0x170/0x8f2Fix it by freeing 'pending_skb' in error and remove.
--- drivers/nfc/st21nfca/i2c.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)
drivers/nfc/st21nfca/i2c.c +20 -9
@@ -544,7 +544,8 @@ static int st21nfca_hci_i2c_probe(struct i2c_client *client, phy->gpiod_ena =devm_gpiod_get (dev,"enable" ,GPIOD_OUT_LOW );if (IS_ERR (phy->gpiod_ena)) {nfc_err (dev,"Unable to get ENABLE GPIO\n" ); -return PTR_ERR (phy->gpiod_ena); + r =PTR_ERR (phy->gpiod_ena); + goto out_free; } phy->se_status.is_ese_present =
@@ -555,7 +556,7 @@ static int st21nfca_hci_i2c_probe(struct i2c_client *client, r =st21nfca_hci_platform_init (phy);if (r <0 ) {nfc_err (&client->dev,"Unable to reboot st21nfca\n" ); -return r; + goto out_free; } r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
@@ -564,15 +565,23 @@ static int st21nfca_hci_i2c_probe(struct i2c_client *client, ST21NFCA_HCI_DRIVER_NAME, phy);if (r <0 ) {nfc_err (&client->dev,"Unable to register IRQ handler\n" ); -return r; + goto out_free; } -return st21nfca_hci_probe (phy, &i2c_phy_ops,LLC_SHDLC_NAME , -ST21NFCA_FRAME_HEADROOM , -ST21NFCA_FRAME_TAILROOM , -ST21NFCA_HCI_LLC_MAX_PAYLOAD , - &phy->hdev, - &phy->se_status); + r =st21nfca_hci_probe (phy, &i2c_phy_ops,LLC_SHDLC_NAME , +ST21NFCA_FRAME_HEADROOM , +ST21NFCA_FRAME_TAILROOM , +ST21NFCA_HCI_LLC_MAX_PAYLOAD , + &phy->hdev, + &phy->se_status); +if (r) + goto out_free; + +return 0 ; + +out_free: +kfree_skb (phy->pending_skb); +return r; }static int st21nfca_hci_i2c_remove (struct i2c_client *client)
@@ -585,6 +594,8 @@ static int st21nfca_hci_i2c_remove(struct i2c_client *client)if (phy->powered)st21nfca_hci_i2c_disable (phy); +if (phy->pending_skb) +kfree_skb (phy->pending_skb);return 0 ; }
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 14/27 net/mlx5e: Fix wrong features assignment in case of error
In reply to Greg Kroah-HartmanFrom: Gal Pressman <[email protected]>
[ Upstream commit 992d8a4e38f0527f24e273ce3a9cd6dea1a6a436 ]
In case of an error in mlx5e_set_features(), 'netdev->features' must be updated with the correct state of the device to indicate which features were updated successfully.
To do that we maintain a copy of 'netdev->features' and update it after successful feature changes, so we can assign it to back to 'netdev->features' if needed.
However, since not all netdev features are handled by the driver (e.g. GRO/TSO/etc), some features may not be updated correctly in case of an error updating another feature.
For example, while requesting to disable TSO (feature which is not handled by the driver) and enable HW-GRO, if an error occurs during HW-GRO enable, 'oper_features' will be assigned with 'netdev->features' and HW-GRO turned off. TSO will remain enabled in such case, which is a bug.
To solve that, instead of using 'netdev->features' as the baseline of 'oper_features' and changing it on set feature success, use 'features' instead and update it in case of errors.
--- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_main.c +5 -6
@@ -3666,12 +3666,11 @@ static int set_feature_arfs(struct net_device *netdev, bool enable)static int mlx5e_handle_feature (struct net_device *netdev,netdev_features_t *features, -netdev_features_t wanted_features,netdev_features_t feature,mlx5e_feature_handler feature_handler) { -netdev_features_t changes = wanted_features ^ netdev->features; -bool enable = !!(wanted_features & feature); +netdev_features_t changes = *features ^ netdev->features; +bool enable = !!(*features & feature);int err;if (!(changes & feature))
@@ -3679,23 +3678,23 @@ static int mlx5e_handle_feature(struct net_device *netdev, err =feature_handler (netdev, enable);if (err) { +MLX5E_SET_FEATURE (features, feature, !enable);netdev_err (netdev,"%s feature %pNF failed, err %d\n" , enable ?"Enable" :"Disable" , &feature, err);return err; } -MLX5E_SET_FEATURE (features, feature, enable);return 0 ; }static int mlx5e_set_features (struct net_device *netdev,netdev_features_t features) { -netdev_features_t oper_features = netdev->features; +netdev_features_t oper_features = features;int err =0 ;#define MLX5E_HANDLE_FEATURE (feature, handler) \ - mlx5e_handle_feature(netdev, &oper_features, features, feature, handler) + mlx5e_handle_feature(netdev, &oper_features, feature, handler) err |=MLX5E_HANDLE_FEATURE (NETIF_F_LRO , set_feature_lro); err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_VLAN_CTAG_FILTER,
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 15/27 selftests/net: udpgso_bench_tx: fix dst ip argument
In reply to Greg Kroah-HartmanFrom: wujianguo <[email protected]>
[ Upstream commit 9c1952aeaa98b3cfc49e2a79cb2c7d6a674213e9 ]
udpgso_bench_tx call setup_sockaddr() for dest address before parsing all arguments, if we specify "-p ${dst_port}" after "-D ${dst_ip}", then ${dst_port} will be ignored, and using default cfg_port 8000.
This will cause test case "multiple GRO socks" failed in udpgro.sh.
Setup sockaddr after parsing all arguments.
--- tools/testing/selftests/net/udpgso_bench_tx.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
tools/testing/selftests/net/udpgso_bench_tx.c +7 -1
@@ -247,6 +247,7 @@ static void usage(const char *filepath)static void parse_opts (int argc,char **argv) { +const char *bind_addr =NULL ;int max_len, hdrlen;int c;
@@ -271,7 +272,7 @@ static void parse_opts(int argc, char **argv) cfg_cpu =strtol (optarg,NULL ,0 );break ;case 'D' : -setup_sockaddr (cfg_family, optarg, &cfg_dst_addr); + bind_addr = optarg;break ;case 'l' : cfg_runtime_ms =strtoul (optarg,NULL ,10 ) *1000 ;
@@ -300,6 +301,11 @@ static void parse_opts(int argc, char **argv) } } +if (!bind_addr) + bind_addr = cfg_family ==PF_INET6 ?"::" :"0.0.0.0" ; + +setup_sockaddr (cfg_family, bind_addr, &cfg_dst_addr); +if (optind != argc)usage (argv[0 ]);
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 16/27 fsl/fman: Fix missing put_device() call in fman_port_probe
In reply to Greg Kroah-HartmanFrom: Miaoqian Lin <[email protected]>
[ Upstream commit bf2b09fedc17248b315f80fb249087b7d28a69a6 ]
The reference taken by 'of_find_device_by_node()' must be released when not needed anymore.
Add the corresponding 'put_device()' in the and error handling paths.
--- drivers/net/ethernet/freescale/fman/fman_port.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/net/ethernet/freescale/fman/fman_port.c +7 -5
@@ -1791,7 +1791,7 @@ static int fman_port_probe(struct platform_device *of_dev) fman =dev_get_drvdata (&fm_pdev->dev);if (!fman) { err = -EINVAL ; - goto return_err; + goto put_device; } err =of_property_read_u32 (port_node,"cell-index" , &val);
@@ -1799,7 +1799,7 @@ static int fman_port_probe(struct platform_device *of_dev)dev_err (port->dev,"%s: reading cell-index for %pOF failed\n" , __func__, port_node); err = -EINVAL ; - goto return_err; + goto put_device; } port_id = (u8 )val; port->dts_params.id = port_id;
@@ -1833,7 +1833,7 @@ static int fman_port_probe(struct platform_device *of_dev) }else {dev_err (port->dev,"%s: Illegal port type\n" , __func__); err = -EINVAL ; - goto return_err; + goto put_device; } port->dts_params.type = port_type;
@@ -1847,7 +1847,7 @@ static int fman_port_probe(struct platform_device *of_dev)dev_err (port->dev,"%s: incorrect qman-channel-id\n" , __func__); err = -EINVAL ; - goto return_err; + goto put_device; } port->dts_params.qman_channel_id = qman_channel_id; }
@@ -1857,7 +1857,7 @@ static int fman_port_probe(struct platform_device *of_dev)dev_err (port->dev,"%s: of_address_to_resource() failed\n" , __func__); err = -ENOMEM ; - goto return_err; + goto put_device; } port->dts_params.fman = fman;
@@ -1882,6 +1882,8 @@ static int fman_port_probe(struct platform_device *of_dev)return 0 ; +put_device: +put_device (&fm_pdev->dev); return_err:of_node_put (port_node); free_port:
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 17/27 i2c: validate user data in compat ioctl
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
[ Upstream commit bb436283e25aaf1533ce061605d23a9564447bdf ]
Wrong user data may cause warning in i2c_transfer(), ex: zero msgs. Userspace should not be able to trigger warnings, so this patch adds validation checks for user data in compact ioctl to prevent reported warnings
--- drivers/i2c/i2c-dev.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/i2c/i2c-dev.c +3 -0
@@ -544,6 +544,9 @@ static long compat_i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned lo sizeof(rdwr_arg)))return -EFAULT ; +if (!rdwr_arg.msgs || rdwr_arg.nmsgs ==0 ) +return -EINVAL ; +if (rdwr_arg.nmsgs >I2C_RDWR_IOCTL_MAX_MSGS )return -EINVAL ;
Signature · 1 line
2.34.1
Greg Kroah-Hartman
maintainerPATCH 18/27 nfc: uapi: use kernel size_t to fix user-space builds
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
commit 79b69a83705e621b258ac6d8ae6d3bfdb4b930aa upstream.
Fix user-space builds if it includes /usr/include/linux/nfc.h before some of other headers:
/usr/include/linux/nfc.h:281:9: error: unknown type name ‘size_t’
281 | size_t service_name_len;
| ^~~~~~--- include/uapi/linux/nfc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/linux/nfc.h +1 -1
@@ -278,7 +278,7 @@ struct sockaddr_nfc_llcp {__u8 dsap;/* Destination SAP, if known */ __u8 ssap;/* Source SAP to be bound to */ char service_name[NFC_LLCP_MAX_SERVICE_NAME ];/* Service name URI */ ; -size_t service_name_len; +__kernel_size_t service_name_len; };/* NFC socket protocols */
Greg Kroah-Hartman
maintainerPATCH 19/27 uapi: fix linux/nfc.h userspace compilation errors
In reply to Greg Kroah-HartmanFrom: Dmitry V. Levin <[email protected]>
commit 7175f02c4e5f5a9430113ab9ca0fd0ce98b28a51 upstream.
Replace sa_family_t with __kernel_sa_family_t to fix the following linux/nfc.h userspace compilation errors:
/usr/include/linux/nfc.h:266:2: error: unknown type name 'sa_family_t'
sa_family_t sa_family;/usr/include/linux/nfc.h:274:2: error: unknown type name 'sa_family_t'
sa_family_t sa_family;
--- include/uapi/linux/nfc.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/uapi/linux/nfc.h +2 -2
@@ -263,7 +263,7 @@ enum nfc_sdp_attr {#define NFC_SE_ENABLED 0x1struct sockaddr_nfc { -sa_family_t sa_family; +__kernel_sa_family_t sa_family;__u32 dev_idx;__u32 target_idx;__u32 nfc_protocol;
@@ -271,7 +271,7 @@ struct sockaddr_nfc {#define NFC_LLCP_MAX_SERVICE_NAME 63struct sockaddr_nfc_llcp { -sa_family_t sa_family; +__kernel_sa_family_t sa_family;__u32 dev_idx;__u32 target_idx;__u32 nfc_protocol;
Greg Kroah-Hartman
maintainerPATCH 20/27 xhci: Fresco FL1100 controller should not have BROKEN_MSI quirk set.
In reply to Greg Kroah-HartmanFrom: Mathias Nyman <[email protected]>
commit e4844092581ceec22489b66c42edc88bc6079783 upstream.
The Fresco Logic FL1100 controller needs the TRUST_TX_LENGTH quirk like other Fresco controllers, but should not have the BROKEN_MSI quirks set.
BROKEN_MSI quirk causes issues in detecting usb drives connected to docks with this FL1100 controller.
The BROKEN_MSI flag was apparently accidentally set together with the TRUST_TX_LENGTH quirk
Original patch went to stable so this should go there as well.
--- drivers/usb/host/xhci-pci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-pci.c +4 -1
@@ -90,7 +90,6 @@ static void xhci_pci_quirks(struct devic/* Look for vendor-specific quirks */ if (pdev->vendor ==PCI_VENDOR_ID_FRESCO_LOGIC && (pdev->device ==PCI_DEVICE_ID_FRESCO_LOGIC_PDK || - pdev->device ==PCI_DEVICE_ID_FRESCO_LOGIC_FL1100 || pdev->device ==PCI_DEVICE_ID_FRESCO_LOGIC_FL1400 )) {if (pdev->device ==PCI_DEVICE_ID_FRESCO_LOGIC_PDK && pdev->revision ==0x0 ) {
@@ -125,6 +124,10 @@ static void xhci_pci_quirks(struct devic pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1009) xhci->quirks |= XHCI_BROKEN_STREAMS; +if (pdev->vendor ==PCI_VENDOR_ID_FRESCO_LOGIC && + pdev->device ==PCI_DEVICE_ID_FRESCO_LOGIC_FL1100 ) + xhci->quirks |=XHCI_TRUST_TX_LENGTH ; +if (pdev->vendor ==PCI_VENDOR_ID_NEC ) xhci->quirks |=XHCI_NEC_HOST ;
Greg Kroah-Hartman
maintainerPATCH 21/27 usb: gadget: f_fs: Clear ffs_eventfd in ffs_data_clear.
In reply to Greg Kroah-HartmanFrom: Vincent Pelletier <[email protected]>
commit b1e0887379422975f237d43d8839b751a6bcf154 upstream.
ffs_data_clear is indirectly called from both ffs_fs_kill_sb and ffs_ep0_release, so it ends up being called twice when userland closes ep0 and then unmounts f_fs.
If userland provided an eventfd along with function's USB descriptors, it ends up calling eventfd_ctx_put as many times, causing a refcount underflow.
NULL-ify ffs_eventfd to prevent these extraneous eventfd_ctx_put calls.
Also, set epfiles to NULL right after de-allocating it, for readability.
For completeness, ffs_data_clear actually ends up being called thrice, the last call being before the whole ffs structure gets freed, so when this specific sequence happens there is a second underflow happening (but not being reported):
/sys/kernel/debug/tracing# modprobe usb_f_fs /sys/kernel/debug/tracing# echo ffs_data_clear > set_ftrace_filter /sys/kernel/debug/tracing# echo function > current_tracer /sys/kernel/debug/tracing# echo 1 > tracing_on
(setup gadget, run and kill function userland process, teardown gadget) /sys/kernel/debug/tracing# echo 0 > tracing_on /sys/kernel/debug/tracing# cat trace
smartcard-openp-436 [000] ..... 1946.208786: ffs_data_clear <-ffs_data_closed smartcard-openp-431 [000] ..... 1946.279147: ffs_data_clear <-ffs_data_closed smartcard-openp-431 [000] .n... 1946.905512: ffs_data_clear <-ffs_data_put
Warning output corresponding to above trace:
[ 1946.284139] WARNING: CPU: 0 PID: 431 at lib/refcount.c:28 refcount_warn_saturate+0x110/0x15c [ 1946.293094] refcount_t: underflow; use-after-free. [ 1946.298164] Modules linked in: usb_f_ncm(E) u_ether(E) usb_f_fs(E) hci_uart(E) btqca(E) btrtl(E) btbcm(E) btintel(E) bluetooth(E) nls_ascii(E) nls_cp437(E) vfat(E) fat(E) bcm2835_v4l2(CE) bcm2835_mmal_vchiq(CE) videobuf2_vmalloc(E) videobuf2_memops(E) sha512_generic(E) videobuf2_v4l2(E) sha512_arm(E) videobuf2_common(E) videodev(E) cpufreq_dt(E) snd_bcm2835(CE) brcmfmac(E) mc(E) vc4(E) ctr(E) brcmutil(E) snd_soc_core(E) snd_pcm_dmaengine(E) drbg(E) snd_pcm(E) snd_timer(E) snd(E) soundcore(E) drm_kms_helper(E) cec(E) ansi_cprng(E) rc_core(E) syscopyarea(E) raspberrypi_cpufreq(E) sysfillrect(E) sysimgblt(E) cfg80211(E) max17040_battery(OE) raspberrypi_hwmon(E) fb_sys_fops(E) regmap_i2c(E) ecdh_generic(E) rfkill(E) ecc(E) bcm2835_rng(E) rng_core(E) vchiq(CE) leds_gpio(E) libcomposite(E) fuse(E) configfs(E) ip_tables(E) x_tables(E) autofs4(E) ext4(E) crc16(E) mbcache(E) jbd2(E) crc32c_generic(E) sdhci_iproc(E) sdhci_pltfm(E) sdhci(E) [ 1946.399633] CPU: 0 PID: 431 Comm: smartcard-openp Tainted: G C OE 5.15.0-1-rpi #1 Debian 5.15.3-1 [ 1946.417950] Hardware name: BCM2835 [ 1946.425442] Backtrace: [ 1946.432048] [<c08d60a0>] (dump_backtrace) from [<c08d62ec>] (show_stack+0x20/0x24) [ 1946.448226] r7:00000009 r6:0000001c r5:c04a948c r4:c0a64e2c [ 1946.458412] [<c08d62cc>] (show_stack) from [<c08d9ae0>] (dump_stack+0x28/0x30) [ 1946.470380] [<c08d9ab8>] (dump_stack) from [<c0123500>] (__warn+0xe8/0x154) [ 1946.482067] r5:c04a948c r4:c0a71dc8 [ 1946.490184] [<c0123418>] (__warn) from [<c08d6948>] (warn_slowpath_fmt+0xa0/0xe4) [ 1946.506758] r7:00000009 r6:0000001c r5:c0a71dc8 r4:c0a71e04 [ 1946.517070] [<c08d68ac>] (warn_slowpath_fmt) from [<c04a948c>] (refcount_warn_saturate+0x110/0x15c) [ 1946.535309] r8:c0100224 r7:c0dfcb84 r6:ffffffff r5:c3b84c00 r4:c24a17c0 [ 1946.546708] [<c04a937c>] (refcount_warn_saturate) from [<c0380134>] (eventfd_ctx_put+0x48/0x74) [ 1946.564476] [<c03800ec>] (eventfd_ctx_put) from [<bf5464e8>] (ffs_data_clear+0xd0/0x118 [usb_f_fs]) [ 1946.582664] r5:c3b84c00 r4:c2695b00 [ 1946.590668] [<bf546418>] (ffs_data_clear [usb_f_fs]) from [<bf547cc0>] (ffs_data_closed+0x9c/0x150 [usb_f_fs]) [ 1946.609608] r5:bf54d014 r4:c2695b00 [ 1946.617522] [<bf547c24>] (ffs_data_closed [usb_f_fs]) from [<bf547da0>] (ffs_fs_kill_sb+0x2c/0x30 [usb_f_fs]) [ 1946.636217] r7:c0dfcb84 r6:c3a12260 r5:bf54d014 r4:c229f000 [ 1946.646273] [<bf547d74>] (ffs_fs_kill_sb [usb_f_fs]) from [<c0326d50>] (deactivate_locked_super+0x54/0x9c) [ 1946.664893] r5:bf54d014 r4:c229f000 [ 1946.672921] [<c0326cfc>] (deactivate_locked_super) from [<c0326df8>] (deactivate_super+0x60/0x64) [ 1946.690722] r5:c2a09000 r4:c229f000 [ 1946.698706] [<c0326d98>] (deactivate_super) from [<c0349a28>] (cleanup_mnt+0xe4/0x14c) [ 1946.715553] r5:c2a09000 r4:00000000 [ 1946.723528] [<c0349944>] (cleanup_mnt) from [<c0349b08>] (__cleanup_mnt+0x1c/0x20) [ 1946.739922] r7:c0dfcb84 r6:c3a12260 r5:c3a126fc r4:00000000 [ 1946.750088] [<c0349aec>] (__cleanup_mnt) from [<c0143d10>] (task_work_run+0x84/0xb8) [ 1946.766602] [<c0143c8c>] (task_work_run) from [<c010bdc8>] (do_work_pending+0x470/0x56c) [ 1946.783540] r7:5ac3c35a r6:c0d0424c r5:c200bfb0 r4:c200a000 [ 1946.793614] [<c010b958>] (do_work_pending) from [<c01000c0>] (slow_work_pending+0xc/0x20) [ 1946.810553] Exception stack(0xc200bfb0 to 0xc200bff8) [ 1946.820129] bfa0: 00000000 00000000 000000aa b5e21430 [ 1946.837104] bfc0: bef867a0 00000001 bef86840 00000034 bef86838 bef86790 bef86794 bef867a0 [ 1946.854125] bfe0: 00000000 bef86798 b67b7a1c b6d626a4 60000010 b5a23760 [ 1946.865335] r10:00000000 r9:c200a000 r8:c0100224 r7:00000034 r6:bef86840 r5:00000001 [ 1946.881914] r4:bef867a0 [ 1946.888793] ---[ end trace 7387f2a9725b28d0 ]---
--- drivers/usb/gadget/function/f_fs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/usb/gadget/function/f_fs.c +6 -3
@@ -1698,11 +1698,15 @@ static void ffs_data_clear(struct ffs_daBUG_ON (ffs->gadget); -if (ffs->epfiles) +if (ffs->epfiles) {ffs_epfiles_destroy (ffs->epfiles, ffs->eps_count); + ffs->epfiles =NULL ; + } -if (ffs->ffs_eventfd) +if (ffs->ffs_eventfd) {eventfd_ctx_put (ffs->ffs_eventfd); + ffs->ffs_eventfd =NULL ; + }kfree (ffs->raw_descs_data);kfree (ffs->raw_strings);
@@ -1715,7 +1719,6 @@ static void ffs_data_reset(struct ffs_daffs_data_clear (ffs); - ffs->epfiles =NULL ; ffs->raw_descs_data =NULL ; ffs->raw_descs =NULL ; ffs->raw_strings =NULL ;
Greg Kroah-Hartman
maintainerPATCH 22/27 usb: mtu3: set interval of FS intr and isoc endpoint
In reply to Greg Kroah-HartmanFrom: Chunfeng Yun <[email protected]>
commit 43f3b8cbcf93da7c2755af4a543280c31f4adf16 upstream.
Add support to set interval also for FS intr and isoc endpoint.
--- drivers/usb/mtu3/mtu3_gadget.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/usb/mtu3/mtu3_gadget.c +7 -0
@@ -98,6 +98,13 @@ static int mtu3_ep_enable(struct mtu3_ep mult =usb_endpoint_maxp_mult (desc) -1 ; }break ; +case USB_SPEED_FULL : +if (usb_endpoint_xfer_isoc (desc)) + interval =clamp_val (desc->bInterval,1 ,16 ); +else if (usb_endpoint_xfer_int (desc)) + interval =clamp_val (desc->bInterval,1 ,255 ); + +break ;default :break ;/*others are ignored */ }
Greg Kroah-Hartman
maintainerPATCH 23/27 binder: fix async_free_space accounting for empty parcels
In reply to Greg Kroah-HartmanFrom: Todd Kjos <[email protected]>
commit cfd0d84ba28c18b531648c9d4a35ecca89ad9901 upstream.
In 4.13, commit 74310e06be4d ("android: binder: Move buffer out of area shared with user space") fixed a kernel structure visibility issue. As part of that patch,sizeof(void *) was used as the buffer size for 0-length data payloads so
the driver could detect abusive clients sending 0-length asynchronous transactions to a server by enforcing limits on async_free_size.
Unfortunately, on the "free" side, the accounting of async_free_space did not add the sizeof(void *) back. The result was that up to 8-bytes of async_free_space were leaked on every async transaction of 8-bytes or less. These small transactions are uncommon, so this accounting issue has gone undetected for several years.
The fix is to use "buffer_size" (the allocated buffer size) instead of "size" (the logical buffer size) when updating the async_free_space during the free operation. These are the same except for this corner case of asynchronous transactions with payloads < 8 bytes.
--- drivers/android/binder_alloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/android/binder_alloc.c +1 -1
@@ -630,7 +630,7 @@ static void binder_free_buf_locked(strucBUG_ON (buffer->data > alloc->buffer + alloc->buffer_size);if (buffer->async_transaction) { - alloc->free_async_space += size +sizeof (struct binder_buffer ); + alloc->free_async_space += buffer_size +sizeof (struct binder_buffer ); binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, "%d: binder_free_buf size %zd async free %zd\n",
Greg Kroah-Hartman
maintainerPATCH 24/27 scsi: vmw_pvscsi: Set residual data length conditionally
In reply to Greg Kroah-HartmanFrom: Alexey Makhalov <[email protected]>
commit 142c779d05d1fef75134c3cb63f52ccbc96d9e1f upstream.
The PVSCSI implementation in the VMware hypervisor under specific configuration ("SCSI Bus Sharing" set to "Physical") returns zero dataLen in the completion descriptor for READ CAPACITY(16). As a result, the kernel can not detect proper disk geometry. This can be recognized by the kernel message:
[ 0.776588] sd 1:0:0:0: [sdb] Sector size 0 reported, assuming 512.
The PVSCSI implementation in QEMU does not set dataLen at all, keeping it zeroed. This leads to a boot hang as was reported by Shmulik Ladkani.
It is likely that the controller returns the garbage at the end of the buffer. Residual length should be set by the driver in that case. The SCSI layer will erase corresponding data. See commit bdb2b8cab439 ("[SCSI] erase invalid data returned by device") for details.
Commit e662502b3a78 ("scsi: vmw_pvscsi: Set correct residual data length") introduced the issue by setting residual length unconditionally, causing the SCSI layer to erase the useful payload beyond dataLen when this value is returned as 0.
As a result, considering existing issues in implementations of PVSCSI controllers, we do not want to call scsi_set_resid() when dataLen ==
0. Calling scsi_set_resid() has no effect if dataLen equals buffer length.
--- drivers/scsi/vmw_pvscsi.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/scsi/vmw_pvscsi.c +5 -2
@@ -578,9 +578,12 @@ static void pvscsi_complete_request(stru* Commands like INQUIRY may transfer less data than * requested by the initiator via bufflen. Set residual * count to make upper layer aware of the actual amount -* of data returned. +* of data returned. There are cases when controller +* returns zero dataLen with non zero data - do not set +* residual count in that case. */ -scsi_set_resid (cmd,scsi_bufflen (cmd) - e->dataLen); +if (e->dataLen && (e->dataLen <scsi_bufflen (cmd))) +scsi_set_resid (cmd,scsi_bufflen (cmd) - e->dataLen); cmd->result = (DID_OK <<16 );break ;
Greg Kroah-Hartman
maintainerPATCH 25/27 Input: appletouch - initialize work before device registration
In reply to Greg Kroah-HartmanFrom: Pavel Skripkin <[email protected]>
commit 9f3ccdc3f6ef10084ceb3a47df0961bec6196fd0 upstream.
Syzbot has reported warning in __flush_work(). This warning is caused by work->func == NULL, which means missing work initialization.
This may happen, since input_dev->close() calls cancel_work_sync(&dev->work), but dev->work initalization happens _after_ input_register_device() call.
So this patch moves dev->work initialization before registering input device
--- drivers/input/mouse/appletouch.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/input/mouse/appletouch.c +2 -2
@@ -930,6 +930,8 @@ static int atp_probe(struct usb_interfacset_bit (BTN_TOOL_TRIPLETAP , input_dev->keybit);set_bit (BTN_LEFT , input_dev->keybit); +INIT_WORK (&dev->work, atp_reinit); + error =input_register_device (dev->input);if (error) goto err_free_buffer;
@@ -937,8 +939,6 @@ static int atp_probe(struct usb_interfac/* save our data pointer in this interface device */ usb_set_intfdata (iface, dev); -INIT_WORK (&dev->work, atp_reinit); -return 0 ; err_free_buffer:
Greg Kroah-Hartman
maintainerPATCH 26/27 Input: spaceball - fix parsing of movement data packets
In reply to Greg Kroah-HartmanFrom: Leo L. Schwab <[email protected]>
commit bc7ec91718c49d938849697cfad98fcd9877cc26 upstream.
The spaceball.c module was not properly parsing the movement reports coming from the device. The code read axis data as signed 16-bit little-endian values starting at offset 2.
In fact, axis data in Spaceball movement reports are signed 16-bit big-endian values starting at offset 3. This was determined first by visually inspecting the data packets, and later verified by consulting:
http://spacemice.org/pdf/SpaceBall_2003-3003_Protocol.pdf
If this ever worked properly, it was in the time before Git...
--- drivers/input/joystick/spaceball.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/input/joystick/spaceball.c +9 -2
@@ -31,6 +31,7 @@#include <linux/module.h> #include <linux/input.h> #include <linux/serio.h> +#include <asm/unaligned.h> #define DRIVER_DESC "SpaceTec SpaceBall 2003/3003/4000 FLX driver"
@@ -87,9 +88,15 @@ static void spaceball_process_packet(strcase 'D' :/* Ball data */ if (spaceball->idx !=15 )return ; -for (i =0 ; i <6 ; i++) +/* +* Skip first three bytes; read six axes worth of data. +* Axis values are signed 16-bit big-endian. +*/ + data +=3 ; +for (i =0 ; i <ARRAY_SIZE (spaceball_axes); i++) {input_report_abs (dev, spaceball_axes[i], - (__s16)((data[2 * i +3 ] <<8 ) | data[2 * i +2 ])); + (__s16 )get_unaligned_be16 (&data[i *2 ])); + }break ;case 'K' :/* Button data */
Greg Kroah-Hartman
maintainerPATCH 27/27 net: fix use-after-free in tw_timer_handler
In reply to Greg Kroah-HartmanFrom: Muchun Song <[email protected]>
commit e22e45fc9e41bf9fcc1e92cfb78eb92786728ef0 upstream.
A real world panic issue was found as follow in Linux 5.4.
BUG: unable to handle page fault for address: ffffde49a863de28
PGD 7e6fe62067 P4D 7e6fe62067 PUD 7e6fe63067 PMD f51e064067 PTE 0
RIP: 0010:tw_timer_handler+0x20/0x40
Call Trace:
<IRQ>
call_timer_fn+0x2b/0x120
run_timer_softirq+0x1ef/0x450
__do_softirq+0x10d/0x2b8
irq_exit+0xc7/0xd0
smp_apic_timer_interrupt+0x68/0x120
apic_timer_interrupt+0xf/0x20This issue was also reported since 2017 in the thread [1], unfortunately, the issue was still can be reproduced after fixing DCCP.
The ipv4_mib_exit_net is called before tcp_sk_exit_batch when a net namespace is destroyed since tcp_sk_ops is registered befrore ipv4_mib_ops, which means tcp_sk_ops is in the front of ipv4_mib_ops in the list of pernet_list. There will be a use-after-free on net->mib.net_statistics in tw_timer_handler after ipv4_mib_exit_net if there are some inflight time-wait timers.
This bug is not introduced by commit f2bf415cfed7 ("mib: add net to NET_ADD_STATS_BH") since the net_statistics is a global variable instead of dynamic allocation and freeing. Actually, commit 61a7e26028b9 ("mib: put net statistics on struct net") introduces the bug since it put net statistics on struct net and free it when net namespace is destroyed.
Moving init_ipv4_mibs() to the front of tcp_init() to fix this bug and replace pr_crit() with panic() since continuing is meaningless when init_ipv4_mibs() fails.
[1] https://groups.google.com/g/syzkaller/c/p1tn-_Kc6l4/m/smuL_FMAAgAJ?pli=1
--- net/ipv4/af_inet.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
net/ipv4/af_inet.c +4 -6
@@ -1955,6 +1955,10 @@ static int __init inet_init(void)ip_init (); +/* Initialise per-cpu ipv4 mibs */ +if (init_ipv4_mibs ()) +panic ("%s: Cannot init ipv4 mibs\n" , __func__); +/* Setup TCP slab cache for open requests. */ tcp_init ();
@@ -1983,12 +1987,6 @@ static int __init inet_init(void)if (init_inet_pernet_ops ())pr_crit ("%s: Cannot init ipv4 inet pernet ops\n" , __func__); -/* -* Initialise per-cpu ipv4 mibs -*/ - -if (init_ipv4_mibs ()) -pr_crit ("%s: Cannot init ipv4 mibs\n" , __func__);ipv4_proc_init ();
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 4.19.224 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-4.19.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.224 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 05 Jan 2022 14:20:40 +0000. Anything received after that time might be too late.
Build results:
total: 155 pass: 155 fail: 0 Qemu test results: total: 422 pass: 422 fail: 0
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.224 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 05 Jan 2022 14:20:40 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.224-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v4.19:
10 builds: 10 pass, 0 fail
22 boots: 22 pass, 0 fail
40 tests: 40 pass, 0 failLinux version: 4.19.224-rc1-g3285af6cecfc
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04Jon
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.224 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 05 Jan 2022 14:20:40 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.19.224-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.19.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
## Build
* kernel: 4.19.224-rc1
* git: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
* git branch: linux-4.19.y
* git commit: 3285af6cecfcf350536b55f95214b08192ff25f2
* git describe: v4.19.223-28-g3285af6cecfc
* test details:
https://qa-reports.linaro.org/lkft/linux-stable-rc-linux-4.19.y/build/v4.19.223-28-g3285af6cecfc
## No Test Regressions (compared to v4.19.223)
No test regressions found.
## Metric Regressions (compared to v4.19.223)
No metric regressions found.
## No Test Fixes (compared to v4.19.223)
## Metric Fixes (compared to v4.19.223)
No metric fixes found.
## Test result summary
total: 73951, pass: 59880, fail: 643, skip: 11816, xfail: 1612
## Build Summary
* arm: 130 total, 130 passed, 0 failed
* arm64: 35 total, 35 passed, 0 failed
* dragonboard-410c: 1 total, 1 passed, 0 failed
* hi6220-hikey: 1 total, 1 passed, 0 failed
* i386: 19 total, 19 passed, 0 failed
* juno-r2: 1 total, 1 passed, 0 failed
* mips: 26 total, 26 passed, 0 failed
* powerpc: 52 total, 48 passed, 4 failed
* s390: 12 total, 12 passed, 0 failed
* sparc: 12 total, 12 passed, 0 failed
* x15: 1 total, 1 passed, 0 failed
* x86: 1 total, 1 passed, 0 failed
* x86_64: 34 total, 34 passed, 0 failed
## Test suites summary
* fwts
* kselftest-android
* kselftest-arm64
* kselftest-arm64/arm64.btitest.bti_c_func
* kselftest-arm64/arm64.btitest.bti_j_func
* kselftest-arm64/arm64.btitest.bti_jc_func
* kselftest-arm64/arm64.btitest.bti_none_func
* kselftest-arm64/arm64.btitest.nohint_func
* kselftest-arm64/arm64.btitest.paciasp_func
* kselftest-arm64/arm64.nobtitest.bti_c_func
* kselftest-arm64/arm64.nobtitest.bti_j_func
* kselftest-arm64/arm64.nobtitest.bti_jc_func
* kselftest-arm64/arm64.nobtitest.bti_none_func
* kselftest-arm64/arm64.nobtitest.nohint_func
* kselftest-arm64/arm64.nobtitest.paciasp_func
* kselftest-bpf
* kselftest-breakpoints
* kselftest-capabilities
* kselftest-cgroup
* kselftest-clone3
* kselftest-core
* kselftest-cpu-hotplug
* kselftest-cpufreq
* kselftest-drivers
* kselftest-efivarfs
* kselftest-filesystems
* kselftest-firmware
* kselftest-fpu
* kselftest-futex
* kselftest-gpio
* kselftest-intel_pstate
* kselftest-ipc
* kselftest-ir
* kselftest-kcmp
* kselftest-kexec
* kselftest-kvm
* kselftest-lib
* kselftest-livepatch
* kselftest-membarrier
* kselftest-memfd
* kselftest-memory-hotplug
* kselftest-mincore
* kselftest-mount
* kselftest-mqueue
* kselftest-net
* kselftest-netfilter
* kselftest-nsfs
* kselftest-openat2
* kselftest-pid_namespace
* kselftest-pidfd
* kselftest-proc
* kselftest-pstore
* kselftest-ptrace
* kselftest-rseq
* kselftest-rtc
* kselftest-seccomp
* kselftest-sigaltstack
* kselftest-size
* kselftest-splice
* kselftest-static_keys
* kselftest-sync
* kselftest-sysctl
* kselftest-tc-testing
* kselftest-timens
* kselftest-timers
* kselftest-tmpfs
* kselftest-tpm2
* kselftest-user
* kselftest-vm
* kselftest-x86
* kselftest-zram
* kvm-unit-tests
* libhugetlbfs
* linux-log-parser
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-controllers-tests
* ltp-cpuhotplug-tests
* ltp-crypto-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-open-posix-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-tracing-tests
* network-basic-tests
* packetdrill
* perf
* rcutorture
* ssuite
* v4l2-compliance
--
Linaro LKFT
https://lkft.linaro.org
Hi Greg,
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.19.224 release. There are 27 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 05 Jan 2022 14:20:40 +0000. Anything received after that time might be too late.
Build test:
mips (gcc version 11.2.1 20211214): 63 configs -> no failure arm (gcc version 11.2.1 20211214): 116 configs -> no new failure arm64 (gcc version 11.2.1 20211214): 2 configs -> no failure x86_64 (gcc version 11.2.1 20211214): 4 configs -> no failure
Boot test:x86_64: Booted on my test laptop. No regression.x86_64: Booted on qemu. No regression. [1]
[1]. https://openqa.qa.codethink.co.uk/tests/581
--
Regards
Sudip