Skip to content

Commit e35ac62

Browse files
author
Russell King
committed
Merge branch 'security-fixes' into fixes
2 parents 24195ca + 8c0cc8a commit e35ac62

File tree

3 files changed

+31
-28
lines changed

3 files changed

+31
-28
lines changed

arch/arm/include/asm/elf.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ struct mm_struct;
130130
extern unsigned long arch_randomize_brk(struct mm_struct *mm);
131131
#define arch_randomize_brk arch_randomize_brk
132132

133+
#ifdef CONFIG_MMU
133134
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
134135
struct linux_binprm;
135136
int arch_setup_additional_pages(struct linux_binprm *, int);
137+
#endif
136138

137139
#endif

arch/arm/kernel/process.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -474,17 +474,18 @@ const char *arch_vma_name(struct vm_area_struct *vma)
474474
"[sigpage]" : NULL;
475475
}
476476

477+
static struct page *signal_page;
477478
extern struct page *get_signal_page(void);
478479

479480
int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
480481
{
481482
struct mm_struct *mm = current->mm;
482-
struct page *page;
483483
unsigned long addr;
484484
int ret;
485485

486-
page = get_signal_page();
487-
if (!page)
486+
if (!signal_page)
487+
signal_page = get_signal_page();
488+
if (!signal_page)
488489
return -ENOMEM;
489490

490491
down_write(&mm->mmap_sem);
@@ -496,7 +497,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
496497

497498
ret = install_special_mapping(mm, addr, PAGE_SIZE,
498499
VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
499-
&page);
500+
&signal_page);
500501

501502
if (ret == 0)
502503
mm->context.sigpage = addr;

arch/arm/kernel/signal.c

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,8 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
402402
__put_user(sigreturn_codes[idx+1], rc+1))
403403
return 1;
404404

405-
if ((cpsr & MODE32_BIT) && !IS_ENABLED(CONFIG_ARM_MPU)) {
405+
#ifdef CONFIG_MMU
406+
if (cpsr & MODE32_BIT) {
406407
struct mm_struct *mm = current->mm;
407408

408409
/*
@@ -412,7 +413,9 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
412413
*/
413414
retcode = mm->context.sigpage + signal_return_offset +
414415
(idx << 2) + thumb;
415-
} else {
416+
} else
417+
#endif
418+
{
416419
/*
417420
* Ensure that the instruction cache sees
418421
* the return code written onto the stack.
@@ -614,35 +617,32 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
614617
return 0;
615618
}
616619

617-
static struct page *signal_page;
618-
619620
struct page *get_signal_page(void)
620621
{
621-
if (!signal_page) {
622-
unsigned long ptr;
623-
unsigned offset;
624-
void *addr;
622+
unsigned long ptr;
623+
unsigned offset;
624+
struct page *page;
625+
void *addr;
625626

626-
signal_page = alloc_pages(GFP_KERNEL, 0);
627+
page = alloc_pages(GFP_KERNEL, 0);
627628

628-
if (!signal_page)
629-
return NULL;
629+
if (!page)
630+
return NULL;
630631

631-
addr = page_address(signal_page);
632+
addr = page_address(page);
632633

633-
/* Give the signal return code some randomness */
634-
offset = 0x200 + (get_random_int() & 0x7fc);
635-
signal_return_offset = offset;
634+
/* Give the signal return code some randomness */
635+
offset = 0x200 + (get_random_int() & 0x7fc);
636+
signal_return_offset = offset;
636637

637-
/*
638-
* Copy signal return handlers into the vector page, and
639-
* set sigreturn to be a pointer to these.
640-
*/
641-
memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
638+
/*
639+
* Copy signal return handlers into the vector page, and
640+
* set sigreturn to be a pointer to these.
641+
*/
642+
memcpy(addr + offset, sigreturn_codes, sizeof(sigreturn_codes));
642643

643-
ptr = (unsigned long)addr + offset;
644-
flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
645-
}
644+
ptr = (unsigned long)addr + offset;
645+
flush_icache_range(ptr, ptr + sizeof(sigreturn_codes));
646646

647-
return signal_page;
647+
return page;
648648
}

0 commit comments

Comments
 (0)