3.18.100-stable review
Subsystems (4)
Greg Kroah-Hartman
maintainercover 3.18.100-stable review
This is the start of the stable review cycle for the 3.18.100 release. There are 25 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 Sun Mar 18 15:22:18 UTC 2018. 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/v3.x/stable-review/patch-3.18.100-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-3.18.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.18.100-rc1
Greg Kroah-Hartman <[email protected]>
fixup: sctp: verify size of a new chunk in _sctp_make_chunk()
Nikola Ciprich <[email protected]>
serial: 8250_pci: Add Brainboxes UC-260 4 port serial device
Pete Zaitcev <[email protected]>
usb: usbmon: Read text within supplied buffer size
Julia Lawall <[email protected]>
USB: usbmon: remove assignment from IS_ERR argument
Danilo Krummrich <[email protected]>
usb: quirks: add control message delay for 1b1c:1b20
Joel Fernandes <[email protected]>
staging: android: ashmem: Fix lockdep issue during llseek
Oliver Neukum <[email protected]>
uas: fix comparison for error code
Jonas Danielsson <[email protected]>
tty/serial: atmel: add new version check for usart
Ulrich Hecht <[email protected]>
serial: sh-sci: prevent lockup on full TTY buffers
H.J. Lu <[email protected]>
x86: Treat R_X86_64_PLT32 as R_X86_64_PC32
Josh Poimboeuf <[email protected]>
x86/module: Detect and skip invalid relocations
Russell King <[email protected]>
scripts: recordmcount: break hardlinks
Clay McClure <[email protected]>
ubi: Fix race condition between ubi volume creation and udev
Florian Westphal <[email protected]>
netfilter: ipv6: fix use-after-free Write in nf_nat_ipv6_manip_pkt
Florian Westphal <[email protected]>
netfilter: bridge: ebt_among: add missing match size checks
Florian Westphal <[email protected]>
netfilter: ebtables: CONFIG_COMPAT: don't trust userland offsets
Eric Dumazet <[email protected]>
netfilter: IDLETIMER: be syzkaller friendly
Paolo Abeni <[email protected]>
netfilter: nat: cope with negative port range
Paolo Abeni <[email protected]>
netfilter: x_tables: fix missing timer initialization in xt_LED
Takashi Iwai <[email protected]>
ALSA: seq: More protection for concurrent write and ioctl races
Takashi Iwai <[email protected]>
ALSA: seq: Don't allow resizing pool in use
Seunghun Han <[email protected]>
x86/MCE: Serialize sysfs changes
Zhang Bo <[email protected]>
Input: matrix_keypad - fix race when disabling interrupts
Justin Chen <[email protected]>
MIPS: BMIPS: Do not mask IPIs during suspend
[email protected] <[email protected]>
scsi: qla2xxx: Fix NULL pointer crash due to active timer for ABTS
-------------
Diffstat:
Makefile | 4 +- arch/mips/kernel/smp-bmips.c | 8 +- arch/x86/kernel/cpu/mcheck/mce.c | 22 +++++- arch/x86/kernel/machine_kexec_64.c | 1 + arch/x86/kernel/module.c | 14 ++++ arch/x86/tools/relocs.c | 3 + drivers/input/keyboard/matrix_keypad.c | 4 +- drivers/mtd/ubi/vmt.c | 15 ++-- drivers/scsi/qla2xxx/qla_init.c | 1 + drivers/staging/android/ashmem.c | 15 ++-- drivers/tty/serial/8250/8250_pci.c | 11 +++ drivers/tty/serial/atmel_serial.c | 1 + drivers/tty/serial/sh-sci.c | 2 + drivers/usb/core/message.c | 4 + drivers/usb/core/quirks.c | 3 +- drivers/usb/mon/mon_text.c | 124 +++++++++++++++++++------------ drivers/usb/storage/uas.c | 2 +- include/linux/usb/quirks.h | 3 + net/bridge/netfilter/ebt_among.c | 21 +++++- net/bridge/netfilter/ebtables.c | 13 +++- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 4 + net/netfilter/nf_nat_proto_common.c | 7 +- net/netfilter/xt_IDLETIMER.c | 9 ++- net/netfilter/xt_LED.c | 12 +-- net/sctp/sm_make_chunk.c | 2 +- scripts/recordmcount.c | 14 ++++ sound/core/seq/seq_clientmgr.c | 21 ++++-- sound/core/seq/seq_fifo.c | 2 +- sound/core/seq/seq_memory.c | 14 +++- sound/core/seq/seq_memory.h | 3 +- 30 files changed, 262 insertions(+), 97 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/25 scsi: qla2xxx: Fix NULL pointer crash due to active timer for ABTS
3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: [email protected] <[email protected]>
commit 1514839b366417934e2f1328edb50ed1e8a719f5 upstream.
This patch fixes NULL pointer crash due to active timer running for abort IOCB.
Quoted 1 line
Quoted 1 line
From crash dump analysis it was discoverd that
get_next_timer_interrupt()
encountered a corrupted entry on the timer list.
#9 [ffff95e1f6f0fd40] page_fault at ffffffff914fe8f8
[exception RIP: get_next_timer_interrupt+440]
RIP: ffffffff90ea3088 RSP: ffff95e1f6f0fdf0 RFLAGS: 00010013
RAX: ffff95e1f6451028 RBX: 000218e2389e5f40 RCX: 00000001232ad600
RDX: 0000000000000001 RSI: ffff95e1f6f0fdf0 RDI: 0000000001232ad6
RBP: ffff95e1f6f0fe40 R8: ffff95e1f6451188 R9: 0000000000000001
R10: 0000000000000016 R11: 0000000000000016 R12: 00000001232ad5f6
R13: ffff95e1f6450000 R14: ffff95e1f6f0fdf8 R15: ffff95e1f6f0fe10
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018Looking at the assembly of get_next_timer_interrupt(), address came from %r8 (ffff95e1f6451188) which is pointing to list_head with single entry at ffff95e5ff621178.
0xffffffff90ea307a <get_next_timer_interrupt+426>: mov (%r8),%rdx 0xffffffff90ea307d <get_next_timer_interrupt+429>: cmp %r8,%rdx 0xffffffff90ea3080 <get_next_timer_interrupt+432>: je 0xffffffff90ea30a7 <get_next_timer_interrupt+471> 0xffffffff90ea3082 <get_next_timer_interrupt+434>: nopw 0x0(%rax,%rax,1) 0xffffffff90ea3088 <get_next_timer_interrupt+440>: testb $0x1,0x18(%rdx)
crash> rd ffff95e1f6451188 10
ffff95e1f6451188: ffff95e5ff621178 ffff95e5ff621178 x.b.....x.b..... ffff95e1f6451198: ffff95e1f6451198 ffff95e1f6451198 ..E.......E..... ffff95e1f64511a8: ffff95e1f64511a8 ffff95e1f64511a8 ..E.......E..... ffff95e1f64511b8: ffff95e77cf509a0 ffff95e77cf509a0 ...|.......|.... ffff95e1f64511c8: ffff95e1f64511c8 ffff95e1f64511c8 ..E.......E.....
crash> rd ffff95e5ff621178 10
ffff95e5ff621178: 0000000000000001 ffff95e15936aa00 ..........6Y.... ffff95e5ff621188: 0000000000000000 00000000ffffffff ................ ffff95e5ff621198: 00000000000000a0 0000000000000010 ................ ffff95e5ff6211a8: ffff95e5ff621198 000000000000000c ..b............. ffff95e5ff6211b8: 00000f5800000000 ffff95e751f8d720 ....X... ..Q....
ffff95e5ff621178 belongs to freed mempool object at ffff95e5ff621080.
CACHE NAME OBJSIZE ALLOCATED TOTAL SLABS SSIZE
ffff95dc7fd74d00 mnt_cache 384 19785 24948 594 16k
SLAB MEMORY NODE TOTAL ALLOCATED FREE
ffffdc5dabfd8800 ffff95e5ff620000 1 42 29 13
FREE / [ALLOCATED]
ffff95e5ff621080 (cpu 6 cache)
Examining the contents of that memory reveals a pointer to a constant string in the driver, "abort\0", which is set by qla24xx_async_abort_cmd().
crash> rd ffffffffc059277c 20
ffffffffc059277c: 6e490074726f6261 0074707572726574 abort.Interrupt. ffffffffc059278c: 00676e696c6c6f50 6920726576697244 Polling.Driver i ffffffffc059279c: 646f6d207325206e 6974736554000a65 n %s mode..Testi ffffffffc05927ac: 636976656420676e 786c252074612065 ng device at %lx ffffffffc05927bc: 6b63656843000a2e 646f727020676e69 ...Checking prod ffffffffc05927cc: 6f20444920746375 0a2e706968632066 uct ID of chip.. ffffffffc05927dc: 5120646e756f4600 204130303232414c .Found QLA2200A ffffffffc05927ec: 43000a2e70696843 20676e696b636568 Chip...Checking ffffffffc05927fc: 65786f626c69616d 6c636e69000a2e73 mailboxes...incl ffffffffc059280c: 756e696c2f656475 616d2d616d642f78 ude/linux/dma-ma
crash> struct -ox srb_iocb
struct srb_iocb {
union {
struct {...} logio;
struct {...} els_logo;
struct {...} tmf;
struct {...} fxiocb;
struct {...} abt;
struct ct_arg ctarg;
struct {...} mbx;
struct {...} nack;
[0x0 ] } u;
[0xb8] struct timer_list timer;
[0x108] void (*timeout)(void *); }
SIZE: 0x110
crash> ! bc
ibase=16
obase=10
B8+40
F8
The object is a srb_t, and at offset 0xf8 within that structure (i.e. ffff95e5ff621080 + f8 -> ffff95e5ff621178) is a struct timer_list.
--- drivers/scsi/qla2xxx/qla_init.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/qla2xxx/qla_init.c +1 -0
@@ -365,6 +365,7 @@ qla24xx_abort_sp_done(void *data, void *srb_t *sp = (srb_t *)ptr;struct srb_iocb *abt = &sp->u.iocb_cmd; +del_timer (&sp->u.iocb_cmd.timer);complete (&abt->u.abt.comp); }
Greg Kroah-Hartman
maintainerPATCH 2/25 MIPS: BMIPS: Do not mask IPIs during suspend
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Chen <[email protected]>
commit 06a3f0c9f2725f5d7c63c4203839373c9bd00c28 upstream.
Commit a3e6c1eff548 ("MIPS: IRQ: Fix disable_irq on CPU IRQs") fixes an issue where disable_irq did not actually disable the irq. The bug caused our IPIs to not be disabled, which actually is the correct behavior.
With the addition of commit a3e6c1eff548 ("MIPS: IRQ: Fix disable_irq on CPU IRQs"), the IPIs were getting disabled going into suspend, thus schedule_ipi() was not being called. This caused deadlocks where schedulable task were not being scheduled and other cpus were waiting for them to do something.
Add the IRQF_NO_SUSPEND flag so an irq_disable will not be called on the IPIs during suspend.
Patchwork: https://patchwork.linux-mips.org/patch/17385/
--- arch/mips/kernel/smp-bmips.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/mips/kernel/smp-bmips.c +4 -4
@@ -159,11 +159,11 @@ static void bmips_prepare_cpus(unsignedreturn ; } -if (request_irq (IPI0_IRQ , bmips_ipi_interrupt,IRQF_PERCPU , -"smp_ipi0" ,NULL )) +if (request_irq (IPI0_IRQ , bmips_ipi_interrupt, +IRQF_PERCPU |IRQF_NO_SUSPEND ,"smp_ipi0" ,NULL ))panic ("Can't request IPI0 interrupt" ); -if (request_irq (IPI1_IRQ , bmips_ipi_interrupt,IRQF_PERCPU , -"smp_ipi1" ,NULL )) +if (request_irq (IPI1_IRQ , bmips_ipi_interrupt, +IRQF_PERCPU |IRQF_NO_SUSPEND ,"smp_ipi1" ,NULL ))panic ("Can't request IPI1 interrupt" ); }
Greg Kroah-Hartman
maintainerPATCH 3/25 Input: matrix_keypad - fix race when disabling interrupts
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhang Bo <[email protected]>
commit ea4f7bd2aca9f68470e9aac0fc9432fd180b1fe7 upstream.
If matrix_keypad_stop() is executing and the keypad interrupt is triggered, disable_row_irqs() may be called by both matrix_keypad_interrupt() and matrix_keypad_stop() at the same time, causing interrupts to be disabled twice and the keypad being "stuck" after resuming.
Take lock when setting keypad->stopped to ensure that ISR will not race with matrix_keypad_stop() disabling interrupts.
--- drivers/input/keyboard/matrix_keypad.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/input/keyboard/matrix_keypad.c +3 -1
@@ -216,8 +216,10 @@ static void matrix_keypad_stop(struct in {struct matrix_keypad *keypad =input_get_drvdata (dev); +spin_lock_irq (&keypad->lock); keypad->stopped = true; -mb (); +spin_unlock_irq (&keypad->lock); +flush_work (&keypad->work.work);/* * matrix_keypad_scan() will leave IRQs enabled;
Greg Kroah-Hartman
maintainerPATCH 4/25 x86/MCE: Serialize sysfs changes
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Seunghun Han <[email protected]>
commit b3b7c4795ccab5be71f080774c45bbbcc75c2aaf upstream.
The check_interval file in
/sys/devices/system/machinecheck/machinecheck<cpu number>
directory is a global timer value for MCE polling. If it is changed by one CPU, mce_restart() broadcasts the event to other CPUs to delete and restart the MCE polling timer and __mcheck_cpu_init_timer() reinitializes the mce_timer variable.
If more than one CPU writes a specific value to the check_interval file concurrently, mce_timer is not protected from such concurrent accesses and all kinds of explosions happen. Since only root can write to those sysfs variables, the issue is not a big deal security-wise.
However, concurrent writes to these configuration variables is void of reason so the proper thing to do is to serialize the access with a mutex.
Boris:
- Make store_int_with_restart() use device_store_ulong() to filter out negative intervals
- Limit min interval to 1 second
- Correct locking
- Massage commit message
--- arch/x86/kernel/cpu/mcheck/mce.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
--
To unsubscribe from this list: send the line "unsubscribe linux-edac" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
arch/x86/kernel/cpu/mcheck/mce.c +21 -1
@@ -56,6 +56,9 @@ static DEFINE_MUTEX(mce_chrdev_read_mute rcu_read_lock_sched_held() || \ lockdep_is_held(&mce_chrdev_read_mutex)) +/* sysfs synchronization */ +static DEFINE_MUTEX (mce_sysfs_mutex); +#define CREATE_TRACE_POINTS #include <trace/events/mce.h>
@@ -2183,6 +2186,7 @@ static ssize_t set_ignore_ce(struct deviif (kstrtou64 (buf,0 , &new) <0 )return -EINVAL ; +mutex_lock (&mce_sysfs_mutex);if (mca_cfg.ignore_ce ^ !!new) {if (new) {/* disable ce features */
@@ -2195,6 +2199,8 @@ static ssize_t set_ignore_ce(struct devion_each_cpu (mce_enable_ce, (void *)1 ,1 ); } } +mutex_unlock (&mce_sysfs_mutex); +return size; }
@@ -2207,6 +2213,7 @@ static ssize_t set_cmci_disabled(structif (kstrtou64 (buf,0 , &new) <0 )return -EINVAL ; +mutex_lock (&mce_sysfs_mutex);if (mca_cfg.cmci_disabled ^ !!new) {if (new) {/* disable cmci */
@@ -2218,6 +2225,8 @@ static ssize_t set_cmci_disabled(structon_each_cpu (mce_enable_ce,NULL ,1 ); } } +mutex_unlock (&mce_sysfs_mutex); +return size; }
@@ -2225,8 +2234,19 @@ static ssize_t store_int_with_restart(ststruct device_attribute *attr, const char *buf, size_t size) { - ssize_t ret = device_store_int(s, attr, buf, size); + unsigned long old_check_interval = check_interval; +ssize_t ret =device_store_ulong (s, attr, buf, size); + +if (check_interval == old_check_interval) +return ret; + +if (check_interval <1 ) + check_interval =1 ; + +mutex_lock (&mce_sysfs_mutex);mce_restart (); +mutex_unlock (&mce_sysfs_mutex); +return ret; }
Greg Kroah-Hartman
maintainerPATCH 5/25 ALSA: seq: Dont allow resizing pool in use
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit d85739367c6d56e475c281945c68fdb05ca74b4c upstream.
This is a fix for a (sort of) fallout in the recent commit d15d662e89fc ("ALSA: seq: Fix racy pool initializations") for CVE-2018-1000004.
As the pool resize deletes the existing cells, it may lead to a race when another thread is writing concurrently, eventually resulting a UAF.
A simple workaround is not to allow the pool resizing when the pool is in use. It's an invalid behavior in anyway.
--- sound/core/seq/seq_clientmgr.c | 3 +++ 1 file changed, 3 insertions(+)
sound/core/seq/seq_clientmgr.c +3 -0
@@ -1929,6 +1929,9 @@ static int snd_seq_ioctl_set_client_pool (! snd_seq_write_pool_allocated(client) || info.output_pool != client->pool->size)) {if (snd_seq_write_pool_allocated (client)) { +/* is the pool in use? */ +if (atomic_read (&client->pool->counter)) +return -EBUSY ;/* remove all existing cells */ snd_seq_pool_mark_closing (client->pool);snd_seq_queue_client_leave_cells (client->number);
Greg Kroah-Hartman
maintainerPATCH 6/25 ALSA: seq: More protection for concurrent write and ioctl races
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
commit 7bd80091567789f1c0cb70eb4737aac8bcd2b6b9 upstream.
This patch is an attempt for further hardening against races between the concurrent write and ioctls. The previous fix d15d662e89fc ("ALSA: seq: Fix racy pool initializations") covered the race of the pool initialization at writer and the pool resize ioctl by the client->ioctl_mutex (CVE-2018-1000004). However, basically this mutex should be applied more widely to the whole write operation for avoiding the unexpected pool operations by another thread.
The only change outside snd_seq_write() is the additional mutex argument to helper functions, so that we can unlock / relock the given mutex temporarily during schedule() call for blocking write.
--- sound/core/seq/seq_clientmgr.c | 18 +++++++++++------- sound/core/seq/seq_fifo.c | 2 +- sound/core/seq/seq_memory.c | 14 ++++++++++---- sound/core/seq/seq_memory.h | 3 ++- 4 files changed, 24 insertions(+), 13 deletions(-)
sound/core/seq/seq_clientmgr.c +11 -7
@@ -919,7 +919,8 @@ int snd_seq_dispatch_event(struct snd_sestatic int snd_seq_client_enqueue_event (struct snd_seq_client *client,struct snd_seq_event *event,struct file *file,int blocking, -int atomic,int hop) +int atomic,int hop, +struct mutex *mutexp) {struct snd_seq_event_cell *cell;int err;
@@ -957,7 +958,8 @@ static int snd_seq_client_enqueue_event(return -ENXIO ;/* queue is not allocated */ /* allocate an event cell */ - err =snd_seq_event_dup (client->pool, event, &cell, !blocking || atomic, file); + err =snd_seq_event_dup (client->pool, event, &cell, !blocking || atomic, + file, mutexp);if (err <0 )return err;
@@ -1026,12 +1028,11 @@ static ssize_t snd_seq_write(struct filereturn -ENXIO ;/* allocate the pool now if the pool is not allocated yet */ +mutex_lock (&client->ioctl_mutex);if (client->pool->size >0 && !snd_seq_write_pool_allocated (client)) { -mutex_lock (&client->ioctl_mutex); err =snd_seq_pool_init (client->pool); -mutex_unlock (&client->ioctl_mutex);if (err <0 ) -return -ENOMEM ; + goto out; }/* only process whole events */
@@ -1082,7 +1083,7 @@ static ssize_t snd_seq_write(struct file/* ok, enqueue it */ err =snd_seq_client_enqueue_event (client, &event, file, !(file->f_flags &O_NONBLOCK ), -0 ,0 ); +0 ,0 , &client->ioctl_mutex);if (err <0 )break ;
@@ -1093,6 +1094,8 @@ static ssize_t snd_seq_write(struct file written += len; } + out: +mutex_unlock (&client->ioctl_mutex);return written ? written : err; }
@@ -2355,7 +2358,8 @@ static int kernel_client_enqueue(int cliif (! cptr->accept_output) result = -EPERM ;else /* send it */ - result =snd_seq_client_enqueue_event (cptr, ev, file, blocking, atomic, hop); + result =snd_seq_client_enqueue_event (cptr, ev, file, blocking, + atomic, hop,NULL );snd_seq_client_unlock (cptr);return result;
sound/core/seq/seq_fifo.c +1 -1
@@ -123,7 +123,7 @@ int snd_seq_fifo_event_in(struct snd_seqreturn -EINVAL ;snd_use_lock_use (&f->use_lock); - err =snd_seq_event_dup (f->pool, event, &cell,1 ,NULL );/* always non-blocking */ + err =snd_seq_event_dup (f->pool, event, &cell,1 ,NULL ,NULL );/* always non-blocking */ if (err <0 ) {if ((err == -ENOMEM ) || (err == -EAGAIN ))atomic_inc (&f->overflow);
sound/core/seq/seq_memory.c +10 -4
@@ -221,7 +221,8 @@ void snd_seq_cell_free(struct snd_seq_ev*/ static int snd_seq_cell_alloc (struct snd_seq_pool *pool,struct snd_seq_event_cell **cellp, -int nonblock,struct file *file) +int nonblock,struct file *file, +struct mutex *mutexp) {struct snd_seq_event_cell *cell;unsigned long flags;
@@ -245,7 +246,11 @@ static int snd_seq_cell_alloc(struct sndset_current_state (TASK_INTERRUPTIBLE );add_wait_queue (&pool->output_sleep, &wait);spin_unlock_irq (&pool->lock); +if (mutexp) +mutex_unlock (mutexp);schedule (); +if (mutexp) +mutex_lock (mutexp);spin_lock_irq (&pool->lock);remove_wait_queue (&pool->output_sleep, &wait);/* interrupted? */
@@ -288,7 +293,7 @@ __error:*/ int snd_seq_event_dup (struct snd_seq_pool *pool,struct snd_seq_event *event,struct snd_seq_event_cell **cellp,int nonblock, -struct file *file) +struct file *file,struct mutex *mutexp) {int ncells, err;unsigned int extlen;
@@ -305,7 +310,7 @@ int snd_seq_event_dup(struct snd_seq_pooif (ncells >= pool->total_elements)return -ENOMEM ; - err =snd_seq_cell_alloc (pool, &cell, nonblock, file); + err =snd_seq_cell_alloc (pool, &cell, nonblock, file, mutexp);if (err <0 )return err;
@@ -331,7 +336,8 @@ int snd_seq_event_dup(struct snd_seq_pooint size =sizeof (struct snd_seq_event );if (len < size) size = len; - err =snd_seq_cell_alloc (pool, &tmp, nonblock, file); + err =snd_seq_cell_alloc (pool, &tmp, nonblock, file, + mutexp);if (err <0 ) goto __error;if (cell->event.data.ext.ptr ==NULL )
sound/core/seq/seq_memory.h +2 -1
@@ -66,7 +66,8 @@ struct snd_seq_pool {void snd_seq_cell_free (struct snd_seq_event_cell *cell);int snd_seq_event_dup (struct snd_seq_pool *pool,struct snd_seq_event *event, -struct snd_seq_event_cell **cellp,int nonblock,struct file *file); +struct snd_seq_event_cell **cellp,int nonblock, +struct file *file,struct mutex *mutexp);/* return number of unused (free) cells */ static inline int snd_seq_unused_cells (struct snd_seq_pool *pool)
Greg Kroah-Hartman
maintainerPATCH 7/25 netfilter: x_tables: fix missing timer initialization in xt_LED
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit 10414014bc085aac9f787a5890b33b5605fbcfc4 upstream.
syzbot reported that xt_LED may try to use the ledinternal->timer without previously initializing it:
------------[ cut here ]------------
kernel BUG at kernel/time/timer.c:958!
invalid opcode: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
(ftrace buffer empty)
Modules linked in:
CPU: 1 PID: 1826 Comm: kworker/1:2 Not tainted 4.15.0+ #306
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
Google 01/01/2011
Workqueue: ipv6_addrconf addrconf_dad_work
RIP: 0010:__mod_timer kernel/time/timer.c:958 [inline]
RIP: 0010:mod_timer+0x7d6/0x13c0 kernel/time/timer.c:1102
RSP: 0018:ffff8801d24fe9f8 EFLAGS: 00010293
RAX: ffff8801d25246c0 RBX: ffff8801aec6cb50 RCX: ffffffff816052c6
RDX: 0000000000000000 RSI: 00000000fffbd14b RDI: ffff8801aec6cb68
RBP: ffff8801d24fec98 R08: 0000000000000000 R09: 1ffff1003a49fd6c
R10: ffff8801d24feb28 R11: 0000000000000005 R12: dffffc0000000000
R13: ffff8801d24fec70 R14: 00000000fffbd14b R15: ffff8801af608f90
FS: 0000000000000000(0000) GS:ffff8801db500000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00000000206d6fd0 CR3: 0000000006a22001 CR4: 00000000001606e0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
led_tg+0x1db/0x2e0 net/netfilter/xt_LED.c:75
ip6t_do_table+0xc2a/0x1a30 net/ipv6/netfilter/ip6_tables.c:365
ip6table_raw_hook+0x65/0x80 net/ipv6/netfilter/ip6table_raw.c:42
nf_hook_entry_hookfn include/linux/netfilter.h:120 [inline]
nf_hook_slow+0xba/0x1a0 net/netfilter/core.c:483
nf_hook.constprop.27+0x3f6/0x830 include/linux/netfilter.h:243
NF_HOOK include/linux/netfilter.h:286 [inline]
ndisc_send_skb+0xa51/0x1370 net/ipv6/ndisc.c:491
ndisc_send_ns+0x38a/0x870 net/ipv6/ndisc.c:633
addrconf_dad_work+0xb9e/0x1320 net/ipv6/addrconf.c:4008
process_one_work+0xbbf/0x1af0 kernel/workqueue.c:2113
worker_thread+0x223/0x1990 kernel/workqueue.c:2247
kthread+0x33c/0x400 kernel/kthread.c:238
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:429
Code: 85 2a 0b 00 00 4d 8b 3c 24 4d 85 ff 75 9f 4c 8b bd 60 fd ff ff e8 bb
57 10 00 65 ff 0d 94 9a a1 7e e9 d9 fc ff ff e8 aa 57 10 00 <0f> 0b e8 a3
57 10 00 e9 14 fb ff ff e8 99 57 10 00 4c 89 bd 70
RIP: __mod_timer kernel/time/timer.c:958 [inline] RSP: ffff8801d24fe9f8
RIP: mod_timer+0x7d6/0x13c0 kernel/time/timer.c:1102 RSP: ffff8801d24fe9f8
---[ end trace f661ab06f5dd8b3d ]---The ledinternal struct can be shared between several different xt_LED targets, but the related timer is currently initialized only if the first target requires it. Fix it by unconditionally initializing the timer struct.
v1 -> v2: call del_timer_sync() unconditionally, too.
--- net/netfilter/xt_LED.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/netfilter/xt_LED.c +6 -6
@@ -141,10 +141,11 @@ static int led_tg_check(const struct xt_ goto exit_alloc; } -/* See if we need to set up a timer */ -if (ledinfo->delay >0 ) -setup_timer (&ledinternal->timer, led_timeout_callback, - (unsigned long )ledinternal); +/* Since the letinternal timer can be shared between multiple targets, +* always set it up, even if the current target does not need it +*/ +setup_timer (&ledinternal->timer, led_timeout_callback, + (unsigned long )ledinternal);list_add_tail (&ledinternal->list, &xt_led_triggers);
@@ -181,8 +182,7 @@ static void led_tg_destroy(const structlist_del (&ledinternal->list); -if (ledinfo->delay >0 ) -del_timer_sync (&ledinternal->timer); +del_timer_sync (&ledinternal->timer);led_trigger_unregister (&ledinternal->netfilter_led_trigger);
Greg Kroah-Hartman
maintainerPATCH 8/25 netfilter: nat: cope with negative port range
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
commit db57ccf0f2f4624b4c4758379f8165277504fbd7 upstream.
syzbot reported a division by 0 bug in the netfilter nat code:
divide error: 0000 [#1] SMP KASAN
Dumping ftrace buffer:
(ftrace buffer empty)
Modules linked in: CPU: 1 PID: 4168 Comm: syzkaller034710 Not tainted 4.16.0-rc1+ #309 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:nf_nat_l4proto_unique_tuple+0x291/0x530 net/netfilter/nf_nat_proto_common.c:88 RSP: 0018:ffff8801b2466778 EFLAGS: 00010246 RAX: 000000000000f153 RBX: ffff8801b2466dd8 RCX: ffff8801b2466c7c RDX: 0000000000000000 RSI: ffff8801b2466c58 RDI: ffff8801db5293ac RBP: ffff8801b24667d8 R08: ffff8801b8ba6dc0 R09: ffffffff88af5900 R10: ffff8801b24666f0 R11: 0000000000000000 R12: 000000002990f153 R13: 0000000000000001 R14: 0000000000000000 R15: ffff8801b2466c7c FS: 00000000017e3880(0000) GS:ffff8801db500000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000208fdfe4 CR3: 00000001b5340002 CR4: 00000000001606e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: dccp_unique_tuple+0x40/0x50 net/netfilter/nf_nat_proto_dccp.c:30 get_unique_tuple+0xc28/0x1c10 net/netfilter/nf_nat_core.c:362 nf_nat_setup_info+0x1c2/0xe00 net/netfilter/nf_nat_core.c:406 nf_nat_redirect_ipv6+0x306/0x730 net/netfilter/nf_nat_redirect.c:124 redirect_tg6+0x7f/0xb0 net/netfilter/xt_REDIRECT.c:34 ip6t_do_table+0xc2a/0x1a30 net/ipv6/netfilter/ip6_tables.c:365 ip6table_nat_do_chain+0x65/0x80 net/ipv6/netfilter/ip6table_nat.c:41 nf_nat_ipv6_fn+0x594/0xa80 net/ipv6/netfilter/nf_nat_l3proto_ipv6.c:302 nf_nat_ipv6_local_fn+0x33/0x5d0 net/ipv6/netfilter/nf_nat_l3proto_ipv6.c:407 ip6table_nat_local_fn+0x2c/0x40 net/ipv6/netfilter/ip6table_nat.c:69 nf_hook_entry_hookfn include/linux/netfilter.h:120 [inline] nf_hook_slow+0xba/0x1a0 net/netfilter/core.c:483 nf_hook include/linux/netfilter.h:243 [inline] NF_HOOK include/linux/netfilter.h:286 [inline] ip6_xmit+0x10ec/0x2260 net/ipv6/ip6_output.c:277 inet6_csk_xmit+0x2fc/0x580 net/ipv6/inet6_connection_sock.c:139 dccp_transmit_skb+0x9ac/0x10f0 net/dccp/output.c:142 dccp_connect+0x369/0x670 net/dccp/output.c:564 dccp_v6_connect+0xe17/0x1bf0 net/dccp/ipv6.c:946 __inet_stream_connect+0x2d4/0xf00 net/ipv4/af_inet.c:620 inet_stream_connect+0x58/0xa0 net/ipv4/af_inet.c:684 SYSC_connect+0x213/0x4a0 net/socket.c:1639 SyS_connect+0x24/0x30 net/socket.c:1620 do_syscall_64+0x282/0x940 arch/x86/entry/common.c:287 entry_SYSCALL_64_after_hwframe+0x26/0x9b RIP: 0033:0x441c69 RSP: 002b:00007ffe50cc0be8 EFLAGS: 00000217 ORIG_RAX: 000000000000002a RAX: ffffffffffffffda RBX: ffffffffffffffff RCX: 0000000000441c69 RDX: 000000000000001c RSI: 00000000208fdfe4 RDI: 0000000000000003 RBP: 00000000006cc018 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000538 R11: 0000000000000217 R12: 0000000000403590 R13: 0000000000403620 R14: 0000000000000000 R15: 0000000000000000 Code: 48 89 f0 83 e0 07 83 c0 01 38 d0 7c 08 84 d2 0f 85 46 02 00 00 48 8b 45 c8 44 0f b7 20 e8 88 97 04 fd 31 d2 41 0f b7 c4 4c 89 f9 <41> f7 f6 48 c1 e9 03 48 b8 00 00 00 00 00 fc ff df 0f b6 0c 01 RIP: nf_nat_l4proto_unique_tuple+0x291/0x530
net/netfilter/nf_nat_proto_common.c:88 RSP: ffff8801b2466778
The problem is that currently we don't have any check on the configured port range. A port range == -1 triggers the bug, while other negative values may require a very long time to complete the following loop.
This commit addresses the issue swapping the two ends on negative ranges. The check is performed in nf_nat_l4proto_unique_tuple() since the nft nat loads the port values from nft registers at runtime.
v1 -> v2: use the correct 'Fixes' tag
v2 -> v3: update commit message, drop unneeded READ_ONCE()
--- net/netfilter/nf_nat_proto_common.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
net/netfilter/nf_nat_proto_common.c +5 -2
@@ -41,7 +41,7 @@ void nf_nat_l4proto_unique_tuple(const sconst struct nf_conn *ct, u16 *rover) { - unsigned int range_size, min, i; + unsigned int range_size, min, max, i;__be16 *portptr;u_int16_t off;
@@ -71,7 +71,10 @@ void nf_nat_l4proto_unique_tuple(const s } }else { min =ntohs (range->min_proto.all); - range_size =ntohs (range->max_proto.all) - min +1 ; + max =ntohs (range->max_proto.all); +if (unlikely (max < min)) +swap (max, min); + range_size = max - min +1 ; }if (range->flags &NF_NAT_RANGE_PROTO_RANDOM ) {
Greg Kroah-Hartman
maintainerPATCH 9/25 netfilter: IDLETIMER: be syzkaller friendly
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
commit cfc2c740533368b96e2be5e0a4e8c3cace7d9814 upstream.
We had one report from syzkaller [1]
First issue is that INIT_WORK() should be done before mod_timer() or we risk timer being fired too soon, even with a 1 second timer.
Second issue is that we need to reject too big info->timeout to avoid overflows in msecs_to_jiffies(info->timeout * 1000), or risk looping, if result after overflow is 0.
[1]
WARNING: CPU: 1 PID: 5129 at kernel/workqueue.c:1444 __queue_work+0xdf4/0x1230 kernel/workqueue.c:1444 Kernel panic - not syncing: panic_on_warn set ... CPU: 1 PID: 5129 Comm: syzkaller159866 Not tainted 4.16.0-rc1+ #230 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: <IRQ> __dump_stack lib/dump_stack.c:17 [inline] dump_stack+0x194/0x257 lib/dump_stack.c:53 panic+0x1e4/0x41c kernel/panic.c:183 __warn+0x1dc/0x200 kernel/panic.c:547 report_bug+0x211/0x2d0 lib/bug.c:184 fixup_bug.part.11+0x37/0x80 arch/x86/kernel/traps.c:178 fixup_bug arch/x86/kernel/traps.c:247 [inline] do_error_trap+0x2d7/0x3e0 arch/x86/kernel/traps.c:296 do_invalid_op+0x1b/0x20 arch/x86/kernel/traps.c:315 invalid_op+0x22/0x40 arch/x86/entry/entry_64.S:988 RIP: 0010:__queue_work+0xdf4/0x1230 kernel/workqueue.c:1444 RSP: 0018:ffff8801db507538 EFLAGS: 00010006 RAX: ffff8801aeb46080 RBX: ffff8801db530200 RCX: ffffffff81481404 RDX: 0000000000000100 RSI: ffffffff86b42640 RDI: 0000000000000082 RBP: ffff8801db507758 R08: 1ffff1003b6a0de5 R09: 000000000000000c R10: ffff8801db5073f0 R11: 0000000000000020 R12: 1ffff1003b6a0eb6 R13: ffff8801b1067ae0 R14: 00000000000001f8 R15: dffffc0000000000 queue_work_on+0x16a/0x1c0 kernel/workqueue.c:1488 queue_work include/linux/workqueue.h:488 [inline] schedule_work include/linux/workqueue.h:546 [inline] idletimer_tg_expired+0x44/0x60 net/netfilter/xt_IDLETIMER.c:116 call_timer_fn+0x228/0x820 kernel/time/timer.c:1326 expire_timers kernel/time/timer.c:1363 [inline] __run_timers+0x7ee/0xb70 kernel/time/timer.c:1666 run_timer_softirq+0x4c/0x70 kernel/time/timer.c:1692 __do_softirq+0x2d7/0xb85 kernel/softirq.c:285 invoke_softirq kernel/softirq.c:365 [inline] irq_exit+0x1cc/0x200 kernel/softirq.c:405 exiting_irq arch/x86/include/asm/apic.h:541 [inline] smp_apic_timer_interrupt+0x16b/0x700 arch/x86/kernel/apic/apic.c:1052 apic_timer_interrupt+0xa9/0xb0 arch/x86/entry/entry_64.S:829 </IRQ> RIP: 0010:arch_local_irq_restore arch/x86/include/asm/paravirt.h:777 [inline] RIP: 0010:__raw_spin_unlock_irqrestore include/linux/spinlock_api_smp.h:160 [inline] RIP: 0010:_raw_spin_unlock_irqrestore+0x5e/0xba kernel/locking/spinlock.c:184 RSP: 0018:ffff8801c20173c8 EFLAGS: 00000282 ORIG_RAX: ffffffffffffff12 RAX: dffffc0000000000 RBX: 0000000000000282 RCX: 0000000000000006 RDX: 1ffffffff0d592cd RSI: 1ffff10035d68d23 RDI: 0000000000000282 RBP: ffff8801c20173d8 R08: 1ffff10038402e47 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: ffffffff8820e5c8 R13: ffff8801b1067ad8 R14: ffff8801aea7c268 R15: ffff8801aea7c278 __debug_object_init+0x235/0x1040 lib/debugobjects.c:378 debug_object_init+0x17/0x20 lib/debugobjects.c:391 __init_work+0x2b/0x60 kernel/workqueue.c:506 idletimer_tg_create net/netfilter/xt_IDLETIMER.c:152 [inline] idletimer_tg_checkentry+0x691/0xb00 net/netfilter/xt_IDLETIMER.c:213 xt_check_target+0x22c/0x7d0 net/netfilter/x_tables.c:850 check_target net/ipv6/netfilter/ip6_tables.c:533 [inline] find_check_entry.isra.7+0x935/0xcf0 net/ipv6/netfilter/ip6_tables.c:575 translate_table+0xf52/0x1690 net/ipv6/netfilter/ip6_tables.c:744 do_replace net/ipv6/netfilter/ip6_tables.c:1160 [inline] do_ip6t_set_ctl+0x370/0x5f0 net/ipv6/netfilter/ip6_tables.c:1686 nf_sockopt net/netfilter/nf_sockopt.c:106 [inline] nf_setsockopt+0x67/0xc0 net/netfilter/nf_sockopt.c:115 ipv6_setsockopt+0x10b/0x130 net/ipv6/ipv6_sockglue.c:927 udpv6_setsockopt+0x45/0x80 net/ipv6/udp.c:1422 sock_common_setsockopt+0x95/0xd0 net/core/sock.c:2976 SYSC_setsockopt net/socket.c:1850 [inline] SyS_setsockopt+0x189/0x360 net/socket.c:1829 do_syscall_64+0x282/0x940 arch/x86/entry/common.c:287
--- net/netfilter/xt_IDLETIMER.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
net/netfilter/xt_IDLETIMER.c +6 -3
@@ -146,11 +146,11 @@ static int idletimer_tg_create(struct id (unsigned long) info->timer); info->timer->refcnt =1 ; +INIT_WORK (&info->timer->work, idletimer_tg_work); +mod_timer (&info->timer->timer,msecs_to_jiffies (info->timeout *1000 ) + jiffies); -INIT_WORK (&info->timer->work, idletimer_tg_work); -return 0 ; out_free_attr:
@@ -191,7 +191,10 @@ static int idletimer_tg_checkentry(constpr_debug ("timeout value is zero\n" );return -EINVAL ; } - +if (info->timeout >=INT_MAX /1000 ) { +pr_debug ("timeout value is too big\n" ); +return -EINVAL ; + }if (info->label[0 ] =='\0' ||strnlen (info->label,MAX_IDLETIMER_LABEL_SIZE ) ==MAX_IDLETIMER_LABEL_SIZE ) {
Greg Kroah-Hartman
maintainerPATCH 10/25 netfilter: ebtables: CONFIG_COMPAT: dont trust userland offsets
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit b71812168571fa55e44cdd0254471331b9c4c4c6 upstream.
We need to make sure the offsets are not out of range of the total size.
Also check that they are in ascending order.
The WARN_ON triggered by syzkaller (it sets panic_on_warn) is changed to also bail out, no point in continuing parsing.
Briefly tested with simple ruleset of
-A INPUT --limit 1/s' --log
plus jump to custom chains using 32bit ebtables binary.
--- net/bridge/netfilter/ebtables.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
net/bridge/netfilter/ebtables.c +12 -1
@@ -2019,7 +2019,9 @@ static int ebt_size_mwt(struct compat_ebif (match_kern) match_kern->match_size = ret; -WARN_ON (type ==EBT_COMPAT_TARGET && size_left); +if (WARN_ON (type ==EBT_COMPAT_TARGET && size_left)) +return -EINVAL ; + match32 = (struct compat_ebt_entry_mwt *) buf; }
@@ -2076,6 +2078,15 @@ static int size_entry_mwt(struct ebt_ent* * offsets are relative to beginning of struct ebt_entry (i.e., 0). */ +for (i =0 ; i <4 ; ++i) { +if (offsets[i] >= *total) +return -EINVAL ; +if (i ==0 ) +continue ; +if (offsets[i-1 ] > offsets[i]) +return -EINVAL ; + } +for (i =0 , j =1 ; j <4 ; j++, i++) {struct compat_ebt_entry_mwt *match32;unsigned int size;
Greg Kroah-Hartman
maintainerPATCH 11/25 netfilter: bridge: ebt_among: add missing match size checks
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit c4585a2823edf4d1326da44d1524ecbfda26bb37 upstream.
ebt_among is special, it has a dynamic match size and is exempt from the central size checks.
Therefore it must check that the size of the match structure provided from userspace is sane by making sure em->match_size is at least the minimum size of the expected structure.
The module has such a check, but its only done after accessing a structure that might be out of bounds.
tested with: ebtables -A INPUT ... \
--among-dst fe:fe:fe:fe:fe:fe
--among-dst fe:fe:fe:fe:fe:fe --among-src fe:fe:fe:fe:ff:f,fe:fe:fe:fe:fe:fb,fe:fe:fe:fe:fc:fd,fe:fe:fe:fe:fe:fd,fe:fe:fe:fe:fe:fe --among-src fe:fe:fe:fe:ff:f,fe:fe:fe:fe:fe:fa,fe:fe:fe:fe:fe:fd,fe:fe:fe:fe:fe:fe,fe:fe:fe:fe:fe:fe
--- net/bridge/netfilter/ebt_among.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)
net/bridge/netfilter/ebt_among.c +19 -2
@@ -172,18 +172,35 @@ ebt_among_mt(const struct sk_buff *skb,return true; } +static bool poolsize_invalid (const struct ebt_mac_wormhash *w) +{ +return w && w->poolsize >= (INT_MAX /sizeof (struct ebt_mac_wormhash_tuple )); +} +static int ebt_among_mt_check (const struct xt_mtchk_param *par) {const struct ebt_among_info *info = par->matchinfo;const struct ebt_entry_match *em = container_of(par->matchinfo, const struct ebt_entry_match, data); -int expected_length =sizeof (struct ebt_among_info ); +unsigned int expected_length =sizeof (struct ebt_among_info );const struct ebt_mac_wormhash *wh_dst, *wh_src;int err; +if (expected_length > em->match_size) +return -EINVAL ; + wh_dst =ebt_among_wh_dst (info); - wh_src =ebt_among_wh_src (info); +if (poolsize_invalid (wh_dst)) +return -EINVAL ; + expected_length +=ebt_mac_wormhash_size (wh_dst); +if (expected_length > em->match_size) +return -EINVAL ; + + wh_src =ebt_among_wh_src (info); +if (poolsize_invalid (wh_src)) +return -EINVAL ; + expected_length +=ebt_mac_wormhash_size (wh_src);if (em->match_size !=EBT_ALIGN (expected_length)) {
Greg Kroah-Hartman
maintainerPATCH 12/25 netfilter: ipv6: fix use-after-free Write in nf_nat_ipv6_manip_pkt
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
commit b078556aecd791b0e5cb3a59f4c3a14273b52121 upstream.
l4proto->manip_pkt() can cause reallocation of skb head so pointer to the ipv6 header must be reloaded.
--- net/ipv6/netfilter/nf_nat_l3proto_ipv6.c | 4 ++++ 1 file changed, 4 insertions(+)
net/ipv6/netfilter/nf_nat_l3proto_ipv6.c +4 -0
@@ -99,6 +99,10 @@ static bool nf_nat_ipv6_manip_pkt(struct !l4proto->manip_pkt(skb, &nf_nat_l3proto_ipv6, iphdroff, hdroff, target, maniptype))return false; + +/* must reload, offset might have changed */ + ipv6h = (void *)skb->data + iphdroff; + manip_addr:if (maniptype ==NF_NAT_MANIP_SRC ) ipv6h->saddr = target->src.u3.in6;
Greg Kroah-Hartman
maintainerPATCH 13/25 ubi: Fix race condition between ubi volume creation and udev
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clay McClure <[email protected]>
commit a51a0c8d213594bc094cb8e54aad0cb6d7f7b9a6 upstream.
Similar to commit 714fb87e8bc0 ("ubi: Fix race condition between ubi device creation and udev"), we should make the volume active before registering it.
--- drivers/mtd/ubi/vmt.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/mtd/ubi/vmt.c +10 -5
@@ -308,6 +308,12 @@ int ubi_create_volume(struct ubi_device vol->last_eb_bytes = vol->usable_leb_size; } +/* Make volume "available" before it becomes accessible via sysfs */ +spin_lock (&ubi->volumes_lock); + ubi->volumes[vol_id] = vol; + ubi->vol_count +=1 ; +spin_unlock (&ubi->volumes_lock); +/* Register character device for the volume */ cdev_init (&vol->cdev, &ubi_vol_cdev_operations); vol->cdev.owner =THIS_MODULE ;
@@ -350,11 +356,6 @@ int ubi_create_volume(struct ubi_deviceif (err) goto out_sysfs; -spin_lock (&ubi->volumes_lock); - ubi->volumes[vol_id] = vol; - ubi->vol_count +=1 ; -spin_unlock (&ubi->volumes_lock); -ubi_volume_notify (ubi, vol,UBI_VOLUME_ADDED );self_check_volumes (ubi);return err;
@@ -374,6 +375,10 @@ out_sysfs: out_cdev:cdev_del (&vol->cdev); out_mapping: +spin_lock (&ubi->volumes_lock); + ubi->volumes[vol_id] =NULL ; + ubi->vol_count -=1 ; +spin_unlock (&ubi->volumes_lock);if (do_free)kfree (vol->eba_tbl); out_acc:
Greg Kroah-Hartman
maintainerPATCH 14/25 scripts: recordmcount: break hardlinks
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russell King <[email protected]>
commit dd39a26538e37f6c6131e829a4a510787e43c783 upstream.
recordmcount edits the file in-place, which can cause problems when using ccache in hardlink mode. Arrange for recordmcount to break a hardlinked object.
--- scripts/recordmcount.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
scripts/recordmcount.c +14 -0
@@ -201,6 +201,20 @@ static void *mmap_file(char const *fname addr =umalloc (sb.st_size);uread (fd_map, addr, sb.st_size); } +if (sb.st_nlink !=1 ) { +/* file is hard-linked, break the hard link */ +close (fd_map); +if (unlink (fname) <0 ) { +perror (fname); +fail_file (); + } + fd_map =open (fname,O_RDWR |O_CREAT , sb.st_mode); +if (fd_map <0 ) { +perror (fname); +fail_file (); + } +uwrite (fd_map, addr, sb.st_size); + }return addr; }
Greg Kroah-Hartman
maintainerPATCH 15/25 x86/module: Detect and skip invalid relocations
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josh Poimboeuf <[email protected]>
commit eda9cec4c9a12208a6f69fbe68f72a6311d50032 upstream.
There have been some cases where external tooling (e.g., kpatch-build) creates a corrupt relocation which targets the wrong address. This is a silent failure which can corrupt memory in unexpected places.
On x86, the bytes of data being overwritten by relocations are always initialized to zero beforehand. Use that knowledge to add sanity checks to detect such cases before they corrupt memory.
--- arch/x86/kernel/module.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
arch/x86/kernel/module.c +13 -0
@@ -167,19 +167,27 @@ int apply_relocate_add(Elf64_Shdr *sechdcase R_X86_64_NONE :break ;case R_X86_64_64 : +if (*(u64 *)loc !=0 ) + goto invalid_relocation; *(u64 *)loc = val;break ;case R_X86_64_32 : +if (*(u32 *)loc !=0 ) + goto invalid_relocation; *(u32 *)loc = val;if (val != *(u32 *)loc) goto overflow;break ;case R_X86_64_32S : +if (*(s32 *)loc !=0 ) + goto invalid_relocation; *(s32 *)loc = val;if ((s64 )val != *(s32 *)loc) goto overflow;break ;case R_X86_64_PC32 : +if (*(u32 *)loc !=0 ) + goto invalid_relocation; val -= (u64 )loc; *(u32 *)loc = val;#if 0
@@ -195,6 +203,11 @@ int apply_relocate_add(Elf64_Shdr *sechd }return 0 ; +invalid_relocation: +pr_err ("x86/modules: Skipping invalid relocation target, existing value is nonzero for type %d, loc %p, val %Lx\n" , + (int )ELF64_R_TYPE (rel[i].r_info), loc, val); +return -ENOEXEC ; + overflow:pr_err ("overflow in relocation type %d val %Lx\n" , (int )ELF64_R_TYPE (rel[i].r_info), val);
Greg Kroah-Hartman
maintainerPATCH 16/25 x86: Treat R_X86_64_PLT32 as R_X86_64_PC32
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: H.J. Lu <[email protected]>
commit b21ebf2fb4cde1618915a97cc773e287ff49173e upstream.
On i386, there are 2 types of PLTs, PIC and non-PIC. PIE and shared objects must use PIC PLT. To use PIC PLT, you need to load _GLOBAL_OFFSET_TABLE_ into EBX first. There is no need for that on x86-64 since x86-64 uses PC-relative PLT.
On x86-64, for 32-bit PC-relative branches, we can generate PLT32 relocation, instead of PC32 relocation, which can also be used as a marker for 32-bit PC-relative branches. Linker can always reduce
PLT32 relocation to PC32 if function is defined locally. Local
functions should use PC32 relocation. As far as Linux kernel is concerned, R_X86_64_PLT32 can be treated the same as R_X86_64_PC32 since Linux kernel doesn't use PLT.
R_X86_64_PLT32 for 32-bit PC-relative branches has been enabled in binutils master branch which will become binutils 2.31.
[ hjl is working on having better documentation on this all, but a few
more notes from him:
"PLT32 relocation is used as marker for PC-relative branches. Because
of EBX, it looks odd to generate PLT32 relocation on i386 when EBX doesn't have GOT.
As for symbol resolution, PLT32 and PC32 relocations are almost interchangeable. But when linker sees PLT32 relocation against a protected symbol, it can resolved locally at link-time since it is used on a branch instruction. Linker can't do that for PC32 relocation"
but for the kernel use, the two are basically the same, and this commit gets things building and working with the current binutils
master - Linus ]
--- arch/x86/kernel/machine_kexec_64.c | 1 + arch/x86/kernel/module.c | 1 + arch/x86/tools/relocs.c | 3 +++ 3 files changed, 5 insertions(+)
arch/x86/kernel/machine_kexec_64.c +1 -0
@@ -516,6 +516,7 @@ int arch_kexec_apply_relocations_add(con goto overflow;break ;case R_X86_64_PC32 : +case R_X86_64_PLT32 : value -= (u64 )address; *(u32 *)location = value;break ;
arch/x86/kernel/module.c +1 -0
@@ -186,6 +186,7 @@ int apply_relocate_add(Elf64_Shdr *sechd goto overflow;break ;case R_X86_64_PC32 : +case R_X86_64_PLT32 :if (*(u32 *)loc !=0 ) goto invalid_relocation; val -= (u64 )loc;
arch/x86/tools/relocs.c +3 -0
@@ -769,9 +769,12 @@ static int do_reloc64(struct section *sebreak ;case R_X86_64_PC32 : +case R_X86_64_PLT32 :/* * PC relative relocations don't need to be adjusted unless * referencing a percpu symbol. +* +* NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32. */ if (is_percpu_sym (sym, symname))add_reloc (&relocs32neg, offset);
Greg Kroah-Hartman
maintainerPATCH 17/25 serial: sh-sci: prevent lockup on full TTY buffers
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ulrich Hecht <[email protected]>
commit 7842055bfce4bf0170d0f61df8b2add8399697be upstream.
When the TTY buffers fill up to the configured maximum, a system lockup occurs:
[ 598.820128] INFO: rcu_preempt detected stalls on CPUs/tasks: [ 598.825796] 0-...!: (1 GPs behind) idle=5a6/2/0 softirq=1974/1974 fqs=1 [ 598.832577] (detected by 3, t=62517 jiffies, g=296, c=295, q=126) [ 598.838755] Task dump for CPU 0: [ 598.841977] swapper/0 R running task 0 0 0 0x00000022 [ 598.849023] Call trace: [ 598.851476] __switch_to+0x98/0xb0 [ 598.854870] (null)
This can be prevented by doing a dummy read of the RX data register.
This issue affects both HSCIF and SCIF ports. Reported for R-Car H3 ES2.0; reproduced and fixed on H3 ES1.1. Probably affects other R-Car platforms as well.
--- drivers/tty/serial/sh-sci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/tty/serial/sh-sci.c +2 -0
@@ -736,6 +736,8 @@ static void sci_receive_chars(struct uar/* Tell the rest of the system the news. New characters! */ tty_flip_buffer_push (tport); }else { +/* TTY buffers full; read from RX reg to prevent lockup */ +serial_port_in (port, SCxRDR);serial_port_in (port, SCxSR);/* dummy read */ serial_port_out (port, SCxSR,SCxSR_RDxF_CLEAR (port)); }
Greg Kroah-Hartman
maintainerPATCH 18/25 tty/serial: atmel: add new version check for usart
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Danielsson <[email protected]>
commit fd63a8903a2c40425a9811c3371dd4d0f42c0ad3 upstream.
On our at91sam9260 based board the usart0 and usart1 ports report their versions (ATMEL_US_VERSION) as 0x10302. This version is not included in the current checks in the driver.
--- drivers/tty/serial/atmel_serial.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/atmel_serial.c +1 -0
@@ -1643,6 +1643,7 @@ static void atmel_get_ip_name(struct uarswitch (version) {case 0x302 :case 0x10213 : +case 0x10302 :dev_dbg (port->dev,"This version is usart\n" ); atmel_port->is_usart = true;break ;
Greg Kroah-Hartman
maintainerPATCH 19/25 uas: fix comparison for error code
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
commit 9a513c905bb95bef79d96feb08621c1ec8d8c4bb upstream.
A typo broke the comparison.
--- drivers/usb/storage/uas.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/storage/uas.c +1 -1
@@ -1067,7 +1067,7 @@ static int uas_post_reset(struct usb_intreturn 0 ; err =uas_configure_endpoints (devinfo); -if (err && err !=ENODEV ) +if (err && err != -ENODEV )shost_printk (KERN_ERR , shost,"%s: alloc streams error %d after reset" , __func__, err);
Greg Kroah-Hartman
maintainerPATCH 20/25 staging: android: ashmem: Fix lockdep issue during llseek
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joel Fernandes <[email protected]>
commit cb57469c9573f6018cd1302953dd45d6e05aba7b upstream.
ashmem_mutex create a chain of dependencies like so:
(1)
mmap syscall ->
mmap_sem -> (acquired)
ashmem_mmap
ashmem_mutex (try to acquire)
(block)
(2)
llseek syscall ->
ashmem_llseek ->
ashmem_mutex -> (acquired)
inode_lock ->
inode->i_rwsem (try to acquire)
(block)
(3)
getdents ->
iterate_dir ->
inode_lock ->
inode->i_rwsem (acquired)
copy_to_user ->
mmap_sem (try to acquire)
There is a lock ordering created between mmap_sem and inode->i_rwsem causing a lockdep splat [2] during a syzcaller test, this patch fixes the issue by unlocking the mutex earlier. Functionally that's Ok since we don't need to protect vfs_llseek.
[1] https://patchwork.kernel.org/patch/10185031/
[2] https://lkml.org/lkml/2018/1/10/48
--- drivers/staging/android/ashmem.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
drivers/staging/android/ashmem.c +7 -8
@@ -330,24 +330,23 @@ static loff_t ashmem_llseek(struct filemutex_lock (&ashmem_mutex);if (asma->size ==0 ) { - ret = -EINVAL ; - goto out; +mutex_unlock (&ashmem_mutex); +return -EINVAL ; }if (!asma->file) { - ret = -EBADF ; - goto out; +mutex_unlock (&ashmem_mutex); +return -EBADF ; } +mutex_unlock (&ashmem_mutex); + ret =vfs_llseek (asma->file, offset, origin);if (ret <0 ) - goto out; +return ret;/** Copy f_pos from backing file, since f_ops->llseek() sets it */ file->f_pos = asma->file->f_pos; - -out: -mutex_unlock (&ashmem_mutex);return ret; }
Greg Kroah-Hartman
maintainerPATCH 21/25 usb: quirks: add control message delay for 1b1c:1b20
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Danilo Krummrich <[email protected]>
commit cb88a0588717ba6c756cb5972d75766b273a6817 upstream.
Corsair Strafe RGB keyboard does not respond to usb control messages sometimes and hence generates timeouts.
Commit de3af5bf259d ("usb: quirks: add delay init quirk for Corsair Strafe RGB keyboard") tried to fix those timeouts by adding USB_QUIRK_DELAY_INIT.
Unfortunately, even with this quirk timeouts of usb_control_msg() can still be seen, but with a lower frequency (approx. 1 out of 15):
[ 29.103520] usb 1-8: string descriptor 0 read error: -110 [ 34.363097] usb 1-8: can't set config #1, error -110
Adding further delays to different locations where usb control messages are issued just moves the timeouts to other locations, e.g.:
[ 35.400533] usbhid 1-8:1.0: can't add hid device: -110 [ 35.401014] usbhid: probe of 1-8:1.0 failed with error -110
The only way to reliably avoid those issues is having a pause after each usb control message. In approx. 200 boot cycles no more timeouts were seen.
Addionaly, keep USB_QUIRK_DELAY_INIT as it turned out to be necessary to have the delay in hub_port_connect() after hub_port_init().
The overall boot time seems not to be influenced by these additional delays, even on fast machines and lightweight distributions.
--- drivers/usb/core/message.c | 4 ++++ drivers/usb/core/quirks.c | 3 ++- include/linux/usb/quirks.h | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-)
drivers/usb/core/message.c +4 -0
@@ -147,6 +147,10 @@ int usb_control_msg(struct usb_device *d ret =usb_internal_control_msg (dev, pipe, dr, data, size, timeout); +/* Linger a bit, prior to the next control message. */ +if (dev->quirks &USB_QUIRK_DELAY_CTRL_MSG ) +msleep (200 ); +kfree (dr);return ret;
drivers/usb/core/quirks.c +2 -1
@@ -219,7 +219,8 @@ static const struct usb_device_id usb_qu USB_QUIRK_LINEAR_UFRAME_INTR_BINTERVAL },/* Corsair Strafe RGB */ - { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT }, + { USB_DEVICE(0x1b1c, 0x1b20), .driver_info = USB_QUIRK_DELAY_INIT | + USB_QUIRK_DELAY_CTRL_MSG }, /* Corsair K70 LUX */ { USB_DEVICE(0x1b1c, 0x1b36), .driver_info = USB_QUIRK_DELAY_INIT },
include/linux/usb/quirks.h +3 -0
@@ -56,4 +56,7 @@*/ #define USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL BIT(11) +/* Device needs a pause after every control message. */ +#define USB_QUIRK_DELAY_CTRL_MSG BIT(13) +#endif /* __LINUX_USB_QUIRKS_H */
Greg Kroah-Hartman
maintainerPATCH 22/25 USB: usbmon: remove assignment from IS_ERR argument
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Julia Lawall <[email protected]>
commit 46c236dc7d1212d7417e6fb0317f91c44c719322 upstream.
The semantic patch that makes this change is as follows:
(http://coccinelle.lip6.fr/)
// <smpl>
@@
expression e1,e2;
statement S1,S2;
@@
+e1 = e2;
if (IS_ERR(
e1
- = e2
)) S1 else S2
// </smpl>
--- drivers/usb/mon/mon_text.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/mon/mon_text.c +4 -2
@@ -386,7 +386,8 @@ static ssize_t mon_text_read_t(struct fistruct mon_event_text *ep;struct mon_text_ptr ptr; -if (IS_ERR (ep =mon_text_read_wait (rp, file))) + ep =mon_text_read_wait (rp, file); +if (IS_ERR (ep))return PTR_ERR (ep);mutex_lock (&rp->printf_lock); ptr.cnt =0 ;
@@ -413,7 +414,8 @@ static ssize_t mon_text_read_u(struct fistruct mon_event_text *ep;struct mon_text_ptr ptr; -if (IS_ERR (ep =mon_text_read_wait (rp, file))) + ep =mon_text_read_wait (rp, file); +if (IS_ERR (ep))return PTR_ERR (ep);mutex_lock (&rp->printf_lock); ptr.cnt =0 ;
Greg Kroah-Hartman
maintainerPATCH 23/25 usb: usbmon: Read text within supplied buffer size
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pete Zaitcev <[email protected]>
commit a5f596830e27e15f7a0ecd6be55e433d776986d8 upstream.
This change fixes buffer overflows and silent data corruption with the usbmon device driver text file read operations.
--- drivers/usb/mon/mon_text.c | 124 +++++++++++++++++++++++++++------------------ 1 file changed, 77 insertions(+), 47 deletions(-)
drivers/usb/mon/mon_text.c +77 -47
@@ -82,6 +82,8 @@ struct mon_reader_text {wait_queue_head_t wait;int printf_size; +size_t printf_offset; +size_t printf_togo;char *printf_buf;struct mutex printf_lock;
@@ -373,75 +375,103 @@ err_alloc:return rc; } -/* -* For simplicity, we read one record in one system call and throw out -* what does not fit. This means that the following does not work: -* dd if=/dbg/usbmon/0t bs=10 -* Also, we do not allow seeks and do not bother advancing the offset. -*/ +static ssize_t mon_text_copy_to_user (struct mon_reader_text *rp, +char __user *const buf,const size_t nbytes) +{ +const size_t togo =min (nbytes, rp->printf_togo); + +if (copy_to_user (buf, &rp->printf_buf[rp->printf_offset], togo)) +return -EFAULT ; + rp->printf_togo -= togo; + rp->printf_offset += togo; +return togo; +} + +/* ppos is not advanced since the llseek operation is not permitted. */ static ssize_t mon_text_read_t (struct file *file,char __user *buf, -size_t nbytes,loff_t *ppos) +size_t nbytes,loff_t *ppos) {struct mon_reader_text *rp = file->private_data;struct mon_event_text *ep;struct mon_text_ptr ptr; +ssize_t ret; - ep =mon_text_read_wait (rp, file); -if (IS_ERR (ep)) -return PTR_ERR (ep);mutex_lock (&rp->printf_lock); - ptr.cnt =0 ; - ptr.pbuf = rp->printf_buf; - ptr.limit = rp->printf_size; - -mon_text_read_head_t (rp, &ptr, ep); -mon_text_read_statset (rp, &ptr, ep); - ptr.cnt +=snprintf (ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, -" %d" , ep->length); -mon_text_read_data (rp, &ptr, ep); -if (copy_to_user (buf, rp->printf_buf, ptr.cnt)) - ptr.cnt = -EFAULT ; +if (rp->printf_togo ==0 ) { + + ep =mon_text_read_wait (rp, file); +if (IS_ERR (ep)) { +mutex_unlock (&rp->printf_lock); +return PTR_ERR (ep); + } + ptr.cnt =0 ; + ptr.pbuf = rp->printf_buf; + ptr.limit = rp->printf_size; + +mon_text_read_head_t (rp, &ptr, ep); +mon_text_read_statset (rp, &ptr, ep); + ptr.cnt +=snprintf (ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, +" %d" , ep->length); +mon_text_read_data (rp, &ptr, ep); + + rp->printf_togo = ptr.cnt; + rp->printf_offset =0 ; + +kmem_cache_free (rp->e_slab, ep); + } + + ret =mon_text_copy_to_user (rp, buf, nbytes);mutex_unlock (&rp->printf_lock); -kmem_cache_free (rp->e_slab, ep); -return ptr.cnt; +return ret; } +/* ppos is not advanced since the llseek operation is not permitted. */ static ssize_t mon_text_read_u (struct file *file,char __user *buf, -size_t nbytes,loff_t *ppos) +size_t nbytes,loff_t *ppos) {struct mon_reader_text *rp = file->private_data;struct mon_event_text *ep;struct mon_text_ptr ptr; +ssize_t ret; - ep =mon_text_read_wait (rp, file); -if (IS_ERR (ep)) -return PTR_ERR (ep);mutex_lock (&rp->printf_lock); - ptr.cnt =0 ; - ptr.pbuf = rp->printf_buf; - ptr.limit = rp->printf_size; -mon_text_read_head_u (rp, &ptr, ep); -if (ep->type =='E' ) { -mon_text_read_statset (rp, &ptr, ep); - }else if (ep->xfertype ==USB_ENDPOINT_XFER_ISOC ) { -mon_text_read_isostat (rp, &ptr, ep); -mon_text_read_isodesc (rp, &ptr, ep); - }else if (ep->xfertype ==USB_ENDPOINT_XFER_INT ) { -mon_text_read_intstat (rp, &ptr, ep); - }else { -mon_text_read_statset (rp, &ptr, ep); +if (rp->printf_togo ==0 ) { + + ep =mon_text_read_wait (rp, file); +if (IS_ERR (ep)) { +mutex_unlock (&rp->printf_lock); +return PTR_ERR (ep); + } + ptr.cnt =0 ; + ptr.pbuf = rp->printf_buf; + ptr.limit = rp->printf_size; + +mon_text_read_head_u (rp, &ptr, ep); +if (ep->type =='E' ) { +mon_text_read_statset (rp, &ptr, ep); + }else if (ep->xfertype ==USB_ENDPOINT_XFER_ISOC ) { +mon_text_read_isostat (rp, &ptr, ep); +mon_text_read_isodesc (rp, &ptr, ep); + }else if (ep->xfertype ==USB_ENDPOINT_XFER_INT ) { +mon_text_read_intstat (rp, &ptr, ep); + }else { +mon_text_read_statset (rp, &ptr, ep); + } + ptr.cnt +=snprintf (ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, +" %d" , ep->length); +mon_text_read_data (rp, &ptr, ep); + + rp->printf_togo = ptr.cnt; + rp->printf_offset =0 ; + +kmem_cache_free (rp->e_slab, ep); } - ptr.cnt +=snprintf (ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt, -" %d" , ep->length); -mon_text_read_data (rp, &ptr, ep); -if (copy_to_user (buf, rp->printf_buf, ptr.cnt)) - ptr.cnt = -EFAULT ; + ret =mon_text_copy_to_user (rp, buf, nbytes);mutex_unlock (&rp->printf_lock); -kmem_cache_free (rp->e_slab, ep); -return ptr.cnt; +return ret; } static struct mon_event_text *mon_text_read_wait(struct mon_reader_text *rp,
Greg Kroah-Hartman
maintainerPATCH 24/25 serial: 8250_pci: Add Brainboxes UC-260 4 port serial device
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikola Ciprich <[email protected]>
commit 9f2068f35729948bde84d87a40d135015911345d upstream.
Add PCI ids for two variants of Brainboxes UC-260 quad port PCI serial cards.
--- drivers/tty/serial/8250/8250_pci.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/tty/serial/8250/8250_pci.c +11 -0
@@ -4982,6 +4982,17 @@ static struct pci_device_id serial_pci_tPCI_ANY_ID ,PCI_ANY_ID ,0 ,0 ,/* 135a.0dc0 */ pbn_b2_4_115200 },/* +* BrainBoxes UC-260 +*/ + { PCI_VENDOR_ID_INTASHIELD, 0x0D21, +PCI_ANY_ID ,PCI_ANY_ID , +PCI_CLASS_COMMUNICATION_MULTISERIAL <<8 ,0xffff00 , + pbn_b2_4_115200 }, + { PCI_VENDOR_ID_INTASHIELD, 0x0E34, +PCI_ANY_ID ,PCI_ANY_ID , +PCI_CLASS_COMMUNICATION_MULTISERIAL <<8 ,0xffff00 , + pbn_b2_4_115200 }, +/* * Perle PCI-RAS cards */ { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
Greg Kroah-Hartman
maintainerPATCH 25/25 fixup: sctp: verify size of a new chunk in _sctp_make_chunk()
In reply to Greg Kroah-Hartman3.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
Quoted 6 lines · Ben
Review
Quoted 3 lines
(quoted diff) +3
-0+ int chunklen; + + chunklen = sizeof(*chunk_hdr) + paylen;I think this length still needs to be rounded up (with
WORD_ROUNDhere, instead ofSCTP_PAD4upstream).
So here's a fix for this problem.
--- net/sctp/sm_make_chunk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sctp/sm_make_chunk.c +1 -1
@@ -1369,7 +1369,7 @@ static struct sctp_chunk *_sctp_make_chustruct sock *sk;int chunklen; - chunklen =sizeof (*chunk_hdr) + paylen; + chunklen =WORD_ROUND (sizeof (*chunk_hdr) + paylen);if (chunklen >SCTP_MAX_CHUNK_LEN ) goto nodata;
Quoted 8 lines · Greg Kroah-Hartman,
This is the start of the stable review cycle for the 3.18.100 release. There are 25 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 Sun Mar 18 15:22:18 UTC 2018. Anything received after that time might be too late.
Quoted 9 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v3.x/stable-review/patch-3.18.100-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-3.18.y
and the diffstat can be found below.
Builds and boots on the OnePlus 3T, no immediate issues noticed. Thanks for the update.
Harsh Shandilya
Quoted 1 line
Greg Kroah-Hartman
maintainerQuoted 21 lines · Harsh Shandilya
Quoted 8 lines · Greg Kroah-Hartman,
This is the start of the stable review cycle for the 3.18.100 release. There are 25 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 Sun Mar 18 15:22:18 UTC 2018. Anything received after that time might be too late.
Quoted 9 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v3.x/stable-review/patch-3.18.100-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-3.18.y
and the diffstat can be found below.
Quoted 2 lines
Builds and boots on the OnePlus 3T, no immediate issues noticed. Thanks for the update.
Thanks for testing and letting me know.
greg k-h
stable-rc/linux-3.18.y boot: 62 boots: 2 failed, 52 passed with 8 offline (v3.18.99-26-g3074344a1906)
stable-rc/linux-3.18.y boot: 62 boots: 2 failed, 52 passed with 8 offline (v3.18.99-26-g3074344a1906)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/branch/linux-3.18.y/kernel/v3.18.99-26-g3074344a1906/
Full Build Summary: https://kernelci.org/build/stable-rc/branch/linux-3.18.y/kernel/v3.18.99-26-g3074344a1906/
Tree: stable-rc
Branch: linux-3.18.y
Git Describe: v3.18.99-26-g3074344a1906
Git Commit: 3074344a190695d392821dec4555e5ceacd2e22f
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 32 unique boards, 13 SoC families, 14 builds out of 167
Boot Regressions Detected:
arm:
exynos_defconfig:
exynos5420-arndale-octa:
lab-baylibre-seattle: failing since 10 days (last pass: v3.18.96-14-g9fdaa6623e85 - first fail: v3.18.98)
multi_v7_defconfig:
tegra124-nyan-big:
lab-collabora: new failure (last pass: v3.18.99)Boot Failures Detected:
arm:
multi_v7_defconfig
tegra124-nyan-big: 1 failed lab
exynos_defconfig
exynos5420-arndale-octa: 1 failed lab
Offline Platforms:
arm:
exynos_defconfig:
exynos5410-odroidxu: 1 offline lab
multi_v7_defconfig:
am335x-boneblack: 1 offline lab
exynos5410-odroidxu: 1 offline lab
tegra124-jetson-tk1: 1 offline lab
sama5_defconfig:
at91-sama5d4ek: 1 offline lab
tegra_defconfig:
tegra124-jetson-tk1: 1 offline lab
bcm2835_defconfig:
bcm2835-rpi-b: 1 offline lab
omap2plus_defconfig:
am335x-boneblack: 1 offline lab
---
For more info write to <[email protected]>
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.18.100 release. There are 25 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 Sun Mar 18 15:22:18 UTC 2018. Anything received after that time might be too late.
Build results:
total: 137 pass: 137 fail: 0 Qemu test results: total: 119 pass: 119 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter