diff options
Diffstat (limited to 'arch/i386/mm/fault.c')
| -rw-r--r-- | arch/i386/mm/fault.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index 47a3b72ec7b6..7f0fcf219a26 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c | |||
| @@ -509,24 +509,31 @@ no_context: | |||
| 509 | 509 | ||
| 510 | bust_spinlocks(1); | 510 | bust_spinlocks(1); |
| 511 | 511 | ||
| 512 | #ifdef CONFIG_X86_PAE | 512 | if (oops_may_print()) { |
| 513 | if (error_code & 16) { | 513 | #ifdef CONFIG_X86_PAE |
| 514 | pte_t *pte = lookup_address(address); | 514 | if (error_code & 16) { |
| 515 | 515 | pte_t *pte = lookup_address(address); | |
| 516 | if (pte && pte_present(*pte) && !pte_exec_kernel(*pte)) | 516 | |
| 517 | printk(KERN_CRIT "kernel tried to execute NX-protected page - exploit attempt? (uid: %d)\n", current->uid); | 517 | if (pte && pte_present(*pte) && !pte_exec_kernel(*pte)) |
| 518 | printk(KERN_CRIT "kernel tried to execute " | ||
| 519 | "NX-protected page - exploit attempt? " | ||
| 520 | "(uid: %d)\n", current->uid); | ||
| 521 | } | ||
| 522 | #endif | ||
| 523 | if (address < PAGE_SIZE) | ||
| 524 | printk(KERN_ALERT "BUG: unable to handle kernel NULL " | ||
| 525 | "pointer dereference"); | ||
| 526 | else | ||
| 527 | printk(KERN_ALERT "BUG: unable to handle kernel paging" | ||
| 528 | " request"); | ||
| 529 | printk(" at virtual address %08lx\n",address); | ||
| 530 | printk(KERN_ALERT " printing eip:\n"); | ||
| 531 | printk("%08lx\n", regs->eip); | ||
| 518 | } | 532 | } |
| 519 | #endif | ||
| 520 | if (address < PAGE_SIZE) | ||
| 521 | printk(KERN_ALERT "BUG: unable to handle kernel NULL pointer dereference"); | ||
| 522 | else | ||
| 523 | printk(KERN_ALERT "BUG: unable to handle kernel paging request"); | ||
| 524 | printk(" at virtual address %08lx\n",address); | ||
| 525 | printk(KERN_ALERT " printing eip:\n"); | ||
| 526 | printk("%08lx\n", regs->eip); | ||
| 527 | page = read_cr3(); | 533 | page = read_cr3(); |
| 528 | page = ((unsigned long *) __va(page))[address >> 22]; | 534 | page = ((unsigned long *) __va(page))[address >> 22]; |
| 529 | printk(KERN_ALERT "*pde = %08lx\n", page); | 535 | if (oops_may_print()) |
| 536 | printk(KERN_ALERT "*pde = %08lx\n", page); | ||
| 530 | /* | 537 | /* |
| 531 | * We must not directly access the pte in the highpte | 538 | * We must not directly access the pte in the highpte |
| 532 | * case, the page table might be allocated in highmem. | 539 | * case, the page table might be allocated in highmem. |
| @@ -534,7 +541,7 @@ no_context: | |||
| 534 | * it's allocated already. | 541 | * it's allocated already. |
| 535 | */ | 542 | */ |
| 536 | #ifndef CONFIG_HIGHPTE | 543 | #ifndef CONFIG_HIGHPTE |
| 537 | if (page & 1) { | 544 | if ((page & 1) && oops_may_print()) { |
| 538 | page &= PAGE_MASK; | 545 | page &= PAGE_MASK; |
| 539 | address &= 0x003ff000; | 546 | address &= 0x003ff000; |
| 540 | page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; | 547 | page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT]; |
