diff options
Diffstat (limited to 'arch/ia64/kernel/sys_ia64.c')
| -rw-r--r-- | arch/ia64/kernel/sys_ia64.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c index 40722d88607a..9ef62a3fbfad 100644 --- a/arch/ia64/kernel/sys_ia64.c +++ b/arch/ia64/kernel/sys_ia64.c | |||
| @@ -163,10 +163,25 @@ sys_pipe (void) | |||
| 163 | return retval; | 163 | return retval; |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | int ia64_mmap_check(unsigned long addr, unsigned long len, | ||
| 167 | unsigned long flags) | ||
| 168 | { | ||
| 169 | unsigned long roff; | ||
| 170 | |||
| 171 | /* | ||
| 172 | * Don't permit mappings into unmapped space, the virtual page table | ||
| 173 | * of a region, or across a region boundary. Note: RGN_MAP_LIMIT is | ||
| 174 | * equal to 2^n-PAGE_SIZE (for some integer n <= 61) and len > 0. | ||
| 175 | */ | ||
| 176 | roff = REGION_OFFSET(addr); | ||
| 177 | if ((len > RGN_MAP_LIMIT) || (roff > (RGN_MAP_LIMIT - len))) | ||
| 178 | return -EINVAL; | ||
| 179 | return 0; | ||
| 180 | } | ||
| 181 | |||
| 166 | static inline unsigned long | 182 | static inline unsigned long |
| 167 | do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff) | 183 | do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, unsigned long pgoff) |
| 168 | { | 184 | { |
| 169 | unsigned long roff; | ||
| 170 | struct file *file = NULL; | 185 | struct file *file = NULL; |
| 171 | 186 | ||
| 172 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | 187 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); |
| @@ -188,17 +203,6 @@ do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, un | |||
| 188 | goto out; | 203 | goto out; |
| 189 | } | 204 | } |
| 190 | 205 | ||
| 191 | /* | ||
| 192 | * Don't permit mappings into unmapped space, the virtual page table of a region, | ||
| 193 | * or across a region boundary. Note: RGN_MAP_LIMIT is equal to 2^n-PAGE_SIZE | ||
| 194 | * (for some integer n <= 61) and len > 0. | ||
| 195 | */ | ||
| 196 | roff = REGION_OFFSET(addr); | ||
| 197 | if ((len > RGN_MAP_LIMIT) || (roff > (RGN_MAP_LIMIT - len))) { | ||
| 198 | addr = -EINVAL; | ||
| 199 | goto out; | ||
| 200 | } | ||
| 201 | |||
| 202 | down_write(¤t->mm->mmap_sem); | 206 | down_write(¤t->mm->mmap_sem); |
| 203 | addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | 207 | addr = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); |
| 204 | up_write(¤t->mm->mmap_sem); | 208 | up_write(¤t->mm->mmap_sem); |
