|
@@ -472,19 +472,23 @@ int in_gate_area_no_mm(unsigned long addr)
|
|
|
|
|
|
const char *arch_vma_name(struct vm_area_struct *vma)
|
|
|
{
|
|
|
- return is_gate_vma(vma) ? "[vectors]" :
|
|
|
- (vma->vm_mm && vma->vm_start == vma->vm_mm->context.sigpage) ?
|
|
|
- "[sigpage]" : NULL;
|
|
|
+ return is_gate_vma(vma) ? "[vectors]" : NULL;
|
|
|
}
|
|
|
|
|
|
static struct page *signal_page;
|
|
|
extern struct page *get_signal_page(void);
|
|
|
|
|
|
+static const struct vm_special_mapping sigpage_mapping = {
|
|
|
+ .name = "[sigpage]",
|
|
|
+ .pages = &signal_page,
|
|
|
+};
|
|
|
+
|
|
|
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|
|
{
|
|
|
struct mm_struct *mm = current->mm;
|
|
|
+ struct vm_area_struct *vma;
|
|
|
unsigned long addr;
|
|
|
- int ret;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (!signal_page)
|
|
|
signal_page = get_signal_page();
|
|
@@ -498,12 +502,16 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|
|
goto up_fail;
|
|
|
}
|
|
|
|
|
|
- ret = install_special_mapping(mm, addr, PAGE_SIZE,
|
|
|
+ vma = _install_special_mapping(mm, addr, PAGE_SIZE,
|
|
|
VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
|
|
|
- &signal_page);
|
|
|
+ &sigpage_mapping);
|
|
|
+
|
|
|
+ if (IS_ERR(vma)) {
|
|
|
+ ret = PTR_ERR(vma);
|
|
|
+ goto up_fail;
|
|
|
+ }
|
|
|
|
|
|
- if (ret == 0)
|
|
|
- mm->context.sigpage = addr;
|
|
|
+ mm->context.sigpage = addr;
|
|
|
|
|
|
up_fail:
|
|
|
up_write(&mm->mmap_sem);
|