4.9.60-stable review
Greg Kroah-Hartman
maintainercover 4.9.60-stable review
This is the start of the stable review cycle for the 4.9.60 release. There are 23 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 Thu Nov 2 09:55:07 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.60-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.9.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.9.60-rc1
Eric Biggers <[email protected]>
ecryptfs: fix dereference of NULL user_key_payload
Guillaume Tucker <[email protected]>
regulator: fan53555: fix I2C device ids
Herbert Xu <[email protected]>
ipsec: Fix aborted xfrm policy dump crash
Johannes Berg <[email protected]>
cfg80211: fix connect/disconnect edge cases
Jimmy Assarsson <[email protected]>
can: kvaser_usb: Ignore CMD_FLUSH_QUEUE_REPLY messages
Jimmy Assarsson <[email protected]>
can: kvaser_usb: Correct return value in printout
Gerhard Bertelsmann <[email protected]>
can: sun4i: fix loopback mode
Rex Zhu <[email protected]>
drm/amd/powerplay: fix uninitialized variable
Ben Hutchings <[email protected]>
scsi: sg: Re-fix off by one in sg_fill_request_table()
Steffen Maier <[email protected]>
scsi: zfcp: fix erp_action use-before-initialize in REC action trace
David Howells <[email protected]>
assoc_array: Fix a buggy node-splitting case
Dmitry Torokhov <[email protected]>
Input: gtco - fix potential out-of-bound access
Kai-Heng Feng <[email protected]>
Input: elan_i2c - add ELAN0611 to the ACPI table
Juergen Gross <[email protected]>
xen/gntdev: avoid out of bounds access in case of partial gntdev_mmap()
Miklos Szeredi <[email protected]>
fuse: fix READDIRPLUS skipping an entry
Florian Fainelli <[email protected]>
spi: bcm-qspi: Fix use after free in bcm_qspi_probe() in error path
Baruch Siach <[email protected]>
spi: uapi: spidev: add missing ioctl header
Greg Kurz <[email protected]>
KVM: PPC: Fix oops when checking KVM_CAP_PPC_HTM
Mayank Rana <[email protected]>
usb: xhci: Handle error condition in xhci_stop_device()
Jeff Layton <[email protected]>
ceph: unlock dangling spinlock in try_flush_caps()
Hui Wang <[email protected]>
ALSA: hda - fix headset mic problem for Dell machines with alc236
Kailang Yang <[email protected]>
ALSA: hda/realtek - Add support for ALC236/ALC3204
Tejun Heo <[email protected]>
workqueue: replace pool->manager_arb mutex with a flag
-------------
Diffstat:
Makefile | 4 +- arch/powerpc/kvm/powerpc.c | 3 +- drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 6 +-- drivers/input/mouse/elan_i2c_core.c | 1 + drivers/input/tablet/gtco.c | 17 ++++---- drivers/net/can/sun4i_can.c | 3 +- drivers/net/can/usb/kvaser_usb.c | 9 ++++- drivers/regulator/fan53555.c | 5 ++- drivers/s390/scsi/zfcp_aux.c | 5 +++ drivers/s390/scsi/zfcp_erp.c | 18 +++++---- drivers/s390/scsi/zfcp_scsi.c | 5 +++ drivers/scsi/sg.c | 2 +- drivers/spi/spi-bcm-qspi.c | 9 +++-- drivers/usb/host/xhci-hub.c | 22 +++++++--- drivers/xen/gntdev.c | 2 +- fs/ceph/caps.c | 5 ++- fs/ecryptfs/ecryptfs_kernel.h | 24 +++++++---- fs/ecryptfs/keystore.c | 9 ++++- fs/fuse/dir.c | 3 +- include/uapi/linux/spi/spidev.h | 1 + kernel/workqueue.c | 37 +++++++---------- lib/assoc_array.c | 51 ++++++++---------------- net/wireless/sme.c | 50 ++++++++++++++++++----- net/xfrm/xfrm_user.c | 25 +++++++----- sound/pci/hda/patch_realtek.c | 19 +++++++++ 25 files changed, 214 insertions(+), 121 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/23 workqueue: replace pool->manager_arb mutex with a flag
4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit 692b48258dda7c302e777d7d5f4217244478f1f6 upstream.
Josef reported a HARDIRQ-safe -> HARDIRQ-unsafe lock order detected by lockdep:
[ 1270.472259] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected
[ 1270.472783] 4.14.0-rc1-xfstests-12888-g76833e8 #110 Not tainted
[ 1270.473240] -----------------------------------------------------
[ 1270.473710] kworker/u5:2/5157 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
[ 1270.474239] (&(&lock->wait_lock)->rlock){+.+.}, at: [<ffffffff8da253d2>] __mutex_unlock_slowpath+0xa2/0x280
[ 1270.474994]
[ 1270.474994] and this task is already holding:
[ 1270.475440] (&pool->lock/1){-.-.}, at: [<ffffffff8d2992f6>] worker_thread+0x366/0x3c0
[ 1270.476046] which would create a new lock dependency:
[ 1270.476436] (&pool->lock/1){-.-.} -> (&(&lock->wait_lock)->rlock){+.+.}
[ 1270.476949]
[ 1270.476949] but this new dependency connects a HARDIRQ-irq-safe lock:
[ 1270.477553] (&pool->lock/1){-.-.}
...
[ 1270.488900] to a HARDIRQ-irq-unsafe lock:
[ 1270.489327] (&(&lock->wait_lock)->rlock){+.+.}
...
[ 1270.494735] Possible interrupt unsafe locking scenario:
[ 1270.494735]
[ 1270.495250] CPU0 CPU1
[ 1270.495600] ---- ----
[ 1270.495947] lock(&(&lock->wait_lock)->rlock);
[ 1270.496295] local_irq_disable();
[ 1270.496753] lock(&pool->lock/1);
[ 1270.497205] lock(&(&lock->wait_lock)->rlock);
[ 1270.497744] <Interrupt>
[ 1270.497948] lock(&pool->lock/1);, which will cause a irq inversion deadlock if the above lock scenario happens.
The root cause of this safe -> unsafe lock order is the mutex_unlock(pool->manager_arb) in manage_workers() with pool->lock held.
Unlocking mutex while holding an irq spinlock was never safe and this problem has been around forever but it never got noticed because the only time the mutex is usually trylocked while holding irqlock making actual failures very unlikely and lockdep annotation missed the condition until the recent b9c16a0e1f73 ("locking/mutex: Fix lockdep_assert_held() fail").
Using mutex for pool->manager_arb has always been a bit of stretch. It primarily is an mechanism to arbitrate managership between workers which can easily be done with a pool flag. The only reason it became a mutex is that pool destruction path wants to exclude parallel managing operations.
This patch replaces the mutex with a new pool flag POOL_MANAGER_ACTIVE and make the destruction path wait for the current manager on a wait queue.
v2: Drop unnecessary flag clearing before pool destruction as
suggested by Boqun.
--- kernel/workqueue.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-)
kernel/workqueue.c +15 -22
@@ -68,6 +68,7 @@ enum {* attach_mutex to avoid changing binding state while * worker_attach_to_pool() is in progress. */ +POOL_MANAGER_ACTIVE =1 <<0 ,/* being managed */ POOL_DISASSOCIATED = 1 << 2, /* cpu can't serve workers *//* worker flags */
@@ -165,7 +166,6 @@ struct worker_pool {/* L: hash of busy workers */ /* see manage_workers() for details on the two manager mutexes */ -struct mutex manager_arb;/* manager arbitration */ struct worker *manager;/* L: purely informational */ struct mutex attach_mutex;/* attach/detach exclusion */ struct list_head workers;/* A: attached workers */
@@ -297,6 +297,7 @@ static struct workqueue_attrs *wq_updatestatic DEFINE_MUTEX (wq_pool_mutex);/* protects pools and workqueues list */ static DEFINE_SPINLOCK (wq_mayday_lock);/* protects wq->maydays list */ +static DECLARE_WAIT_QUEUE_HEAD (wq_manager_wait);/* wait for manager to go away */ static LIST_HEAD (workqueues);/* PR: list of all workqueues */ static bool workqueue_freezing;/* PL: have wqs started freezing? */
@@ -799,7 +800,7 @@ static bool need_to_create_worker(struct/* Do we have too many workers and should some go away? */ static bool too_many_workers (struct worker_pool *pool) { -bool managing =mutex_is_locked (&pool->manager_arb); +bool managing = pool->flags &POOL_MANAGER_ACTIVE ;int nr_idle = pool->nr_idle + managing;/* manager is considered idle */ int nr_busy = pool->nr_workers - nr_idle;
@@ -1979,24 +1980,17 @@ static bool manage_workers(struct worker {struct worker_pool *pool = worker->pool; -/* -* Anyone who successfully grabs manager_arb wins the arbitration -* and becomes the manager. mutex_trylock() on pool->manager_arb -* failure while holding pool->lock reliably indicates that someone -* else is managing the pool and the worker which failed trylock -* can proceed to executing work items. This means that anyone -* grabbing manager_arb is responsible for actually performing -* manager duties. If manager_arb is grabbed and released without -* actual management, the pool may stall indefinitely. -*/ -if (!mutex_trylock (&pool->manager_arb)) +if (pool->flags &POOL_MANAGER_ACTIVE )return false; + + pool->flags |=POOL_MANAGER_ACTIVE ; pool->manager = worker;maybe_create_worker (pool); pool->manager =NULL ; -mutex_unlock (&pool->manager_arb); + pool->flags &= ~POOL_MANAGER_ACTIVE ; +wake_up (&wq_manager_wait);return true; }
@@ -3203,7 +3197,6 @@ static int init_worker_pool(struct workesetup_timer (&pool->mayday_timer, pool_mayday_timeout, (unsigned long )pool); -mutex_init (&pool->manager_arb);mutex_init (&pool->attach_mutex);INIT_LIST_HEAD (&pool->workers);
@@ -3273,13 +3266,15 @@ static void put_unbound_pool(struct workhash_del (&pool->hash_node);/* -* Become the manager and destroy all workers. Grabbing -* manager_arb prevents @pool's workers from blocking on -* attach_mutex. +* Become the manager and destroy all workers. This prevents +* @pool's workers from blocking on attach_mutex. We're the last +* manager and @pool gets freed with the flag set. */ -mutex_lock (&pool->manager_arb); -spin_lock_irq (&pool->lock); +wait_event_lock_irq (wq_manager_wait, + !(pool->flags &POOL_MANAGER_ACTIVE ), pool->lock); + pool->flags |=POOL_MANAGER_ACTIVE ; +while ((worker =first_idle_worker (pool)))destroy_worker (worker);WARN_ON (pool->nr_workers || pool->nr_idle);
@@ -3293,8 +3288,6 @@ static void put_unbound_pool(struct workif (pool->detach_completion)wait_for_completion (pool->detach_completion); -mutex_unlock (&pool->manager_arb); -/* shut down the timers */ del_timer_sync (&pool->idle_timer);del_timer_sync (&pool->mayday_timer);
Greg Kroah-Hartman
maintainerPATCH 2/23 ALSA: hda/realtek - Add support for ALC236/ALC3204
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
commit 736f20a7060857ff569e9e9586ae6c1204a73e07 upstream.
Add support for ALC236/ALC3204.
Add headset mode support for ALC236/ALC3204.
--- sound/pci/hda/patch_realtek.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/pci/hda/patch_realtek.c +11 -0
@@ -329,6 +329,7 @@ static void alc_fill_eapd_coef(struct hdbreak ;case 0x10ec0225 :case 0x10ec0233 : +case 0x10ec0236 :case 0x10ec0255 :case 0x10ec0256 :case 0x10ec0282 :
@@ -909,6 +910,7 @@ static struct alc_codec_rename_pci_table { 0x10ec0275, 0x1028, 0, "ALC3260" }, { 0x10ec0899, 0x1028, 0, "ALC3861" }, { 0x10ec0298, 0x1028, 0, "ALC3266" }, + { 0x10ec0236, 0x1028, 0, "ALC3204" }, { 0x10ec0256, 0x1028, 0, "ALC3246" }, { 0x10ec0225, 0x1028, 0, "ALC3253" }, { 0x10ec0295, 0x1028, 0, "ALC3254" },
@@ -3694,6 +3696,7 @@ static void alc_headset_mode_unplugged(salc_process_coef_fw (codec, coef0255_1);alc_process_coef_fw (codec, coef0255);break ; +case 0x10ec0236 :case 0x10ec0256 :alc_process_coef_fw (codec, coef0256);alc_process_coef_fw (codec, coef0255);
@@ -3777,6 +3780,7 @@ static void alc_headset_mode_mic_in(struswitch (codec->core.vendor_id) { +case 0x10ec0236 :case 0x10ec0255 :case 0x10ec0256 :alc_write_coef_idx (codec,0x45 ,0xc489 );
@@ -3885,6 +3889,7 @@ static void alc_headset_mode_default(strcase 0x10ec0295 :alc_process_coef_fw (codec, coef0225);break ; +case 0x10ec0236 :case 0x10ec0255 :case 0x10ec0256 :alc_process_coef_fw (codec, coef0255);
@@ -3971,6 +3976,7 @@ static void alc_headset_mode_ctia(structcase 0x10ec0255 :alc_process_coef_fw (codec, coef0255);break ; +case 0x10ec0236 :case 0x10ec0256 :alc_process_coef_fw (codec, coef0256);break ;
@@ -4064,6 +4070,7 @@ static void alc_headset_mode_omtp(structcase 0x10ec0255 :alc_process_coef_fw (codec, coef0255);break ; +case 0x10ec0236 :case 0x10ec0256 :alc_process_coef_fw (codec, coef0256);break ;
@@ -4131,6 +4138,7 @@ static void alc_determine_headset_type(s };switch (codec->core.vendor_id) { +case 0x10ec0236 :case 0x10ec0255 :case 0x10ec0256 :alc_process_coef_fw (codec, coef0255);
@@ -4335,6 +4343,7 @@ static void alc255_set_default_jack_typecase 0x10ec0255 :alc_process_coef_fw (codec, alc255fw);break ; +case 0x10ec0236 :case 0x10ec0256 :alc_process_coef_fw (codec, alc256fw);break ;
@@ -6226,6 +6235,7 @@ static int patch_alc269(struct hda_codeccase 0x10ec0255 : spec->codec_variant =ALC269_TYPE_ALC255 ;break ; +case 0x10ec0236 :case 0x10ec0256 : spec->codec_variant =ALC269_TYPE_ALC256 ; spec->gen.mixer_nid =0 ;/* ALC256 does not have any loopback mixer path */
@@ -7205,6 +7215,7 @@ static const struct hda_device_id snd_hdHDA_CODEC_ENTRY (0x10ec0233 ,"ALC233" , patch_alc269),HDA_CODEC_ENTRY (0x10ec0234 ,"ALC234" , patch_alc269),HDA_CODEC_ENTRY (0x10ec0235 ,"ALC233" , patch_alc269), +HDA_CODEC_ENTRY (0x10ec0236 ,"ALC236" , patch_alc269),HDA_CODEC_ENTRY (0x10ec0255 ,"ALC255" , patch_alc269),HDA_CODEC_ENTRY (0x10ec0256 ,"ALC256" , patch_alc269), HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
Greg Kroah-Hartman
maintainerPATCH 3/23 ALSA: hda - fix headset mic problem for Dell machines with alc236
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hui Wang <[email protected]>
commit f265788c336979090ac80b9ae173aa817c4fe40d upstream.
We have several Dell laptops which use the codec alc236, the headset mic can't work on these machines. Following the commit 736f20a70, we add the pin cfg table to make the headset mic work.
--- sound/pci/hda/patch_realtek.c | 8 ++++++++ 1 file changed, 8 insertions(+)
sound/pci/hda/patch_realtek.c +8 -0
@@ -5861,6 +5861,14 @@ static const struct snd_hda_pin_quirk alALC225_STANDARD_PINS , {0x12, 0xb7a60130}, {0x1b, 0x90170110}), +SND_HDA_PIN_QUIRK (0x10ec0236 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , + {0x12, 0x90a60140}, + {0x14, 0x90170110}, + {0x21, 0x02211020}), +SND_HDA_PIN_QUIRK (0x10ec0236 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL1_MIC_NO_PRESENCE , + {0x12, 0x90a60140}, + {0x14, 0x90170150}, + {0x21, 0x02211020}),SND_HDA_PIN_QUIRK (0x10ec0255 ,0x1028 ,"Dell" ,ALC255_FIXUP_DELL2_MIC_NO_PRESENCE , {0x14, 0x90170110}, {0x21, 0x02211020}),
Greg Kroah-Hartman
maintainerPATCH 4/23 ceph: unlock dangling spinlock in try_flush_caps()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 6c2838fbdedb9b72a81c931d49e56b229b6cdbca upstream.
sparse warns:
fs/ceph/caps.c:2042:9: warning: context imbalance in 'try_flush_caps' - wrong count at exit
We need to exit this function with the lock unlocked, but a couple of cases leave it locked.
--- fs/ceph/caps.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/ceph/caps.c +4 -1
@@ -1900,6 +1900,7 @@ static int try_flush_caps(struct inode * retry:spin_lock (&ci->i_ceph_lock);if (ci->i_ceph_flags &CEPH_I_NOFLUSH ) { +spin_unlock (&ci->i_ceph_lock);dout ("try_flush_caps skipping %p I_NOFLUSH set\n" , inode); goto out; }
@@ -1917,8 +1918,10 @@ retry:mutex_lock (&session->s_mutex); goto retry; } -if (cap->session->s_state <CEPH_MDS_SESSION_OPEN ) +if (cap->session->s_state <CEPH_MDS_SESSION_OPEN ) { +spin_unlock (&ci->i_ceph_lock); goto out; + } flushing =__mark_caps_flushing (inode, session, true, &flush_tid, &oldest_flush_tid);
Greg Kroah-Hartman
maintainerPATCH 5/23 usb: xhci: Handle error condition in xhci_stop_device()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mayank Rana <[email protected]>
commit b3207c65dfafae27e7c492cb9188c0dc0eeaf3fd upstream.
xhci_stop_device() calls xhci_queue_stop_endpoint() multiple times without checking the return value. xhci_queue_stop_endpoint() can return error if the HC is already halted or unable to queue commands. This can cause a deadlock condition as xhci_stop_device() would end up waiting indefinitely for a completion for the command that didn't get queued. Fix this by checking the return value and bailing out of xhci_stop_device() in case of error. This patch happens to fix potential memory leaks of the allocated command structures as well.
--- drivers/usb/host/xhci-hub.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-)
drivers/usb/host/xhci-hub.c +17 -5
@@ -412,15 +412,25 @@ static int xhci_stop_device(struct xhci_ GFP_NOWAIT);if (!command) {spin_unlock_irqrestore (&xhci->lock, flags); -xhci_free_command (xhci, cmd); -return -ENOMEM ; + ret = -ENOMEM ; + goto cmd_cleanup; + } + ret =xhci_queue_stop_endpoint (xhci, command, slot_id, + i, suspend); +if (ret) { +spin_unlock_irqrestore (&xhci->lock, flags); +xhci_free_command (xhci, command); + goto cmd_cleanup; } -xhci_queue_stop_endpoint (xhci, command, slot_id, i, - suspend); } } -xhci_queue_stop_endpoint (xhci, cmd, slot_id,0 , suspend); + ret =xhci_queue_stop_endpoint (xhci, cmd, slot_id,0 , suspend); +if (ret) { +spin_unlock_irqrestore (&xhci->lock, flags); + goto cmd_cleanup; + } +xhci_ring_cmd_db (xhci);spin_unlock_irqrestore (&xhci->lock, flags);
@@ -431,6 +441,8 @@ static int xhci_stop_device(struct xhci_xhci_warn (xhci,"Timeout while waiting for stop endpoint command\n" ); ret = -ETIME ; } + +cmd_cleanup:xhci_free_command (xhci, cmd);return ret; }
Greg Kroah-Hartman
maintainerPATCH 6/23 KVM: PPC: Fix oops when checking KVM_CAP_PPC_HTM
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kurz <[email protected]>
commit ac64115a66c18c01745bbd3c47a36b124e5fd8c0 upstream.
The following program causes a kernel oops:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/kvm.h>
main()
{
int fd = open("/dev/kvm", O_RDWR);
ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_PPC_HTM);
}This happens because when using the global KVM fd with KVM_CHECK_EXTENSION, kvm_vm_ioctl_check_extension() gets called with a NULL kvm argument, which gets dereferenced in is_kvmppc_hv_enabled(). Spotted while reading the code.
Let's use the hv_enabled fallback variable, like everywhere else in this function.
--- arch/powerpc/kvm/powerpc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/powerpc/kvm/powerpc.c +1 -2
@@ -601,8 +601,7 @@ int kvm_vm_ioctl_check_extension(structbreak ;#endif case KVM_CAP_PPC_HTM : - r =cpu_has_feature (CPU_FTR_TM_COMP ) && -is_kvmppc_hv_enabled (kvm); + r =cpu_has_feature (CPU_FTR_TM_COMP ) && hv_enabled;break ;default : r =0 ;
Greg Kroah-Hartman
maintainerPATCH 7/23 spi: uapi: spidev: add missing ioctl header
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Baruch Siach <[email protected]>
commit a2b4a79b88b24c49d98d45a06a014ffd22ada1a4 upstream.
The SPI_IOC_MESSAGE() macro references _IOC_SIZEBITS. Add linux/ioctl.h to make sure this macro is defined. This fixes the following build failure of lcdproc with the musl libc:
In file included from .../sysroot/usr/include/sys/ioctl.h:7:0,
from hd44780-spi.c:31:
hd44780-spi.c: In function 'spi_transfer':
hd44780-spi.c:89:24: error: '_IOC_SIZEBITS' undeclared (first use in this function)
status = ioctl(p->fd, SPI_IOC_MESSAGE(1), &xfer);
^--- include/uapi/linux/spi/spidev.h | 1 + 1 file changed, 1 insertion(+)
include/uapi/linux/spi/spidev.h +1 -0
@@ -23,6 +23,7 @@#define SPIDEV_H #include <linux/types.h> +#include <linux/ioctl.h> /* User space versions of kernel symbols for SPI clocking modes, * matching <linux/spi/spi.h>
Greg Kroah-Hartman
maintainerPATCH 8/23 spi: bcm-qspi: Fix use after free in bcm_qspi_probe() in error path
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Fainelli <[email protected]>
commit c0368e4db4a3e8a3dce40f3f621c06e14c560d79 upstream.
There was an inversion in how the error path in bcm_qspi_probe() is done which would make us trip over a KASAN use-after-free report. Turns out that qspi->dev_ids does not get allocated until later in the probe process. Fix this by introducing a new lable: qspi_resource_err which takes care of cleaning up the SPI master instance.
--- drivers/spi/spi-bcm-qspi.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/spi/spi-bcm-qspi.c +5 -4
@@ -1215,7 +1215,7 @@ int bcm_qspi_probe(struct platform_devic goto qspi_probe_err; } }else { - goto qspi_probe_err; + goto qspi_resource_err; } res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"bspi" );
@@ -1237,7 +1237,7 @@ int bcm_qspi_probe(struct platform_devic qspi->base[CHIP_SELECT ] =devm_ioremap_resource (dev, res);if (IS_ERR (qspi->base[CHIP_SELECT ])) { ret =PTR_ERR (qspi->base[CHIP_SELECT ]); - goto qspi_probe_err; + goto qspi_resource_err; } }
@@ -1245,7 +1245,7 @@ int bcm_qspi_probe(struct platform_devic GFP_KERNEL);if (!qspi->dev_ids) { ret = -ENOMEM ; - goto qspi_probe_err; + goto qspi_resource_err; }for (val =0 ; val < num_irqs; val++) {
@@ -1334,8 +1334,9 @@ qspi_reg_err:bcm_qspi_hw_uninit (qspi);clk_disable_unprepare (qspi->clk); qspi_probe_err: -spi_master_put (master);kfree (qspi->dev_ids); +qspi_resource_err: +spi_master_put (master);return ret; }/* probe function to be called by SoC specific platform driver probe */
Greg Kroah-Hartman
maintainerPATCH 9/23 fuse: fix READDIRPLUS skipping an entry
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit c6cdd51404b7ac12dd95173ddfc548c59ecf037f upstream.
Marios Titas running a Haskell program noticed a problem with fuse's
readdirplus: when it is interrupted by a signal, it skips one directory entry.
The reason is that fuse erronously updates ctx->pos after a failed dir_emit().
The issue originates from the patch adding readdirplus support.
--- fs/fuse/dir.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/fuse/dir.c +2 -1
@@ -1312,7 +1312,8 @@ static int parse_dirplusfile(char *buf,*/ over = !dir_emit (ctx, dirent->name, dirent->namelen, dirent->ino, dirent->type); - ctx->pos = dirent->off; +if (!over) + ctx->pos = dirent->off; } buf += reclen;
Greg Kroah-Hartman
maintainerPATCH 10/23 xen/gntdev: avoid out of bounds access in case of partial gntdev_mmap()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juergen Gross <[email protected]>
commit 298d275d4d9bea3524ff4bc76678c140611d8a8d upstream.
In case gntdev_mmap() succeeds only partially in mapping grant pages it will leave some vital information uninitialized needed later for cleanup. This will lead to an out of bounds array access when unmapping the already mapped pages.
So just initialize the data needed for unmapping the pages a little bit earlier.
--- drivers/xen/gntdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/xen/gntdev.c +1 -1
@@ -1030,6 +1030,7 @@ static int gntdev_mmap(struct file *flipmutex_unlock (&priv->lock);if (use_ptemod) { + map->pages_vm_start = vma->vm_start; err =apply_to_page_range (vma->vm_mm, vma->vm_start, vma->vm_end - vma->vm_start, find_grant_ptes, map);
@@ -1067,7 +1068,6 @@ static int gntdev_mmap(struct file *flip set_grant_ptes_as_special, NULL); }#endif - map->pages_vm_start = vma->vm_start; }return 0 ;
Greg Kroah-Hartman
maintainerPATCH 11/23 Input: elan_i2c - add ELAN0611 to the ACPI table
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai-Heng Feng <[email protected]>
commit 57a95b41869b8f0d1949c24df2a9dac1ca7082ee upstream.
ELAN0611 touchpad uses elan_i2c as its driver. It can be found on Lenovo ideapad 320-15IKB.
So add it to ACPI table to enable the touchpad.
[Ido Adiv <[email protected]> reports that the same ACPI ID is used for Elan touchpad in ideapad 520].
--- drivers/input/mouse/elan_i2c_core.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/mouse/elan_i2c_core.c +1 -0
@@ -1240,6 +1240,7 @@ static const struct acpi_device_id elan_ { "ELAN0605", 0 }, { "ELAN0609", 0 }, { "ELAN060B", 0 }, + { "ELAN0611", 0 }, { "ELAN1000", 0 }, { } };
Greg Kroah-Hartman
maintainerPATCH 12/23 Input: gtco - fix potential out-of-bound access
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
commit a50829479f58416a013a4ccca791336af3c584c7 upstream.
parse_hid_report_descriptor() has a while (i < length) loop, which only guarantees that there's at least 1 byte in the buffer, but the loop body can read multiple bytes which causes out-of-bounds access.
--- drivers/input/tablet/gtco.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
drivers/input/tablet/gtco.c +10 -7
@@ -230,13 +230,17 @@ static void parse_hid_report_descriptor(/* Walk this report and pull out the info we need */ while (i < length) { - prefix = report[i]; - -/* Skip over prefix */ - i++; + prefix = report[i++];/* Determine data size and save the data in the proper variable */ - size =PREF_SIZE (prefix); + size = (1U <<PREF_SIZE (prefix)) >>1 ; +if (i + size > length) { +dev_err (ddev, +"Not enough data (need %d, have %d)\n" , + i + size, length); +break ; + } +switch (size) {case 1 : data = report[i];
@@ -244,8 +248,7 @@ static void parse_hid_report_descriptor(case 2 : data16 =get_unaligned_le16 (&report[i]);break ; -case 3 : - size =4 ; +case 4 : data32 =get_unaligned_le32 (&report[i]);break ; }
Greg Kroah-Hartman
maintainerPATCH 13/23 assoc_array: Fix a buggy node-splitting case
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
commit ea6789980fdaa610d7eb63602c746bf6ec70cd2b upstream.
This fixes CVE-2017-12193.
Fix a case in the assoc_array implementation in which a new leaf is added that needs to go into a node that happens to be full, where the existing leaves in that node cluster together at that level to the exclusion of new leaf.
What needs to happen is that the existing leaves get moved out to a new node, N1, at level + 1 and the existing node needs replacing with one, N0, that has pointers to the new leaf and to N1.
The code that tries to do this gets this wrong in two ways:
(1) The pointer that should've pointed from N0 to N1 is set to point recursively to N0 instead.
(2) The backpointer from N0 needs to be set correctly in the case N0 is either the root node or reached through a shortcut.
Fix this by removing this path and using the split_node path instead, which achieves the same end, but in a more general way (thanks to Eric Biggers for spotting the redundancy).
The problem manifests itself as:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000010 IP: assoc_array_apply_edit+0x59/0xe5
--- lib/assoc_array.c | 51 +++++++++++++++++---------------------------------- 1 file changed, 17 insertions(+), 34 deletions(-)
lib/assoc_array.c +17 -34
@@ -598,21 +598,31 @@ static bool assoc_array_insert_into_termif ((edit->segment_cache[ASSOC_ARRAY_FAN_OUT ] ^ base_seg) ==0 ) goto all_leaves_cluster_together; -/* Otherwise we can just insert a new node ahead of the old -* one. +/* Otherwise all the old leaves cluster in the same slot, but +* the new leaf wants to go into a different slot - so we +* create a new node (n0) to hold the new leaf and a pointer to +* a new node (n1) holding all the old leaves. +* +* This can be done by falling through to the node splitting +* path. */ - goto present_leaves_cluster_but_not_new_leaf; +pr_devel ("present leaves cluster but not new leaf\n" ); } split_node:pr_devel ("split node\n" ); -/* We need to split the current node; we know that the node doesn't -* simply contain a full set of leaves that cluster together (it -* contains meta pointers and/or non-clustering leaves). +/* We need to split the current node. The node must contain anything +* from a single leaf (in the one leaf case, this leaf will cluster +* with the new leaf) and the rest meta-pointers, to all leaves, some +* of which may cluster. +* +* It won't contain the case in which all the current leaves plus the +* new leaves want to cluster in the same slot. * * We need to expel at least two leaves out of a set consisting of the -* leaves in the node and the new leaf. +* leaves in the node and the new leaf. The current meta pointers can +* just be copied as they shouldn't cluster with any of the leaves. * * We need a new node (n0) to replace the current one and a new node to * take the expelled nodes (n1).
@@ -717,33 +727,6 @@ found_slot_for_multiple_occupancy:pr_devel ("<--%s() = ok [split node]\n" , __func__);return true; -present_leaves_cluster_but_not_new_leaf: -/* All the old leaves cluster in the same slot, but the new leaf wants -* to go into a different slot, so we create a new node to hold the new -* leaf and a pointer to a new node holding all the old leaves. -*/ -pr_devel ("present leaves cluster but not new leaf\n" ); - - new_n0->back_pointer = node->back_pointer; - new_n0->parent_slot = node->parent_slot; - new_n0->nr_leaves_on_branch = node->nr_leaves_on_branch; - new_n1->back_pointer =assoc_array_node_to_ptr (new_n0); - new_n1->parent_slot = edit->segment_cache[0 ]; - new_n1->nr_leaves_on_branch = node->nr_leaves_on_branch; - edit->adjust_count_on = new_n0; - -for (i =0 ; i <ASSOC_ARRAY_FAN_OUT ; i++) - new_n1->slots[i] = node->slots[i]; - - new_n0->slots[edit->segment_cache[0 ]] =assoc_array_node_to_ptr (new_n0); - edit->leaf_p = &new_n0->slots[edit->segment_cache[ASSOC_ARRAY_FAN_OUT ]]; - - edit->set[0 ].ptr = &assoc_array_ptr_to_node (node->back_pointer)->slots[node->parent_slot]; - edit->set[0 ].to =assoc_array_node_to_ptr (new_n0); - edit->excised_meta[0 ] =assoc_array_node_to_ptr (node); -pr_devel ("<--%s() = ok [insert node before]\n" , __func__); -return true; - all_leaves_cluster_together:/* All the leaves, new and old, want to cluster together in this node * in the same slot, so we have to replace this node with a shortcut to
Greg Kroah-Hartman
maintainerPATCH 14/23 scsi: zfcp: fix erp_action use-before-initialize in REC action trace
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steffen Maier <[email protected]>
commit ab31fd0ce65ec93828b617123792c1bb7c6dcc42 upstream.
v4.10 commit 6f2ce1c6af37 ("scsi: zfcp: fix rport unblock race with LUN recovery") extended accessing parent pointer fields of struct zfcp_erp_action for tracing. If an erp_action has never been enqueued before, these parent pointer fields are uninitialized and NULL. Examples are zfcp objects freshly added to the parent object's children list, before enqueueing their first recovery subsequently. In zfcp_erp_try_rport_unblock(), we iterate such list. Accessing erp_action fields can cause a NULL pointer dereference. Since the kernel can read from lowcore on s390, it does not immediately cause a kernel page fault. Instead it can cause hangs on trying to acquire the wrong erp_action->adapter->dbf->rec_lock in zfcp_dbf_rec_action_lvl()
^bogus^
while holding already other locks with IRQs disabled.
Real life example from attaching lots of LUNs in parallel on many CPUs:
crash> bt 17723
PID: 17723 TASK: ... CPU: 25 COMMAND: "zfcperp0.0.1800"
LOWCORE INFO:
-psw : 0x0404300180000000 0x000000000038e424
-function : _raw_spin_lock_wait_flags at 38e424
...
#0 [fdde8fc90] zfcp_dbf_rec_action_lvl at 3e0004e9862 [zfcp] #1 [fdde8fce8] zfcp_erp_try_rport_unblock at 3e0004dfddc [zfcp] #2 [fdde8fd38] zfcp_erp_strategy at 3e0004e0234 [zfcp] #3 [fdde8fda8] zfcp_erp_thread at 3e0004e0a12 [zfcp] #4 [fdde8fe60] kthread at 173550
#5 [fdde8feb8] kernel_thread_starter at 10add2
zfcp_adapter
zfcp_port
zfcp_unit <address>, 0x404040d600000000
scsi_device NULL, returning early!
zfcp_scsi_dev.status = 0x400000000x40000000 ZFCP_STATUS_COMMON_RUNNING
crash> zfcp_unit <address>
struct zfcp_unit {
erp_action = {
adapter = 0x0,
port = 0x0,
unit = 0x0, },
}
zfcp_erp_action is always fully embedded into its container object. Such container object is never moved in its object tree (only add or delete). Hence, erp_action parent pointers can never change.
To fix the issue, initialize the erp_action parent pointers before adding the erp_action container to any list and thus before it becomes accessible from outside of its initializing function.
In order to also close the time window between zfcp_erp_setup_act() memsetting the entire erp_action to zero and setting the parent pointers again, drop the memset and instead explicitly initialize individually all erp_action fields except for parent pointers. To be extra careful not to introduce any other unintended side effect, even keep zeroing the erp_action fields for list and timer. Also double-check with WARN_ON_ONCE that erp_action parent pointers never change, so we get to know when we would deviate from previous behavior.
--- drivers/s390/scsi/zfcp_aux.c | 5 +++++ drivers/s390/scsi/zfcp_erp.c | 18 +++++++++++------- drivers/s390/scsi/zfcp_scsi.c | 5 +++++ 3 files changed, 21 insertions(+), 7 deletions(-)
drivers/s390/scsi/zfcp_aux.c +5 -0
@@ -358,6 +358,8 @@ struct zfcp_adapter *zfcp_adapter_enqueu adapter->next_port_scan = jiffies; + adapter->erp_action.adapter = adapter; +if (zfcp_qdio_setup (adapter)) goto failed;
@@ -514,6 +516,9 @@ struct zfcp_port *zfcp_port_enqueue(stru port->dev.groups = zfcp_port_attr_groups; port->dev.release = zfcp_port_release; + port->erp_action.adapter = adapter; + port->erp_action.port = port; +if (dev_set_name (&port->dev,"0x%016llx" , (unsigned long long )wwpn)) {kfree (port); goto err_out;
drivers/s390/scsi/zfcp_erp.c +11 -7
@@ -193,9 +193,8 @@ static struct zfcp_erp_action *zfcp_erp_atomic_or (ZFCP_STATUS_COMMON_ERP_INUSE , &zfcp_sdev->status); erp_action = &zfcp_sdev->erp_action; -memset (erp_action,0 ,sizeof (struct zfcp_erp_action )); - erp_action->port = port; - erp_action->sdev = sdev; +WARN_ON_ONCE (erp_action->port != port); +WARN_ON_ONCE (erp_action->sdev != sdev);if (!(atomic_read (&zfcp_sdev->status) &ZFCP_STATUS_COMMON_RUNNING )) act_status |=ZFCP_STATUS_ERP_CLOSE_ONLY ;
@@ -208,8 +207,8 @@ static struct zfcp_erp_action *zfcp_erp_zfcp_erp_action_dismiss_port (port);atomic_or (ZFCP_STATUS_COMMON_ERP_INUSE , &port->status); erp_action = &port->erp_action; -memset (erp_action,0 ,sizeof (struct zfcp_erp_action )); - erp_action->port = port; +WARN_ON_ONCE (erp_action->port != port); +WARN_ON_ONCE (erp_action->sdev !=NULL );if (!(atomic_read (&port->status) &ZFCP_STATUS_COMMON_RUNNING )) act_status |=ZFCP_STATUS_ERP_CLOSE_ONLY ;break ;
@@ -219,7 +218,8 @@ static struct zfcp_erp_action *zfcp_erp_zfcp_erp_action_dismiss_adapter (adapter);atomic_or (ZFCP_STATUS_COMMON_ERP_INUSE , &adapter->status); erp_action = &adapter->erp_action; -memset (erp_action,0 ,sizeof (struct zfcp_erp_action )); +WARN_ON_ONCE (erp_action->port !=NULL ); +WARN_ON_ONCE (erp_action->sdev !=NULL );if (!(atomic_read (&adapter->status) &ZFCP_STATUS_COMMON_RUNNING )) act_status |=ZFCP_STATUS_ERP_CLOSE_ONLY ;
@@ -229,7 +229,11 @@ static struct zfcp_erp_action *zfcp_erp_return NULL ; } - erp_action->adapter = adapter; +WARN_ON_ONCE (erp_action->adapter != adapter); +memset (&erp_action->list,0 ,sizeof (erp_action->list)); +memset (&erp_action->timer,0 ,sizeof (erp_action->timer)); + erp_action->step =ZFCP_ERP_STEP_UNINITIALIZED ; + erp_action->fsf_req_id =0 ; erp_action->action = need; erp_action->status = act_status;
drivers/s390/scsi/zfcp_scsi.c +5 -0
@@ -115,10 +115,15 @@ static int zfcp_scsi_slave_alloc(structstruct zfcp_unit *unit;int npiv = adapter->connection_features &FSF_FEATURE_NPIV_MODE ; + zfcp_sdev->erp_action.adapter = adapter; + zfcp_sdev->erp_action.sdev = sdev; + port =zfcp_get_port_by_wwpn (adapter, rport->port_name);if (!port)return -ENXIO ; + zfcp_sdev->erp_action.port = port; + unit =zfcp_unit_find (port,zfcp_scsi_dev_lun (sdev));if (unit)put_device (&unit->dev);
Greg Kroah-Hartman
maintainerPATCH 15/23 scsi: sg: Re-fix off by one in sg_fill_request_table()
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
commit 587c3c9f286cee5c9cac38d28c8ae1875f4ec85b upstream.
Commit 109bade9c625 ("scsi: sg: use standard lists for sg_requests") introduced an off-by-one error in sg_ioctl(), which was fixed by commit bd46fc406b30 ("scsi: sg: off by one in sg_ioctl()").
Unfortunately commit 4759df905a47 ("scsi: sg: factor out sg_fill_request_table()") moved that code, and reintroduced the bug (perhaps due to a botched rebase). Fix it again.
--- drivers/scsi/sg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/sg.c +1 -1
@@ -837,7 +837,7 @@ sg_fill_request_table(Sg_fd *sfp, sg_req val =0 ;list_for_each_entry (srp, &sfp->rq_list, entry) { -if (val >SG_MAX_QUEUE ) +if (val >=SG_MAX_QUEUE )break ; rinfo[val].req_state = srp->done +1 ; rinfo[val].problem =
Greg Kroah-Hartman
maintainerPATCH 16/23 drm/amd/powerplay: fix uninitialized variable
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rex Zhu <[email protected]>
commit 8b95f4f730cba02ef6febbdc4ca7e55ca045b00e upstream.
refresh_rate was not initialized when program
display gap.
this patch can fix vce ring test failed
when do S3 on Polaris10.
--- drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +3 -3
@@ -825,7 +825,7 @@ uint32_t smu7_get_xclk(struct pp_hwmgr * {uint32_t reference_clock, tmp;struct cgs_display_info info = {0 }; -struct cgs_mode_info mode_info; +struct cgs_mode_info mode_info = {0 }; info.mode_info = &mode_info;
@@ -3718,10 +3718,9 @@ int smu7_program_display_gap(struct pp_huint32_t ref_clock;uint32_t refresh_rate =0 ;struct cgs_display_info info = {0 }; -struct cgs_mode_info mode_info; +struct cgs_mode_info mode_info = {0 }; info.mode_info = &mode_info; -cgs_get_active_displays_info (hwmgr->device, &info); num_active_displays = info.display_count;
@@ -3737,6 +3736,7 @@ int smu7_program_display_gap(struct pp_h frame_time_in_us =1000000 / refresh_rate; pre_vbi_time_in_us = frame_time_in_us -200 - mode_info.vblank_time_us; + data->frame_time_x2 = frame_time_in_us *2 /100 ; display_gap2 = pre_vbi_time_in_us * (ref_clock /100 );
Greg Kroah-Hartman
maintainerPATCH 17/23 can: sun4i: fix loopback mode
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gerhard Bertelsmann <[email protected]>
commit 3a379f5b36ae039dfeb6f73316e47ab1af4945df upstream.
Fix loopback mode by setting the right flag and remove presume mode.
--- drivers/net/can/sun4i_can.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/can/sun4i_can.c +1 -2
@@ -342,7 +342,7 @@ static int sun4i_can_start(struct net_de/* enter the selected mode */ mod_reg_val =readl (priv->base +SUN4I_REG_MSEL_ADDR ); -if (priv->can.ctrlmode &CAN_CTRLMODE_PRESUME_ACK ) +if (priv->can.ctrlmode &CAN_CTRLMODE_LOOPBACK ) mod_reg_val |=SUN4I_MSEL_LOOPBACK_MODE ;else if (priv->can.ctrlmode &CAN_CTRLMODE_LISTENONLY ) mod_reg_val |=SUN4I_MSEL_LISTEN_ONLY_MODE ;
@@ -811,7 +811,6 @@ static int sun4ican_probe(struct platfor priv->can.ctrlmode_supported =CAN_CTRLMODE_BERR_REPORTING |CAN_CTRLMODE_LISTENONLY |CAN_CTRLMODE_LOOPBACK | -CAN_CTRLMODE_PRESUME_ACK |CAN_CTRLMODE_3_SAMPLES ; priv->base = addr; priv->clk = clk;
Greg Kroah-Hartman
maintainerPATCH 18/23 can: kvaser_usb: Correct return value in printout
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jimmy Assarsson <[email protected]>
commit 8f65a923e6b628e187d5e791cf49393dd5e8c2f9 upstream.
If the return value from kvaser_usb_send_simple_msg() was non-zero, the return value from kvaser_usb_flush_queue() was printed in the kernel warning.
--- drivers/net/can/usb/kvaser_usb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/can/usb/kvaser_usb.c +2 -1
@@ -1609,7 +1609,8 @@ static int kvaser_usb_close(struct net_dif (err)netdev_warn (netdev,"Cannot flush queue, error %d\n" , err); -if (kvaser_usb_send_simple_msg (dev,CMD_RESET_CHIP , priv->channel)) + err =kvaser_usb_send_simple_msg (dev,CMD_RESET_CHIP , priv->channel); +if (err)netdev_warn (netdev,"Cannot reset card, error %d\n" , err); err =kvaser_usb_stop_chip (priv);
Greg Kroah-Hartman
maintainerPATCH 19/23 can: kvaser_usb: Ignore CMD_FLUSH_QUEUE_REPLY messages
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jimmy Assarsson <[email protected]>
commit e1d2d1329a5722dbecc9c278303fcc4aa01f8790 upstream.
To avoid kernel warning "Unhandled message (68)", ignore the CMD_FLUSH_QUEUE_REPLY message for now.
As of Leaf v2 firmware version v4.1.844 (2017-02-15), flush tx queue is synchronous. There is a capability bit indicating whether flushing tx queue is synchronous or asynchronous.
A proper solution would be to query the device for capabilities. If the synchronous tx flush capability bit is set, we should wait for CMD_FLUSH_QUEUE_REPLY message, while flushing the tx queue.
--- drivers/net/can/usb/kvaser_usb.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/can/usb/kvaser_usb.c +6 -0
@@ -137,6 +137,7 @@ static inline bool kvaser_is_usbcan(cons#define CMD_RESET_ERROR_COUNTER 49#define CMD_TX_ACKNOWLEDGE 50#define CMD_CAN_ERROR_EVENT 51 +#define CMD_FLUSH_QUEUE_REPLY 68#define CMD_LEAF_USB_THROTTLE 77#define CMD_LEAF_LOG_MESSAGE 106
@@ -1301,6 +1302,11 @@ static void kvaser_usb_handle_message(co goto warn;break ; +case CMD_FLUSH_QUEUE_REPLY : +if (dev->family !=KVASER_LEAF ) + goto warn; +break ; +default : warn:dev_warn (dev->udev->dev.parent,"Unhandled message (%d)\n" , msg->id);
Greg Kroah-Hartman
maintainerPATCH 20/23 cfg80211: fix connect/disconnect edge cases
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit 51e13359cd5ea34acc62c90627603352956380af upstream.
If we try to connect while already connected/connecting, but this fails, we set ssid_len=0 but leave current_bss hanging, leading to errors.
Check all of this better, first of all ensuring that we can't try to connect to a different SSID while connected/ing; ensure that prev_bssid is set for re-association attempts even in the case of the driver supporting the connect() method, and don't reset ssid_len in the failure cases.
While at it, also reset ssid_len while disconnecting unless we were connected and expect a disconnected event, and warn on a successful connection without ssid_len being set.
--- net/wireless/sme.c | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-)
net/wireless/sme.c +41 -9
@@ -505,11 +505,6 @@ static int cfg80211_sme_connect(struct wreturn -EOPNOTSUPP ;if (wdev->current_bss) { -if (!prev_bssid) -return -EALREADY ; -if (prev_bssid && - !ether_addr_equal (prev_bssid, wdev->current_bss->pub.bssid)) -return -ENOTCONN ;cfg80211_unhold_bss (wdev->current_bss);cfg80211_put_bss (wdev->wiphy, &wdev->current_bss->pub); wdev->current_bss =NULL ;
@@ -1025,11 +1020,35 @@ int cfg80211_connect(struct cfg80211_regASSERT_WDEV_LOCK (wdev); -if (WARN_ON (wdev->connect_keys)) { -kzfree (wdev->connect_keys); - wdev->connect_keys =NULL ; +/* +* If we have an ssid_len, we're trying to connect or are +* already connected, so reject a new SSID unless it's the +* same (which is the case for re-association.) +*/ +if (wdev->ssid_len && + (wdev->ssid_len != connect->ssid_len || +memcmp (wdev->ssid, connect->ssid, wdev->ssid_len))) +return -EALREADY ; + +/* +* If connected, reject (re-)association unless prev_bssid +* matches the current BSSID. +*/ +if (wdev->current_bss) { +if (!prev_bssid) +return -EALREADY ; +if (!ether_addr_equal (prev_bssid, wdev->current_bss->pub.bssid)) +return -ENOTCONN ; } +/* +* Reject if we're in the process of connecting with WEP, +* this case isn't very interesting and trying to handle +* it would make the code much more complex. +*/ +if (wdev->connect_keys) +return -EINPROGRESS ; +cfg80211_oper_and_ht_capa (&connect->ht_capa_mask, rdev->wiphy.ht_capa_mod_mask);
@@ -1080,7 +1099,12 @@ int cfg80211_connect(struct cfg80211_regif (err) { wdev->connect_keys =NULL ; - wdev->ssid_len =0 ; +/* +* This could be reassoc getting refused, don't clear +* ssid_len in that case. +*/ +if (!wdev->current_bss) + wdev->ssid_len =0 ;return err; }
@@ -1105,5 +1129,13 @@ int cfg80211_disconnect(struct cfg80211_else if (wdev->current_bss) err =rdev_disconnect (rdev, dev, reason); +/* +* Clear ssid_len unless we actually were fully connected, +* in which case cfg80211_disconnected() will take care of +* this later. +*/ +if (!wdev->current_bss) + wdev->ssid_len =0 ; +return err; }
Greg Kroah-Hartman
maintainerPATCH 21/23 ipsec: Fix aborted xfrm policy dump crash
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Herbert Xu <[email protected]>
commit 1137b5e2529a8f5ca8ee709288ecba3e68044df2 upstream.
An independent security researcher, Mohamed Ghannam, has reported this vulnerability to Beyond Security's SecuriTeam Secure Disclosure program.
The xfrm_dump_policy_done function expects xfrm_dump_policy to have been called at least once or it will crash. This can be triggered if a dump fails because the target socket's receive buffer is full.
This patch fixes it by using the cb->start mechanism to ensure that the initialisation is always done regardless of the buffer situation.
--- net/xfrm/xfrm_user.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-)
net/xfrm/xfrm_user.c +15 -10
@@ -1656,32 +1656,34 @@ static int dump_one_policy(struct xfrm_pstatic int xfrm_dump_policy_done (struct netlink_callback *cb) { -struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *) &cb->args[1 ]; +struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *)cb->args;struct net *net =sock_net (cb->skb->sk);xfrm_policy_walk_done (walk, net);return 0 ; } +static int xfrm_dump_policy_start (struct netlink_callback *cb) +{ +struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *)cb->args; + +BUILD_BUG_ON (sizeof (*walk) >sizeof (cb->args)); + +xfrm_policy_walk_init (walk,XFRM_POLICY_TYPE_ANY ); +return 0 ; +} +static int xfrm_dump_policy (struct sk_buff *skb,struct netlink_callback *cb) {struct net *net =sock_net (skb->sk); -struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *) &cb->args[1 ]; +struct xfrm_policy_walk *walk = (struct xfrm_policy_walk *)cb->args;struct xfrm_dump_info info; -BUILD_BUG_ON (sizeof (struct xfrm_policy_walk ) > -sizeof (cb->args) -sizeof (cb->args[0 ])); - info.in_skb = cb->skb; info.out_skb = skb; info.nlmsg_seq = cb->nlh->nlmsg_seq; info.nlmsg_flags =NLM_F_MULTI ; -if (!cb->args[0 ]) { - cb->args[0 ] =1 ; -xfrm_policy_walk_init (walk,XFRM_POLICY_TYPE_ANY ); - } - (void )xfrm_policy_walk (net, walk, dump_one_policy, &info);return skb->len;
@@ -2415,6 +2417,7 @@ static const struct nla_policy xfrma_spd static const struct xfrm_link { int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **); + int (*start)(struct netlink_callback *); int (*dump)(struct sk_buff *, struct netlink_callback *); int (*done)(struct netlink_callback *); const struct nla_policy *nla_pol;
@@ -2428,6 +2431,7 @@ static const struct xfrm_link { [XFRM_MSG_NEWPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_add_policy }, [XFRM_MSG_DELPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_get_policy }, [XFRM_MSG_GETPOLICY - XFRM_MSG_BASE] = { .doit = xfrm_get_policy, + .start = xfrm_dump_policy_start, .dump = xfrm_dump_policy, .done = xfrm_dump_policy_done }, [XFRM_MSG_ALLOCSPI - XFRM_MSG_BASE] = { .doit = xfrm_alloc_userspi },
@@ -2479,6 +2483,7 @@ static int xfrm_user_rcv_msg(struct sk_b {struct netlink_dump_control c = { + .start = link->start, .dump = link->dump, .done = link->done, };
Greg Kroah-Hartman
maintainerPATCH 22/23 regulator: fan53555: fix I2C device ids
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guillaume Tucker <[email protected]>
commit fc1111b885437f374ed54aadda44d8b241ebd2a3 upstream.
The device tree nodes all correctly describe the regulators as syr827 or syr828, but the I2C device id is currently set to the wildcard value of syr82x in the driver. This causes udev to fail to match the driver module with the modalias data from sysfs.
Fix this by replacing the I2C device ids with ones that match the device tree descriptions, with syr827 and syr828. Tested on Firefly rk3288 board. The syr82x id was not used anywhere.
--- drivers/regulator/fan53555.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/regulator/fan53555.c +4 -1
@@ -476,7 +476,10 @@ static const struct i2c_device_id fan535 .name = "fan53555", .driver_data = FAN53555_VENDOR_FAIRCHILD }, { - .name = "syr82x", + .name = "syr827", + .driver_data = FAN53555_VENDOR_SILERGY + }, { + .name = "syr828", .driver_data = FAN53555_VENDOR_SILERGY }, { },
Greg Kroah-Hartman
maintainerPATCH 23/23 ecryptfs: fix dereference of NULL user_key_payload
In reply to Greg Kroah-Hartman4.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit f66665c09ab489a11ca490d6a82df57cfc1bea3e upstream.
In eCryptfs, we failed to verify that the authentication token keys are not revoked before dereferencing their payloads, which is problematic because the payload of a revoked key is NULL. request_key() *does* skip revoked keys, but there is still a window where the key can be revoked before we acquire the key semaphore.
Fix it by updating ecryptfs_get_key_payload_data() to return -EKEYREVOKED if the key payload is NULL. For completeness we check this for "encrypted" keys as well as "user" keys, although encrypted keys cannot be revoked currently.
Alternatively we could use key_validate(), but since we'll also need to fix ecryptfs_get_key_payload_data() to validate the payload length, it seems appropriate to just check the payload pointer.
--- fs/ecryptfs/ecryptfs_kernel.h | 24 +++++++++++++++++------- fs/ecryptfs/keystore.c | 9 ++++++++- 2 files changed, 25 insertions(+), 8 deletions(-)
fs/ecryptfs/ecryptfs_kernel.h +17 -7
@@ -84,11 +84,16 @@ struct ecryptfs_page_crypt_context {static inline struct ecryptfs_auth_tok *ecryptfs_get_encrypted_key_payload_data (struct key *key) { -if (key->type == &key_type_encrypted) -return (struct ecryptfs_auth_tok *) - (&((struct encrypted_key_payload *)key->payload.data[0 ])->payload_data); -else +struct encrypted_key_payload *payload; + +if (key->type != &key_type_encrypted)return NULL ; + + payload = key->payload.data[0 ]; +if (!payload) +return ERR_PTR (-EKEYREVOKED ); + +return (struct ecryptfs_auth_tok *)payload->payload_data; }static inline struct key *ecryptfs_get_encrypted_key (char *sig)
@@ -114,12 +119,17 @@ static inline struct ecryptfs_auth_tok * ecryptfs_get_key_payload_data(struct key *key) {struct ecryptfs_auth_tok *auth_tok; +const struct user_key_payload *ukp; auth_tok =ecryptfs_get_encrypted_key_payload_data (key); -if (!auth_tok) -return (struct ecryptfs_auth_tok *)user_key_payload (key)->data; -else +if (auth_tok)return auth_tok; + + ukp =user_key_payload (key); +if (!ukp) +return ERR_PTR (-EKEYREVOKED ); + +return (struct ecryptfs_auth_tok *)ukp->data; }#define ECRYPTFS_MAX_KEYSET_SIZE 1024
fs/ecryptfs/keystore.c +8 -1
@@ -459,7 +459,8 @@ out:* @auth_tok_key: key containing the authentication token * @auth_tok: authentication token * -* Returns zero on valid auth tok; -EINVAL otherwise +* Returns zero on valid auth tok; -EINVAL if the payload is invalid; or +* -EKEYREVOKED if the key was revoked before we acquired its semaphore. */ static int ecryptfs_verify_auth_tok_from_key(struct key *auth_tok_key,
@@ -468,6 +469,12 @@ ecryptfs_verify_auth_tok_from_key(structint rc =0 ; (*auth_tok) =ecryptfs_get_key_payload_data (auth_tok_key); +if (IS_ERR (*auth_tok)) { + rc =PTR_ERR (*auth_tok); + *auth_tok =NULL ; + goto out; + } +if (ecryptfs_verify_version ((*auth_tok)->version)) {printk (KERN_ERR "Data structure version mismatch. Userspace " "tools must match eCryptfs kernel module with major "
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerQuoted 35 lines · kernelci.org bot
stable-rc/linux-4.9.y boot: 272 boots: 18 failed, 226 passed with 24 offline, 4 conflicts (v4.9.59-24-g0aea695df43e)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-4.9.y/kernel/v4.9.59-24-g0aea695df43e/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-4.9.y/kernel/v4.9.59-24-g0aea695df43e/Tree: stable-rc
Branch: linux-4.9.y
Git Describe: v4.9.59-24-g0aea695df43e
Git Commit:0aea695df43ec4454c9bf076a1a7faf264eb074f
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 95 unique boards, 24 SoC families, 22 builds out of 187Boot Failures Detected:
arm:
imx_v6_v7_defconfig imx6q-nitrogen6x: 1 failed lab mvebu_v7_defconfig armada-370-db: 1 failed lab armada-370-rd: 1 failed lab armada-398-db: 1 failed lab armada-xp-linksys-mamba: 1 failed lab at91_dt_defconfig at91rm9200ek_rootfs:nfs: 1 failed lab at91sam9261ek: 1 failed lab multi_v7_defconfig+CONFIG_LKDTM=y alpine-db: 1 failed lab armada-370-db: 1 failed lab armada-398-db: 1 failed lab sun8i-a83t-allwinner-h8homlet-v2: 1 failed lab
Quoted 8 lines
multi_v7_defconfig
alpine-db: 1 failed lab
armada-370-db: 1 failed lab
armada-398-db: 1 failed lab
armada-xp-linksys-mamba: 1 failed lab
at91-sama5d2_xplained: 1 failed lab
at91-sama5d3_xplained: 1 failed lab
sun8i-h3-orangepi-pc: 1 failed labThis seems like a lot of failed labs, anything I should be worried about?
thanks,
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
Quoted 3 lines · kernelci.org bot
at91-sama5d2_xplained: 1 failed lab
at91-sama5d3_xplained: 1 failed lab
sun8i-h3-orangepi-pc: 1 failed labThis seems like a lot of failed labs, anything I should be worried about?
It's all one lab, a quick poll of results seems to suggest that lab is having a bad day and some of the boards have booted in other labs so I'd not worry.
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.60 release. There are 23 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 Thu Nov 2 09:55:07 UTC 2017. Anything received after that time might be too late.
Build results:
total: 145 pass: 145 fail: 0 Qemu test results: total: 123 pass: 123 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.60 release. There are 23 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 Thu Nov 2 09:55:07 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.60-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.9.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg and kselftest regressions.
thanks,
-- Shuah
Quoted 12 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.60 release. There are 23 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 Thu Nov 2 09:55:07 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.60-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.9.y
and the diffstat can be found below.thanks,
greg k-h
From the Linaro test farm:
Summary
------------------------------------------------------------------------
kernel: 4.9.60-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.9.y
git commit: 0aea695df43ec4454c9bf076a1a7faf264eb074f
git describe: v4.9.59-24-g0aea695df43e
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.9-oe/build/v4.9.59-24-g0aea695df43e
No regressions (compared to build v4.9.59)
Boards, architectures and test suites:
-------------------------------------
hi6220-hikey - arm64
* boot - pass: 20
* kselftest - fail: 7, skip: 8, pass: 38 (known failures)
* libhugetlbfs - skip: 1, pass: 90
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - pass: 76
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - pass: 60
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-hugetlb-tests - skip: 1, pass: 21
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - pass: 14
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 122, pass: 986
* ltp-timers-tests - pass: 13
juno-r2 - arm64
* boot - pass: 20
* kselftest - fail: 7, skip: 6, pass: 38 (known failures)
* libhugetlbfs - skip: 1, pass: 90
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - pass: 76
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - pass: 60
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-hugetlb-tests - pass: 22
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - pass: 10
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - fail: 2, skip: 156, pass: 943 (known failures)
* ltp-timers-tests - pass: 13
x15 - arm
* boot - pass: 20
* kselftest - fail: 6, skip: 11, pass: 36 (known failures)
* libhugetlbfs - skip: 1,
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - pass: 64
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - pass: 60
* ltp-fs_bind-tests - pass: 2
* ltp-fs_perms_simple-tests - pass: 19
* ltp-fsx-tests - pass: 2
* ltp-io-tests - pass: 3
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - skip: 1, pass: 13
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 67, pass: 1040
* ltp-timers-tests - pass: 12
dell-poweredge-r200 - x86_64
* boot - pass: 20
* kselftest - fail: 15, pass: 52 (known failures)
* libhugetlbfs - skip: 1, pass: 76
* ltp-cap_bounds-tests - pass: 2
* ltp-containers-tests - pass: 64
* ltp-fcntl-locktests-tests - pass: 2
* ltp-filecaps-tests - pass: 2
* ltp-fs-tests - pass: 61
* ltp-fs_bind-tests - pass: 1
* ltp-fs_perms_simple-tests - pass: 18
* ltp-fsx-tests - pass: 1
* ltp-hugetlb-tests - pass: 22
* ltp-io-tests - pass: 2
* ltp-ipc-tests - pass: 9
* ltp-math-tests - pass: 11
* ltp-nptl-tests - pass: 2
* ltp-pty-tests - pass: 4
* ltp-sched-tests - skip: 1, pass: 9
* ltp-securebits-tests - pass: 4
* ltp-syscalls-tests - skip: 163, pass: 964
* ltp-timers-tests - pass: 12
Documentation - https://collaborate.linaro.org/display/LKFT/Email+Reports
Greg Kroah-Hartman
maintainerQuoted 35 lines · Tom Gall
Quoted 12 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.9.60 release. There are 23 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 Thu Nov 2 09:55:07 UTC 2017. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.9.60-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.9.y
and the diffstat can be found below.thanks,
greg k-h
From the Linaro test farm:
Summary
------------------------------------------------------------------------kernel: 4.9.60-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-4.9.y
git commit:0aea695df43ec4454c9bf076a1a7faf264eb074f
git describe: v4.9.59-24-g0aea695df43e
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-4.9-oe/build/v4.9.59-24-g0aea695df43e
Quoted 1 line
No regressions (compared to build v4.9.59)
thanks for testing and letting me know.
No testing of 4.13-rc?
thanks,
greg k-h