From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Jiri Olsa <jolsa@redhat.com>, Brian Gerst <brgerst@gmail.com>,
Ingo Molnar <mingo@elte.hu>
Subject: [09/85] x86, 64-bit: Fix copy_[to/from]_user() checks for the
Date: Wed, 15 Jun 2011 17:28:05 -0700 [thread overview]
Message-ID: <20110616002904.677211667@clark.kroah.org> (raw)
In-Reply-To: <20110616002917.GA3627@kroah.com>
2.6.33-longterm review patch. If anyone has any objections, please let us know.
------------------
userspace address limit
From: Jiri Olsa <jolsa@redhat.com>
commit 26afb7c661080ae3f1f13ddf7f0c58c4f931c22b upstream.
As reported in BZ #30352:
https://bugzilla.kernel.org/show_bug.cgi?id=30352
there's a kernel bug related to reading the last allowed page on x86_64.
The _copy_to_user() and _copy_from_user() functions use the following
check for address limit:
if (buf + size >= limit)
fail();
while it should be more permissive:
if (buf + size > limit)
fail();
That's because the size represents the number of bytes being
read/write from/to buf address AND including the buf address.
So the copy function will actually never touch the limit
address even if "buf + size == limit".
Following program fails to use the last page as buffer
due to the wrong limit check:
#include <sys/mman.h>
#include <sys/socket.h>
#include <assert.h>
#define PAGE_SIZE (4096)
#define LAST_PAGE ((void*)(0x7fffffffe000))
int main()
{
int fds[2], err;
void * ptr = mmap(LAST_PAGE, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0);
assert(ptr == LAST_PAGE);
err = socketpair(AF_LOCAL, SOCK_STREAM, 0, fds);
assert(err == 0);
err = send(fds[0], ptr, PAGE_SIZE, 0);
perror("send");
assert(err == PAGE_SIZE);
err = recv(fds[1], ptr, PAGE_SIZE, MSG_WAITALL);
perror("recv");
assert(err == PAGE_SIZE);
return 0;
}
The other place checking the addr limit is the access_ok() function,
which is working properly. There's just a misleading comment
for the __range_not_ok() macro - which this patch fixes as well.
The last page of the user-space address range is a guard page and
Brian Gerst observed that the guard page itself due to an erratum on K8 cpus
(#121 Sequential Execution Across Non-Canonical Boundary Causes Processor
Hang).
However, the test code is using the last valid page before the guard page.
The bug is that the last byte before the guard page can't be read
because of the off-by-one error. The guard page is left in place.
This bug would normally not show up because the last page is
part of the process stack and never accessed via syscalls.
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Acked-by: Brian Gerst <brgerst@gmail.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Link: http://lkml.kernel.org/r/1305210630-7136-1-git-send-email-jolsa@redhat.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/include/asm/uaccess.h | 2 +-
arch/x86/lib/copy_user_64.S | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -42,7 +42,7 @@
* Returns 0 if the range is valid, nonzero otherwise.
*
* This is equivalent to the following test:
- * (u33)addr + (u33)size >= (u33)current->addr_limit.seg (u65 for x86_64)
+ * (u33)addr + (u33)size > (u33)current->addr_limit.seg (u65 for x86_64)
*
* This needs 33-bit (65-bit for x86_64) arithmetic. We have a carry...
*/
--- a/arch/x86/lib/copy_user_64.S
+++ b/arch/x86/lib/copy_user_64.S
@@ -72,7 +72,7 @@ ENTRY(_copy_to_user)
addq %rdx,%rcx
jc bad_to_user
cmpq TI_addr_limit(%rax),%rcx
- jae bad_to_user
+ ja bad_to_user
ALTERNATIVE_JUMP X86_FEATURE_REP_GOOD,copy_user_generic_unrolled,copy_user_generic_string
CFI_ENDPROC
ENDPROC(_copy_to_user)
@@ -85,7 +85,7 @@ ENTRY(_copy_from_user)
addq %rdx,%rcx
jc bad_from_user
cmpq TI_addr_limit(%rax),%rcx
- jae bad_from_user
+ ja bad_from_user
ALTERNATIVE_JUMP X86_FEATURE_REP_GOOD,copy_user_generic_unrolled,copy_user_generic_string
CFI_ENDPROC
ENDPROC(_copy_from_user)
next prev parent reply other threads:[~2011-06-16 7:23 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-16 0:29 [00/85] 2.6.33.15-longterm review Greg KH
2011-06-16 0:27 ` [02/85] kmemleak: Do not return a pointer to an object that kmemleak did not get Greg KH
2011-06-16 0:27 ` [03/85] [CPUFREQ] CPU hotplug, re-create sysfs directory and symlinks Greg KH
2011-06-16 0:28 ` [04/85] [CPUFREQ] Fix memory leak in cpufreq_stat Greg KH
2011-06-16 0:28 ` [05/85] powerpc/oprofile: Handle events that raise an exception without overflowing Greg KH
2011-06-16 0:28 ` [06/85] block: rescan partitions on invalidated devices on -ENOMEDIA Greg KH
2011-06-16 0:28 ` [07/85] block: add proper state guards to __elv_next_request Greg KH
2011-06-16 0:28 ` [08/85] mtd: mtdconcat: fix NAND OOB write Greg KH
2011-06-16 0:28 ` Greg KH [this message]
2011-06-16 0:28 ` [10/85] ext3: Fix fs corruption when make_indexed_dir() fails Greg KH
2011-06-16 0:28 ` [11/85] jbd: Fix forever sleeping process in do_get_write_access() Greg KH
2011-06-16 0:28 ` [12/85] jbd: fix fsync() tid wraparound bug Greg KH
2011-06-16 0:28 ` [13/85] ext4: release page cache in ext4_mb_load_buddy error path Greg KH
2011-06-16 0:28 ` [14/85] [SCSI] bnx2i: Fixed packet error created when the sq_size is Greg KH
2011-06-16 0:28 ` [15/85] [SCSI] Fix Ultrastor asm snippet Greg KH
2011-06-16 0:28 ` [16/85] x86, amd: Do not enable ARAT feature on AMD processors below Greg KH
2011-06-16 0:28 ` [17/85] x86, amd: Use _safe() msr access for GartTlbWlk disable code Greg KH
2011-06-16 0:28 ` [18/85] rcu: Fix unpaired rcu_irq_enter() from locking selftests Greg KH
2011-06-16 0:28 ` [19/85] staging: usbip: fix wrong endian conversion Greg KH
2011-06-16 0:28 ` [20/85] Fix for buffer overflow in ldm_frag_add not sufficient Greg KH
2011-06-16 0:28 ` [21/85] seqlock: Dont smp_rmb in seqlock reader spin loop Greg KH
2011-06-16 0:28 ` [22/85] time: Compensate for rounding on odd-frequency clocksources Greg KH
2011-06-16 0:28 ` [23/85] ALSA: HDA: Use one dmic only for Dell Studio 1558 Greg KH
2011-06-16 0:28 ` [24/85] ASoC: Ensure output PGA is enabled for line outputs in Greg KH
2011-06-16 0:28 ` [25/85] ASoC: Add some missing volume update bit sets for wm_hubs Greg KH
2011-06-16 0:28 ` [26/85] mm/page_alloc.c: prevent unending loop in Greg KH
2011-06-16 0:28 ` [27/85] loop: limit max_part module param to DISK_MAX_PARTS Greg KH
2011-06-16 0:28 ` [28/85] loop: handle on-demand devices correctly Greg KH
2011-06-16 0:28 ` [29/85] USB: moto_modem: Add USB identifier for the Motorola VE240 Greg KH
2011-06-16 0:28 ` [30/85] USB: serial: ftdi_sio: adding support for TavIR STK500 Greg KH
2011-06-16 0:28 ` [31/85] USB: gamin_gps: Fix for data transfer problems in native Greg KH
2011-06-16 0:28 ` [32/85] usb/gadget: at91sam9g20 fix end point max packet size Greg KH
2011-06-16 0:28 ` [33/85] usb: gadget: rndis: dont test against req->length Greg KH
2011-06-16 0:28 ` [34/85] xhci: Fix full speed bInterval encoding Greg KH
2011-06-16 0:28 ` [35/85] p54usb: add zoom 4410 usbid Greg KH
2011-06-16 0:28 ` [36/85] eCryptfs: Allow 2 scatterlist entries for encrypted Greg KH
2011-06-16 0:28 ` [37/85] UBIFS: fix a rare memory leak in ro to rw remounting path Greg KH
2011-06-16 0:28 ` [38/85] i8k: Avoid lahf in 64-bit code Greg KH
2011-06-16 0:28 ` [39/85] cpuidle: menu: fixed wrapping timers at 4.294 seconds Greg KH
2011-06-16 0:28 ` [40/85] dm table: reject devices without request fns Greg KH
2011-06-16 0:28 ` [41/85] ARM: 6941/1: cache: ensure MVA is cacheline aligned in Greg KH
2011-06-16 0:28 ` [57/85] ath9k: set 40 Mhz rate only if hw is configured in ht40 Greg KH
2011-06-16 0:28 ` [58/85] mm: fix ENOSPC returned by handle_mm_fault() Greg KH
2011-06-16 0:28 ` [59/85] PCI: Set PCIE maxpayload for card during hotplug insertion Greg KH
2011-06-16 0:28 ` [60/85] nl80211: fix check for valid SSID size in scan operations Greg KH
2011-06-16 0:28 ` [61/85] lockdep: Fix lock_is_held() on recursion Greg KH
2011-06-16 0:28 ` [62/85] drm/i915: Add a no lvds quirk for the Asus EeeBox PC EB1007 Greg KH
2011-06-16 0:28 ` [63/85] drm/radeon/kms: fix for radeon on systems >4GB without Greg KH
2011-06-16 0:29 ` [64/85] fat: Fix corrupt inode flags when remove ATTR_SYS flag Greg KH
2011-06-16 0:29 ` [65/85] xen: off by one errors in multicalls.c Greg KH
2011-06-16 0:29 ` [66/85] x86/amd-iommu: Use only per-device dma_ops Greg KH
2011-06-16 0:29 ` [67/85] x86/amd-iommu: Fix 3 possible endless loops Greg KH
2011-06-16 0:29 ` [68/85] x86/amd-iommu: Fix boot crash with hidden PCI devices Greg KH
2011-06-16 0:29 ` [69/85] USB: core: Tolerate protocol stall during hub and port Greg KH
2011-06-16 0:29 ` [70/85] USB: serial: add another 4N-GALAXY.DE PID to ftdi_sio driver Greg KH
2011-06-16 0:29 ` [71/85] USB: xhci - fix interval calculation for FS isoc endpoints Greg KH
2011-06-16 0:29 ` [72/85] ALSA: hda: Fix quirk for Dell Inspiron 910 Greg KH
2011-06-16 0:29 ` [73/85] oprofile, dcookies: Fix possible circular locking dependency Greg KH
2011-06-16 0:29 ` [74/85] CPUFREQ: Remove cpufreq_stats sysfs entries on module unload Greg KH
2011-06-16 0:29 ` [75/85] md: check ->hot_remove_disk when removing disk Greg KH
2011-06-16 0:29 ` [76/85] md/raid5: fix raid5_set_bi_hw_segments Greg KH
2011-06-16 0:29 ` [77/85] md/raid5: fix FUA request handling in ops_run_io() Greg KH
2011-06-16 0:29 ` [78/85] pata_cmd64x: fix PIO setup Greg KH
2011-06-16 0:29 ` [79/85] pata_cmd64x: cmd648_bmdma_stop() fix Greg KH
2011-06-16 0:29 ` [80/85] pata_cmd64x: remove unused definitions Greg KH
2011-06-16 0:29 ` [81/85] pata_cm64x: fix boot crash on parisc Greg KH
2011-06-16 0:29 ` [82/85] xfs: properly account for reclaimed inodes Greg KH
2011-06-16 0:29 ` [83/85] netfilter: IPv6: initialize TOS field in REJECT target module Greg KH
2011-06-16 0:29 ` [84/85] netfilter: IPv6: fix DSCP mangle code Greg KH
2011-06-16 0:29 ` [85/85] [PATCH] Revert "iwlagn: Support new 5000 microcode." Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110616002904.677211667@clark.kroah.org \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=brgerst@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®