Commit aba1ecd3 authored by Eric W. Biederman's avatar Eric W. Biederman
Browse files

signal/x86: Pass pkey not vma into __bad_area



There is only one caller of __bad_area that passes in PKUERR and thus
will generate a siginfo with si_pkey set.  Therefore simplify the
logic and hoist reading of vma_pkey up into that caller, and just
pass *pkey into __bad_area.

Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent 988bbc7b
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -904,22 +904,16 @@ bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,

static void
__bad_area(struct pt_regs *regs, unsigned long error_code,
	   unsigned long address,  struct vm_area_struct *vma, int si_code)
	   unsigned long address, u32 *pkey, int si_code)
{
	struct mm_struct *mm = current->mm;
	u32 pkey;

	if (vma)
		pkey = vma_pkey(vma);

	/*
	 * Something tried to access memory that isn't in our memory map..
	 * Fix it, but check if it's kernel or user first..
	 */
	up_read(&mm->mmap_sem);

	__bad_area_nosemaphore(regs, error_code, address,
			       (vma) ? &pkey : NULL, si_code);
	__bad_area_nosemaphore(regs, error_code, address, pkey, si_code);
}

static noinline void
@@ -954,10 +948,12 @@ bad_area_access_error(struct pt_regs *regs, unsigned long error_code,
	 * But, doing it this way allows compiler optimizations
	 * if pkeys are compiled out.
	 */
	if (bad_area_access_from_pkeys(error_code, vma))
		__bad_area(regs, error_code, address, vma, SEGV_PKUERR);
	else
		__bad_area(regs, error_code, address, vma, SEGV_ACCERR);
	if (bad_area_access_from_pkeys(error_code, vma)) {
		u32 pkey = vma_pkey(vma);
		__bad_area(regs, error_code, address, &pkey, SEGV_PKUERR);
	} else {
		__bad_area(regs, error_code, address, NULL, SEGV_ACCERR);
	}
}

static void