Linux 2.6.34.9
Fix up drm-next.patch to apply on top of cda4b7d3a, e06b14ee9 Un-revert 6a1a82df9 from upstream
This commit is contained in:
parent
7adc359067
commit
07dec24ea7
@ -1,48 +0,0 @@
|
||||
From: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
Date: Wed, 24 Nov 2010 17:15:27 +0000 (-0800)
|
||||
Subject: af_unix: limit unix_tot_inflight
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdavem%2Fnet-2.6.git;a=commitdiff_plain;h=9915672d41273f5b77f1b3c29b391ffb7732b84b
|
||||
|
||||
af_unix: limit unix_tot_inflight
|
||||
|
||||
Vegard Nossum found a unix socket OOM was possible, posting an exploit
|
||||
program.
|
||||
|
||||
My analysis is we can eat all LOWMEM memory before unix_gc() being
|
||||
called from unix_release_sock(). Moreover, the thread blocked in
|
||||
unix_gc() can consume huge amount of time to perform cleanup because of
|
||||
huge working set.
|
||||
|
||||
One way to handle this is to have a sensible limit on unix_tot_inflight,
|
||||
tested from wait_for_unix_gc() and to force a call to unix_gc() if this
|
||||
limit is hit.
|
||||
|
||||
This solves the OOM and also reduce overall latencies, and should not
|
||||
slowdown normal workloads.
|
||||
|
||||
Reported-by: Vegard Nossum <vegard.nossum@gmail.com>
|
||||
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
diff --git a/net/unix/garbage.c b/net/unix/garbage.c
|
||||
index c8df6fd..40df93d 100644
|
||||
--- a/net/unix/garbage.c
|
||||
+++ b/net/unix/garbage.c
|
||||
@@ -259,9 +259,16 @@ static void inc_inflight_move_tail(struct unix_sock *u)
|
||||
}
|
||||
|
||||
static bool gc_in_progress = false;
|
||||
+#define UNIX_INFLIGHT_TRIGGER_GC 16000
|
||||
|
||||
void wait_for_unix_gc(void)
|
||||
{
|
||||
+ /*
|
||||
+ * If number of inflight sockets is insane,
|
||||
+ * force a garbage collect right now.
|
||||
+ */
|
||||
+ if (unix_tot_inflight > UNIX_INFLIGHT_TRIGGER_GC && !gc_in_progress)
|
||||
+ unix_gc();
|
||||
wait_event(unix_gc_wait, gc_in_progress == false);
|
||||
}
|
||||
|
@ -1,56 +0,0 @@
|
||||
From: Jens Axboe <jaxboe@fusionio.com>
|
||||
Date: Wed, 10 Nov 2010 13:36:25 +0000 (+0100)
|
||||
Subject: bio: take care not overflow page count when mapping/copying user data
|
||||
X-Git-Tag: v2.6.37-rc4~22^2~14
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=cb4644cac4a2797afc847e6c92736664d4b0ea34
|
||||
|
||||
bio: take care not overflow page count when mapping/copying user data
|
||||
|
||||
If the iovec is being set up in a way that causes uaddr + PAGE_SIZE
|
||||
to overflow, we could end up attempting to map a huge number of
|
||||
pages. Check for this invalid input type.
|
||||
|
||||
Reported-by: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Cc: stable@kernel.org
|
||||
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
|
||||
---
|
||||
|
||||
diff --git a/fs/bio.c b/fs/bio.c
|
||||
index 8317a2c..4bd454f 100644
|
||||
--- a/fs/bio.c
|
||||
+++ b/fs/bio.c
|
||||
@@ -834,6 +834,12 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
|
||||
end = (uaddr + iov[i].iov_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
start = uaddr >> PAGE_SHIFT;
|
||||
|
||||
+ /*
|
||||
+ * Overflow, abort
|
||||
+ */
|
||||
+ if (end < start)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
nr_pages += end - start;
|
||||
len += iov[i].iov_len;
|
||||
}
|
||||
@@ -962,6 +968,12 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,
|
||||
unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
unsigned long start = uaddr >> PAGE_SHIFT;
|
||||
|
||||
+ /*
|
||||
+ * Overflow, abort
|
||||
+ */
|
||||
+ if (end < start)
|
||||
+ return ERR_PTR(-EINVAL);
|
||||
+
|
||||
nr_pages += end - start;
|
||||
/*
|
||||
* buffer must be aligned to at least hardsector size for now
|
||||
@@ -989,7 +1001,7 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,
|
||||
unsigned long start = uaddr >> PAGE_SHIFT;
|
||||
const int local_nr_pages = end - start;
|
||||
const int page_limit = cur_page + local_nr_pages;
|
||||
-
|
||||
+
|
||||
ret = get_user_pages_fast(uaddr, local_nr_pages,
|
||||
write_to_vm, &pages[cur_page]);
|
||||
if (ret < local_nr_pages) {
|
@ -1,38 +0,0 @@
|
||||
From: Xiaotian Feng <dfeng@redhat.com>
|
||||
Date: Mon, 29 Nov 2010 09:03:55 +0000 (+0100)
|
||||
Subject: block: check for proper length of iov entries earlier in blk_rq_map_user_iov()
|
||||
X-Git-Tag: v2.6.37-rc7~10^2~5
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=54787556
|
||||
|
||||
block: check for proper length of iov entries earlier in blk_rq_map_user_iov()
|
||||
|
||||
commit 9284bcf checks for proper length of iov entries in
|
||||
blk_rq_map_user_iov(). But if the map is unaligned, kernel
|
||||
will break out the loop without checking for the proper length.
|
||||
So we need to check the proper length before the unalign check.
|
||||
|
||||
Signed-off-by: Xiaotian Feng <dfeng@redhat.com>
|
||||
Cc: stable@kernel.org
|
||||
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
|
||||
---
|
||||
|
||||
diff --git a/block/blk-map.c b/block/blk-map.c
|
||||
index 5d5dbe4..e663ac2 100644
|
||||
--- a/block/blk-map.c
|
||||
+++ b/block/blk-map.c
|
||||
@@ -201,12 +201,13 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
||||
for (i = 0; i < iov_count; i++) {
|
||||
unsigned long uaddr = (unsigned long)iov[i].iov_base;
|
||||
|
||||
+ if (!iov[i].iov_len)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (uaddr & queue_dma_alignment(q)) {
|
||||
unaligned = 1;
|
||||
break;
|
||||
}
|
||||
- if (!iov[i].iov_len)
|
||||
- return -EINVAL;
|
||||
}
|
||||
|
||||
if (unaligned || (q->dma_pad_mask & len) || map_data)
|
@ -1,29 +0,0 @@
|
||||
From: Jens Axboe <jaxboe@fusionio.com>
|
||||
Date: Fri, 29 Oct 2010 14:10:18 +0000 (-0600)
|
||||
Subject: block: check for proper length of iov entries in blk_rq_map_user_iov()
|
||||
X-Git-Tag: v2.6.37-rc4~22^2~17
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=9284bcf
|
||||
|
||||
block: check for proper length of iov entries in blk_rq_map_user_iov()
|
||||
|
||||
Ensure that we pass down properly validated iov segments before
|
||||
calling into the mapping or copy functions.
|
||||
|
||||
Reported-by: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Cc: stable@kernel.org
|
||||
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
|
||||
---
|
||||
|
||||
diff --git a/block/blk-map.c b/block/blk-map.c
|
||||
index d4a586d..5d5dbe4 100644
|
||||
--- a/block/blk-map.c
|
||||
+++ b/block/blk-map.c
|
||||
@@ -205,6 +205,8 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
||||
unaligned = 1;
|
||||
break;
|
||||
}
|
||||
+ if (!iov[i].iov_len)
|
||||
+ return -EINVAL;
|
||||
}
|
||||
|
||||
if (unaligned || (q->dma_pad_mask & len) || map_data)
|
@ -1,32 +0,0 @@
|
||||
From: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||
Date: Wed, 10 Nov 2010 12:10:30 +0000 (+0000)
|
||||
Subject: can-bcm: fix minor heap overflow
|
||||
X-Git-Tag: v2.6.37-rc2~20^2
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=0597d1b99fcfc2c0eada09a698f85ed413d4ba84
|
||||
|
||||
can-bcm: fix minor heap overflow
|
||||
|
||||
On 64-bit platforms the ASCII representation of a pointer may be up to 17
|
||||
bytes long. This patch increases the length of the buffer accordingly.
|
||||
|
||||
http://marc.info/?l=linux-netdev&m=128872251418192&w=2
|
||||
|
||||
Reported-by: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||
CC: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
diff --git a/net/can/bcm.c b/net/can/bcm.c
|
||||
index 08ffe9e..6faa825 100644
|
||||
--- a/net/can/bcm.c
|
||||
+++ b/net/can/bcm.c
|
||||
@@ -125,7 +125,7 @@ struct bcm_sock {
|
||||
struct list_head tx_ops;
|
||||
unsigned long dropped_usr_msgs;
|
||||
struct proc_dir_entry *bcm_proc_read;
|
||||
- char procname [9]; /* pointer printed in ASCII with \0 */
|
||||
+ char procname [20]; /* pointer printed in ASCII with \0 */
|
||||
};
|
||||
|
||||
static inline struct bcm_sock *bcm_sk(const struct sock *sk)
|
@ -3502,6 +3502,7 @@ CONFIG_CRYPTO_FIPS=y
|
||||
CONFIG_CRYPTO_HW=y
|
||||
CONFIG_CRYPTO_BLKCIPHER=y
|
||||
CONFIG_CRYPTO_MANAGER=m
|
||||
CONFIG_CRYPTO_MANAGER_TESTS=y
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
CONFIG_CRYPTO_AES=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
|
@ -1,53 +0,0 @@
|
||||
From: Nelson Elhage <nelhage@ksplice.com>
|
||||
Date: Thu, 2 Dec 2010 22:31:21 +0000 (-0800)
|
||||
Subject: do_exit(): make sure that we run with get_fs() == USER_DS
|
||||
X-Git-Tag: v2.6.37-rc5~17
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=33dd94ae1ccbfb7bf0fb6c692bc3d1c4269e6177
|
||||
|
||||
do_exit(): make sure that we run with get_fs() == USER_DS
|
||||
|
||||
If a user manages to trigger an oops with fs set to KERNEL_DS, fs is not
|
||||
otherwise reset before do_exit(). do_exit may later (via mm_release in
|
||||
fork.c) do a put_user to a user-controlled address, potentially allowing
|
||||
a user to leverage an oops into a controlled write into kernel memory.
|
||||
|
||||
This is only triggerable in the presence of another bug, but this
|
||||
potentially turns a lot of DoS bugs into privilege escalations, so it's
|
||||
worth fixing. I have proof-of-concept code which uses this bug along
|
||||
with CVE-2010-3849 to write a zero to an arbitrary kernel address, so
|
||||
I've tested that this is not theoretical.
|
||||
|
||||
A more logical place to put this fix might be when we know an oops has
|
||||
occurred, before we call do_exit(), but that would involve changing
|
||||
every architecture, in multiple places.
|
||||
|
||||
Let's just stick it in do_exit instead.
|
||||
|
||||
[akpm@linux-foundation.org: update code comment]
|
||||
Signed-off-by: Nelson Elhage <nelhage@ksplice.com>
|
||||
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
|
||||
Cc: <stable@kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/kernel/exit.c b/kernel/exit.c
|
||||
index 21aa7b3..676149a 100644
|
||||
--- a/kernel/exit.c
|
||||
+++ b/kernel/exit.c
|
||||
@@ -914,6 +914,15 @@ NORET_TYPE void do_exit(long code)
|
||||
if (unlikely(!tsk->pid))
|
||||
panic("Attempted to kill the idle task!");
|
||||
|
||||
+ /*
|
||||
+ * If do_exit is called because this processes oopsed, it's possible
|
||||
+ * that get_fs() was left as KERNEL_DS, so reset it to USER_DS before
|
||||
+ * continuing. Amongst other possible reasons, this is to prevent
|
||||
+ * mm_release()->clear_child_tid() from writing to a user-controlled
|
||||
+ * kernel address.
|
||||
+ */
|
||||
+ set_fs(USER_DS);
|
||||
+
|
||||
tracehook_report_exit(&code);
|
||||
|
||||
validate_creds_for_do_exit(tsk);
|
@ -17327,11 +17327,17 @@ index e302537..df931f7 100644
|
||||
struct intel_crtc;
|
||||
struct intel_overlay {
|
||||
struct drm_device *dev;
|
||||
@@ -149,17 +152,18 @@ struct intel_crtc {
|
||||
@@ -149,23 +152,24 @@ struct intel_crtc {
|
||||
bool lowfreq_avail;
|
||||
struct intel_overlay *overlay;
|
||||
struct intel_unpin_work *unpin_work;
|
||||
+ int fdi_lanes;
|
||||
|
||||
struct drm_gem_object *cursor_bo;
|
||||
uint32_t cursor_addr;
|
||||
int16_t cursor_x, cursor_y;
|
||||
int16_t cursor_width, cursor_height;
|
||||
bool cursor_visble;
|
||||
};
|
||||
|
||||
#define to_intel_crtc(x) container_of(x, struct intel_crtc, base)
|
||||
@ -36045,7 +36051,7 @@ index 1227747..d5b9373 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_object.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_object.c
|
||||
@@ -112,9 +112,11 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
|
||||
|
||||
retry:
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
/* Kernel allocation are uninterruptible */
|
||||
+ mutex_lock(&rdev->vram_mutex);
|
||||
@ -36054,8 +36060,8 @@ index 1227747..d5b9373 100644
|
||||
&radeon_ttm_bo_destroy);
|
||||
+ mutex_unlock(&rdev->vram_mutex);
|
||||
if (unlikely(r != 0)) {
|
||||
if (r != -ERESTARTSYS)
|
||||
dev_err(rdev->dev,
|
||||
if (r != -ERESTARTSYS) {
|
||||
if (domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||
@@ -166,11 +168,15 @@ void radeon_bo_kunmap(struct radeon_bo *bo)
|
||||
void radeon_bo_unref(struct radeon_bo **bo)
|
||||
{
|
||||
@ -36118,14 +36124,14 @@ index 1227747..d5b9373 100644
|
||||
if (unlikely(r != 0)) {
|
||||
return r;
|
||||
@@ -331,7 +341,7 @@ int radeon_bo_list_validate(struct list_head *head)
|
||||
lobj->rdomain);
|
||||
}
|
||||
retry:
|
||||
radeon_ttm_placement_from_domain(bo, domain);
|
||||
r = ttm_bo_validate(&bo->tbo, &bo->placement,
|
||||
- true, false);
|
||||
+ true, false, false);
|
||||
if (unlikely(r))
|
||||
return r;
|
||||
}
|
||||
if (unlikely(r)) {
|
||||
if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
|
||||
domain |= RADEON_GEM_DOMAIN_GTT;
|
||||
@@ -499,11 +509,33 @@ void radeon_bo_move_notify(struct ttm_buffer_object *bo,
|
||||
radeon_bo_check_tiling(rbo, 0, 1);
|
||||
}
|
||||
@ -39104,8 +39110,8 @@ index bbf3da7..bcc3319 100644
|
||||
d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||
d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||
@@ -502,32 +500,32 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||
d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||
}
|
||||
} else if (mode0) {
|
||||
- if (rfixed_trunc(wm0.dbpp) > 64)
|
||||
- a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair);
|
||||
@ -39149,9 +39155,9 @@ index bbf3da7..bcc3319 100644
|
||||
d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||
@@ -537,32 +535,32 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT,
|
||||
S_006D4C_D2MODE_PRIORITY_B_OFF(1));
|
||||
} else {
|
||||
if (rdev->disp_priority == 2)
|
||||
d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);
|
||||
} else if (mode1) {
|
||||
- if (rfixed_trunc(wm1.dbpp) > 64)
|
||||
- a.full = rfixed_mul(wm1.dbpp, wm1.num_line_pair);
|
||||
+ if (dfixed_trunc(wm1.dbpp) > 64)
|
||||
@ -39633,8 +39639,8 @@ index 9035121..7d9a7b0 100644
|
||||
d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||
d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||
@@ -1096,32 +1003,32 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)
|
||||
WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt);
|
||||
WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);
|
||||
d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||
}
|
||||
} else if (mode0) {
|
||||
- if (rfixed_trunc(wm0.dbpp) > 64)
|
||||
- a.full = rfixed_div(wm0.dbpp, wm0.num_line_pair);
|
||||
@ -39678,9 +39684,9 @@ index 9035121..7d9a7b0 100644
|
||||
d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||
WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt);
|
||||
@@ -1129,32 +1036,32 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)
|
||||
WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
||||
WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
||||
} else {
|
||||
if (rdev->disp_priority == 2)
|
||||
d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;
|
||||
} else if (mode1) {
|
||||
- if (rfixed_trunc(wm1.dbpp) > 64)
|
||||
- a.full = rfixed_div(wm1.dbpp, wm1.num_line_pair);
|
||||
+ if (dfixed_trunc(wm1.dbpp) > 64)
|
||||
|
@ -1,235 +0,0 @@
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
Date: Wed, 10 Nov 2010 18:38:24 +0000 (-0800)
|
||||
Subject: filter: make sure filters dont read uninitialized memory
|
||||
X-Git-Tag: v2.6.37-rc2~20^2~27
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=57fe93b374a6b8711995c2d466c502af9f3a08bb
|
||||
|
||||
[ trivial backport to 2.6.34 ]
|
||||
|
||||
filter: make sure filters dont read uninitialized memory
|
||||
|
||||
There is a possibility malicious users can get limited information about
|
||||
uninitialized stack mem array. Even if sk_run_filter() result is bound
|
||||
to packet length (0 .. 65535), we could imagine this can be used by
|
||||
hostile user.
|
||||
|
||||
Initializing mem[] array, like Dan Rosenberg suggested in his patch is
|
||||
expensive since most filters dont even use this array.
|
||||
|
||||
Its hard to make the filter validation in sk_chk_filter(), because of
|
||||
the jumps. This might be done later.
|
||||
|
||||
In this patch, I use a bitmap (a single long var) so that only filters
|
||||
using mem[] loads/stores pay the price of added security checks.
|
||||
|
||||
For other filters, additional cost is a single instruction.
|
||||
|
||||
[ Since we access fentry->k a lot now, cache it in a local variable
|
||||
and mark filter entry pointer as const. -DaveM ]
|
||||
|
||||
Reported-by: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
diff --git a/net/core/filter.c b/net/core/filter.c
|
||||
index 7beaec3..23e9b2a 100644
|
||||
--- a/net/core/filter.c
|
||||
+++ b/net/core/filter.c
|
||||
@@ -112,39 +112,41 @@ EXPORT_SYMBOL(sk_filter);
|
||||
*/
|
||||
unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen)
|
||||
{
|
||||
- struct sock_filter *fentry; /* We walk down these */
|
||||
void *ptr;
|
||||
u32 A = 0; /* Accumulator */
|
||||
u32 X = 0; /* Index Register */
|
||||
u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */
|
||||
+ unsigned long memvalid = 0;
|
||||
u32 tmp;
|
||||
int k;
|
||||
int pc;
|
||||
|
||||
+ BUILD_BUG_ON(BPF_MEMWORDS > BITS_PER_LONG);
|
||||
/*
|
||||
* Process array of filter instructions.
|
||||
*/
|
||||
for (pc = 0; pc < flen; pc++) {
|
||||
- fentry = &filter[pc];
|
||||
+ const struct sock_filter *fentry = &filter[pc];
|
||||
+ u32 f_k = fentry->k;
|
||||
|
||||
switch (fentry->code) {
|
||||
case BPF_ALU|BPF_ADD|BPF_X:
|
||||
A += X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_ADD|BPF_K:
|
||||
- A += fentry->k;
|
||||
+ A += f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_SUB|BPF_X:
|
||||
A -= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_SUB|BPF_K:
|
||||
- A -= fentry->k;
|
||||
+ A -= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_MUL|BPF_X:
|
||||
A *= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_MUL|BPF_K:
|
||||
- A *= fentry->k;
|
||||
+ A *= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_DIV|BPF_X:
|
||||
if (X == 0)
|
||||
@@ -152,49 +154,49 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
|
||||
A /= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_DIV|BPF_K:
|
||||
- A /= fentry->k;
|
||||
+ A /= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_AND|BPF_X:
|
||||
A &= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_AND|BPF_K:
|
||||
- A &= fentry->k;
|
||||
+ A &= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_OR|BPF_X:
|
||||
A |= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_OR|BPF_K:
|
||||
- A |= fentry->k;
|
||||
+ A |= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_LSH|BPF_X:
|
||||
A <<= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_LSH|BPF_K:
|
||||
- A <<= fentry->k;
|
||||
+ A <<= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_RSH|BPF_X:
|
||||
A >>= X;
|
||||
continue;
|
||||
case BPF_ALU|BPF_RSH|BPF_K:
|
||||
- A >>= fentry->k;
|
||||
+ A >>= f_k;
|
||||
continue;
|
||||
case BPF_ALU|BPF_NEG:
|
||||
A = -A;
|
||||
continue;
|
||||
case BPF_JMP|BPF_JA:
|
||||
- pc += fentry->k;
|
||||
+ pc += f_k;
|
||||
continue;
|
||||
case BPF_JMP|BPF_JGT|BPF_K:
|
||||
- pc += (A > fentry->k) ? fentry->jt : fentry->jf;
|
||||
+ pc += (A > f_k) ? fentry->jt : fentry->jf;
|
||||
continue;
|
||||
case BPF_JMP|BPF_JGE|BPF_K:
|
||||
- pc += (A >= fentry->k) ? fentry->jt : fentry->jf;
|
||||
+ pc += (A >= f_k) ? fentry->jt : fentry->jf;
|
||||
continue;
|
||||
case BPF_JMP|BPF_JEQ|BPF_K:
|
||||
- pc += (A == fentry->k) ? fentry->jt : fentry->jf;
|
||||
+ pc += (A == f_k) ? fentry->jt : fentry->jf;
|
||||
continue;
|
||||
case BPF_JMP|BPF_JSET|BPF_K:
|
||||
- pc += (A & fentry->k) ? fentry->jt : fentry->jf;
|
||||
+ pc += (A & f_k) ? fentry->jt : fentry->jf;
|
||||
continue;
|
||||
case BPF_JMP|BPF_JGT|BPF_X:
|
||||
pc += (A > X) ? fentry->jt : fentry->jf;
|
||||
@@ -209,7 +211,7 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
|
||||
pc += (A & X) ? fentry->jt : fentry->jf;
|
||||
continue;
|
||||
case BPF_LD|BPF_W|BPF_ABS:
|
||||
- k = fentry->k;
|
||||
+ k = f_k;
|
||||
load_w:
|
||||
ptr = load_pointer(skb, k, 4, &tmp);
|
||||
if (ptr != NULL) {
|
||||
@@ -218,7 +220,7 @@ load_w:
|
||||
}
|
||||
break;
|
||||
case BPF_LD|BPF_H|BPF_ABS:
|
||||
- k = fentry->k;
|
||||
+ k = f_k;
|
||||
load_h:
|
||||
ptr = load_pointer(skb, k, 2, &tmp);
|
||||
if (ptr != NULL) {
|
||||
@@ -227,7 +229,7 @@ load_h:
|
||||
}
|
||||
break;
|
||||
case BPF_LD|BPF_B|BPF_ABS:
|
||||
- k = fentry->k;
|
||||
+ k = f_k;
|
||||
load_b:
|
||||
ptr = load_pointer(skb, k, 1, &tmp);
|
||||
if (ptr != NULL) {
|
||||
@@ -242,32 +244,34 @@ load_b:
|
||||
X = skb->len;
|
||||
continue;
|
||||
case BPF_LD|BPF_W|BPF_IND:
|
||||
- k = X + fentry->k;
|
||||
+ k = X + f_k;
|
||||
goto load_w;
|
||||
case BPF_LD|BPF_H|BPF_IND:
|
||||
- k = X + fentry->k;
|
||||
+ k = X + f_k;
|
||||
goto load_h;
|
||||
case BPF_LD|BPF_B|BPF_IND:
|
||||
- k = X + fentry->k;
|
||||
+ k = X + f_k;
|
||||
goto load_b;
|
||||
case BPF_LDX|BPF_B|BPF_MSH:
|
||||
- ptr = load_pointer(skb, fentry->k, 1, &tmp);
|
||||
+ ptr = load_pointer(skb, f_k, 1, &tmp);
|
||||
if (ptr != NULL) {
|
||||
X = (*(u8 *)ptr & 0xf) << 2;
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
case BPF_LD|BPF_IMM:
|
||||
- A = fentry->k;
|
||||
+ A = f_k;
|
||||
continue;
|
||||
case BPF_LDX|BPF_IMM:
|
||||
- X = fentry->k;
|
||||
+ X = f_k;
|
||||
continue;
|
||||
case BPF_LD|BPF_MEM:
|
||||
- A = mem[fentry->k];
|
||||
+ A = (memvalid & (1UL << f_k)) ?
|
||||
+ mem[f_k] : 0;
|
||||
continue;
|
||||
case BPF_LDX|BPF_MEM:
|
||||
- X = mem[fentry->k];
|
||||
+ X = (memvalid & (1UL << f_k)) ?
|
||||
+ mem[f_k] : 0;
|
||||
continue;
|
||||
case BPF_MISC|BPF_TAX:
|
||||
X = A;
|
||||
@@ -276,14 +280,16 @@ load_b:
|
||||
A = X;
|
||||
continue;
|
||||
case BPF_RET|BPF_K:
|
||||
- return fentry->k;
|
||||
+ return f_k;
|
||||
case BPF_RET|BPF_A:
|
||||
return A;
|
||||
case BPF_ST:
|
||||
- mem[fentry->k] = A;
|
||||
+ memvalid |= 1UL << f_k;
|
||||
+ mem[f_k] = A;
|
||||
continue;
|
||||
case BPF_STX:
|
||||
- mem[fentry->k] = X;
|
||||
+ memvalid |= 1UL << f_k;
|
||||
+ mem[f_k] = X;
|
||||
continue;
|
||||
default:
|
||||
WARN_ON(1);
|
@ -1,56 +0,0 @@
|
||||
From: Miklos Szeredi <mszeredi@suse.cz>
|
||||
Date: Tue, 30 Nov 2010 15:39:27 +0000 (+0100)
|
||||
Subject: fuse: verify ioctl retries
|
||||
X-Git-Tag: v2.6.37-rc6~31^2
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=7572777eef78ebdee1ecb7c258c0ef94d35bad16
|
||||
|
||||
fuse: verify ioctl retries
|
||||
|
||||
Verify that the total length of the iovec returned in FUSE_IOCTL_RETRY
|
||||
doesn't overflow iov_length().
|
||||
|
||||
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
|
||||
CC: Tejun Heo <tj@kernel.org>
|
||||
CC: <stable@kernel.org> [2.6.31+]
|
||||
---
|
||||
|
||||
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
|
||||
index 0e2e25b..8b984a2 100644
|
||||
--- a/fs/fuse/file.c
|
||||
+++ b/fs/fuse/file.c
|
||||
@@ -1666,6 +1666,20 @@ static int fuse_copy_ioctl_iovec(struct iovec *dst, void *src,
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* Make sure iov_length() won't overflow */
|
||||
+static int fuse_verify_ioctl_iov(struct iovec *iov, size_t count)
|
||||
+{
|
||||
+ size_t n;
|
||||
+ u32 max = FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT;
|
||||
+
|
||||
+ for (n = 0; n < count; n++) {
|
||||
+ if (iov->iov_len > (size_t) max)
|
||||
+ return -ENOMEM;
|
||||
+ max -= iov->iov_len;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* For ioctls, there is no generic way to determine how much memory
|
||||
* needs to be read and/or written. Furthermore, ioctls are allowed
|
||||
@@ -1858,6 +1872,14 @@ long fuse_do_ioctl(struct file *file, unsigned int cmd, unsigned long arg,
|
||||
in_iov = page_address(iov_page);
|
||||
out_iov = in_iov + in_iovs;
|
||||
|
||||
+ err = fuse_verify_ioctl_iov(in_iov, in_iovs);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
+ err = fuse_verify_ioctl_iov(out_iov, out_iovs);
|
||||
+ if (err)
|
||||
+ goto out;
|
||||
+
|
||||
goto retry;
|
||||
}
|
||||
|
@ -1,160 +0,0 @@
|
||||
From: Dan Carpenter <error27@gmail.com>
|
||||
Date: Wed, 13 Oct 2010 09:13:12 +0000 (+0000)
|
||||
Subject: IB/uverbs: Handle large number of entries in poll CQ
|
||||
X-Git-Tag: v2.6.37-rc6~22^2
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=7182afea8d1afd432a17c18162cc3fd441d0da93
|
||||
|
||||
IB/uverbs: Handle large number of entries in poll CQ
|
||||
|
||||
In ib_uverbs_poll_cq() code there is a potential integer overflow if
|
||||
userspace passes in a large cmd.ne. The calls to kmalloc() would
|
||||
allocate smaller buffers than intended, leading to memory corruption.
|
||||
There iss also an information leak if resp wasn't all used.
|
||||
Unprivileged userspace may call this function, although only if an
|
||||
RDMA device that uses this function is present.
|
||||
|
||||
Fix this by copying CQ entries one at a time, which avoids the
|
||||
allocation entirely, and also by moving this copying into a function
|
||||
that makes sure to initialize all memory copied to userspace.
|
||||
|
||||
Special thanks to Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
|
||||
for his help and advice.
|
||||
|
||||
Cc: <stable@kernel.org>
|
||||
Signed-off-by: Dan Carpenter <error27@gmail.com>
|
||||
|
||||
[ Monkey around with things a bit to avoid bad code generation by gcc
|
||||
when designated initializers are used. - Roland ]
|
||||
|
||||
Signed-off-by: Roland Dreier <rolandd@cisco.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
|
||||
index b342248..c426992 100644
|
||||
--- a/drivers/infiniband/core/uverbs_cmd.c
|
||||
+++ b/drivers/infiniband/core/uverbs_cmd.c
|
||||
@@ -893,68 +893,81 @@ out:
|
||||
return ret ? ret : in_len;
|
||||
}
|
||||
|
||||
+static int copy_wc_to_user(void __user *dest, struct ib_wc *wc)
|
||||
+{
|
||||
+ struct ib_uverbs_wc tmp;
|
||||
+
|
||||
+ tmp.wr_id = wc->wr_id;
|
||||
+ tmp.status = wc->status;
|
||||
+ tmp.opcode = wc->opcode;
|
||||
+ tmp.vendor_err = wc->vendor_err;
|
||||
+ tmp.byte_len = wc->byte_len;
|
||||
+ tmp.ex.imm_data = (__u32 __force) wc->ex.imm_data;
|
||||
+ tmp.qp_num = wc->qp->qp_num;
|
||||
+ tmp.src_qp = wc->src_qp;
|
||||
+ tmp.wc_flags = wc->wc_flags;
|
||||
+ tmp.pkey_index = wc->pkey_index;
|
||||
+ tmp.slid = wc->slid;
|
||||
+ tmp.sl = wc->sl;
|
||||
+ tmp.dlid_path_bits = wc->dlid_path_bits;
|
||||
+ tmp.port_num = wc->port_num;
|
||||
+ tmp.reserved = 0;
|
||||
+
|
||||
+ if (copy_to_user(dest, &tmp, sizeof tmp))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
ssize_t ib_uverbs_poll_cq(struct ib_uverbs_file *file,
|
||||
const char __user *buf, int in_len,
|
||||
int out_len)
|
||||
{
|
||||
struct ib_uverbs_poll_cq cmd;
|
||||
- struct ib_uverbs_poll_cq_resp *resp;
|
||||
+ struct ib_uverbs_poll_cq_resp resp;
|
||||
+ u8 __user *header_ptr;
|
||||
+ u8 __user *data_ptr;
|
||||
struct ib_cq *cq;
|
||||
- struct ib_wc *wc;
|
||||
- int ret = 0;
|
||||
- int i;
|
||||
- int rsize;
|
||||
+ struct ib_wc wc;
|
||||
+ int ret;
|
||||
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
- wc = kmalloc(cmd.ne * sizeof *wc, GFP_KERNEL);
|
||||
- if (!wc)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- rsize = sizeof *resp + cmd.ne * sizeof(struct ib_uverbs_wc);
|
||||
- resp = kmalloc(rsize, GFP_KERNEL);
|
||||
- if (!resp) {
|
||||
- ret = -ENOMEM;
|
||||
- goto out_wc;
|
||||
- }
|
||||
-
|
||||
cq = idr_read_cq(cmd.cq_handle, file->ucontext, 0);
|
||||
- if (!cq) {
|
||||
- ret = -EINVAL;
|
||||
- goto out;
|
||||
- }
|
||||
+ if (!cq)
|
||||
+ return -EINVAL;
|
||||
|
||||
- resp->count = ib_poll_cq(cq, cmd.ne, wc);
|
||||
+ /* we copy a struct ib_uverbs_poll_cq_resp to user space */
|
||||
+ header_ptr = (void __user *)(unsigned long) cmd.response;
|
||||
+ data_ptr = header_ptr + sizeof resp;
|
||||
|
||||
- put_cq_read(cq);
|
||||
+ memset(&resp, 0, sizeof resp);
|
||||
+ while (resp.count < cmd.ne) {
|
||||
+ ret = ib_poll_cq(cq, 1, &wc);
|
||||
+ if (ret < 0)
|
||||
+ goto out_put;
|
||||
+ if (!ret)
|
||||
+ break;
|
||||
+
|
||||
+ ret = copy_wc_to_user(data_ptr, &wc);
|
||||
+ if (ret)
|
||||
+ goto out_put;
|
||||
|
||||
- for (i = 0; i < resp->count; i++) {
|
||||
- resp->wc[i].wr_id = wc[i].wr_id;
|
||||
- resp->wc[i].status = wc[i].status;
|
||||
- resp->wc[i].opcode = wc[i].opcode;
|
||||
- resp->wc[i].vendor_err = wc[i].vendor_err;
|
||||
- resp->wc[i].byte_len = wc[i].byte_len;
|
||||
- resp->wc[i].ex.imm_data = (__u32 __force) wc[i].ex.imm_data;
|
||||
- resp->wc[i].qp_num = wc[i].qp->qp_num;
|
||||
- resp->wc[i].src_qp = wc[i].src_qp;
|
||||
- resp->wc[i].wc_flags = wc[i].wc_flags;
|
||||
- resp->wc[i].pkey_index = wc[i].pkey_index;
|
||||
- resp->wc[i].slid = wc[i].slid;
|
||||
- resp->wc[i].sl = wc[i].sl;
|
||||
- resp->wc[i].dlid_path_bits = wc[i].dlid_path_bits;
|
||||
- resp->wc[i].port_num = wc[i].port_num;
|
||||
+ data_ptr += sizeof(struct ib_uverbs_wc);
|
||||
+ ++resp.count;
|
||||
}
|
||||
|
||||
- if (copy_to_user((void __user *) (unsigned long) cmd.response, resp, rsize))
|
||||
+ if (copy_to_user(header_ptr, &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
+ goto out_put;
|
||||
+ }
|
||||
|
||||
-out:
|
||||
- kfree(resp);
|
||||
+ ret = in_len;
|
||||
|
||||
-out_wc:
|
||||
- kfree(wc);
|
||||
- return ret ? ret : in_len;
|
||||
+out_put:
|
||||
+ put_cq_read(cq);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
ssize_t ib_uverbs_req_notify_cq(struct ib_uverbs_file *file,
|
@ -1,62 +0,0 @@
|
||||
From: Mimi Zohar <zohar@linux.vnet.ibm.com>
|
||||
Date: Mon, 3 Jan 2011 22:59:10 +0000 (-0800)
|
||||
Subject: ima: fix add LSM rule bug
|
||||
X-Git-Tag: v2.6.37~5
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=867c20265459d30a01b021a9c1e81fb4c5832aa9
|
||||
|
||||
ima: fix add LSM rule bug
|
||||
|
||||
If security_filter_rule_init() doesn't return a rule, then not everything
|
||||
is as fine as the return code implies.
|
||||
|
||||
This bug only occurs when the LSM (eg. SELinux) is disabled at runtime.
|
||||
|
||||
Adding an empty LSM rule causes ima_match_rules() to always succeed,
|
||||
ignoring any remaining rules.
|
||||
|
||||
default IMA TCB policy:
|
||||
# PROC_SUPER_MAGIC
|
||||
dont_measure fsmagic=0x9fa0
|
||||
# SYSFS_MAGIC
|
||||
dont_measure fsmagic=0x62656572
|
||||
# DEBUGFS_MAGIC
|
||||
dont_measure fsmagic=0x64626720
|
||||
# TMPFS_MAGIC
|
||||
dont_measure fsmagic=0x01021994
|
||||
# SECURITYFS_MAGIC
|
||||
dont_measure fsmagic=0x73636673
|
||||
|
||||
< LSM specific rule >
|
||||
dont_measure obj_type=var_log_t
|
||||
|
||||
measure func=BPRM_CHECK
|
||||
measure func=FILE_MMAP mask=MAY_EXEC
|
||||
measure func=FILE_CHECK mask=MAY_READ uid=0
|
||||
|
||||
Thus without the patch, with the boot parameters 'tcb selinux=0', adding
|
||||
the above 'dont_measure obj_type=var_log_t' rule to the default IMA TCB
|
||||
measurement policy, would result in nothing being measured. The patch
|
||||
prevents the default TCB policy from being replaced.
|
||||
|
||||
Signed-off-by: Mimi Zohar <zohar@us.ibm.com>
|
||||
Cc: James Morris <jmorris@namei.org>
|
||||
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
|
||||
Cc: David Safford <safford@watson.ibm.com>
|
||||
Cc: <stable@kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
|
||||
index aef8c0a..d661afb 100644
|
||||
--- a/security/integrity/ima/ima_policy.c
|
||||
+++ b/security/integrity/ima/ima_policy.c
|
||||
@@ -253,6 +253,8 @@ static int ima_lsm_rule_init(struct ima_measure_rule_entry *entry,
|
||||
result = security_filter_rule_init(entry->lsm[lsm_rule].type,
|
||||
Audit_equal, args,
|
||||
&entry->lsm[lsm_rule].rule);
|
||||
+ if (!entry->lsm[lsm_rule].rule)
|
||||
+ return -EINVAL;
|
||||
return result;
|
||||
}
|
||||
|
@ -1,107 +0,0 @@
|
||||
From: Tavis Ormandy <taviso@cmpxchg8b.com>
|
||||
Date: Thu, 9 Dec 2010 14:29:42 +0000 (+0100)
|
||||
Subject: install_special_mapping skips security_file_mmap check.
|
||||
X-Git-Tag: v2.6.37-rc6~5
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=462e635e5b73ba9a4c03913b77138cd57ce4b050
|
||||
|
||||
install_special_mapping skips security_file_mmap check.
|
||||
|
||||
[ Trivial backport to 2.6.34 ]
|
||||
|
||||
The install_special_mapping routine (used, for example, to setup the
|
||||
vdso) skips the security check before insert_vm_struct, allowing a local
|
||||
attacker to bypass the mmap_min_addr security restriction by limiting
|
||||
the available pages for special mappings.
|
||||
|
||||
bprm_mm_init() also skips the check, and although I don't think this can
|
||||
be used to bypass any restrictions, I don't see any reason not to have
|
||||
the security check.
|
||||
|
||||
$ uname -m
|
||||
x86_64
|
||||
$ cat /proc/sys/vm/mmap_min_addr
|
||||
65536
|
||||
$ cat install_special_mapping.s
|
||||
section .bss
|
||||
resb BSS_SIZE
|
||||
section .text
|
||||
global _start
|
||||
_start:
|
||||
mov eax, __NR_pause
|
||||
int 0x80
|
||||
$ nasm -D__NR_pause=29 -DBSS_SIZE=0xfffed000 -f elf -o install_special_mapping.o install_special_mapping.s
|
||||
$ ld -m elf_i386 -Ttext=0x10000 -Tbss=0x11000 -o install_special_mapping install_special_mapping.o
|
||||
$ ./install_special_mapping &
|
||||
[1] 14303
|
||||
$ cat /proc/14303/maps
|
||||
0000f000-00010000 r-xp 00000000 00:00 0 [vdso]
|
||||
00010000-00011000 r-xp 00001000 00:19 2453665 /home/taviso/install_special_mapping
|
||||
00011000-ffffe000 rwxp 00000000 00:00 0 [stack]
|
||||
|
||||
It's worth noting that Red Hat are shipping with mmap_min_addr set to
|
||||
4096.
|
||||
|
||||
Signed-off-by: Tavis Ormandy <taviso@google.com>
|
||||
Acked-by: Kees Cook <kees@ubuntu.com>
|
||||
Acked-by: Robert Swiecki <swiecki@google.com>
|
||||
[ Changed to not drop the error code - akpm ]
|
||||
Reviewed-by: James Morris <jmorris@namei.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/fs/exec.c b/fs/exec.c
|
||||
index d68c378..c62efcb 100644
|
||||
--- a/fs/exec.c
|
||||
+++ b/fs/exec.c
|
||||
@@ -275,6 +275,11 @@ static int __bprm_mm_init(struct linux_binprm *bprm)
|
||||
vma->vm_flags = VM_STACK_FLAGS;
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
INIT_LIST_HEAD(&vma->anon_vma_chain);
|
||||
+
|
||||
+ err = security_file_mmap(NULL, 0, 0, 0, vma->vm_start, 1);
|
||||
+ if (err)
|
||||
+ goto err;
|
||||
+
|
||||
err = insert_vm_struct(mm, vma);
|
||||
if (err)
|
||||
goto err;
|
||||
diff --git a/mm/mmap.c b/mm/mmap.c
|
||||
index b179abb..50a4aa0 100644
|
||||
--- a/mm/mmap.c
|
||||
+++ b/mm/mmap.c
|
||||
@@ -2462,6 +2462,7 @@ int install_special_mapping(struct mm_struct *mm,
|
||||
unsigned long addr, unsigned long len,
|
||||
unsigned long vm_flags, struct page **pages)
|
||||
{
|
||||
+ int ret;
|
||||
struct vm_area_struct *vma;
|
||||
|
||||
vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
|
||||
@@ -2479,16 +2480,23 @@ int install_special_mapping(struct mm_struct *mm,
|
||||
vma->vm_ops = &special_mapping_vmops;
|
||||
vma->vm_private_data = pages;
|
||||
|
||||
- if (unlikely(insert_vm_struct(mm, vma))) {
|
||||
- kmem_cache_free(vm_area_cachep, vma);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
+ ret = security_file_mmap(NULL, 0, 0, 0, vma->vm_start, 1);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
+
|
||||
+ ret = insert_vm_struct(mm, vma);
|
||||
+ if (ret)
|
||||
+ goto out;
|
||||
|
||||
mm->total_vm += len >> PAGE_SHIFT;
|
||||
|
||||
perf_event_mmap(vma);
|
||||
|
||||
return 0;
|
||||
+
|
||||
+out:
|
||||
+ kmem_cache_free(vm_area_cachep, vma);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static DEFINE_MUTEX(mm_all_locks_mutex);
|
@ -1,166 +0,0 @@
|
||||
From 547c01ae2608ffe89d18441ea209aff0540e83ec Mon Sep 17 00:00:00 2001
|
||||
From: Kyle McMartin <kyle@mcmartin.ca>
|
||||
Date: Thu, 9 Dec 2010 17:45:58 -0500
|
||||
Subject: ioat2: catch and recover from broken vtd configurations v6
|
||||
|
||||
On some platforms (MacPro3,1) the BIOS assigns the ioatdma device to the
|
||||
incorrect iommu causing faults when the driver initializes. Add a quirk
|
||||
to catch this misconfiguration and try falling back to untranslated
|
||||
operation (which works in the MacPro3,1 case).
|
||||
|
||||
Assuming there are other platforms with misconfigured iommus teach the
|
||||
ioatdma driver to treat initialization failures as non-fatal (just fail
|
||||
the driver load and emit a warning instead of triggering a BUG_ON).
|
||||
|
||||
This can be classified as a boot regression since 2.6.32 on affected
|
||||
platforms since the ioatdma module did not autoload prior to that
|
||||
kernel.
|
||||
|
||||
Cc: <stable@kernel.org>
|
||||
Acked-by: David Woodhouse <David.Woodhouse@intel.com>
|
||||
Reported-by: Chris Li <lkml@chrisli.org>
|
||||
Tested-by: Chris Li <lkml@chrisli.org>
|
||||
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
|
||||
|
||||
Conflicts:
|
||||
|
||||
drivers/dma/ioat/dma.h
|
||||
---
|
||||
drivers/dma/ioat/dma.h | 1 +
|
||||
drivers/dma/ioat/dma_v2.c | 24 ++++++++++++++++++++++--
|
||||
drivers/dma/ioat/dma_v3.c | 5 ++++-
|
||||
drivers/pci/intel-iommu.c | 28 ++++++++++++++++++++++++++++
|
||||
4 files changed, 55 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/dma/ioat/dma.h b/drivers/dma/ioat/dma.h
|
||||
index 86b97ac..f7619e9 100644
|
||||
--- a/drivers/dma/ioat/dma.h
|
||||
+++ b/drivers/dma/ioat/dma.h
|
||||
@@ -96,6 +96,7 @@ struct ioat_chan_common {
|
||||
#define IOAT_COMPLETION_ACK 1
|
||||
#define IOAT_RESET_PENDING 2
|
||||
#define IOAT_KOBJ_INIT_FAIL 3
|
||||
+ #define IOAT_RUN 4
|
||||
struct timer_list timer;
|
||||
#define COMPLETION_TIMEOUT msecs_to_jiffies(100)
|
||||
#define IDLE_TIMEOUT msecs_to_jiffies(2000)
|
||||
diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c
|
||||
index b5ae56c..63e6929 100644
|
||||
--- a/drivers/dma/ioat/dma_v2.c
|
||||
+++ b/drivers/dma/ioat/dma_v2.c
|
||||
@@ -304,7 +304,10 @@ void ioat2_timer_event(unsigned long data)
|
||||
chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET);
|
||||
dev_err(to_dev(chan), "%s: Channel halted (%x)\n",
|
||||
__func__, chanerr);
|
||||
- BUG_ON(is_ioat_bug(chanerr));
|
||||
+ if (test_bit(IOAT_RUN, &chan->state))
|
||||
+ BUG_ON(is_ioat_bug(chanerr));
|
||||
+ else /* we never got off the ground */
|
||||
+ return;
|
||||
}
|
||||
|
||||
/* if we haven't made progress and we have already
|
||||
@@ -496,6 +499,8 @@ static struct ioat_ring_ent **ioat2_alloc_ring(struct dma_chan *c, int order, gf
|
||||
return ring;
|
||||
}
|
||||
|
||||
+void ioat2_free_chan_resources(struct dma_chan *c);
|
||||
+
|
||||
/* ioat2_alloc_chan_resources - allocate/initialize ioat2 descriptor ring
|
||||
* @chan: channel to be initialized
|
||||
*/
|
||||
@@ -504,6 +509,7 @@ int ioat2_alloc_chan_resources(struct dma_chan *c)
|
||||
struct ioat2_dma_chan *ioat = to_ioat2_chan(c);
|
||||
struct ioat_chan_common *chan = &ioat->base;
|
||||
struct ioat_ring_ent **ring;
|
||||
+ u64 status;
|
||||
int order;
|
||||
|
||||
/* have we already been set up? */
|
||||
@@ -542,7 +548,20 @@ int ioat2_alloc_chan_resources(struct dma_chan *c)
|
||||
tasklet_enable(&chan->cleanup_task);
|
||||
ioat2_start_null_desc(ioat);
|
||||
|
||||
- return 1 << ioat->alloc_order;
|
||||
+ /* check that we got off the ground */
|
||||
+ udelay(5);
|
||||
+ status = ioat_chansts(chan);
|
||||
+ if (is_ioat_active(status) || is_ioat_idle(status)) {
|
||||
+ set_bit(IOAT_RUN, &chan->state);
|
||||
+ return 1 << ioat->alloc_order;
|
||||
+ } else {
|
||||
+ u32 chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET);
|
||||
+
|
||||
+ dev_WARN(to_dev(chan),
|
||||
+ "failed to start channel chanerr: %#x\n", chanerr);
|
||||
+ ioat2_free_chan_resources(c);
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
}
|
||||
|
||||
bool reshape_ring(struct ioat2_dma_chan *ioat, int order)
|
||||
@@ -776,6 +795,7 @@ void ioat2_free_chan_resources(struct dma_chan *c)
|
||||
del_timer_sync(&chan->timer);
|
||||
device->cleanup_fn((unsigned long) c);
|
||||
device->reset_hw(chan);
|
||||
+ clear_bit(IOAT_RUN, &chan->state);
|
||||
|
||||
spin_lock_bh(&ioat->ring_lock);
|
||||
descs = ioat2_ring_space(ioat);
|
||||
diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c
|
||||
index 6740e31..52b1e3d 100644
|
||||
--- a/drivers/dma/ioat/dma_v3.c
|
||||
+++ b/drivers/dma/ioat/dma_v3.c
|
||||
@@ -401,7 +401,10 @@ static void ioat3_timer_event(unsigned long data)
|
||||
chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET);
|
||||
dev_err(to_dev(chan), "%s: Channel halted (%x)\n",
|
||||
__func__, chanerr);
|
||||
- BUG_ON(is_ioat_bug(chanerr));
|
||||
+ if (test_bit(IOAT_RUN, &chan->state))
|
||||
+ BUG_ON(is_ioat_bug(chanerr));
|
||||
+ else /* we never got off the ground */
|
||||
+ return;
|
||||
}
|
||||
|
||||
/* if we haven't made progress and we have already
|
||||
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
|
||||
index 4173125..f4ba2e5 100644
|
||||
--- a/drivers/pci/intel-iommu.c
|
||||
+++ b/drivers/pci/intel-iommu.c
|
||||
@@ -3032,6 +3032,33 @@ static void __init iommu_exit_mempool(void)
|
||||
|
||||
}
|
||||
|
||||
+static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev)
|
||||
+{
|
||||
+ struct dmar_drhd_unit *drhd;
|
||||
+ u32 vtbar;
|
||||
+ int rc;
|
||||
+
|
||||
+ /* We know that this device on this chipset has its own IOMMU.
|
||||
+ * If we find it under a different IOMMU, then the BIOS is lying
|
||||
+ * to us. Hope that the IOMMU for this device is actually
|
||||
+ * disabled, and it needs no translation...
|
||||
+ */
|
||||
+ rc = pci_bus_read_config_dword(pdev->bus, PCI_DEVFN(0, 0), 0xb0, &vtbar);
|
||||
+ if (rc) {
|
||||
+ /* "can't" happen */
|
||||
+ dev_info(&pdev->dev, "failed to run vt-d quirk\n");
|
||||
+ return;
|
||||
+ }
|
||||
+ vtbar &= 0xffff0000;
|
||||
+
|
||||
+ /* we know that the this iommu should be at offset 0xa000 from vtbar */
|
||||
+ drhd = dmar_find_matched_drhd_unit(pdev);
|
||||
+ if (WARN_ONCE(!drhd || drhd->reg_base_addr - vtbar != 0xa000,
|
||||
+ "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n"))
|
||||
+ pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO;
|
||||
+}
|
||||
+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu);
|
||||
+
|
||||
static void __init init_no_remapping_devices(void)
|
||||
{
|
||||
struct dmar_drhd_unit *drhd;
|
||||
--
|
||||
1.7.3.3
|
||||
|
@ -1,30 +0,0 @@
|
||||
From: Vasiliy Kulikov <segooon@gmail.com>
|
||||
Date: Sat, 30 Oct 2010 14:22:49 +0000 (+0400)
|
||||
Subject: ipc: shm: fix information leak to userland
|
||||
X-Git-Tag: v2.6.37-rc1~24
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=3af54c9bd9e6f14f896aac1bb0e8405ae0bc7a44
|
||||
|
||||
ipc: shm: fix information leak to userland
|
||||
|
||||
The shmid_ds structure is copied to userland with shm_unused{,2,3}
|
||||
fields unitialized. It leads to leaking of contents of kernel stack
|
||||
memory.
|
||||
|
||||
Signed-off-by: Vasiliy Kulikov <segooon@gmail.com>
|
||||
Acked-by: Al Viro <viro@ZenIV.linux.org.uk>
|
||||
Cc: stable@kernel.org
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/ipc/shm.c b/ipc/shm.c
|
||||
index fd658a1..7d3bb22 100644
|
||||
--- a/ipc/shm.c
|
||||
+++ b/ipc/shm.c
|
||||
@@ -479,6 +479,7 @@ static inline unsigned long copy_shmid_to_user(void __user *buf, struct shmid64_
|
||||
{
|
||||
struct shmid_ds out;
|
||||
|
||||
+ memset(&out, 0, sizeof(out));
|
||||
ipc64_perm_to_ipc_perm(&in->shm_perm, &out.shm_perm);
|
||||
out.shm_segsz = in->shm_segsz;
|
||||
out.shm_atime = in->shm_atime;
|
@ -1,73 +0,0 @@
|
||||
From: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Date: Wed, 27 Oct 2010 22:34:17 +0000 (-0700)
|
||||
Subject: ipc: initialize structure memory to zero for compat functions
|
||||
X-Git-Tag: v2.6.37-rc1~85^2~50
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=03145beb455cf5c20a761e8451e30b8a74ba58d9
|
||||
|
||||
ipc: initialize structure memory to zero for compat functions
|
||||
|
||||
This takes care of leaking uninitialized kernel stack memory to
|
||||
userspace from non-zeroed fields in structs in compat ipc functions.
|
||||
|
||||
Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Cc: Manfred Spraul <manfred@colorfullife.com>
|
||||
Cc: Arnd Bergmann <arnd@arndb.de>
|
||||
Cc: <stable@kernel.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/ipc/compat.c b/ipc/compat.c
|
||||
index 9dc2c7d..845a287 100644
|
||||
--- a/ipc/compat.c
|
||||
+++ b/ipc/compat.c
|
||||
@@ -241,6 +241,8 @@ long compat_sys_semctl(int first, int second, int third, void __user *uptr)
|
||||
struct semid64_ds __user *up64;
|
||||
int version = compat_ipc_parse_version(&third);
|
||||
|
||||
+ memset(&s64, 0, sizeof(s64));
|
||||
+
|
||||
if (!uptr)
|
||||
return -EINVAL;
|
||||
if (get_user(pad, (u32 __user *) uptr))
|
||||
@@ -421,6 +423,8 @@ long compat_sys_msgctl(int first, int second, void __user *uptr)
|
||||
int version = compat_ipc_parse_version(&second);
|
||||
void __user *p;
|
||||
|
||||
+ memset(&m64, 0, sizeof(m64));
|
||||
+
|
||||
switch (second & (~IPC_64)) {
|
||||
case IPC_INFO:
|
||||
case IPC_RMID:
|
||||
@@ -594,6 +598,8 @@ long compat_sys_shmctl(int first, int second, void __user *uptr)
|
||||
int err, err2;
|
||||
int version = compat_ipc_parse_version(&second);
|
||||
|
||||
+ memset(&s64, 0, sizeof(s64));
|
||||
+
|
||||
switch (second & (~IPC_64)) {
|
||||
case IPC_RMID:
|
||||
case SHM_LOCK:
|
||||
diff --git a/ipc/compat_mq.c b/ipc/compat_mq.c
|
||||
index d8d1e9f..380ea4f 100644
|
||||
--- a/ipc/compat_mq.c
|
||||
+++ b/ipc/compat_mq.c
|
||||
@@ -53,6 +53,9 @@ asmlinkage long compat_sys_mq_open(const char __user *u_name,
|
||||
void __user *p = NULL;
|
||||
if (u_attr && oflag & O_CREAT) {
|
||||
struct mq_attr attr;
|
||||
+
|
||||
+ memset(&attr, 0, sizeof(attr));
|
||||
+
|
||||
p = compat_alloc_user_space(sizeof(attr));
|
||||
if (get_compat_mq_attr(&attr, u_attr) ||
|
||||
copy_to_user(p, &attr, sizeof(attr)))
|
||||
@@ -127,6 +130,8 @@ asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
|
||||
struct mq_attr __user *p = compat_alloc_user_space(2 * sizeof(*p));
|
||||
long ret;
|
||||
|
||||
+ memset(&mqstat, 0, sizeof(mqstat));
|
||||
+
|
||||
if (u_mqstat) {
|
||||
if (get_compat_mq_attr(&mqstat, u_mqstat) ||
|
||||
copy_to_user(p, &mqstat, sizeof(mqstat)))
|
129
kernel.spec
129
kernel.spec
@ -48,7 +48,7 @@ Summary: The Linux kernel
|
||||
# reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
|
||||
# scripts/rebase.sh should be made to do that for you, actually.
|
||||
#
|
||||
%global baserelease 68
|
||||
%global baserelease 69
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
@ -60,7 +60,7 @@ Summary: The Linux kernel
|
||||
%if 0%{?released_kernel}
|
||||
|
||||
# Do we have a -stable update to apply?
|
||||
%define stable_update 8
|
||||
%define stable_update 9
|
||||
# Is it a -stable RC?
|
||||
%define stable_rc 0
|
||||
# Set rpm version accordingly
|
||||
@ -734,8 +734,6 @@ Patch2906: linux-2.6-v4l-dvb-uvcvideo-update.patch
|
||||
|
||||
Patch2910: linux-2.6-v4l-dvb-add-lgdt3304-support.patch
|
||||
Patch2911: linux-2.6-v4l-dvb-add-kworld-a340-support.patch
|
||||
# CVE-2011-0521
|
||||
Patch2912: linux-2.6-v4l-dvb-av7110-check-for-negative-array-offset.patch
|
||||
|
||||
# fs fixes
|
||||
|
||||
@ -804,15 +802,9 @@ Patch13647: rt2x00-fix-failed-SLEEP-AWAKE-and-AWAKE-SLEEP-transitions.patch
|
||||
Patch13648: tpm-autodetect-itpm-devices.patch
|
||||
Patch13649: tpm-fix-stall-on-boot.patch
|
||||
|
||||
Patch13700: ipc-zero-struct-memory-for-compat-fns.patch
|
||||
Patch13701: ipc-shm-fix-information-leak-to-user.patch
|
||||
|
||||
Patch13702: inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch
|
||||
Patch13705: netlink-make-nlmsg_find_attr-take-a-const-ptr.patch
|
||||
|
||||
# CVE-2010-4248
|
||||
Patch13703: posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch
|
||||
|
||||
Patch13710: rtl8180-improve-signal-reporting-for-rtl8185-hardware.patch
|
||||
Patch13711: rtl8180-improve-signal-reporting-for-actual-rtl8180-hardware.patch
|
||||
|
||||
@ -831,55 +823,18 @@ Patch13802: xfs-properly-account-for-reclaimed-inodes.patch
|
||||
|
||||
Patch13900: ima-allow-it-to-be-completely-disabled-and-default-off.patch
|
||||
|
||||
Patch13901: ioat2-catch-and-recover-from-broken-vtd-configurations.patch
|
||||
|
||||
# CVE-2010-3705
|
||||
Patch13912: sctp-fix-out-of-bounds-reading-in-sctp_asoc_get_hmac.patch
|
||||
# CVE-2010-4258
|
||||
Patch13914: do_exit-make-sure-that-we-run-with-get_fs-user_ds.patch
|
||||
# CVE-2010-4169
|
||||
Patch13915: perf_events-fix-perf_counter_mmap-hook-in-mprotect.patch
|
||||
# CVE-2010-4162
|
||||
Patch13916: bio-take-care-not-overflow-page-count-when-mapping-copying-user-data.patch
|
||||
# CVE-2010-4249
|
||||
Patch13917: af_unix-limit-unix_tot_inflight.patch
|
||||
Patch13918: scm-lower-SCM-MAX-FD.patch
|
||||
# CVE-2010-4158
|
||||
Patch13920: filter-make-sure-filters-dont-read-uninitialized-memory.patch
|
||||
# CVE-2010-3874
|
||||
Patch13921: can-bcm-fix-minor-heap-overflow.patch
|
||||
# Allow AF_PACKET to be less of a pig with contiguous ram
|
||||
Patch13922: patch-2.6.38-afpacket-vmalloc.patch
|
||||
|
||||
# rhbz#662344
|
||||
Patch13923: fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# CVE-2010-4163
|
||||
Patch13924: block-check-for-proper-length-of-iov-entries-in-blk_rq_map_user_iov.patch
|
||||
# CVE-2010-4668
|
||||
Patch13925: block-check-for-proper-length-of-iov-entries-earlier-in-blk_rq_map_user_iov.patch
|
||||
|
||||
# rhbz#643758
|
||||
Patch13926: hostap_cs-fix-sleeping-function-called-from-invalid-context.patch
|
||||
|
||||
# CVE-2010-4346
|
||||
Patch13930: install-special-mapping-skips-security-file-mmap-check.patch
|
||||
# CVE-2010-4649
|
||||
Patch13931: ib-uverbs-handle-large-number-of-poll-entries-in-poll-cq.patch
|
||||
# CVE-2011-0006
|
||||
Patch13932: ima-fix-add-lsm-rule-bug.patch
|
||||
# CVE-2010-4648
|
||||
Patch13933: orinoco-fix-tkip-countermeasure-behaviour.patch
|
||||
# CVE-2010-4650
|
||||
Patch13934: fuse-verify-ioctl-retries.patch
|
||||
|
||||
# Networking fixes from 2.6.36.3
|
||||
Patch13940: tcp-avoid-a-possible-divide-by-zero.patch
|
||||
Patch13941: tcp-bug-fix-in-initialization-of-receive-window.patch
|
||||
Patch13942: tcp-don-t-change-unlocked-socket-state-in-tcp_v4_err.patch
|
||||
# CVE-2010-4165
|
||||
Patch13943: tcp-increase-tcp_maxseg-socket-option-minimum.patch
|
||||
Patch13944: tcp-make-tcp_maxseg-minimum-more-correct.patch
|
||||
Patch13945: tcp-protect-sysctl_tcp_cookie_size-reads.patch
|
||||
|
||||
# rhbz#673207 (f14)
|
||||
@ -1515,8 +1470,6 @@ ApplyPatch linux-2.6-v4l-dvb-uvcvideo-update.patch
|
||||
|
||||
ApplyPatch linux-2.6-v4l-dvb-add-lgdt3304-support.patch
|
||||
ApplyPatch linux-2.6-v4l-dvb-add-kworld-a340-support.patch
|
||||
# CVE-2011-0521
|
||||
ApplyPatch linux-2.6-v4l-dvb-av7110-check-for-negative-array-offset.patch
|
||||
|
||||
ApplyPatch linux-2.6-phylib-autoload.patch
|
||||
|
||||
@ -1600,19 +1553,10 @@ ApplyPatch tpm-fix-stall-on-boot.patch
|
||||
ApplyPatch rt2x00-disable-auto-wakeup-before-waking-up-device.patch
|
||||
ApplyPatch rt2x00-fix-failed-SLEEP-AWAKE-and-AWAKE-SLEEP-transitions.patch
|
||||
|
||||
# rhbz#648658 (CVE-2010-4073)
|
||||
ApplyPatch ipc-zero-struct-memory-for-compat-fns.patch
|
||||
|
||||
# rhbz#648656 (CVE-2010-4072)
|
||||
ApplyPatch ipc-shm-fix-information-leak-to-user.patch
|
||||
|
||||
# rhbz#651264 (CVE-2010-3880)
|
||||
ApplyPatch inet_diag-make-sure-we-run-the-same-bytecode-we-audited.patch
|
||||
ApplyPatch netlink-make-nlmsg_find_attr-take-a-const-ptr.patch
|
||||
|
||||
# rhbz#656264 (CVE-2010-4248)
|
||||
ApplyPatch posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch
|
||||
|
||||
ApplyPatch rtl8180-improve-signal-reporting-for-rtl8185-hardware.patch
|
||||
ApplyPatch rtl8180-improve-signal-reporting-for-actual-rtl8180-hardware.patch
|
||||
|
||||
@ -1635,56 +1579,19 @@ ApplyPatch xfs-properly-account-for-reclaimed-inodes.patch
|
||||
# disable IMA by default as we did in F-14
|
||||
ApplyPatch ima-allow-it-to-be-completely-disabled-and-default-off.patch
|
||||
|
||||
# rhbz605845 [556ab45f]
|
||||
ApplyPatch ioat2-catch-and-recover-from-broken-vtd-configurations.patch
|
||||
|
||||
# CVE-2010-3705
|
||||
ApplyPatch sctp-fix-out-of-bounds-reading-in-sctp_asoc_get_hmac.patch
|
||||
# CVE-2010-4258
|
||||
ApplyPatch do_exit-make-sure-that-we-run-with-get_fs-user_ds.patch
|
||||
# CVE-2010-4169
|
||||
ApplyPatch perf_events-fix-perf_counter_mmap-hook-in-mprotect.patch
|
||||
# CVE-2010-4162
|
||||
ApplyPatch bio-take-care-not-overflow-page-count-when-mapping-copying-user-data.patch
|
||||
# CVE-2010-4249
|
||||
ApplyPatch af_unix-limit-unix_tot_inflight.patch
|
||||
ApplyPatch scm-lower-SCM-MAX-FD.patch
|
||||
# CVE-2010-4158
|
||||
ApplyPatch filter-make-sure-filters-dont-read-uninitialized-memory.patch
|
||||
# CVE-2010-3874
|
||||
ApplyPatch can-bcm-fix-minor-heap-overflow.patch
|
||||
|
||||
# Allow AF_PACKET to be less of a contiguous ram pig
|
||||
ApplyPatch patch-2.6.38-afpacket-vmalloc.patch
|
||||
|
||||
# rhbz#662344
|
||||
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# CVE-2010-4163
|
||||
ApplyPatch block-check-for-proper-length-of-iov-entries-in-blk_rq_map_user_iov.patch
|
||||
# CVE-2010-4668
|
||||
ApplyPatch block-check-for-proper-length-of-iov-entries-earlier-in-blk_rq_map_user_iov.patch
|
||||
|
||||
# rhbz#643758
|
||||
ApplyPatch hostap_cs-fix-sleeping-function-called-from-invalid-context.patch
|
||||
|
||||
# CVE-2010-4346
|
||||
ApplyPatch install-special-mapping-skips-security-file-mmap-check.patch
|
||||
# CVE-2010-4649
|
||||
ApplyPatch ib-uverbs-handle-large-number-of-poll-entries-in-poll-cq.patch
|
||||
# CVE-2011-0006
|
||||
ApplyPatch ima-fix-add-lsm-rule-bug.patch
|
||||
# CVE-2010-4648
|
||||
ApplyPatch orinoco-fix-tkip-countermeasure-behaviour.patch
|
||||
# CVE-2010-4650
|
||||
ApplyPatch fuse-verify-ioctl-retries.patch
|
||||
|
||||
# Networking fixes from 2.6.36.3
|
||||
ApplyPatch tcp-avoid-a-possible-divide-by-zero.patch
|
||||
ApplyPatch tcp-bug-fix-in-initialization-of-receive-window.patch
|
||||
ApplyPatch tcp-don-t-change-unlocked-socket-state-in-tcp_v4_err.patch
|
||||
# CVE-2010-4165
|
||||
ApplyPatch tcp-increase-tcp_maxseg-socket-option-minimum.patch
|
||||
ApplyPatch tcp-make-tcp_maxseg-minimum-more-correct.patch
|
||||
ApplyPatch tcp-protect-sysctl_tcp_cookie_size-reads.patch
|
||||
|
||||
# rhbz#673207 (f14)
|
||||
@ -2318,6 +2225,36 @@ fi
|
||||
%kernel_variant_files %{with_pae_debug} PAEdebug
|
||||
|
||||
%changelog
|
||||
* Sun Apr 17 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.34.9-69
|
||||
- Linux 2.6.34.9
|
||||
- Fix up drm-next.patch to apply on top of cda4b7d3a, e06b14ee9
|
||||
- Un-revert 6a1a82df9 from upstream
|
||||
- Drop:
|
||||
linux-2.6-v4l-dvb-av7110-check-for-negative-array-offset.patch
|
||||
ipc-zero-struct-memory-for-compat-fns.patch
|
||||
ipc-shm-fix-information-leak-to-user.patch
|
||||
posix-cpu-timers-workaround-to-suppress-problems-with-mt-exec.patch
|
||||
ioat2-catch-and-recover-from-broken-vtd-configurations.patch
|
||||
sctp-fix-out-of-bounds-reading-in-sctp_asoc_get_hmac.patch
|
||||
do_exit-make-sure-that-we-run-with-get_fs-user_ds.patch
|
||||
perf_events-fix-perf_counter_mmap-hook-in-mprotect.patch
|
||||
bio-take-care-not-overflow-page-count-when-mapping-copying-user-data.patch
|
||||
af_unix-limit-unix_tot_inflight.patch
|
||||
filter-make-sure-filters-dont-read-uninitialized-memory.patch
|
||||
can-bcm-fix-minor-heap-overflow.patch
|
||||
block-check-for-proper-length-of-iov-entries-in-blk_rq_map_user_iov.patch
|
||||
block-check-for-proper-length-of-iov-entries-earlier-in-blk_rq_map_user_iov.patch
|
||||
install-special-mapping-skips-security-file-mmap-check.patch
|
||||
ib-uverbs-handle-large-number-of-poll-entries-in-poll-cq.patch
|
||||
ima-fix-add-lsm-rule-bug.patch
|
||||
orinoco-fix-tkip-countermeasure-behaviour.patch
|
||||
fuse-verify-ioctl-retries.patch
|
||||
tcp-avoid-a-possible-divide-by-zero.patch
|
||||
tcp-bug-fix-in-initialization-of-receive-window.patch
|
||||
tcp-don-t-change-unlocked-socket-state-in-tcp_v4_err.patch
|
||||
tcp-increase-tcp_maxseg-socket-option-minimum.patch
|
||||
tcp-make-tcp_maxseg-minimum-more-correct.patch
|
||||
|
||||
* Wed Mar 23 2011 Kyle McMartin <kmcmartin@redhat.com>
|
||||
- Backport 3e9d08e: "virtio_net: Add schedule check to napi_enable call"
|
||||
|
||||
|
@ -1,52 +1,3 @@
|
||||
From 6a1a82df91fa0eb1cc76069a9efe5714d087eccd Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Mack <daniel@caiaq.de>
|
||||
Date: Thu, 3 Jun 2010 13:55:02 +0200
|
||||
Subject: USB: ftdi_sio: fix DTR/RTS line modes
|
||||
|
||||
From: Daniel Mack <daniel@caiaq.de>
|
||||
|
||||
commit 6a1a82df91fa0eb1cc76069a9efe5714d087eccd upstream.
|
||||
|
||||
Call set_mctrl() and clear_mctrl() according to the flow control mode
|
||||
selected. This makes serial communication for FT232 connected devices
|
||||
work when CRTSCTS is not set.
|
||||
|
||||
This fixes a regression introduced by 4175f3e31 ("tty_port: If we are
|
||||
opened non blocking we still need to raise the carrier"). This patch
|
||||
calls the low-level driver's dtr_rts() function which consequently sets
|
||||
TIOCM_DTR | TIOCM_RTS. A later call to set_termios() without CRTSCTS in
|
||||
cflags, however, does not reset these bits, and so data is not actually
|
||||
sent out on the serial wire.
|
||||
|
||||
Signed-off-by: Daniel Mack <daniel@caiaq.de>
|
||||
Cc: Johan Hovold <jhovold@gmail.com>
|
||||
Cc: Alan Cox <alan@linux.intel.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---
|
||||
drivers/usb/serial/ftdi_sio.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/usb/serial/ftdi_sio.c
|
||||
+++ b/drivers/usb/serial/ftdi_sio.c
|
||||
@@ -2289,6 +2289,8 @@ static void ftdi_set_termios(struct tty_
|
||||
"urb failed to set to rts/cts flow control\n");
|
||||
}
|
||||
|
||||
+ /* raise DTR/RTS */
|
||||
+ set_mctrl(port, TIOCM_DTR | TIOCM_RTS);
|
||||
} else {
|
||||
/*
|
||||
* Xon/Xoff code
|
||||
@@ -2336,6 +2338,8 @@ static void ftdi_set_termios(struct tty_
|
||||
}
|
||||
}
|
||||
|
||||
+ /* lower DTR/RTS */
|
||||
+ clear_mctrl(port, TIOCM_DTR | TIOCM_RTS);
|
||||
}
|
||||
return;
|
||||
}
|
||||
From 3d61510f4ecacfe47c75c0eb51c0659dfa77fb1b Mon Sep 17 00:00:00 2001
|
||||
From: Alan Stern <stern@rowland.harvard.edu>
|
||||
Date: Fri, 2 Apr 2010 13:21:58 -0400
|
||||
|
@ -1,28 +0,0 @@
|
||||
From: Dan Carpenter <error27@gmail.com>
|
||||
Date: Fri, 7 Jan 2011 19:41:54 +0000 (-0300)
|
||||
Subject: [media] [v3,media] av7110: check for negative array offset
|
||||
X-Git-Tag: v2.6.38-rc2~1^2~31
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=cb26a24ee9706473f31d34cc259f4dcf45cd0644
|
||||
|
||||
[media] [v3,media] av7110: check for negative array offset
|
||||
|
||||
info->num comes from the user. It's type int. If the user passes
|
||||
in a negative value that would cause memory corruption.
|
||||
|
||||
Signed-off-by: Dan Carpenter <error27@gmail.com>
|
||||
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/media/dvb/ttpci/av7110_ca.c b/drivers/media/dvb/ttpci/av7110_ca.c
|
||||
index 122c728..9fc1dd0 100644
|
||||
--- a/drivers/media/dvb/ttpci/av7110_ca.c
|
||||
+++ b/drivers/media/dvb/ttpci/av7110_ca.c
|
||||
@@ -277,7 +277,7 @@ static int dvb_ca_ioctl(struct file *file, unsigned int cmd, void *parg)
|
||||
{
|
||||
ca_slot_info_t *info=(ca_slot_info_t *)parg;
|
||||
|
||||
- if (info->num > 1)
|
||||
+ if (info->num < 0 || info->num > 1)
|
||||
return -EINVAL;
|
||||
av7110->ci_slot[info->num].num = info->num;
|
||||
av7110->ci_slot[info->num].type = FW_CI_LL_SUPPORT(av7110->arm_app) ?
|
@ -1,59 +0,0 @@
|
||||
From: David Kilroy <kilroyd@googlemail.com>
|
||||
Date: Sun, 5 Dec 2010 15:43:55 +0000 (+0000)
|
||||
Subject: orinoco: fix TKIP countermeasure behaviour
|
||||
X-Git-Tag: v2.6.37-rc6~14^2~14^2
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=0a54917c3fc295cb61f3fb52373c173fd3b69f48
|
||||
|
||||
orinoco: fix TKIP countermeasure behaviour
|
||||
|
||||
Enable the port when disabling countermeasures, and disable it on
|
||||
enabling countermeasures.
|
||||
|
||||
This bug causes the response of the system to certain attacks to be
|
||||
ineffective.
|
||||
|
||||
It also prevents wpa_supplicant from getting scan results, as
|
||||
wpa_supplicant disables countermeasures on startup - preventing the
|
||||
hardware from scanning.
|
||||
|
||||
wpa_supplicant works with ap_mode=2 despite this bug because the commit
|
||||
handler re-enables the port.
|
||||
|
||||
The log tends to look like:
|
||||
|
||||
State: DISCONNECTED -> SCANNING
|
||||
Starting AP scan for wildcard SSID
|
||||
Scan requested (ret=0) - scan timeout 5 seconds
|
||||
EAPOL: disable timer tick
|
||||
EAPOL: Supplicant port status: Unauthorized
|
||||
Scan timeout - try to get results
|
||||
Failed to get scan results
|
||||
Failed to get scan results - try scanning again
|
||||
Setting scan request: 1 sec 0 usec
|
||||
Starting AP scan for wildcard SSID
|
||||
Scan requested (ret=-1) - scan timeout 5 seconds
|
||||
Failed to initiate AP scan.
|
||||
|
||||
Reported by: Giacomo Comes <comes@naic.edu>
|
||||
Signed-off by: David Kilroy <kilroyd@googlemail.com>
|
||||
Cc: stable@kernel.org
|
||||
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
||||
---
|
||||
|
||||
diff --git a/drivers/net/wireless/orinoco/wext.c b/drivers/net/wireless/orinoco/wext.c
|
||||
index 93505f9..e5afabe 100644
|
||||
--- a/drivers/net/wireless/orinoco/wext.c
|
||||
+++ b/drivers/net/wireless/orinoco/wext.c
|
||||
@@ -911,10 +911,10 @@ static int orinoco_ioctl_set_auth(struct net_device *dev,
|
||||
*/
|
||||
if (param->value) {
|
||||
priv->tkip_cm_active = 1;
|
||||
- ret = hermes_enable_port(hw, 0);
|
||||
+ ret = hermes_disable_port(hw, 0);
|
||||
} else {
|
||||
priv->tkip_cm_active = 0;
|
||||
- ret = hermes_disable_port(hw, 0);
|
||||
+ ret = hermes_enable_port(hw, 0);
|
||||
}
|
||||
break;
|
||||
|
@ -1,46 +0,0 @@
|
||||
From: Pekka Enberg <penberg@kernel.org>
|
||||
Date: Mon, 8 Nov 2010 19:29:07 +0000 (+0200)
|
||||
Subject: perf_events: Fix perf_counter_mmap() hook in mprotect()
|
||||
X-Git-Tag: v2.6.37-rc2~72
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=63bfd7384b119409685a17d5c58f0b56e5dc03da
|
||||
|
||||
perf_events: Fix perf_counter_mmap() hook in mprotect()
|
||||
|
||||
As pointed out by Linus, commit dab5855 ("perf_counter: Add mmap event hooks to
|
||||
mprotect()") is fundamentally wrong as mprotect_fixup() can free 'vma' due to
|
||||
merging. Fix the problem by moving perf_event_mmap() hook to
|
||||
mprotect_fixup().
|
||||
|
||||
Note: there's another successful return path from mprotect_fixup() if old
|
||||
flags equal to new flags. We don't, however, need to call
|
||||
perf_event_mmap() there because 'perf' already knows the VMA is
|
||||
executable.
|
||||
|
||||
Reported-by: Dave Jones <davej@redhat.com>
|
||||
Analyzed-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Ingo Molnar <mingo@elte.hu>
|
||||
Reviewed-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
Signed-off-by: Pekka Enberg <penberg@kernel.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
|
||||
diff --git a/mm/mprotect.c b/mm/mprotect.c
|
||||
index 2d1bf7c..4c51338 100644
|
||||
--- a/mm/mprotect.c
|
||||
+++ b/mm/mprotect.c
|
||||
@@ -211,6 +211,7 @@ success:
|
||||
mmu_notifier_invalidate_range_end(mm, start, end);
|
||||
vm_stat_account(mm, oldflags, vma->vm_file, -nrpages);
|
||||
vm_stat_account(mm, newflags, vma->vm_file, nrpages);
|
||||
+ perf_event_mmap(vma);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@@ -299,7 +300,6 @@ SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
|
||||
error = mprotect_fixup(vma, &prev, nstart, tmp, newflags);
|
||||
if (error)
|
||||
goto out;
|
||||
- perf_event_mmap(vma);
|
||||
nstart = tmp;
|
||||
|
||||
if (nstart < prev->vm_end)
|
@ -1,60 +0,0 @@
|
||||
From 4366640cd1342b3e77077d3d565dbaeff9b66d4d Mon Sep 17 00:00:00 2001
|
||||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Fri, 5 Nov 2010 16:53:42 +0100
|
||||
Subject: posix-cpu-timers: workaround to suppress the problems with mt exec
|
||||
|
||||
posix-cpu-timers.c correctly assumes that the dying process does
|
||||
posix_cpu_timers_exit_group() and removes all !CPUCLOCK_PERTHREAD
|
||||
timers from signal->cpu_timers list.
|
||||
|
||||
But, it also assumes that timer->it.cpu.task is always the group
|
||||
leader, and thus the dead ->task means the dead thread group.
|
||||
|
||||
This is obviously not true after de_thread() changes the leader.
|
||||
After that almost every posix_cpu_timer_ method has problems.
|
||||
|
||||
It is not simple to fix this bug correctly. First of all, I think
|
||||
that timer->it.cpu should use struct pid instead of task_struct.
|
||||
Also, the locking should be reworked completely. In particular,
|
||||
tasklist_lock should not be used at all. This all needs a lot of
|
||||
nontrivial and hard-to-test changes.
|
||||
|
||||
Change __exit_signal() to do posix_cpu_timers_exit_group() when
|
||||
the old leader dies during exec. This is not the fix, just the
|
||||
temporary hack to hide the problem for 2.6.37 and stable. IOW,
|
||||
this is obviously wrong but this is what we currently have anyway:
|
||||
cpu timers do not work after mt exec.
|
||||
|
||||
In theory this change adds another race. The exiting leader can
|
||||
detach the timers which were attached to the new leader. However,
|
||||
the window between de_thread() and release_task() is small, we
|
||||
can pretend that sys_timer_create() was called before de_thread().
|
||||
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
kernel/exit.c | 8 ++++++++
|
||||
1 files changed, 8 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/kernel/exit.c b/kernel/exit.c
|
||||
index 7f2683a..34d4c33 100644
|
||||
--- a/kernel/exit.c
|
||||
+++ b/kernel/exit.c
|
||||
@@ -95,6 +95,14 @@ static void __exit_signal(struct task_struct *tsk)
|
||||
posix_cpu_timers_exit_group(tsk);
|
||||
else {
|
||||
/*
|
||||
+ * This can only happen if the caller is de_thread().
|
||||
+ * FIXME: this is the temporary hack, we should teach
|
||||
+ * posix-cpu-timers to handle this case correctly.
|
||||
+ */
|
||||
+ if (unlikely(has_group_leader_pid(tsk)))
|
||||
+ posix_cpu_timers_exit_group(tsk);
|
||||
+
|
||||
+ /*
|
||||
* If there is any task waiting for the group exit
|
||||
* then notify it:
|
||||
*/
|
||||
--
|
||||
1.7.3.2
|
||||
|
@ -1,50 +0,0 @@
|
||||
From: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Date: Fri, 1 Oct 2010 11:51:47 +0000 (+0000)
|
||||
Subject: sctp: Fix out-of-bounds reading in sctp_asoc_get_hmac()
|
||||
X-Git-Tag: v2.6.36-rc8~2^2~25
|
||||
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fdavem%2Fnet-2.6.git;a=commitdiff_plain;h=51e97a12bef19b7e43199fc153cf9bd5f2140362
|
||||
|
||||
sctp: Fix out-of-bounds reading in sctp_asoc_get_hmac()
|
||||
|
||||
The sctp_asoc_get_hmac() function iterates through a peer's hmac_ids
|
||||
array and attempts to ensure that only a supported hmac entry is
|
||||
returned. The current code fails to do this properly - if the last id
|
||||
in the array is out of range (greater than SCTP_AUTH_HMAC_ID_MAX), the
|
||||
id integer remains set after exiting the loop, and the address of an
|
||||
out-of-bounds entry will be returned and subsequently used in the parent
|
||||
function, causing potentially ugly memory corruption. This patch resets
|
||||
the id integer to 0 on encountering an invalid id so that NULL will be
|
||||
returned after finishing the loop if no valid ids are found.
|
||||
|
||||
Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
|
||||
Acked-by: Vlad Yasevich <vladislav.yasevich@hp.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
|
||||
diff --git a/net/sctp/auth.c b/net/sctp/auth.c
|
||||
index 8636639..ddbbf7c 100644
|
||||
--- a/net/sctp/auth.c
|
||||
+++ b/net/sctp/auth.c
|
||||
@@ -543,16 +543,20 @@ struct sctp_hmac *sctp_auth_asoc_get_hmac(const struct sctp_association *asoc)
|
||||
id = ntohs(hmacs->hmac_ids[i]);
|
||||
|
||||
/* Check the id is in the supported range */
|
||||
- if (id > SCTP_AUTH_HMAC_ID_MAX)
|
||||
+ if (id > SCTP_AUTH_HMAC_ID_MAX) {
|
||||
+ id = 0;
|
||||
continue;
|
||||
+ }
|
||||
|
||||
/* See is we support the id. Supported IDs have name and
|
||||
* length fields set, so that we can allocated and use
|
||||
* them. We can safely just check for name, for without the
|
||||
* name, we can't allocate the TFM.
|
||||
*/
|
||||
- if (!sctp_hmac_list[id].hmac_name)
|
||||
+ if (!sctp_hmac_list[id].hmac_name) {
|
||||
+ id = 0;
|
||||
continue;
|
||||
+ }
|
||||
|
||||
break;
|
||||
}
|
2
sources
2
sources
@ -1,2 +1,2 @@
|
||||
10eebcb0178fb4540e2165bfd7efc7ad linux-2.6.34.tar.bz2
|
||||
de755877dbd32ed783067987c095c278 patch-2.6.34.8.bz2
|
||||
ec5caafff1da8ea6f3caad3cad1d5a75 patch-2.6.34.9.bz2
|
||||
|
@ -1,49 +0,0 @@
|
||||
From b6bd33114e63d96f424c8e2baf46b3a58745077b Mon Sep 17 00:00:00 2001
|
||||
From: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
Date: Tue, 7 Dec 2010 12:03:55 +0000
|
||||
Subject: tcp: avoid a possible divide by zero
|
||||
|
||||
|
||||
From: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
|
||||
[ Upstream commit ad9f4f50fe9288bbe65b7dfd76d8820afac6a24c ]
|
||||
[ trivial backport to 2.6.34 ]
|
||||
|
||||
sysctl_tcp_tso_win_divisor might be set to zero while one cpu runs in
|
||||
tcp_tso_should_defer(). Make sure we dont allow a divide by zero by
|
||||
reading sysctl_tcp_tso_win_divisor exactly once.
|
||||
|
||||
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
net/ipv4/tcp_output.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/net/ipv4/tcp_output.c
|
||||
+++ b/net/ipv4/tcp_output.c
|
||||
@@ -1518,6 +1518,7 @@ static int tcp_tso_should_defer(struct s
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||
u32 send_win, cong_win, limit, in_flight;
|
||||
+ int win_divisor;
|
||||
|
||||
if (TCP_SKB_CB(skb)->flags & TCPCB_FLAG_FIN)
|
||||
goto send_now;
|
||||
@@ -1549,13 +1550,14 @@ static int tcp_tso_should_defer(struct s
|
||||
if ((skb != tcp_write_queue_tail(sk)) && (limit >= skb->len))
|
||||
goto send_now;
|
||||
|
||||
- if (sysctl_tcp_tso_win_divisor) {
|
||||
+ win_divisor = ACCESS_ONCE(sysctl_tcp_tso_win_divisor);
|
||||
+ if (win_divisor) {
|
||||
u32 chunk = min(tp->snd_wnd, tp->snd_cwnd * tp->mss_cache);
|
||||
|
||||
/* If at least some fraction of a window is available,
|
||||
* just use it.
|
||||
*/
|
||||
- chunk /= sysctl_tcp_tso_win_divisor;
|
||||
+ chunk /= win_divisor;
|
||||
if (limit >= chunk)
|
||||
goto send_now;
|
||||
} else {
|
@ -1,41 +0,0 @@
|
||||
From 18ab4520fd46404b67d415045ee5d9c4535eaacb Mon Sep 17 00:00:00 2001
|
||||
From: Nandita Dukkipati <nanditad@google.com>
|
||||
Date: Fri, 3 Dec 2010 13:33:44 +0000
|
||||
Subject: tcp: Bug fix in initialization of receive window.
|
||||
|
||||
|
||||
From: Nandita Dukkipati <nanditad@google.com>
|
||||
|
||||
[ Upstream commit b1afde60f2b9ee8444fba4e012dc99a3b28d224d ]
|
||||
|
||||
The bug has to do with boundary checks on the initial receive window.
|
||||
If the initial receive window falls between init_cwnd and the
|
||||
receive window specified by the user, the initial window is incorrectly
|
||||
brought down to init_cwnd. The correct behavior is to allow it to
|
||||
remain unchanged.
|
||||
|
||||
Signed-off-by: Nandita Dukkipati <nanditad@google.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
net/ipv4/tcp_output.c | 9 ++++-----
|
||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/net/ipv4/tcp_output.c
|
||||
+++ b/net/ipv4/tcp_output.c
|
||||
@@ -237,11 +237,10 @@ void tcp_select_initial_window(int __spa
|
||||
/* when initializing use the value from init_rcv_wnd
|
||||
* rather than the default from above
|
||||
*/
|
||||
- if (init_rcv_wnd &&
|
||||
- (*rcv_wnd > init_rcv_wnd * mss))
|
||||
- *rcv_wnd = init_rcv_wnd * mss;
|
||||
- else if (*rcv_wnd > init_cwnd * mss)
|
||||
- *rcv_wnd = init_cwnd * mss;
|
||||
+ if (init_rcv_wnd)
|
||||
+ *rcv_wnd = min(*rcv_wnd, init_rcv_wnd * mss);
|
||||
+ else
|
||||
+ *rcv_wnd = min(*rcv_wnd, init_cwnd * mss);
|
||||
}
|
||||
|
||||
/* Set the clamp no higher than max representable value */
|
@ -1,56 +0,0 @@
|
||||
From 34eef919139f6a7558b43576b12b40731f12f7d7 Mon Sep 17 00:00:00 2001
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
Date: Fri, 12 Nov 2010 13:35:00 -0800
|
||||
Subject: tcp: Don't change unlocked socket state in tcp_v4_err().
|
||||
|
||||
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
|
||||
[ Upstream commit 8f49c2703b33519aaaccc63f571b465b9d2b3a2d ]
|
||||
|
||||
Alexey Kuznetsov noticed a regression introduced by
|
||||
commit f1ecd5d9e7366609d640ff4040304ea197fbc618
|
||||
("Revert Backoff [v3]: Revert RTO on ICMP destination unreachable")
|
||||
|
||||
The RTO and timer modification code added to tcp_v4_err()
|
||||
doesn't check sock_owned_by_user(), which if true means we
|
||||
don't have exclusive access to the socket and therefore cannot
|
||||
modify it's critical state.
|
||||
|
||||
Just skip this new code block if sock_owned_by_user() is true
|
||||
and eliminate the now superfluous sock_owned_by_user() code
|
||||
block contained within.
|
||||
|
||||
Reported-by: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
CC: Damian Lukowski <damian@tvk.rwth-aachen.de>
|
||||
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
net/ipv4/tcp_ipv4.c | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/net/ipv4/tcp_ipv4.c
|
||||
+++ b/net/ipv4/tcp_ipv4.c
|
||||
@@ -415,6 +415,9 @@ void tcp_v4_err(struct sk_buff *icmp_skb
|
||||
!icsk->icsk_backoff)
|
||||
break;
|
||||
|
||||
+ if (sock_owned_by_user(sk))
|
||||
+ break;
|
||||
+
|
||||
icsk->icsk_backoff--;
|
||||
inet_csk(sk)->icsk_rto = __tcp_set_rto(tp) <<
|
||||
icsk->icsk_backoff;
|
||||
@@ -429,11 +432,6 @@ void tcp_v4_err(struct sk_buff *icmp_skb
|
||||
if (remaining) {
|
||||
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
remaining, TCP_RTO_MAX);
|
||||
- } else if (sock_owned_by_user(sk)) {
|
||||
- /* RTO revert clocked out retransmission,
|
||||
- * but socket is locked. Will defer. */
|
||||
- inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
|
||||
- HZ/20, TCP_RTO_MAX);
|
||||
} else {
|
||||
/* RTO revert clocked out retransmission.
|
||||
* Will retransmit now */
|
@ -1,39 +0,0 @@
|
||||
From 47a8c78fffc3bde1f828c9fce0aae5ae5320cfb3 Mon Sep 17 00:00:00 2001
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
Date: Wed, 10 Nov 2010 21:35:37 -0800
|
||||
Subject: tcp: Increase TCP_MAXSEG socket option minimum.
|
||||
|
||||
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
|
||||
[ Upstream commit 7a1abd08d52fdeddb3e9a5a33f2f15cc6a5674d2 ]
|
||||
|
||||
As noted by Steve Chen, since commit
|
||||
f5fff5dc8a7a3f395b0525c02ba92c95d42b7390 ("tcp: advertise MSS
|
||||
requested by user") we can end up with a situation where
|
||||
tcp_select_initial_window() does a divide by a zero (or
|
||||
even negative) mss value.
|
||||
|
||||
The problem is that sometimes we effectively subtract
|
||||
TCPOLEN_TSTAMP_ALIGNED and/or TCPOLEN_MD5SIG_ALIGNED from the mss.
|
||||
|
||||
Fix this by increasing the minimum from 8 to 64.
|
||||
|
||||
Reported-by: Steve Chen <schen@mvista.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
net/ipv4/tcp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/net/ipv4/tcp.c
|
||||
+++ b/net/ipv4/tcp.c
|
||||
@@ -2246,7 +2246,7 @@ static int do_tcp_setsockopt(struct sock
|
||||
/* Values greater than interface MTU won't take effect. However
|
||||
* at the point when this call is done we typically don't yet
|
||||
* know which interface is going to be used */
|
||||
- if (val < 8 || val > MAX_TCP_WINDOW) {
|
||||
+ if (val < 64 || val > MAX_TCP_WINDOW) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
From 9f3ec7da60ef8443addc35828214f129590495f2 Mon Sep 17 00:00:00 2001
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
Date: Wed, 24 Nov 2010 11:47:22 -0800
|
||||
Subject: tcp: Make TCP_MAXSEG minimum more correct.
|
||||
|
||||
|
||||
From: David S. Miller <davem@davemloft.net>
|
||||
|
||||
[ Upstream commit c39508d6f118308355468314ff414644115a07f3 ]
|
||||
|
||||
Use TCP_MIN_MSS instead of constant 64.
|
||||
|
||||
Reported-by: Min Zhang <mzhang@mvista.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
---
|
||||
net/ipv4/tcp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/net/ipv4/tcp.c
|
||||
+++ b/net/ipv4/tcp.c
|
||||
@@ -2246,7 +2246,7 @@ static int do_tcp_setsockopt(struct sock
|
||||
/* Values greater than interface MTU won't take effect. However
|
||||
* at the point when this call is done we typically don't yet
|
||||
* know which interface is going to be used */
|
||||
- if (val < 64 || val > MAX_TCP_WINDOW) {
|
||||
+ if (val < TCP_MIN_MSS || val > MAX_TCP_WINDOW) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
Loading…
Reference in New Issue
Block a user