From: Ben Hutchings <ben@decadent.org.uk>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: akpm@linux-foundation.org,
"Akira Takeuchi" <takeuchi.akr@jp.panasonic.com>,
"Linus Torvalds" <torvalds@linux-foundation.org>,
"Naoya Horiguchi" <n-horiguchi@ah.jp.nec.com>,
"Kiyoshi Owada" <owada.kiyoshi@jp.panasonic.com>
Subject: [PATCH 3.2 27/79] mm: ensure get_unmapped_area() returns higher address than mmap_min_addr
Date: Wed, 12 Feb 2014 08:10:12 +0000 [thread overview]
Message-ID: <lsq.1392192612.203829909@decadent.org.uk> (raw)
In-Reply-To: <lsq.1392192611.998273004@decadent.org.uk>
3.2.55-rc1 review patch. If anyone has any objections, please let me know.
------------------
From: Akira Takeuchi <takeuchi.akr@jp.panasonic.com>
commit 2afc745f3e3079ab16c826be4860da2529054dd2 upstream.
This patch fixes the problem that get_unmapped_area() can return illegal
address and result in failing mmap(2) etc.
In case that the address higher than PAGE_SIZE is set to
/proc/sys/vm/mmap_min_addr, the address lower than mmap_min_addr can be
returned by get_unmapped_area(), even if you do not pass any virtual
address hint (i.e. the second argument).
This is because the current get_unmapped_area() code does not take into
account mmap_min_addr.
This leads to two actual problems as follows:
1. mmap(2) can fail with EPERM on the process without CAP_SYS_RAWIO,
although any illegal parameter is not passed.
2. The bottom-up search path after the top-down search might not work in
arch_get_unmapped_area_topdown().
Note: The first and third chunk of my patch, which changes "len" check,
are for more precise check using mmap_min_addr, and not for solving the
above problem.
[How to reproduce]
--- test.c -------------------------------------------------
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/errno.h>
int main(int argc, char *argv[])
{
void *ret = NULL, *last_map;
size_t pagesize = sysconf(_SC_PAGESIZE);
do {
last_map = ret;
ret = mmap(0, pagesize, PROT_NONE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
// printf("ret=%p\n", ret);
} while (ret != MAP_FAILED);
if (errno != ENOMEM) {
printf("ERR: unexpected errno: %d (last map=%p)\n",
errno, last_map);
}
return 0;
}
---------------------------------------------------------------
$ gcc -m32 -o test test.c
$ sudo sysctl -w vm.mmap_min_addr=65536
vm.mmap_min_addr = 65536
$ ./test (run as non-priviledge user)
ERR: unexpected errno: 1 (last map=0x10000)
Signed-off-by: Akira Takeuchi <takeuchi.akr@jp.panasonic.com>
Signed-off-by: Kiyoshi Owada <owada.kiyoshi@jp.panasonic.com>
Reviewed-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
[bwh: Backported to 3.2:
As we do not have vm_unmapped_area(), make arch_get_unmapped_area_topdown()
calculate the lower limit for the new area's end address and then compare
addresses with this instead of with len. In the process, fix an off-by-one
error which could result in returning 0 if mm->mmap_base == len.]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
---
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1368,7 +1368,7 @@ arch_get_unmapped_area(struct file *filp
struct vm_area_struct *vma;
unsigned long start_addr;
- if (len > TASK_SIZE)
+ if (len > TASK_SIZE - mmap_min_addr)
return -ENOMEM;
if (flags & MAP_FIXED)
@@ -1377,7 +1377,7 @@ arch_get_unmapped_area(struct file *filp
if (addr) {
addr = PAGE_ALIGN(addr);
vma = find_vma(mm, addr);
- if (TASK_SIZE - len >= addr &&
+ if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
(!vma || addr + len <= vma->vm_start))
return addr;
}
@@ -1442,9 +1442,10 @@ arch_get_unmapped_area_topdown(struct fi
struct vm_area_struct *vma;
struct mm_struct *mm = current->mm;
unsigned long addr = addr0;
+ unsigned long low_limit = max(PAGE_SIZE, mmap_min_addr);
/* requested length too big for entire address space */
- if (len > TASK_SIZE)
+ if (len > TASK_SIZE - mmap_min_addr)
return -ENOMEM;
if (flags & MAP_FIXED)
@@ -1454,7 +1455,7 @@ arch_get_unmapped_area_topdown(struct fi
if (addr) {
addr = PAGE_ALIGN(addr);
vma = find_vma(mm, addr);
- if (TASK_SIZE - len >= addr &&
+ if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
(!vma || addr + len <= vma->vm_start))
return addr;
}
@@ -1469,14 +1470,14 @@ arch_get_unmapped_area_topdown(struct fi
addr = mm->free_area_cache;
/* make sure it can fit in the remaining address space */
- if (addr > len) {
+ if (addr >= low_limit + len) {
vma = find_vma(mm, addr-len);
if (!vma || addr <= vma->vm_start)
/* remember the address as a hint for next time */
return (mm->free_area_cache = addr-len);
}
- if (mm->mmap_base < len)
+ if (mm->mmap_base < low_limit + len)
goto bottomup;
addr = mm->mmap_base-len;
@@ -1498,7 +1499,7 @@ arch_get_unmapped_area_topdown(struct fi
/* try just below the current vma->vm_start */
addr = vma->vm_start-len;
- } while (len < vma->vm_start);
+ } while (vma->vm_start >= low_limit + len);
bottomup:
/*
next prev parent reply other threads:[~2014-02-12 8:14 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-12 8:10 [PATCH 3.2 00/79] 3.2.55-rc1 review Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 07/79] net: inet_diag: zero out uninitialized idiag_{src,dst} fields Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 21/79] staging: comedi: cb_pcidio: fix for newer PCI-DIO48H Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 79/79] sched/rt: Avoid updating RT entry timeout twice within one tick period Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 47/79] ALSA: Add SNDRV_PCM_STATE_PAUSED case in wait_for_avail function Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 41/79] gpio: msm: Fix irq mask/unmask by writing bits instead of numbers Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 04/79] net: drop_monitor: fix the value of maxattr Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 42/79] radiotap: fix bitmap-end-finding buffer overrun Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 52/79] ASoC: wm8904: fix DSP mode B configuration Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 17/79] net: avoid reference counter overflows on fib_rules in multicast forwarding Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 26/79] x86, fpu, amd: Clear exceptions in AMD FXSAVE workaround Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 43/79] ftrace: Initialize the ftrace profiler for each possible cpu Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 25/79] KVM: x86: Convert vapic synchronization to _cached functions (CVE-2013-6368) Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 40/79] ALSA: hda - Add enable_msi=0 workaround for four HP machines Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 75/79] mm: hugetlbfs: fix hugetlbfs optimization Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 22/79] [IA64] Fix warning from machine_kexec.c Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 35/79] ext2: Fix oops in ext2_get_block() called from ext2_quota_write() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 32/79] ext4: call ext4_error_inode() if jbd2_journal_dirty_metadata() fails Ben Hutchings
2014-02-12 8:10 ` Ben Hutchings [this message]
2014-02-12 8:10 ` [PATCH 3.2 01/79] net: do not pretend FRAGLIST support Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 30/79] sh: always link in helper functions extracted from libgcc Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 50/79] ath9k: Fix interrupt handling for the AR9002 family Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 63/79] ahci: add an observed PCI ID for Marvell 88se9172 SATA controller Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 14/79] bridge: use spin_lock_bh() in br_multicast_set_hash_max Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 67/79] SELinux: Fix possible NULL pointer dereference in selinux_inode_permission() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 06/79] net: unix: allow bind to fail on mutex lock Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 49/79] rtlwifi: pci: Fix oops on driver unload Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 60/79] ARM: fix footbridge clockevent device Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 45/79] drm/ttm: Fix accesses through vmas with only partial coverage Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 61/79] powerpc: Fix bad stack check in exception entry Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 37/79] xhci: Limit the spurious wakeup fix only to HP machines Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 11/79] net: rose: restore old recvmsg behavior Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 09/79] hamradio/yam: fix info leak in ioctl Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 10/79] rds: prevent dereference of a NULL device Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 20/79] mm/memory-failure.c: recheck PageHuge() after hugetlb page migrate successfully Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 39/79] drm/radeon: Fix sideport problems on certain RS690 boards Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 73/79] perf/x86/amd/ibs: Fix waking up from S3 for AMD family 10h Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 38/79] iscsi-target: Fix-up all zero data-length CDBs with R/W_BIT set Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 15/79] bnx2x: fix DMA unmapping of TSO split BDs Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 71/79] hwmon: (coretemp) Fix truncated name of alarm attributes Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 62/79] ahci: Use PCI_VENDOR_ID_MARVELL_EXT for 0x1b4b Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 48/79] drm/i915: Use the correct GMCH_CTRL register for Sandybridge+ Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 57/79] drm/radeon: 0x9649 is SUMO2 not SUMO Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 76/79] sched/rt: Fix SCHED_RR across cgroups Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 59/79] selinux: selinux_setprocattr()->ptrace_parent() needs rcu_read_lock() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 33/79] ext4: fix use-after-free in ext4_mb_new_blocks Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 58/79] selinux: fix broken peer recv check Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 02/79] rds: prevent BUG_ON triggered on congestion update to loopback Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 68/79] md/raid5: Fix possible confusion when multiple write errors occur Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 16/79] inet_diag: fix inet_diag_dump_icsk() timewait socket state logic Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 65/79] ahci: add PCI ID for Marvell 88SE9170 SATA controller Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 12/79] vlan: Fix header ops passthru when doing TX VLAN offload Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 23/79] hpfs: fix warnings when the filesystem fills up Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 54/79] dm9601: fix reception of full size ethernet frames on dm9620/dm9621a Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 70/79] md/raid10: fix bug when raid10 recovery fails to recover a block Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 69/79] md/raid10: fix two bugs in handling of known-bad-blocks Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 08/79] drivers/net/hamradio: Integer overflow in hdlcdrv_ioctl() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 78/79] sched: Unthrottle rt runqueues in __disable_runtime() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 05/79] tg3: Initialize REG_BASE_ADDR at PCI config offset 120 to 0 Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 66/79] ARM: fix "bad mode in ... handler" message for undefined instructions Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 28/79] ceph: cleanup aborted requests when re-sending requests Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 72/79] nilfs2: fix segctor bug that causes file system corruption Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 19/79] PCI: Enable ARI if dev and upstream bridge support it; disable otherwise Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 31/79] libata: add ATA_HORKAGE_BROKEN_FPDMA_AA quirk for Seagate Momentus SpinPoint M8 Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 74/79] mm: fix aio performance regression for database caused by THP Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 53/79] net_dma: mark broken Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 13/79] net: llc: fix use after free in llc_ui_recvmsg Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 36/79] ext4: fix del_timer() misuse for ->s_err_report Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 55/79] dm9601: work around tx fifo sync issue on dm962x Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 29/79] ceph: wake up 'safe' waiters when unregistering request Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 64/79] pci: Add PCI_DEVICE_SUB() macro Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 24/79] ath9k_htc: properly set MAC address and BSSID mask Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 56/79] ext4: add explicit casts when masking cluster sizes Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 44/79] libata: disable a disk via libata.force params Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 77/79] sched,rt: fix isolated CPUs leaving root_task_group indefinitely throttled Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 51/79] cpupower: Fix segfault due to incorrect getopt_long arugments Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 03/79] ipv6: don't count addrconf generated routes against gc limit Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 18/79] xfs: Account log unmount transaction correctly Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 34/79] ext4: check for overlapping extents in ext4_valid_extent_entries() Ben Hutchings
2014-02-12 8:10 ` [PATCH 3.2 46/79] sched/rt: Fix rq's cpupri leak while enqueue/dequeue child RT entities Ben Hutchings
2014-02-12 8:16 ` [PATCH 3.2 00/79] 3.2.55-rc1 review Ben Hutchings
2014-02-12 11:50 ` Guenter Roeck
2014-02-12 18:14 ` Ben Hutchings
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=lsq.1392192612.203829909@decadent.org.uk \
--to=ben@decadent.org.uk \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=n-horiguchi@ah.jp.nec.com \
--cc=owada.kiyoshi@jp.panasonic.com \
--cc=stable@vger.kernel.org \
--cc=takeuchi.akr@jp.panasonic.com \
--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®