3.10.82-stable review
Greg Kroah-Hartman
maintainercover 3.10.82-stable review
This is the start of the stable review cycle for the 3.10.82 release. There are 5 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 Mon Jun 29 01:07:49 UTC 2015. 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/v3.x/stable-review/patch-3.10.82-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.10.82-rc1
James Smart <[email protected]>
lpfc: Add iotag memory barrier
Ben Hutchings <[email protected]>
pipe: iovec: Fix memory corruption when retrying atomic copy as non-atomic
Adam Jackson <[email protected]>
drm/mgag200: Reject non-character-cell-aligned mode widths
Steven Rostedt <[email protected]>
tracing: Have filter check for balanced ops
Steve Cornelius <[email protected]>
crypto: caam - fix RNG buffer cache alignment
-------------
Diffstat:
Makefile | 4 +-- drivers/crypto/caam/caamrng.c | 2 +- drivers/gpu/drm/mgag200/mgag200_mode.c | 5 ++++ drivers/scsi/lpfc/lpfc_sli.c | 21 +++++++++++++ fs/pipe.c | 55 ++++++++++++++++++++-------------- kernel/trace/trace_events_filter.c | 9 ++++-- 6 files changed, 68 insertions(+), 28 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/5 crypto: caam - fix RNG buffer cache alignment
3.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steve Cornelius <[email protected]>
commit 412c98c1bef65fe7589f1300e93735d96130307c upstream.
The hwrng output buffers (2) are cast inside of a a struct (caam_rng_ctx) allocated in one DMA-tagged region. While the kernel's heap allocator should place the overall struct on a cacheline aligned boundary, the 2 buffers contained within may not necessarily align. Consenquently, the ends of unaligned buffers may not fully flush, and if so, stale data will be left behind, resulting in small repeating patterns.
This fix aligns the buffers inside the struct.
Note that not all of the data inside caam_rng_ctx necessarily needs to be DMA-tagged, only the buffers themselves require this. However, a fix would incur the expense of error-handling bloat in the case of allocation failure.
--- drivers/crypto/caam/caamrng.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/caam/caamrng.c +1 -1
@@ -56,7 +56,7 @@/* Buffer, its dma address and lock */ struct buf_data { -u8 buf[RN_BUF_SIZE ]; +u8 buf[RN_BUF_SIZE ]____cacheline_aligned ;dma_addr_t addr;struct completion filled;u32 hw_desc[DESC_JOB_O_LEN ];
Greg Kroah-Hartman
maintainerPATCH 2/5 tracing: Have filter check for balanced ops
In reply to Greg Kroah-Hartman3.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
commit 2cf30dc180cea808077f003c5116388183e54f9e upstream.
When the following filter is used it causes a warning to trigger:
# cd /sys/kernel/debug/tracing # echo "((dev==1)blocks==2)" > events/ext4/ext4_truncate_exit/filter -bash: echo: write error: Invalid argument # cat events/ext4/ext4_truncate_exit/filter ((dev==1)blocks==2) ^ parse_error: No error
------------[ cut here ]------------ WARNING: CPU: 2 PID: 1223 at kernel/trace/trace_events_filter.c:1640 replace_preds+0x3c5/0x990() Modules linked in: bnep lockd grace bluetooth ... CPU: 3 PID: 1223 Comm: bash Tainted: G W 4.1.0-rc3-test+ #450 Hardware name: Hewlett-Packard HP Compaq Pro 6300 SFF/339A, BIOS K01 v02.05 05/07/2012 0000000000000668 ffff8800c106bc98 ffffffff816ed4f9 ffff88011ead0cf0 0000000000000000 ffff8800c106bcd8 ffffffff8107fb07 ffffffff8136b46c ffff8800c7d81d48 ffff8800d4c2bc00 ffff8800d4d4f920 00000000ffffffea Call Trace: [<ffffffff816ed4f9>] dump_stack+0x4c/0x6e [<ffffffff8107fb07>] warn_slowpath_common+0x97/0xe0 [<ffffffff8136b46c>] ? _kstrtoull+0x2c/0x80 [<ffffffff8107fb6a>] warn_slowpath_null+0x1a/0x20 [<ffffffff81159065>] replace_preds+0x3c5/0x990 [<ffffffff811596b2>] create_filter+0x82/0xb0 [<ffffffff81159944>] apply_event_filter+0xd4/0x180 [<ffffffff81152bbf>] event_filter_write+0x8f/0x120 [<ffffffff811db2a8>] __vfs_write+0x28/0xe0 [<ffffffff811dda43>] ? __sb_start_write+0x53/0xf0 [<ffffffff812e51e0>] ? security_file_permission+0x30/0xc0 [<ffffffff811dc408>] vfs_write+0xb8/0x1b0 [<ffffffff811dc72f>] SyS_write+0x4f/0xb0 [<ffffffff816f5217>] system_call_fastpath+0x12/0x6a ---[ end trace e11028bd95818dcd ]---
Worse yet, reading the error message (the filter again) it says that there was no error, when there clearly was. The issue is that the code that checks the input does not check for balanced ops. That is, having an op between a closed parenthesis and the next token.
This would only cause a warning, and fail out before doing any real harm, but it should still not caues a warning, and the error reported should work:
# cd /sys/kernel/debug/tracing # echo "((dev==1)blocks==2)" > events/ext4/ext4_truncate_exit/filter -bash: echo: write error: Invalid argument # cat events/ext4/ext4_truncate_exit/filter ((dev==1)blocks==2) ^ parse_error: Meaningless filter expression
And give no kernel warning.
[ luis: backported to 3.16:
- unconditionally decrement cnt as the OP_NOT logic was introduced only by e12c09cf3087 ("tracing: Add NOT to filtering logic") ]
--- kernel/trace/trace_events_filter.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
kernel/trace/trace_events_filter.c +7 -2
@@ -1328,19 +1328,24 @@ static int check_preds(struct filter_par {int n_normal_preds =0 , n_logical_preds =0 ;struct postfix_elt *elt; +int cnt =0 ;list_for_each_entry (elt, &ps->postfix, list) { -if (elt->op ==OP_NONE ) +if (elt->op ==OP_NONE ) { + cnt++;continue ; + } + cnt--;if (elt->op ==OP_AND || elt->op ==OP_OR ) { n_logical_preds++;continue ; } n_normal_preds++; +WARN_ON_ONCE (cnt <0 ); } -if (!n_normal_preds || n_logical_preds >= n_normal_preds) { +if (cnt !=1 || !n_normal_preds || n_logical_preds >= n_normal_preds) {parse_error (ps,FILT_ERR_INVALID_FILTER ,0 );return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 3/5 drm/mgag200: Reject non-character-cell-aligned mode widths
In reply to Greg Kroah-Hartman3.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adam Jackson <[email protected]>
commit 25161084b1c1b0c29948f6f77266a35f302196b7 upstream.
Turns out 1366x768 does not in fact work on this hardware.
--- drivers/gpu/drm/mgag200/mgag200_mode.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/mgag200/mgag200_mode.c +5 -0
@@ -1487,6 +1487,11 @@ static int mga_vga_mode_valid(struct drmreturn MODE_BANDWIDTH ; } +if ((mode->hdisplay %8 ) !=0 || (mode->hsync_start %8 ) !=0 || + (mode->hsync_end %8 ) !=0 || (mode->htotal %8 ) !=0 ) { +return MODE_H_ILLEGAL ; + } + if (mode->crtc_hdisplay > 2048 || mode->crtc_hsync_start > 4096 || mode->crtc_hsync_end > 4096 || mode->crtc_htotal > 4096 || mode->crtc_vdisplay > 2048 || mode->crtc_vsync_start > 4096 ||
Greg Kroah-Hartman
maintainerPATCH 4/5 pipe: iovec: Fix memory corruption when retrying atomic copy as non-atomic
In reply to Greg Kroah-Hartman3.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
pipe_iov_copy_{from,to}_user() may be tried twice with the same iovec, the first time atomically and the second time not. The second attempt needs to continue from the iovec position, pipe buffer offset and remaining length where the first attempt failed, but currently the pipe buffer offset and remaining length are reset. This will corrupt the piped data (possibly also leading to an information leak between processes) and may also corrupt kernel memory.
This was fixed upstream by commits f0d1bec9d58d ("new helper:copy_page_from_iter()") and 637b58c2887e ("switch pipe_read() to copy_page_to_iter()"), but those aren't suitable for stable. This fix for older kernel versions was made by Seth Jennings for RHEL and I have extracted it from their update.
CVE-2015-1805
References: https://bugzilla.redhat.com/show_bug.cgi?id=1202855
--- fs/pipe.c | 55 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 23 deletions(-)
fs/pipe.c +32 -23
@@ -117,25 +117,27 @@ void pipe_wait(struct pipe_inode_info *p }static int -pipe_iov_copy_from_user (void *to,struct iovec *iov,unsigned long len, -int atomic) +pipe_iov_copy_from_user (void *addr,int *offset,struct iovec *iov, +size_t *remaining,int atomic) {unsigned long copy; -while (len >0 ) { +while (*remaining >0 ) {while (!iov->iov_len) iov++; - copy = min_t(unsigned long, len, iov->iov_len); + copy = min_t(unsigned long, *remaining, iov->iov_len);if (atomic) { -if (__copy_from_user_inatomic (to, iov->iov_base, copy)) +if (__copy_from_user_inatomic (addr + *offset, + iov->iov_base, copy))return -EFAULT ; }else { -if (copy_from_user (to, iov->iov_base, copy)) +if (copy_from_user (addr + *offset, + iov->iov_base, copy))return -EFAULT ; } - to += copy; - len -= copy; + *offset += copy; + *remaining -= copy; iov->iov_base += copy; iov->iov_len -= copy; }
@@ -143,25 +145,27 @@ pipe_iov_copy_from_user(void *to, struct }static int -pipe_iov_copy_to_user (struct iovec *iov,const void *from,unsigned long len, -int atomic) +pipe_iov_copy_to_user (struct iovec *iov,void *addr,int *offset, +size_t *remaining,int atomic) {unsigned long copy; -while (len >0 ) { +while (*remaining >0 ) {while (!iov->iov_len) iov++; - copy = min_t(unsigned long, len, iov->iov_len); + copy = min_t(unsigned long, *remaining, iov->iov_len);if (atomic) { -if (__copy_to_user_inatomic (iov->iov_base, from, copy)) +if (__copy_to_user_inatomic (iov->iov_base, + addr + *offset, copy))return -EFAULT ; }else { -if (copy_to_user (iov->iov_base, from, copy)) +if (copy_to_user (iov->iov_base, + addr + *offset, copy))return -EFAULT ; } - from += copy; - len -= copy; + *offset += copy; + *remaining -= copy; iov->iov_base += copy; iov->iov_len -= copy; }
@@ -395,7 +399,7 @@ pipe_read(struct kiocb *iocb, const strustruct pipe_buffer *buf = pipe->bufs + curbuf;const struct pipe_buf_operations *ops = buf->ops;void *addr; -size_t chars = buf->len; +size_t chars = buf->len, remaining;int error, atomic;if (chars > total_len)
@@ -409,9 +413,11 @@ pipe_read(struct kiocb *iocb, const stru } atomic = !iov_fault_in_pages_write (iov, chars); + remaining = chars; redo: addr = ops->map (pipe, buf, atomic); - error =pipe_iov_copy_to_user (iov, addr + buf->offset, chars, atomic); + error =pipe_iov_copy_to_user (iov, addr, &buf->offset, + &remaining, atomic); ops->unmap (pipe, buf, addr);if (unlikely (error)) {/*
@@ -426,7 +432,6 @@ redo:break ; } ret += chars; - buf->offset += chars; buf->len -= chars;/* Was it a packet buffer? Clean up and exit */
@@ -531,6 +536,7 @@ pipe_write(struct kiocb *iocb, const strif (ops->can_merge && offset + chars <=PAGE_SIZE ) {int error, atomic =1 ;void *addr; +size_t remaining = chars; error = ops->confirm (pipe, buf);if (error)
@@ -539,8 +545,8 @@ pipe_write(struct kiocb *iocb, const striov_fault_in_pages_read (iov, chars); redo1: addr = ops->map (pipe, buf, atomic); - error =pipe_iov_copy_from_user (offset + addr, iov, - chars, atomic); + error =pipe_iov_copy_from_user (addr, &offset, iov, + &remaining, atomic); ops->unmap (pipe, buf, addr); ret = error; do_wakeup =1 ;
@@ -575,6 +581,8 @@ redo1:struct page *page = pipe->tmp_page;char *src;int error, atomic =1 ; +int offset =0 ; +size_t remaining;if (!page) { page =alloc_page (GFP_HIGHUSER );
@@ -595,14 +603,15 @@ redo1: chars = total_len;iov_fault_in_pages_read (iov, chars); + remaining = chars; redo2:if (atomic) src =kmap_atomic (page);else src =kmap (page); - error =pipe_iov_copy_from_user (src, iov, chars, - atomic); + error =pipe_iov_copy_from_user (src, &offset, iov, + &remaining, atomic);if (atomic)kunmap_atomic (src);else
Greg Kroah-Hartman
maintainerPATCH 5/5 lpfc: Add iotag memory barrier
In reply to Greg Kroah-Hartman3.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Smart <[email protected]>
commit 27f344eb15dd0da80ebec80c7245e8c85043f841 upstream.
Add a memory barrier to ensure the valid bit is read before any of the cqe payload is read. This fixes an issue seen on Power where the cqe payload was getting loaded before the valid bit. When this occurred, we saw an iotag out of range error when a command completed, but since the iotag looked invalid the command didn't get completed to scsi core. Later we hit the command timeout, attempted to abort the command, then waited for the aborted command to get returned. Since the adapter already returned the command, we timeout waiting, and end up escalating EEH all the way to host reset. This patch fixes this issue.
--- drivers/scsi/lpfc/lpfc_sli.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/scsi/lpfc/lpfc_sli.c +21 -0
@@ -263,6 +263,16 @@ lpfc_sli4_eq_get(struct lpfc_queue *q)return NULL ; q->hba_index = idx; + +/* +* insert barrier for instruction interlock : data from the hardware +* must have the valid bit checked before it can be copied and acted +* upon. Given what was seen in lpfc_sli4_cq_get() of speculative +* instructions allowing action on content before valid bit checked, +* add barrier here as well. May not be needed as "content" is a +* single 32-bit entity here (vs multi word structure for cq's). +*/ +mb ();return eqe; }
@@ -368,6 +378,17 @@ lpfc_sli4_cq_get(struct lpfc_queue *q) cqe = q->qe[q->hba_index].cqe; q->hba_index = idx; + +/* +* insert barrier for instruction interlock : data from the hardware +* must have the valid bit checked before it can be copied and acted +* upon. Speculative instructions were allowing a bcopy at the start +* of lpfc_sli4_fp_handle_wcqe(), which is called immediately +* after our return, to copy data before the valid bit check above +* was done. As such, some of the copied data was stale. The barrier +* ensures the check is before any data is copied. +*/ +mb ();return cqe; }
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.10.82 release. There are 5 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 Mon Jun 29 01:07:49 UTC 2015. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.x/stable-review/patch-3.10.82-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America (Silicon Valley) [email protected] | (970) 217-8978
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.10.82 release. There are 5 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 Mon Jun 29 01:07:49 UTC 2015. Anything received after that time might be too late.
Build results:
total: 116 pass: 115 fail: 1
Failed builds:
s390:allmodconfig
Qemu test results:
total: 27 pass: 27 fail: 0
Results are as expected.
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.10.82 release. There are 5 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 Mon Jun 29 01:07:49 UTC 2015. Anything received after that time might be too late.
Compiled and booted on x86_32. No errors in dmesg.
regards
sudip