diff options
| author | Eric Paris <eparis@redhat.com> | 2007-11-26 18:47:40 -0500 |
|---|---|---|
| committer | James Morris <jmorris@namei.org> | 2007-12-05 08:25:10 -0500 |
| commit | 7cd94146cd504016315608e297219f9fb7b1413b (patch) | |
| tree | 1d118d6af0a6d3efb9be66f7305827aee2ceffea /include/linux | |
| parent | 8869477a49c3e99def1fcdadd6bbc407fea14b45 (diff) | |
Security: round mmap hint address above mmap_min_addr
If mmap_min_addr is set and a process attempts to mmap (not fixed) with a
non-null hint address less than mmap_min_addr the mapping will fail the
security checks. Since this is just a hint address this patch will round
such a hint address above mmap_min_addr.
gcj was found to try to be very frugal with vm usage and give hint addresses
in the 8k-32k range. Without this patch all such programs failed and with
the patch they happily get a higher address.
This patch is wrappad in CONFIG_SECURITY since mmap_min_addr doesn't exist
without it and there would be no security check possible no matter what. So
we should not bother compiling in this rounding if it is just a waste of
time.
Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/mm.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 520238cbae..1b7b95c67a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | #include <linux/prio_tree.h> | 12 | #include <linux/prio_tree.h> |
| 13 | #include <linux/debug_locks.h> | 13 | #include <linux/debug_locks.h> |
| 14 | #include <linux/mm_types.h> | 14 | #include <linux/mm_types.h> |
| 15 | #include <linux/security.h> | ||
| 15 | 16 | ||
| 16 | struct mempolicy; | 17 | struct mempolicy; |
| 17 | struct anon_vma; | 18 | struct anon_vma; |
| @@ -513,6 +514,21 @@ static inline void set_page_links(struct page *page, enum zone_type zone, | |||
| 513 | } | 514 | } |
| 514 | 515 | ||
| 515 | /* | 516 | /* |
| 517 | * If a hint addr is less than mmap_min_addr change hint to be as | ||
| 518 | * low as possible but still greater than mmap_min_addr | ||
| 519 | */ | ||
| 520 | static inline unsigned long round_hint_to_min(unsigned long hint) | ||
| 521 | { | ||
| 522 | #ifdef CONFIG_SECURITY | ||
| 523 | hint &= PAGE_MASK; | ||
| 524 | if (((void *)hint != NULL) && | ||
| 525 | (hint < mmap_min_addr)) | ||
| 526 | return PAGE_ALIGN(mmap_min_addr); | ||
| 527 | #endif | ||
| 528 | return hint; | ||
| 529 | } | ||
| 530 | |||
| 531 | /* | ||
| 516 | * Some inline functions in vmstat.h depend on page_zone() | 532 | * Some inline functions in vmstat.h depend on page_zone() |
| 517 | */ | 533 | */ |
| 518 | #include <linux/vmstat.h> | 534 | #include <linux/vmstat.h> |
