diff options
Diffstat (limited to 'arch/um/kernel/tlb.c')
-rw-r--r-- | arch/um/kernel/tlb.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/um/kernel/tlb.c b/arch/um/kernel/tlb.c index 9472079471bb..f1b3eb14b855 100644 --- a/arch/um/kernel/tlb.c +++ b/arch/um/kernel/tlb.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <mem_user.h> | 12 | #include <mem_user.h> |
13 | #include <os.h> | 13 | #include <os.h> |
14 | #include <skas.h> | 14 | #include <skas.h> |
15 | #include <kern_util.h> | ||
15 | 16 | ||
16 | struct host_vm_change { | 17 | struct host_vm_change { |
17 | struct host_vm_op { | 18 | struct host_vm_op { |
@@ -124,6 +125,9 @@ static int add_munmap(unsigned long addr, unsigned long len, | |||
124 | struct host_vm_op *last; | 125 | struct host_vm_op *last; |
125 | int ret = 0; | 126 | int ret = 0; |
126 | 127 | ||
128 | if ((addr >= STUB_START) && (addr < STUB_END)) | ||
129 | return -EINVAL; | ||
130 | |||
127 | if (hvc->index != 0) { | 131 | if (hvc->index != 0) { |
128 | last = &hvc->ops[hvc->index - 1]; | 132 | last = &hvc->ops[hvc->index - 1]; |
129 | if ((last->type == MUNMAP) && | 133 | if ((last->type == MUNMAP) && |
@@ -283,8 +287,11 @@ void fix_range_common(struct mm_struct *mm, unsigned long start_addr, | |||
283 | /* This is not an else because ret is modified above */ | 287 | /* This is not an else because ret is modified above */ |
284 | if (ret) { | 288 | if (ret) { |
285 | printk(KERN_ERR "fix_range_common: failed, killing current " | 289 | printk(KERN_ERR "fix_range_common: failed, killing current " |
286 | "process\n"); | 290 | "process: %d\n", task_tgid_vnr(current)); |
291 | /* We are under mmap_sem, release it such that current can terminate */ | ||
292 | up_write(¤t->mm->mmap_sem); | ||
287 | force_sig(SIGKILL, current); | 293 | force_sig(SIGKILL, current); |
294 | do_signal(); | ||
288 | } | 295 | } |
289 | } | 296 | } |
290 | 297 | ||