SOURCES (LINUX_2_6): linux-2.6-grsec_full.patch - merged changes f...
zbyniu
zbyniu at pld-linux.org
Thu Aug 23 03:27:50 CEST 2007
Author: zbyniu Date: Thu Aug 23 01:27:50 2007 GMT
Module: SOURCES Tag: LINUX_2_6
---- Log message:
- merged changes from grsecurity-2.1.11-2.6.22.4-200708211800.patch
---- Files affected:
SOURCES:
linux-2.6-grsec_full.patch (1.1.2.15 -> 1.1.2.16)
---- Diffs:
================================================================
Index: SOURCES/linux-2.6-grsec_full.patch
diff -u SOURCES/linux-2.6-grsec_full.patch:1.1.2.15 SOURCES/linux-2.6-grsec_full.patch:1.1.2.16
--- SOURCES/linux-2.6-grsec_full.patch:1.1.2.15 Mon Aug 13 13:19:04 2007
+++ SOURCES/linux-2.6-grsec_full.patch Thu Aug 23 03:27:44 2007
@@ -323,6 +323,25 @@
# Jump to the 32bit entry point
jmpl *(code32_start - start + (DELTA_INITSEG << 4))(%esi)
+diff -urNp linux-2.6.22/arch/i386/boot/video.S linux-2.6.22/arch/i386/boot/video.S
+--- linux-2.6.22/arch/i386/boot/video.S 2007-07-10 14:56:30.000000000 -0400
++++ linux-2.6.22/arch/i386/boot/video.S 2007-07-10 14:56:30.000000000 -0400
+@@ -96,6 +96,7 @@
+ #define PARAM_LFB_PAGES 0x32
+ #define PARAM_VESA_ATTRIB 0x34
+ #define PARAM_CAPABILITIES 0x36
++#define PARAM_VESAPM_SIZE 0x3a
+
+ /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */
+ #ifdef CONFIG_VIDEO_RETAIN
+@@ -280,6 +281,7 @@ dac_done:
+
+ movw %es, %fs:(PARAM_VESAPM_SEG)
+ movw %di, %fs:(PARAM_VESAPM_OFF)
++ movw %cx, %fs:(PARAM_VESAPM_SIZE)
+ no_pm: ret
+
+ # The video mode menu
diff -urNp linux-2.6.22.1/arch/i386/Kconfig linux-2.6.22.1/arch/i386/Kconfig
--- linux-2.6.22.1/arch/i386/Kconfig 2007-07-10 14:56:30.000000000 -0400
+++ linux-2.6.22.1/arch/i386/Kconfig 2007-08-03 12:36:16.000000000 -0400
@@ -498,10 +517,10 @@
}
#ifdef CONFIG_SMP
-@@ -191,29 +203,53 @@ static void alternatives_smp_lock(u8 **s
+@@ -191,29 +203,53 @@ static void alternatives_smp_lock(u8 **s
{
- u8 **ptr;
-
+ u8 **ptr;
+
+#ifdef CONFIG_PAX_KERNEXEC
+ unsigned long cr0;
+
@@ -542,12 +561,12 @@
for (ptr = start; ptr < end; ptr++) {
if (*ptr < text)
continue;
- if (*ptr > text_end)
+ if (*ptr > text_end)
continue;
- nop_out(*ptr, 1);
- };
+ nop_out(*ptr + __KERNEL_TEXT_OFFSET, 1);
-+ }
++ }
+
+#ifdef CONFIG_PAX_KERNEXEC
+ pax_close_kernel(cr0);
@@ -1476,7 +1495,7 @@
+ __SAVE_ALL(__KERNEL_DS); \
+ GET_CR0_INTO_EDX; \
+ movl %edx, %esi; \
-+ orl $0x10000, %edx; \
++ orl $X86_CR0_WP, %edx; \
+ xorl %edx, %esi; \
+ SET_CR0_FROM_EDX
+#elif defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC) || defined(CONFIG_PAX_MEMORY_UDEREF)
@@ -1640,7 +1659,7 @@
+#ifdef CONFIG_PAX_KERNEXEC
+ GET_CR0_INTO_EDX
+ movl %edx, %esi
-+ orl $0x10000, %edx
++ orl $X86_CR0_WP, %edx
+ xorl %edx, %esi
+ SET_CR0_FROM_EDX
+#endif
@@ -2237,10 +2256,91 @@
asm volatile(
" xchgl %%ebx,%%esp \n"
-diff -urNp linux-2.6.22.1/arch/i386/kernel/kprobes.c linux-2.6.22.1/arch/i386/kernel/kprobes.c
---- linux-2.6.22.1/arch/i386/kernel/kprobes.c 2007-07-10 14:56:30.000000000 -0400
-+++ linux-2.6.22.1/arch/i386/kernel/kprobes.c 2007-08-02 11:38:45.000000000 -0400
-@@ -651,7 +651,7 @@ int __kprobes kprobe_exceptions_notify(s
+diff -urNp linux-2.6.22/arch/i386/kernel/kprobes.c linux-2.6.22/arch/i386/kernel/kprobes.c
+--- linux-2.6.22/arch/i386/kernel/kprobes.c 2007-07-10 14:56:30.000000000 -0400
++++ linux-2.6.22/arch/i386/kernel/kprobes.c 2007-07-10 14:56:30.000000000 -0400
+@@ -48,9 +48,24 @@ static __always_inline void set_jmp_op(v
+ char op;
+ long raddr;
+ } __attribute__((packed)) *jop;
+- jop = (struct __arch_jmp_op *)from;
++
++#ifdef CONFIG_PAX_KERNEXEC
++ unsigned long cr0;
++#endif
++
++ jop = (struct __arch_jmp_op *)(from + __KERNEL_TEXT_OFFSET);
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_open_kernel(cr0);
++#endif
++
+ jop->raddr = (long)(to) - ((long)(from) + 5);
+ jop->op = RELATIVEJUMP_INSTRUCTION;
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_close_kernel(cr0);
++#endif
++
+ }
+
+ /*
+@@ -152,12 +167,26 @@ static int __kprobes is_IF_modifier(kpro
+
+ int __kprobes arch_prepare_kprobe(struct kprobe *p)
+ {
++
++#ifdef CONFIG_PAX_KERNEXEC
++ unsigned long cr0;
++#endif
++
+ /* insn: must be on special executable page on i386. */
+ p->ainsn.insn = get_insn_slot();
+ if (!p->ainsn.insn)
+ return -ENOMEM;
+
+- memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_open_kernel(cr0);
++#endif
++
++ memcpy(p->ainsn.insn, p->addr + __KERNEL_TEXT_OFFSET, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_close_kernel(cr0);
++#endif
++
+ p->opcode = *p->addr;
+ if (can_boost(p->addr)) {
+ p->ainsn.boostable = 0;
+@@ -222,7 +251,7 @@ static void __kprobes prepare_singlestep
+ if (p->opcode == BREAKPOINT_INSTRUCTION)
+ regs->eip = (unsigned long)p->addr;
+ else
+- regs->eip = (unsigned long)p->ainsn.insn;
++ regs->eip = (unsigned long)p->ainsn.insn - __KERNEL_TEXT_OFFSET;
+ }
+
+ /* Called with kretprobe_lock held */
+@@ -328,7 +357,7 @@ ss_probe:
+ if (p->ainsn.boostable == 1 && !p->post_handler){
+ /* Boost up -- we can execute copied instructions directly */
+ reset_current_kprobe();
+- regs->eip = (unsigned long)p->ainsn.insn;
++ regs->eip = (unsigned long)p->ainsn.insn - __KERNEL_TEXT_OFFSET;
+ preempt_enable_no_resched();
+ return 1;
+ }
+@@ -478,7 +507,7 @@ static void __kprobes resume_execution(s
+ struct pt_regs *regs, struct kprobe_ctlblk *kcb)
+ {
+ unsigned long *tos = (unsigned long *)®s->esp;
+- unsigned long copy_eip = (unsigned long)p->ainsn.insn;
++ unsigned long copy_eip = (unsigned long)p->ainsn.insn - __KERNEL_TEXT_OFFSET;
+ unsigned long orig_eip = (unsigned long)p->addr;
+
+ regs->eflags &= ~TF_MASK;
+@@ -651,7 +680,7 @@ int __kprobes kprobe_exceptions_notify(s
struct die_args *args = (struct die_args *)data;
int ret = NOTIFY_DONE;
@@ -3356,7 +3456,7 @@
diff -urNp linux-2.6.22.1/arch/i386/kernel/time.c linux-2.6.22.1/arch/i386/kernel/time.c
--- linux-2.6.22.1/arch/i386/kernel/time.c 2007-07-10 14:56:30.000000000 -0400
+++ linux-2.6.22.1/arch/i386/kernel/time.c 2007-08-02 11:38:45.000000000 -0400
-@@ -132,18 +132,24 @@ unsigned long profile_pc(struct pt_regs
+@@ -132,20 +132,30 @@ unsigned long profile_pc(struct pt_regs
if (!v8086_mode(regs) && SEGMENT_IS_KERNEL_CODE(regs->xcs) &&
in_lock_functions(pc)) {
#ifdef CONFIG_FRAME_POINTER
@@ -3381,7 +3481,13 @@
+#endif
}
#endif
++
++ if (!v8086_mode(regs) && SEGMENT_IS_KERNEL_CODE(regs->xcs))
++ pc += __KERNEL_TEXT_OFFSET;
++
return pc;
+ }
+ EXPORT_SYMBOL(profile_pc);
diff -urNp linux-2.6.22.1/arch/i386/kernel/traps.c linux-2.6.22.1/arch/i386/kernel/traps.c
--- linux-2.6.22.1/arch/i386/kernel/traps.c 2007-07-10 14:56:30.000000000 -0400
+++ linux-2.6.22.1/arch/i386/kernel/traps.c 2007-08-02 11:38:45.000000000 -0400
@@ -3598,31 +3704,54 @@
tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
if (cpu_has_sep)
tsk->thread.sysenter_cs = 0;
-diff -urNp linux-2.6.22.1/arch/i386/kernel/vmi.c linux-2.6.22.1/arch/i386/kernel/vmi.c
---- linux-2.6.22.1/arch/i386/kernel/vmi.c 2007-07-10 14:56:30.000000000 -0400
-+++ linux-2.6.22.1/arch/i386/kernel/vmi.c 2007-08-02 11:38:45.000000000 -0400
-@@ -89,7 +89,19 @@ struct vmi_timer_ops vmi_timer_ops;
-
- static inline void patch_offset(unsigned char *eip, unsigned char *dest)
+diff -urNp linux-2.6.22/arch/i386/kernel/vmi.c linux-2.6.22/arch/i386/kernel/vmi.c
+--- linux-2.6.22/arch/i386/kernel/vmi.c 2007-07-10 14:56:30.000000000 -0400
++++ linux-2.6.22/arch/i386/kernel/vmi.c 2007-07-10 14:56:30.000000000 -0400
+@@ -96,18 +96,43 @@ static unsigned patch_internal(int call,
{
-- *(unsigned long *)(eip+1) = dest-eip-5;
+ u64 reloc;
+ struct vmi_relocation_info *const rel = (struct vmi_relocation_info *)&reloc;
+
+#ifdef CONFIG_PAX_KERNEXEC
+ unsigned long cr0;
++#endif
+
-+ pax_open_kernel(cr0);
+ reloc = call_vrom_long_func(vmi_rom, get_reloc, call);
+ switch(rel->type) {
+ case VMI_RELOCATION_CALL_REL:
+ BUG_ON(len < 5);
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_open_kernel(cr0);
+#endif
+
-+ *(unsigned long *)(eip+1) = dest-eip-5;
+ *(char *)insns = MNEM_CALL;
+ patch_offset(insns, rel->eip);
+
+#ifdef CONFIG_PAX_KERNEXEC
-+ pax_close_kernel(cr0);
++ pax_close_kernel(cr0);
+#endif
+
- }
+ return 5;
+
+ case VMI_RELOCATION_JUMP_REL:
+ BUG_ON(len < 5);
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_open_kernel(cr0);
++#endif
++
+ *(char *)insns = MNEM_JMP;
+ patch_offset(insns, rel->eip);
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_close_kernel(cr0);
++#endif
++
+ return 5;
- static unsigned patch_internal(int call, unsigned len, void *insns)
-@@ -485,14 +497,14 @@ static void vmi_set_pud(pud_t *pudp, pud
+ case VMI_RELOCATION_NOP:
+@@ -485,14 +510,14 @@ static void vmi_set_pud(pud_t *pudp, pud
static void vmi_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
{
@@ -3639,7 +3768,7 @@
vmi_check_page_type(__pa(pmd) >> PAGE_SHIFT, VMI_PAGE_PMD);
vmi_ops.set_pte(pte, (pte_t *)pmd, VMI_PAGE_PD);
}
-@@ -521,8 +533,8 @@ vmi_startup_ipi_hook(int phys_apicid, un
+@@ -521,8 +546,8 @@ vmi_startup_ipi_hook(int phys_apicid, un
ap.ss = __KERNEL_DS;
ap.esp = (unsigned long) start_esp;
@@ -3650,7 +3779,7 @@
ap.fs = __KERNEL_PERCPU;
ap.gs = 0;
-@@ -719,12 +731,20 @@ static inline int __init activate_vmi(vo
+@@ -719,12 +744,20 @@ static inline int __init activate_vmi(vo
u64 reloc;
const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc;
@@ -3671,7 +3800,7 @@
paravirt_ops.paravirt_enabled = 1;
paravirt_ops.kernel_rpl = kernel_cs & SEGMENT_RPL_MASK;
-@@ -903,6 +923,10 @@ static inline int __init activate_vmi(vo
+@@ -903,6 +936,10 @@ static inline int __init activate_vmi(vo
para_fill(safe_halt, Halt);
@@ -5724,9 +5853,9 @@
}
if( ((1<<cpu) & voyager_extended_vic_processors) == 0)
-diff -urNp linux-2.6.22.1/arch/i386/mm/boot_ioremap.c linux-2.6.22.1/arch/i386/mm/boot_ioremap.c
---- linux-2.6.22.1/arch/i386/mm/boot_ioremap.c 2007-07-10 14:56:30.000000000 -0400
-+++ linux-2.6.22.1/arch/i386/mm/boot_ioremap.c 2007-08-02 11:38:45.000000000 -0400
+diff -urNp linux-2.6.22/arch/i386/mm/boot_ioremap.c linux-2.6.22/arch/i386/mm/boot_ioremap.c
+--- linux-2.6.22/arch/i386/mm/boot_ioremap.c 2007-07-10 14:56:30.000000000 -0400
++++ linux-2.6.22/arch/i386/mm/boot_ioremap.c 2007-07-10 14:56:30.000000000 -0400
@@ -7,57 +7,37 @@
* Written by Dave Hansen <haveblue at us.ibm.com>
*/
@@ -6161,6 +6290,15 @@
else
printk(KERN_ALERT "BUG: unable to handle kernel paging"
" request");
+@@ -560,7 +750,7 @@ no_context:
+ * it's allocated already.
+ */
+ if ((page >> PAGE_SHIFT) < max_low_pfn
+- && (page & _PAGE_PRESENT)) {
++ && (page & (_PAGE_PRESENT | _PAGE_PSE)) == _PAGE_PRESENT) {
+ page &= PAGE_MASK;
+ page = ((__typeof__(page) *) __va(page))[(address >> PAGE_SHIFT)
+ & (PTRS_PER_PTE - 1)];
@@ -645,3 +835,110 @@ void vmalloc_sync_all(void)
start = address + PGDIR_SIZE;
}
@@ -7022,10 +7160,10 @@
};
static int __init pcibios_irq_init(void)
-diff -urNp linux-2.6.22.1/arch/i386/pci/pcbios.c linux-2.6.22.1/arch/i386/pci/pcbios.c
---- linux-2.6.22.1/arch/i386/pci/pcbios.c 2007-07-10 14:56:30.000000000 -0400
-+++ linux-2.6.22.1/arch/i386/pci/pcbios.c 2007-08-07 08:41:24.000000000 -0400
-@@ -57,50 +57,102 @@ union bios32 {
+diff -urNp linux-2.6.22/arch/i386/pci/pcbios.c linux-2.6.22/arch/i386/pci/pcbios.c
+--- linux-2.6.22/arch/i386/pci/pcbios.c 2007-07-10 14:56:30.000000000 -0400
++++ linux-2.6.22/arch/i386/pci/pcbios.c 2007-07-10 14:56:30.000000000 -0400
+@@ -57,50 +57,119 @@ union bios32 {
static struct {
unsigned long address;
unsigned short segment;
@@ -7054,13 +7192,22 @@
- __asm__("lcall *(%%edi); cld"
+
+ gdt = get_cpu_gdt_table(smp_processor_id());
-+ pack_descriptor((u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].a,
-+ (u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].b,
++
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_open_kernel(cr0);
++#endif
++
++ pack_descriptor((__u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].a,
++ (__u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].b,
+ 0UL, 0xFFFFFUL, 0x9B, 0xC);
-+ pack_descriptor((u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].a,
-+ (u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].b,
++ pack_descriptor((__u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].a,
++ (__u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].b,
+ 0UL, 0xFFFFFUL, 0x93, 0xC);
+
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_close_kernel(cr0);
++#endif
++
+ __asm__("movw %w7, %%ds; lcall *(%%edi); push %%ss; pop %%ds; cld"
: "=a" (return_code),
"=b" (address),
@@ -7073,11 +7220,19 @@
+ "r"(__PCIBIOS_DS)
+ : "memory");
+
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_open_kernel(cr0);
++#endif
++
+ gdt[GDT_ENTRY_PCIBIOS_CS].a = 0;
+ gdt[GDT_ENTRY_PCIBIOS_CS].b = 0;
+ gdt[GDT_ENTRY_PCIBIOS_DS].a = 0;
+ gdt[GDT_ENTRY_PCIBIOS_DS].b = 0;
+
++#ifdef CONFIG_PAX_KERNEXEC
++ pax_close_kernel(cr0);
++#endif
++
local_irq_restore(flags);
switch (return_code) {
@@ -7108,11 +7263,11 @@
+
+ for (cpu = 0; cpu < NR_CPUS; cpu++) {
+ gdt = get_cpu_gdt_table(cpu);
-+ pack_descriptor((u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].a,
-+ (u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].b,
++ pack_descriptor((__u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].a,
++ (__u32 *)&gdt[GDT_ENTRY_PCIBIOS_CS].b,
+ address, length, 0x9b, flags);
-+ pack_descriptor((u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].a,
-+ (u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].b,
++ pack_descriptor((__u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].a,
++ (__u32 *)&gdt[GDT_ENTRY_PCIBIOS_DS].b,
+ address, length, 0x93, flags);
+ }
+
@@ -7143,7 +7298,7 @@
static int __devinit check_pcibios(void)
{
-@@ -109,11 +161,13 @@ static int __devinit check_pcibios(void)
+@@ -109,11 +178,13 @@ static int __devinit check_pcibios(void)
unsigned long flags, pcibios_entry;
if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
@@ -7160,7 +7315,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -122,7 +176,8 @@ static int __devinit check_pcibios(void)
+@@ -122,7 +193,8 @@ static int __devinit check_pcibios(void)
"=b" (ebx),
"=c" (ecx)
: "1" (PCIBIOS_PCI_BIOS_PRESENT),
@@ -7170,7 +7325,7 @@
: "memory");
local_irq_restore(flags);
-@@ -158,7 +213,10 @@ static int __devinit pci_bios_find_devic
+@@ -158,7 +230,10 @@ static int __devinit pci_bios_find_devic
unsigned short bx;
unsigned short ret;
@@ -7182,7 +7337,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -168,7 +226,8 @@ static int __devinit pci_bios_find_devic
+@@ -168,7 +243,8 @@ static int __devinit pci_bios_find_devic
"c" (device_id),
"d" (vendor),
"S" ((int) index),
@@ -7192,7 +7347,7 @@
*bus = (bx >> 8) & 0xff;
*device_fn = bx & 0xff;
return (int) (ret & 0xff00) >> 8;
-@@ -188,7 +247,10 @@ static int pci_bios_read(unsigned int se
+@@ -188,7 +264,10 @@ static int pci_bios_read(unsigned int se
switch (len) {
case 1:
@@ -7204,7 +7359,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -197,10 +259,14 @@ static int pci_bios_read(unsigned int se
+@@ -197,10 +276,14 @@ static int pci_bios_read(unsigned int se
: "1" (PCIBIOS_READ_CONFIG_BYTE),
"b" (bx),
"D" ((long)reg),
@@ -7221,7 +7376,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -209,10 +275,14 @@ static int pci_bios_read(unsigned int se
+@@ -209,10 +292,14 @@ static int pci_bios_read(unsigned int se
: "1" (PCIBIOS_READ_CONFIG_WORD),
"b" (bx),
"D" ((long)reg),
@@ -7238,7 +7393,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -221,7 +291,8 @@ static int pci_bios_read(unsigned int se
+@@ -221,7 +308,8 @@ static int pci_bios_read(unsigned int se
: "1" (PCIBIOS_READ_CONFIG_DWORD),
"b" (bx),
"D" ((long)reg),
@@ -7248,7 +7403,7 @@
break;
}
-@@ -244,7 +315,10 @@ static int pci_bios_write(unsigned int s
+@@ -244,7 +332,10 @@ static int pci_bios_write(unsigned int s
switch (len) {
case 1:
@@ -7260,7 +7415,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -253,10 +327,14 @@ static int pci_bios_write(unsigned int s
+@@ -253,10 +344,14 @@ static int pci_bios_write(unsigned int s
"c" (value),
"b" (bx),
"D" ((long)reg),
@@ -7277,7 +7432,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -265,10 +343,14 @@ static int pci_bios_write(unsigned int s
+@@ -265,10 +360,14 @@ static int pci_bios_write(unsigned int s
"c" (value),
"b" (bx),
"D" ((long)reg),
@@ -7294,7 +7449,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -277,7 +359,8 @@ static int pci_bios_write(unsigned int s
+@@ -277,7 +376,8 @@ static int pci_bios_write(unsigned int s
"c" (value),
"b" (bx),
"D" ((long)reg),
@@ -7304,7 +7459,7 @@
break;
}
-@@ -430,10 +513,13 @@ struct irq_routing_table * __devinit pci
+@@ -430,10 +530,13 @@ struct irq_routing_table * __devinit pci
DBG("PCI: Fetching IRQ routing table... ");
__asm__("push %%es\n\t"
@@ -7319,7 +7474,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -444,7 +530,8 @@ struct irq_routing_table * __devinit pci
+@@ -444,7 +547,8 @@ struct irq_routing_table * __devinit pci
"1" (0),
"D" ((long) &opt),
"S" (&pci_indirect),
@@ -7329,7 +7484,7 @@
: "memory");
DBG("OK ret=%d, size=%d, map=%x\n", ret, opt.size, map);
if (ret & 0xff00)
-@@ -468,7 +555,10 @@ int pcibios_set_irq_routing(struct pci_d
+@@ -468,7 +572,10 @@ int pcibios_set_irq_routing(struct pci_d
{
int ret;
@@ -7341,7 +7496,7 @@
"jc 1f\n\t"
"xor %%ah, %%ah\n"
"1:"
-@@ -476,7 +566,8 @@ int pcibios_set_irq_routing(struct pci_d
+@@ -476,7 +583,8 @@ int pcibios_set_irq_routing(struct pci_d
: "0" (PCIBIOS_SET_PCI_HW_INT),
"b" ((dev->bus->number << 8) | dev->devfn),
"c" ((irq << 8) | (pin + 10)),
@@ -7380,6 +7535,29 @@
/* Ugly but avoids duplication */
#include "../../../fs/binfmt_elf.c"
+@@ -226,8 +233,20 @@ ia32_setup_arg_pages (struct linux_binpr
+ mpnt->vm_flags = VM_STACK_FLAGS & ~VM_EXEC;
+ else
+ mpnt->vm_flags = VM_STACK_FLAGS;
+- mpnt->vm_page_prot = (mpnt->vm_flags & VM_EXEC)?
+- PAGE_COPY_EXEC: PAGE_COPY;
++
++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC)
++ if (current-<mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) {
++ mpnt->vm_flags &= ~VM_EXEC;
++
++#ifdef CONFIG_PAX_MPROTECT
++ if (current->mm->pax_flags & MF_PAX_MPROTECT)
++ mpnt->vm_flags &= ~VM_MAYEXEC;
++#endif
++
++ }
++#endif
++
++ mpnt->vm_page_prot = vm_get_page_prot(mpnt->vm_flags);
+ if ((ret = insert_vm_struct(current->mm, mpnt))) {
+ up_write(¤t->mm->mmap_sem);
+ kmem_cache_free(vm_area_cachep, mpnt);
diff -urNp linux-2.6.22.1/arch/ia64/ia32/ia32priv.h linux-2.6.22.1/arch/ia64/ia32/ia32priv.h
--- linux-2.6.22.1/arch/ia64/ia32/ia32priv.h 2007-07-10 14:56:30.000000000 -0400
+++ linux-2.6.22.1/arch/ia64/ia32/ia32priv.h 2007-08-02 11:38:45.000000000 -0400
@@ -7612,15 +7790,29 @@
#include <asm/dma.h>
#include <asm/ia32.h>
#include <asm/io.h>
-@@ -130,7 +130,7 @@ ia64_init_addr_space (void)
+@@ -130,8 +130,21 @@ ia64_init_addr_space (void)
vma->vm_mm = current->mm;
vma->vm_start = current->thread.rbs_bot & PAGE_MASK;
vma->vm_end = vma->vm_start + PAGE_SIZE;
- vma->vm_page_prot = protection_map[VM_DATA_DEFAULT_FLAGS & 0x7];
-+ vma->vm_page_prot = vm_get_page_prot(VM_DATA_DEFAULT_FLAGS);
vma->vm_flags = VM_DATA_DEFAULT_FLAGS|VM_GROWSUP|VM_ACCOUNT;
++
++#if defined(CONFIG_PAX_PAGEEXEC) || defined(CONFIG_PAX_SEGMEXEC)
++ if (current->mm->pax_flags & (MF_PAX_PAGEEXEC | MF_PAX_SEGMEXEC)) {
++ vma->vm_flags &= ~VM_EXEC;
++
++#ifdef CONFIG_PAX_MPROTECT
++ if (current->mm->pax_flags & MF_PAX_MPROTECT)
++ vma->vm_flags &= ~VM_MAYEXEC;
++#endif
++
++ }
++#endif
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/linux-2.6-grsec_full.patch?r1=1.1.2.15&r2=1.1.2.16&f=u
More information about the pld-cvs-commit
mailing list