commit:     1fcb85d82cad5b7b799e05df97d774548925a2e2
Author:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
AuthorDate: Thu Jul  7 07:56:33 2016 +0000
Commit:     Anthony G. Basile <blueness <AT> gentoo <DOT> org>
CommitDate: Thu Jul  7 07:56:33 2016 +0000
URL:        
https://gitweb.gentoo.org/proj/hardened-patchset.git/commit/?id=1fcb85d8

grsecurity-3.1-4.6.3-201607062159

 4.6.3/0000_README                                  |   2 +-
 ...> 4420_grsecurity-3.1-4.6.3-201607062159.patch} | 546 ++++++++++++++++-----
 2 files changed, 413 insertions(+), 135 deletions(-)

diff --git a/4.6.3/0000_README b/4.6.3/0000_README
index a40de90..00f1875 100644
--- a/4.6.3/0000_README
+++ b/4.6.3/0000_README
@@ -6,7 +6,7 @@ Patch:  1002_linux-4.6.3.patch
 From:  http://www.kernel.org
 Desc:  Linux 4.6.3
 
-Patch: 4420_grsecurity-3.1-4.6.3-201607060823.patch
+Patch: 4420_grsecurity-3.1-4.6.3-201607062159.patch
 From:  http://www.grsecurity.net
 Desc:  hardened-sources base patch from upstream grsecurity
 

diff --git a/4.6.3/4420_grsecurity-3.1-4.6.3-201607060823.patch 
b/4.6.3/4420_grsecurity-3.1-4.6.3-201607062159.patch
similarity index 99%
rename from 4.6.3/4420_grsecurity-3.1-4.6.3-201607060823.patch
rename to 4.6.3/4420_grsecurity-3.1-4.6.3-201607062159.patch
index 92e7d0d..169d0af 100644
--- a/4.6.3/4420_grsecurity-3.1-4.6.3-201607060823.patch
+++ b/4.6.3/4420_grsecurity-3.1-4.6.3-201607062159.patch
@@ -3541,7 +3541,7 @@ index ff0a68c..b312aa0 100644
                                 sizeof(struct omap_wd_timer_platform_data));
        WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
 diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c 
b/arch/arm/mach-s3c64xx/mach-smdk6410.c
-index 92ec8c3..3df2546 100644
+index 92ec8c3..3b09472 100644
 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
 +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
 @@ -240,7 +240,7 @@ static struct platform_device smdk6410_b_pwr_5v = {
@@ -3549,7 +3549,7 @@ index 92ec8c3..3df2546 100644
  #endif
  
 -static struct s3c_ide_platdata smdk6410_ide_pdata __initdata = {
-+static struct s3c_ide_platdata smdk6410_ide_pdata __initconst = {
++static const struct s3c_ide_platdata smdk6410_ide_pdata __initconst = {
        .setup_gpio     = s3c64xx_ide_setup_gpio,
  };
  
@@ -3795,7 +3795,7 @@ index c8c8b9e..c55cc79 100644
                atomic64_set(&mm->context.id, asid);
        }
 diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
-index ad58418..c0349f4 100644
+index ad58418..8267ca5 100644
 --- a/arch/arm/mm/fault.c
 +++ b/arch/arm/mm/fault.c
 @@ -25,6 +25,7 @@
@@ -4010,7 +4010,7 @@ index ad58418..c0349f4 100644
 +#else
 +              unsigned int bkpt;
 +
-+              if (!probe_kernel_address((const void *)pc, bkpt) && 
cpu_to_le32(bkpt) == 0xe12f1073) {
++              if (!probe_kernel_address((const unsigned int *)pc, bkpt) && 
cpu_to_le32(bkpt) == 0xe12f1073) {
 +#endif
 +                      current->thread.error_code = ifsr;
 +                      current->thread.trap_no = 0;
@@ -20635,6 +20635,22 @@ index fe884e1..46149ae 100644
  static inline void release_dma_lock(unsigned long flags)
  {
        spin_unlock_irqrestore(&dma_spin_lock, flags);
+diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h
+index 53748c4..283147d 100644
+--- a/arch/x86/include/asm/efi.h
++++ b/arch/x86/include/asm/efi.h
+@@ -168,6 +168,11 @@ static inline bool efi_is_native(void)
+ 
+ static inline bool efi_runtime_supported(void)
+ {
++
++#if defined(CONFIG_X86_32) && defined(CONFIG_PAX_KERNEXEC)
++      return false;
++#endif
++
+       if (efi_is_native())
+               return true;
+ 
 diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
 index 15340e3..f338653 100644
 --- a/arch/x86/include/asm/elf.h
@@ -22128,7 +22144,7 @@ index cdaa58c..ae30f0d 100644
  
  static inline void pud_clear(pud_t *pudp)
 diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
-index 97f3242..0d17a84 100644
+index 97f3242..2603a59 100644
 --- a/arch/x86/include/asm/pgtable.h
 +++ b/arch/x86/include/asm/pgtable.h
 @@ -54,6 +54,7 @@ extern struct mm_struct *pgd_page_get_mm(struct page *page);
@@ -22236,6 +22252,15 @@ index 97f3242..0d17a84 100644
  }
  
  static inline pte_t pte_mkdirty(pte_t pte)
+@@ -430,7 +497,7 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, 
pgprot_t newprot)
+ 
+ #define canon_pgprot(p) __pgprot(massage_pgprot(p))
+ 
+-static inline int is_new_memtype_allowed(u64 paddr, unsigned long size,
++static inline int is_new_memtype_allowed(u64 paddr, u64 size,
+                                        enum page_cache_mode pcm,
+                                        enum page_cache_mode new_pcm)
+ {
 @@ -473,6 +540,16 @@ pte_t *populate_extra_pte(unsigned long vaddr);
  #endif
  
@@ -34983,6 +35008,103 @@ index f989132..7c590d6 100644
 +quote:="
 +obj-$(CONFIG_X86_64)          += uderef_64.o
 +CFLAGS_uderef_64.o            := $(subst 
$(quote),,$(CONFIG_ARCH_HWEIGHT_CFLAGS)) -fcall-saved-rax
+diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c
+index 99bfb19..237fb1d 100644
+--- a/arch/x86/mm/dump_pagetables.c
++++ b/arch/x86/mm/dump_pagetables.c
+@@ -27,6 +27,7 @@
+ struct pg_state {
+       int level;
+       pgprot_t current_prot;
++      pgprot_t current_prots[5];
+       unsigned long start_address;
+       unsigned long current_address;
+       const struct addr_marker *marker;
+@@ -184,6 +185,23 @@ static unsigned long normalize_addr(unsigned long u)
+ #endif
+ }
+ 
++static pgprot_t merge_prot(pgprot_t old_prot, pgprot_t new_prot)
++{
++      if (!(pgprot_val(new_prot) & _PAGE_PRESENT))
++              return new_prot;
++
++      if (!(pgprot_val(old_prot) & _PAGE_PRESENT))
++              return new_prot;
++
++      if (pgprot_val(old_prot) & _PAGE_NX)
++              pgprot_val(new_prot) |= _PAGE_NX;
++
++      if (!(pgprot_val(old_prot) & _PAGE_RW))
++              pgprot_val(new_prot) &= ~_PAGE_RW;
++
++      return new_prot;
++}
++
+ /*
+  * This function gets called on a break in a continuous series
+  * of PTE entries; the next one is different so we need to
+@@ -200,11 +218,13 @@ static void note_page(struct seq_file *m, struct 
pg_state *st,
+        * we have now. "break" is either changing perms, levels or
+        * address space marker.
+        */
++      new_prot = merge_prot(st->current_prots[level - 1], new_prot);
+       prot = pgprot_val(new_prot);
+       cur = pgprot_val(st->current_prot);
+ 
+       if (!st->level) {
+               /* First entry */
++              st->current_prots[0] = __pgprot(_PAGE_RW);
+               st->current_prot = new_prot;
+               st->level = level;
+               st->marker = address_markers;
+@@ -216,9 +236,8 @@ static void note_page(struct seq_file *m, struct pg_state 
*st,
+               const char *unit = units;
+               unsigned long delta;
+               int width = sizeof(unsigned long) * 2;
+-              pgprotval_t pr = pgprot_val(st->current_prot);
+ 
+-              if (st->check_wx && (pr & _PAGE_RW) && !(pr & _PAGE_NX)) {
++              if (st->check_wx && (cur & _PAGE_RW) && !(cur & _PAGE_NX)) {
+                       WARN_ONCE(1,
+                                 "x86/mm: Found insecure W+X mapping at 
address %p/%pS\n",
+                                 (void *)st->start_address,
+@@ -304,9 +323,10 @@ static void walk_pmd_level(struct seq_file *m, struct 
pg_state *st, pud_t addr,
+       start = (pmd_t *) pud_page_vaddr(addr);
+       for (i = 0; i < PTRS_PER_PMD; i++) {
+               st->current_address = normalize_addr(P + i * PMD_LEVEL_MULT);
++              prot = pmd_flags(*start);
++              st->current_prots[3] = merge_prot(st->current_prots[2], 
__pgprot(prot));
+               if (!pmd_none(*start)) {
+                       if (pmd_large(*start) || !pmd_present(*start)) {
+-                              prot = pmd_flags(*start);
+                               note_page(m, st, __pgprot(prot), 3);
+                       } else {
+                               walk_pte_level(m, st, *start,
+@@ -337,9 +357,10 @@ static void walk_pud_level(struct seq_file *m, struct 
pg_state *st, pgd_t addr,
+ 
+       for (i = 0; i < PTRS_PER_PUD; i++) {
+               st->current_address = normalize_addr(P + i * PUD_LEVEL_MULT);
++              prot = pud_flags(*start);
++              st->current_prots[2] = merge_prot(st->current_prots[1], 
__pgprot(start->pud));
+               if (!pud_none(*start)) {
+                       if (pud_large(*start) || !pud_present(*start)) {
+-                              prot = pud_flags(*start);
+                               note_page(m, st, __pgprot(prot), 2);
+                       } else {
+                               walk_pmd_level(m, st, *start,
+@@ -395,9 +416,10 @@ static void ptdump_walk_pgd_level_core(struct seq_file 
*m, pgd_t *pgd,
+ 
+       for (i = 0; i < PTRS_PER_PGD; i++) {
+               st.current_address = normalize_addr(i * PGD_LEVEL_MULT);
++              prot = pgd_flags(*start);
++              st.current_prots[1] = __pgprot(prot);
+               if (!pgd_none(*start) && !is_hypervisor_range(i)) {
+                       if (pgd_large(*start) || !pgd_present(*start)) {
+-                              prot = pgd_flags(*start);
+                               note_page(m, &st, __pgprot(prot), 1);
+                       } else {
+                               walk_pud_level(m, &st, *start,
 diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
 index 82447b3..95c2b03 100644
 --- a/arch/x86/mm/extable.c
@@ -36034,7 +36156,7 @@ index 9d56f27..0d15fff 100644
                        (unsigned long)(&__init_begin),
                        (unsigned long)(&__init_end));
 diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
-index bd7a9b9..2cc3f46 100644
+index bd7a9b9..94d80a5 100644
 --- a/arch/x86/mm/init_32.c
 +++ b/arch/x86/mm/init_32.c
 @@ -62,33 +62,6 @@ static noinline int do_test_wp_bit(void);
@@ -36262,6 +36384,15 @@ index bd7a9b9..2cc3f46 100644
                ((unsigned long)&_etext - (unsigned long)&_text) >> 10);
  
        /*
+@@ -871,7 +873,7 @@ static noinline int do_test_wp_bit(void)
+ const int rodata_test_data = 0xC3;
+ EXPORT_SYMBOL_GPL(rodata_test_data);
+ 
+-int kernel_set_to_readonly __read_mostly;
++int kernel_set_to_readonly __read_only;
+ 
+ void set_kernel_text_rw(void)
+ {
 @@ -881,6 +883,7 @@ void set_kernel_text_rw(void)
        if (!kernel_set_to_readonly)
                return;
@@ -36287,7 +36418,7 @@ index bd7a9b9..2cc3f46 100644
        /*
         * This comes from is_kernel_text upper limit. Also HPAGE where used:
         */
-@@ -923,26 +927,49 @@ void mark_rodata_ro(void)
+@@ -923,26 +927,52 @@ void mark_rodata_ro(void)
        unsigned long start = PFN_ALIGN(_text);
        unsigned long size = PFN_ALIGN(_etext) - start;
  
@@ -36295,49 +36426,48 @@ index bd7a9b9..2cc3f46 100644
 -      printk(KERN_INFO "Write protecting the kernel text: %luk\n",
 -              size >> 10);
 +#ifdef CONFIG_PAX_KERNEXEC
-+      {
-+              /* PaX: limit KERNEL_CS to actual size */
-+              unsigned long limit;
-+              struct desc_struct d;
-+              int cpu;
++      /* PaX: limit KERNEL_CS to actual size */
++      unsigned long limit;
++      struct desc_struct d;
++      int cpu;
  
--      kernel_set_to_readonly = 1;
-+              limit = paravirt_enabled() ? ktva_ktla(0xffffffff) : (unsigned 
long)&_etext;
-+              limit = (limit - 1UL) >> PAGE_SHIFT;
++      limit = paravirt_enabled() ? ktva_ktla(0xffffffff) : (unsigned 
long)&_etext;
++      limit = (limit - 1UL) >> PAGE_SHIFT;
 +
-+              memset(__LOAD_PHYSICAL_ADDR + PAGE_OFFSET, POISON_FREE_INITMEM, 
PAGE_SIZE);
-+              for (cpu = 0; cpu < nr_cpu_ids; cpu++) {
-+                      pack_descriptor(&d, 
get_desc_base(&get_cpu_gdt_table(cpu)[GDT_ENTRY_KERNEL_CS]), limit, 0x9B, 0xC);
-+                      write_gdt_entry(get_cpu_gdt_table(cpu), 
GDT_ENTRY_KERNEL_CS, &d, DESCTYPE_S);
-+                      write_gdt_entry(get_cpu_gdt_table(cpu), 
GDT_ENTRY_KERNEXEC_KERNEL_CS, &d, DESCTYPE_S);
-+              }
-+
-+              if (config_enabled(CONFIG_MODULES))
-+                      set_memory_4k((unsigned long)MODULES_EXEC_VADDR, 
(MODULES_EXEC_END - MODULES_EXEC_VADDR) >> PAGE_SHIFT);
++      memset(__LOAD_PHYSICAL_ADDR + PAGE_OFFSET, POISON_FREE_INITMEM, 
PAGE_SIZE);
++      for (cpu = 0; cpu < nr_cpu_ids; cpu++) {
++              pack_descriptor(&d, 
get_desc_base(&get_cpu_gdt_table(cpu)[GDT_ENTRY_KERNEL_CS]), limit, 0x9B, 0xC);
++              write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_KERNEL_CS, 
&d, DESCTYPE_S);
++              write_gdt_entry(get_cpu_gdt_table(cpu), 
GDT_ENTRY_KERNEXEC_KERNEL_CS, &d, DESCTYPE_S);
 +      }
++
++#ifdef CONFIG_MODULES
++      set_memory_4k((unsigned long)MODULES_EXEC_VADDR, (MODULES_EXEC_END - 
MODULES_EXEC_VADDR) >> PAGE_SHIFT);
++#endif
 +#endif
 +
 +      start = ktla_ktva(start);
++#ifdef CONFIG_PAX_KERNEXEC
 +      /* PaX: make KERNEL_CS read-only */
-+      if (config_enabled(CONFIG_PAX_KERNEXEC) && !paravirt_enabled()) {
-+              set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
-+              printk(KERN_INFO "Write protecting the kernel text: %luk\n", 
size >> 10);
-+
-+              kernel_set_to_readonly = 1;
++      if (!paravirt_enabled()) {
++#endif
+       kernel_set_to_readonly = 1;
  
++      set_pages_ro(virt_to_page(start), size >> PAGE_SHIFT);
++      printk(KERN_INFO "Write protecting the kernel text: %luk\n", size >> 
10);
++
  #ifdef CONFIG_CPA_DEBUG
 -      printk(KERN_INFO "Testing CPA: Reverting %lx-%lx\n",
 -              start, start+size);
--      set_pages_rw(virt_to_page(start), size>>PAGE_SHIFT);
-+              printk(KERN_INFO "Testing CPA: Reverting %lx-%lx\n", start, 
start+size);
-+              set_pages_rw(virt_to_page(start), size>>PAGE_SHIFT);
++      printk(KERN_INFO "Testing CPA: Reverting %lx-%lx\n", start, start+size);
+       set_pages_rw(virt_to_page(start), size>>PAGE_SHIFT);
  
--      printk(KERN_INFO "Testing CPA: write protecting again\n");
--      set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT);
-+              printk(KERN_INFO "Testing CPA: write protecting again\n");
-+              set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT);
+       printk(KERN_INFO "Testing CPA: write protecting again\n");
+       set_pages_ro(virt_to_page(start), size>>PAGE_SHIFT);
  #endif
++#ifdef CONFIG_PAX_KERNEXEC
 +      }
++#endif
  
        start += size;
 -      size = (unsigned long)__end_rodata - start;
@@ -36350,7 +36480,7 @@ index bd7a9b9..2cc3f46 100644
  
  #ifdef CONFIG_CPA_DEBUG
 diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
-index 214afda..444aa18 100644
+index 214afda..7fd6c3f 100644
 --- a/arch/x86/mm/init_64.c
 +++ b/arch/x86/mm/init_64.c
 @@ -138,7 +138,7 @@ int kernel_ident_mapping_init(struct x86_mapping_info 
*info, pgd_t *pgd_page,
@@ -36483,6 +36613,15 @@ index 214afda..444aa18 100644
                spin_unlock(&init_mm.page_table_lock);
                pgd_changed = true;
        }
+@@ -1078,7 +1106,7 @@ void __init mem_init(void)
+ const int rodata_test_data = 0xC3;
+ EXPORT_SYMBOL_GPL(rodata_test_data);
+ 
+-int kernel_set_to_readonly;
++int kernel_set_to_readonly __read_only;
+ 
+ void set_kernel_text_rw(void)
+ {
 @@ -1107,8 +1135,7 @@ void set_kernel_text_ro(void)
        if (!kernel_set_to_readonly)
                return;
@@ -36493,29 +36632,34 @@ index 214afda..444aa18 100644
  
        /*
         * Set the kernel identity mapping for text RO.
-@@ -1118,15 +1145,20 @@ void set_kernel_text_ro(void)
- 
+@@ -1119,18 +1146,23 @@ void set_kernel_text_ro(void)
  void mark_rodata_ro(void)
  {
-+      unsigned long addr;
        unsigned long start = PFN_ALIGN(_text);
-       unsigned long rodata_start = PFN_ALIGN(__start_rodata);
 +#ifdef CONFIG_PAX_KERNEXEC
++      unsigned long addr;
 +      unsigned long end = PFN_ALIGN(_sdata);
 +      unsigned long text_end = end;
 +#else
+       unsigned long rodata_start = PFN_ALIGN(__start_rodata);
        unsigned long end = (unsigned long) &__end_rodata_hpage_align;
        unsigned long text_end = PFN_ALIGN(&__stop___ex_table);
-+#endif
        unsigned long rodata_end = PFN_ALIGN(&__end_rodata);
++#endif
        unsigned long all_end;
  
 -      printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
 -             (end - start) >> 10);
-+      printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n", 
(end - start) >> 10);
-       set_memory_ro(start, (end - start) >> PAGE_SHIFT);
- 
+-      set_memory_ro(start, (end - start) >> PAGE_SHIFT);
+-
        kernel_set_to_readonly = 1;
+ 
++      printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n", 
(end - start) >> 10);
++      set_memory_ro(start, (end - start) >> PAGE_SHIFT);
++
+       /*
+        * The rodata/data/bss/brk section (but not the kernel text!)
+        * should also be not-executable.
 @@ -1156,12 +1188,54 @@ void mark_rodata_ro(void)
        set_memory_ro(start, (end-start) >> PAGE_SHIFT);
  #endif
@@ -36588,7 +36732,7 @@ index 9c0ff04..9020d5f 100644
  
        return (void *)vaddr;
 diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
-index 0d8d53d..5f7315c 100644
+index 0d8d53d..74815a4 100644
 --- a/arch/x86/mm/ioremap.c
 +++ b/arch/x86/mm/ioremap.c
 @@ -59,8 +59,8 @@ static int __ioremap_check_ram(unsigned long start_pfn, 
unsigned long nr_pages,
@@ -36602,6 +36746,15 @@ index 0d8d53d..5f7315c 100644
                        return 1;
  
        return 0;
+@@ -81,7 +81,7 @@ static int __ioremap_check_ram(unsigned long start_pfn, 
unsigned long nr_pages,
+  * caller shouldn't need to know that small detail.
+  */
+ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
+-              unsigned long size, enum page_cache_mode pcm, void *caller)
++              resource_size_t size, enum page_cache_mode pcm, void *caller)
+ {
+       unsigned long offset, vaddr;
+       resource_size_t pfn, last_pfn, last_addr;
 @@ -332,7 +332,7 @@ EXPORT_SYMBOL(ioremap_prot);
   *
   * Caller must ensure there is only one unmapping for the same pointer.
@@ -36876,7 +37029,7 @@ index f70c1ff..fdb449c 100644
        unsigned long uninitialized_var(pfn_align);
        int i, nid;
 diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
-index 01be9ec..f4643d7 100644
+index 01be9ec..2b8c8c7 100644
 --- a/arch/x86/mm/pageattr.c
 +++ b/arch/x86/mm/pageattr.c
 @@ -258,7 +258,7 @@ static inline pgprot_t static_protections(pgprot_t prot, 
unsigned long address,
@@ -36888,7 +37041,7 @@ index 01be9ec..f4643d7 100644
  #endif
  
        /*
-@@ -266,8 +266,8 @@ static inline pgprot_t static_protections(pgprot_t prot, 
unsigned long address,
+@@ -266,14 +266,14 @@ static inline pgprot_t static_protections(pgprot_t prot, 
unsigned long address,
         * Does not cover __inittext since that is gone later on. On
         * 64bit we do not enforce !NX on the low mapping
         */
@@ -36899,6 +37052,13 @@ index 01be9ec..f4643d7 100644
  
        /*
         * The .rodata section needs to be read-only. Using the pfn
+        * catches all aliases.
+        */
+-      if (within(pfn, __pa_symbol(__start_rodata) >> PAGE_SHIFT,
++      if (kernel_set_to_readonly && within(pfn, __pa_symbol(__start_rodata) 
>> PAGE_SHIFT,
+                  __pa_symbol(__end_rodata) >> PAGE_SHIFT))
+               pgprot_val(forbidden) |= _PAGE_RW;
+ 
 @@ -314,6 +314,13 @@ static inline pgprot_t static_protections(pgprot_t prot, 
unsigned long address,
        }
  #endif
@@ -48037,7 +48197,7 @@ index 93ad8a5..48f0a57 100644
 -int sis_max_ioctl = ARRAY_SIZE(sis_ioctls);
 +const int sis_max_ioctl = ARRAY_SIZE(sis_ioctls);
 diff --git a/drivers/gpu/drm/sti/sti_cursor.c 
b/drivers/gpu/drm/sti/sti_cursor.c
-index 3abb400..4fd8a65 100644
+index 3abb400..47ff1c9 100644
 --- a/drivers/gpu/drm/sti/sti_cursor.c
 +++ b/drivers/gpu/drm/sti/sti_cursor.c
 @@ -131,7 +131,7 @@ static int cursor_dbg_show(struct seq_file *s, void *data)
@@ -48045,7 +48205,7 @@ index 3abb400..4fd8a65 100644
  }
  
 -static struct drm_info_list cursor_debugfs_files[] = {
-+static struct drm_info_list cursor_debugfs_files[] __read_only = {
++static drm_info_list_no_const cursor_debugfs_files[] __read_only = {
        { "cursor", cursor_dbg_show, 0, NULL },
  };
  
@@ -48055,14 +48215,13 @@ index 3abb400..4fd8a65 100644
  
 +      pax_open_kernel();
        for (i = 0; i < ARRAY_SIZE(cursor_debugfs_files); i++)
--              cursor_debugfs_files[i].data = cursor;
-+              const_cast(cursor_debugfs_files[i].data) = cursor;
+               cursor_debugfs_files[i].data = cursor;
 +      pax_close_kernel();
  
        return drm_debugfs_create_files(cursor_debugfs_files,
                                        ARRAY_SIZE(cursor_debugfs_files),
 diff --git a/drivers/gpu/drm/sti/sti_dvo.c b/drivers/gpu/drm/sti/sti_dvo.c
-index 25f7663..7ea4bf9 100644
+index 25f7663..db8f927 100644
 --- a/drivers/gpu/drm/sti/sti_dvo.c
 +++ b/drivers/gpu/drm/sti/sti_dvo.c
 @@ -197,7 +197,7 @@ static int dvo_dbg_show(struct seq_file *s, void *data)
@@ -48080,16 +48239,42 @@ index 25f7663..7ea4bf9 100644
  
 +      pax_open_kernel();
        for (i = 0; i < ARRAY_SIZE(dvo_debugfs_files); i++)
--              dvo_debugfs_files[i].data = dvo;
-+              const_cast(dvo_debugfs_files[i].data) = dvo;
+               dvo_debugfs_files[i].data = dvo;
 +      pax_close_kernel();
  
        return drm_debugfs_create_files(dvo_debugfs_files,
                                        ARRAY_SIZE(dvo_debugfs_files),
 diff --git a/drivers/gpu/drm/sti/sti_gdp.c b/drivers/gpu/drm/sti/sti_gdp.c
-index ff3d3e7..be8c837 100644
+index ff3d3e7..da4db0f 100644
 --- a/drivers/gpu/drm/sti/sti_gdp.c
 +++ b/drivers/gpu/drm/sti/sti_gdp.c
+@@ -297,22 +297,22 @@ static int gdp_node_dbg_show(struct seq_file *s, void 
*arg)
+       return 0;
+ }
+ 
+-static struct drm_info_list gdp0_debugfs_files[] = {
++static drm_info_list_no_const gdp0_debugfs_files[] __read_only = {
+       { "gdp0", gdp_dbg_show, 0, NULL },
+       { "gdp0_node", gdp_node_dbg_show, 0, NULL },
+ };
+ 
+-static struct drm_info_list gdp1_debugfs_files[] = {
++static drm_info_list_no_const gdp1_debugfs_files[] __read_only = {
+       { "gdp1", gdp_dbg_show, 0, NULL },
+       { "gdp1_node", gdp_node_dbg_show, 0, NULL },
+ };
+ 
+-static struct drm_info_list gdp2_debugfs_files[] = {
++static drm_info_list_no_const gdp2_debugfs_files[] __read_only = {
+       { "gdp2", gdp_dbg_show, 0, NULL },
+       { "gdp2_node", gdp_node_dbg_show, 0, NULL },
+ };
+ 
+-static struct drm_info_list gdp3_debugfs_files[] = {
++static drm_info_list_no_const gdp3_debugfs_files[] __read_only = {
+       { "gdp3", gdp_dbg_show, 0, NULL },
+       { "gdp3_node", gdp_node_dbg_show, 0, NULL },
+ };
 @@ -320,7 +320,7 @@ static struct drm_info_list gdp3_debugfs_files[] = {
  static int gdp_debugfs_init(struct sti_gdp *gdp, struct drm_minor *minor)
  {
@@ -48105,8 +48290,7 @@ index ff3d3e7..be8c837 100644
  
 +      pax_open_kernel();
        for (i = 0; i < nb_files; i++)
--              gdp_debugfs_files[i].data = gdp;
-+              const_cast(gdp_debugfs_files[i].data) = gdp;
+               gdp_debugfs_files[i].data = gdp;
 +      pax_close_kernel();
  
        return drm_debugfs_create_files(gdp_debugfs_files,
@@ -48137,7 +48321,7 @@ index ec0d017..0fe03fd 100644
        return drm_debugfs_create_files(hda_debugfs_files,
                                        ARRAY_SIZE(hda_debugfs_files),
 diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
-index 6ef0715..b5a9e51 100644
+index 6ef0715..dbc27b0 100644
 --- a/drivers/gpu/drm/sti/sti_hdmi.c
 +++ b/drivers/gpu/drm/sti/sti_hdmi.c
 @@ -694,7 +694,7 @@ static int hdmi_dbg_show(struct seq_file *s, void *data)
@@ -48155,8 +48339,7 @@ index 6ef0715..b5a9e51 100644
  
 +      pax_open_kernel();
        for (i = 0; i < ARRAY_SIZE(hdmi_debugfs_files); i++)
--              hdmi_debugfs_files[i].data = hdmi;
-+              const_cast(hdmi_debugfs_files[i].data) = hdmi;
+               hdmi_debugfs_files[i].data = hdmi;
 +      pax_close_kernel();
  
        return drm_debugfs_create_files(hdmi_debugfs_files,
@@ -48187,10 +48370,23 @@ index e05b0dc..a40a642 100644
        return drm_debugfs_create_files(hqvdp_debugfs_files,
                                        ARRAY_SIZE(hqvdp_debugfs_files),
 diff --git a/drivers/gpu/drm/sti/sti_mixer.c b/drivers/gpu/drm/sti/sti_mixer.c
-index e7425c3..ce9dada 100644
+index e7425c3..d53380c 100644
 --- a/drivers/gpu/drm/sti/sti_mixer.c
 +++ b/drivers/gpu/drm/sti/sti_mixer.c
-@@ -190,7 +190,7 @@ static struct drm_info_list mixer1_debugfs_files[] = {
+@@ -179,18 +179,18 @@ static int mixer_dbg_show(struct seq_file *s, void *arg)
+       return 0;
+ }
+ 
+-static struct drm_info_list mixer0_debugfs_files[] = {
++static drm_info_list_no_const mixer0_debugfs_files[] __read_only = {
+       { "mixer_main", mixer_dbg_show, 0, NULL },
+ };
+ 
+-static struct drm_info_list mixer1_debugfs_files[] = {
++static drm_info_list_no_const mixer1_debugfs_files[] __read_only = {
+       { "mixer_aux", mixer_dbg_show, 0, NULL },
+ };
+ 
  static int mixer_debugfs_init(struct sti_mixer *mixer, struct drm_minor 
*minor)
  {
        unsigned int i;
@@ -48205,8 +48401,7 @@ index e7425c3..ce9dada 100644
  
 +      pax_open_kernel();
        for (i = 0; i < nb_files; i++)
--              mixer_debugfs_files[i].data = mixer;
-+              const_cast(mixer_debugfs_files[i].data) = mixer;
+               mixer_debugfs_files[i].data = mixer;
 +      pax_close_kernel();
  
        return drm_debugfs_create_files(mixer_debugfs_files,
@@ -48237,7 +48432,7 @@ index 2c99016..62597fd 100644
        return drm_debugfs_create_files(tvout_debugfs_files,
                                        ARRAY_SIZE(tvout_debugfs_files),
 diff --git a/drivers/gpu/drm/sti/sti_vid.c b/drivers/gpu/drm/sti/sti_vid.c
-index 5a2c5dc..315979b0 100644
+index 5a2c5dc..c4f2be6 100644
 --- a/drivers/gpu/drm/sti/sti_vid.c
 +++ b/drivers/gpu/drm/sti/sti_vid.c
 @@ -125,7 +125,7 @@ static int vid_dbg_show(struct seq_file *s, void *arg)
@@ -48255,8 +48450,7 @@ index 5a2c5dc..315979b0 100644
  
 +      pax_open_kernel();
        for (i = 0; i < ARRAY_SIZE(vid_debugfs_files); i++)
--              vid_debugfs_files[i].data = vid;
-+              const_cast(vid_debugfs_files[i].data) = vid;
+               vid_debugfs_files[i].data = vid;
 +      pax_close_kernel();
  
        return drm_debugfs_create_files(vid_debugfs_files,
@@ -51999,7 +52193,7 @@ index 6b304eb..6e3a1413 100644
                 * Theoretically we do not have to handle this IRQ,
                 * but in Linux this does not cause problems and is
 diff --git a/drivers/irqchip/irq-mmp.c b/drivers/irqchip/irq-mmp.c
-index 013fc96..756ae4a 100644
+index 013fc96..36a9a97 100644
 --- a/drivers/irqchip/irq-mmp.c
 +++ b/drivers/irqchip/irq-mmp.c
 @@ -122,7 +122,7 @@ static void icu_unmask_irq(struct irq_data *d)
@@ -52007,7 +52201,7 @@ index 013fc96..756ae4a 100644
  }
  
 -struct irq_chip icu_irq_chip = {
-+struct irq_chip icu_irq_chip __read_only = {
++irq_chip_no_const icu_irq_chip __read_only = {
        .name           = "icu_irq",
        .irq_mask       = icu_mask_irq,
        .irq_mask_ack   = icu_mask_ack_irq,
@@ -60975,6 +61169,19 @@ index 4048fc5..333809f 100644
  
  /**
   * bnx2x_config_rx_mode - Send and RX_MODE ramrod according to the provided 
parameters.
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index c39a7f5..f145270 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -6149,7 +6149,7 @@ init_err_free:
+  * this device has been detected.
+  */
+ static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
+-                                             pci_channel_state_t state)
++                                             enum pci_channel_state state)
+ {
+       struct net_device *netdev = pci_get_drvdata(pdev);
+ 
 diff --git a/drivers/net/ethernet/broadcom/tg3.c 
b/drivers/net/ethernet/broadcom/tg3.c
 index 3010080..49824f1 100644
 --- a/drivers/net/ethernet/broadcom/tg3.c
@@ -112642,10 +112849,48 @@ index cc514da..2895466 100644
        if (res < 0) {
                free_page((unsigned long) buf);
 diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
-index a4ff5d0..6034cb5 100644
+index a4ff5d0..43d5748 100644
 --- a/fs/overlayfs/inode.c
 +++ b/fs/overlayfs/inode.c
-@@ -347,6 +347,9 @@ struct inode *ovl_d_select_inode(struct dentry *dentry, 
unsigned file_flags)
+@@ -59,16 +59,37 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr)
+       if (err)
+               goto out;
+ 
++      if (attr->ia_valid & ATTR_SIZE) {
++              struct inode *realinode = d_inode(ovl_dentry_real(dentry));
++
++              err = -ETXTBSY;
++              if (atomic_read(&realinode->i_writecount) < 0)
++                      goto out_drop_write;
++      }
++
+       err = ovl_copy_up(dentry);
+       if (!err) {
++              struct inode *winode = NULL;
++
+               upperdentry = ovl_dentry_upper(dentry);
+ 
++              if (attr->ia_valid & ATTR_SIZE) {
++                      winode = d_inode(upperdentry);
++                      err = get_write_access(winode);
++                      if (err)
++                              goto out_drop_write;
++              }
++
+               inode_lock(upperdentry->d_inode);
+               err = notify_change(upperdentry, attr, NULL);
+               if (!err)
+                       ovl_copyattr(upperdentry->d_inode, dentry->d_inode);
+               inode_unlock(upperdentry->d_inode);
++
++              if (winode)
++                      put_write_access(winode);
+       }
++out_drop_write:
+       ovl_drop_write(dentry);
+ out:
+       return err;
+@@ -347,6 +368,9 @@ struct inode *ovl_d_select_inode(struct dentry *dentry, 
unsigned file_flags)
        if (d_is_dir(dentry))
                return d_backing_inode(dentry);
  
@@ -112656,7 +112901,7 @@ index a4ff5d0..6034cb5 100644
        if (ovl_open_need_copy_up(file_flags, type, realpath.dentry)) {
                err = ovl_want_write(dentry);
 diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
-index 791235e..46ecd93 100644
+index 791235e..f6aecf4 100644
 --- a/fs/overlayfs/super.c
 +++ b/fs/overlayfs/super.c
 @@ -194,7 +194,7 @@ void ovl_path_lower(struct dentry *dentry, struct path 
*path)
@@ -112679,6 +112924,25 @@ index 791235e..46ecd93 100644
        struct dentry *root_dentry;
        struct ovl_entry *oe;
        struct ovl_fs *ufs;
+@@ -1070,11 +1070,13 @@ static int ovl_fill_super(struct super_block *sb, void 
*data, int silent)
+               if (err < 0)
+                       goto out_put_workdir;
+ 
+-              if (!err) {
+-                      pr_err("overlayfs: upper fs needs to support 
d_type.\n");
+-                      err = -EINVAL;
+-                      goto out_put_workdir;
+-              }
++              /*
++               * We allowed this configuration and don't want to
++               * break users over kernel upgrade. So warn instead
++               * of erroring out.
++               */
++              if (!err)
++                      pr_warn("overlayfs: upper fs needs to support 
d_type.\n");
+       }
+ 
+       err = -ENOMEM;
 diff --git a/fs/pipe.c b/fs/pipe.c
 index 0d3f516..91735ad 100644
 --- a/fs/pipe.c
@@ -120479,10 +120743,10 @@ index 0000000..9adc75c
 +}
 diff --git a/grsecurity/gracl_cap.c b/grsecurity/gracl_cap.c
 new file mode 100644
-index 0000000..1a94c11
+index 0000000..8747091
 --- /dev/null
 +++ b/grsecurity/gracl_cap.c
-@@ -0,0 +1,127 @@
+@@ -0,0 +1,96 @@
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +#include <linux/sched.h>
@@ -120493,7 +120757,7 @@ index 0000000..1a94c11
 +extern const char *captab_log[];
 +extern int captab_log_entries;
 +
-+int gr_learn_cap(const struct task_struct *task, const struct cred *cred, 
const int cap)
++int gr_learn_cap(const struct task_struct *task, const struct cred *cred, 
const int cap, bool log)
 +{
 +      struct acl_subject_label *curracl;
 +
@@ -120503,7 +120767,8 @@ index 0000000..1a94c11
 +      curracl = task->acl;
 +
 +      if (curracl->mode & (GR_LEARN | GR_INHERITLEARN)) {
-+              security_learn(GR_LEARN_AUDIT_MSG, task->role->rolename,
++              if (log)
++                      security_learn(GR_LEARN_AUDIT_MSG, task->role->rolename,
 +                             task->role->roletype, GR_GLOBAL_UID(cred->uid),
 +                             GR_GLOBAL_GID(cred->gid), task->exec_file ?
 +                             gr_to_filename(task->exec_file->f_path.dentry,
@@ -120516,7 +120781,7 @@ index 0000000..1a94c11
 +      return 0;
 +}
 +
-+int gr_task_acl_is_capable(const struct task_struct *task, const struct cred 
*cred, const int cap)
++int gr_task_acl_is_capable(const struct task_struct *task, const struct cred 
*cred, const int cap, bool log)
 +{
 +      struct acl_subject_label *curracl;
 +      kernel_cap_t cap_drop = __cap_empty_set, cap_mask = __cap_empty_set;
@@ -120547,7 +120812,7 @@ index 0000000..1a94c11
 +      }
 +
 +      if (!cap_raised(cap_drop, cap)) {
-+              if (cap_raised(cap_audit, cap))
++              if (log && cap_raised(cap_audit, cap))
 +                      gr_log_cap(GR_DO_AUDIT, GR_CAP_ACL_MSG2, task, 
captab_log[cap]);
 +              return 1;
 +      }
@@ -120557,10 +120822,10 @@ index 0000000..1a94c11
 +         to this rule to ensure any role transition involves what the 
full-learned
 +         policy believes in a privileged process
 +      */
-+      if (cap_raised(cred->cap_effective, cap) && gr_learn_cap(task, cred, 
cap))
++      if (cap_raised(cred->cap_effective, cap) && gr_learn_cap(task, cred, 
cap, log))
 +              return 1;
 +
-+      if ((cap >= 0) && (cap < captab_log_entries) && 
cap_raised(cred->cap_effective, cap) && !cap_raised(cap_audit, cap))
++      if (log && (cap >= 0) && (cap < captab_log_entries) && 
cap_raised(cred->cap_effective, cap) && !cap_raised(cap_audit, cap))
 +              gr_log_cap(GR_DONT_AUDIT, GR_CAP_ACL_MSG, task, 
captab_log[cap]);
 +
 +      return 0;
@@ -120569,45 +120834,13 @@ index 0000000..1a94c11
 +int
 +gr_acl_is_capable(const int cap)
 +{
-+      return gr_task_acl_is_capable(current, current_cred(), cap);
-+}
-+
-+int gr_task_acl_is_capable_nolog(const struct task_struct *task, const int 
cap)
-+{
-+      struct acl_subject_label *curracl;
-+      kernel_cap_t cap_drop = __cap_empty_set, cap_mask = __cap_empty_set;
-+
-+      if (!gr_acl_is_enabled())
-+              return 1;
-+
-+      curracl = task->acl;
-+
-+      cap_drop = curracl->cap_lower;
-+      cap_mask = curracl->cap_mask;
-+
-+      while ((curracl = curracl->parent_subject)) {
-+              /* if the cap isn't specified in the current computed mask but 
is specified in the
-+                 current level subject, and is lowered in the current level 
subject, then add
-+                 it to the set of dropped capabilities
-+                 otherwise, add the current level subject's mask to the 
current computed mask
-+               */
-+              if (!cap_raised(cap_mask, cap) && cap_raised(curracl->cap_mask, 
cap)) {
-+                      cap_raise(cap_mask, cap);
-+                      if (cap_raised(curracl->cap_lower, cap))
-+                              cap_raise(cap_drop, cap);
-+              }
-+      }
-+
-+      if (!cap_raised(cap_drop, cap))
-+              return 1;
-+
-+      return 0;
++      return gr_task_acl_is_capable(current, current_cred(), cap, true);
 +}
 +
 +int
 +gr_acl_is_capable_nolog(const int cap)
 +{
-+      return gr_task_acl_is_capable_nolog(current, cap);
++      return gr_task_acl_is_capable(current, current_cred(), cap, false);
 +}
 +
 diff --git a/grsecurity/gracl_compat.c b/grsecurity/gracl_compat.c
@@ -124706,7 +124939,7 @@ index 0000000..1964ab1c
 +}
 diff --git a/grsecurity/grsec_disabled.c b/grsecurity/grsec_disabled.c
 new file mode 100644
-index 0000000..0589fe2
+index 0000000..ba8d997
 --- /dev/null
 +++ b/grsecurity/grsec_disabled.c
 @@ -0,0 +1,445 @@
@@ -124752,7 +124985,7 @@ index 0000000..0589fe2
 +}
 +
 +int
-+gr_learn_cap(const struct task_struct *task, const struct cred *cred, const 
int cap)
++gr_learn_cap(const struct task_struct *task, const struct cred *cred, const 
int cap, bool log)
 +{
 +      return 0;
 +}
@@ -125157,10 +125390,10 @@ index 0000000..0589fe2
 +#endif
 diff --git a/grsecurity/grsec_exec.c b/grsecurity/grsec_exec.c
 new file mode 100644
-index 0000000..fb7531e
+index 0000000..808006e
 --- /dev/null
 +++ b/grsecurity/grsec_exec.c
-@@ -0,0 +1,189 @@
+@@ -0,0 +1,188 @@
 +#include <linux/kernel.h>
 +#include <linux/sched.h>
 +#include <linux/file.h>
@@ -125251,8 +125484,7 @@ index 0000000..fb7531e
 +#ifdef CONFIG_GRKERNSEC
 +extern int gr_acl_is_capable(const int cap);
 +extern int gr_acl_is_capable_nolog(const int cap);
-+extern int gr_task_acl_is_capable(const struct task_struct *task, const 
struct cred *cred, const int cap);
-+extern int gr_task_acl_is_capable_nolog(const struct task_struct *task, const 
int cap);
++extern int gr_task_acl_is_capable(const struct task_struct *task, const 
struct cred *cred, const int cap, bool log);
 +extern int gr_chroot_is_capable(const int cap);
 +extern int gr_chroot_is_capable_nolog(const int cap);
 +extern int gr_task_chroot_is_capable(const struct task_struct *task, const 
struct cred *cred, const int cap);
@@ -125316,7 +125548,7 @@ index 0000000..fb7531e
 +int gr_task_is_capable(const struct task_struct *task, const struct cred 
*cred, const int cap)
 +{
 +#ifdef CONFIG_GRKERNSEC
-+      if (gr_task_acl_is_capable(task, cred, cap) && 
gr_task_chroot_is_capable(task, cred, cap))
++      if (gr_task_acl_is_capable(task, cred, cap, true) && 
gr_task_chroot_is_capable(task, cred, cap))
 +              return 1;
 +      return 0;
 +#else
@@ -125335,10 +125567,10 @@ index 0000000..fb7531e
 +#endif
 +}
 +
-+int gr_task_is_capable_nolog(const struct task_struct *task, const int cap)
++int gr_task_is_capable_nolog(const struct task_struct *task, const struct 
cred *cred, const int cap)
 +{
 +#ifdef CONFIG_GRKERNSEC
-+      if (gr_task_acl_is_capable_nolog(task, cap) && 
gr_task_chroot_is_capable_nolog(task, cap))
++      if (gr_task_acl_is_capable(task, cred, cap, false) && 
gr_task_chroot_is_capable_nolog(task, cap))
 +              return 1;
 +      return 0;
 +#else
@@ -131130,7 +131362,7 @@ index 0000000..94ac4d2
 +#define GR_MSRWRITE_MSG "denied write to CPU MSR by "
 diff --git a/include/linux/grsecurity.h b/include/linux/grsecurity.h
 new file mode 100644
-index 0000000..4d5dae0
+index 0000000..749b915
 --- /dev/null
 +++ b/include/linux/grsecurity.h
 @@ -0,0 +1,259 @@
@@ -131180,7 +131412,7 @@ index 0000000..4d5dae0
 +int gr_check_user_change(kuid_t real, kuid_t effective, kuid_t fs);
 +int gr_check_group_change(kgid_t real, kgid_t effective, kgid_t fs);
 +
-+int gr_learn_cap(const struct task_struct *task, const struct cred *cred, 
const int cap);
++int gr_learn_cap(const struct task_struct *task, const struct cred *cred, 
const int cap, bool log);
 +
 +void gr_del_task_from_ip_table(struct task_struct *p);
 +
@@ -131247,7 +131479,7 @@ index 0000000..4d5dae0
 +int gr_is_capable(const int cap);
 +int gr_is_capable_nolog(const int cap);
 +int gr_task_is_capable(const struct task_struct *task, const struct cred 
*cred, const int cap);
-+int gr_task_is_capable_nolog(const struct task_struct *task, const int cap);
++int gr_task_is_capable_nolog(const struct task_struct *task, const struct 
cred *cred, const int cap);
 +
 +void gr_copy_label(struct task_struct *tsk);
 +void gr_handle_crash(struct task_struct *task, const int sig);
@@ -131686,6 +131918,18 @@ index c4de623..8f0044f 100644
  
  /*
   * irq_chip specific flags
+diff --git a/include/linux/irqchip/mmp.h b/include/linux/irqchip/mmp.h
+index c78a892..124e0b7 100644
+--- a/include/linux/irqchip/mmp.h
++++ b/include/linux/irqchip/mmp.h
+@@ -1,6 +1,6 @@
+ #ifndef       __IRQCHIP_MMP_H
+ #define       __IRQCHIP_MMP_H
+ 
+-extern struct irq_chip icu_irq_chip;
++extern irq_chip_no_const icu_irq_chip;
+ 
+ #endif        /* __IRQCHIP_MMP_H */
 diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h
 index dcca77c..8503b4f 100644
 --- a/include/linux/irqdesc.h
@@ -137723,7 +137967,7 @@ index 30f5362..8ed8ac9 100644
        void *pmi_pal;
        u8 *vbe_state_orig;             /*
 diff --git a/init/Kconfig b/init/Kconfig
-index 0dfd09d..c18a0e0 100644
+index 0dfd09d..177e567 100644
 --- a/init/Kconfig
 +++ b/init/Kconfig
 @@ -286,7 +286,8 @@ config FHANDLE
@@ -137752,7 +137996,15 @@ index 0dfd09d..c18a0e0 100644
        default n
        help
          Enables additional kernel features in a sake of checkpoint/restore.
-@@ -1699,7 +1702,7 @@ config SLUB_DEBUG
+@@ -1423,6 +1426,7 @@ config KALLSYMS_ALL
+ 
+ config KALLSYMS_ABSOLUTE_PERCPU
+       bool
++      depends on KALLSYMS
+       default X86_64 && SMP
+ 
+ config KALLSYMS_BASE_RELATIVE
+@@ -1699,7 +1703,7 @@ config SLUB_DEBUG
  
  config COMPAT_BRK
        bool "Disable heap randomization"
@@ -138734,7 +138986,7 @@ index cf5e9f7..81ece72 100644
        if (!access_ok(VERIFY_READ, uattr, 1))
                return -EFAULT;
 diff --git a/kernel/capability.c b/kernel/capability.c
-index 45432b5..988f1e4 100644
+index 45432b5..7d860f7 100644
 --- a/kernel/capability.c
 +++ b/kernel/capability.c
 @@ -193,6 +193,9 @@ SYSCALL_DEFINE2(capget, cap_user_header_t, header, 
cap_user_data_t, dataptr)
@@ -138766,7 +139018,7 @@ index 45432b5..988f1e4 100644
  
        rcu_read_lock();
 -      ret = security_capable_noaudit(__task_cred(t), ns, cap);
-+      ret = security_capable_noaudit(__task_cred(t), ns, cap) == 0 && 
gr_task_is_capable_nolog(t, cap);
++      ret = security_capable_noaudit(__task_cred(t), ns, cap) == 0 && 
gr_task_is_capable_nolog(t, __task_cred(t), cap);
        rcu_read_unlock();
  
 -      return (ret == 0);
@@ -143691,7 +143943,7 @@ index a467e6c..7743481 100644
        .thread_should_run      = cpu_stop_should_run,
        .thread_fn              = cpu_stopper_thread,
 diff --git a/kernel/sys.c b/kernel/sys.c
-index cf8ba54..314fca6 100644
+index cf8ba54..196a680 100644
 --- a/kernel/sys.c
 +++ b/kernel/sys.c
 @@ -160,6 +160,12 @@ static int set_one_prio(struct task_struct *p, int 
niceval, int error)
@@ -143722,7 +143974,7 @@ index cf8ba54..314fca6 100644
 +                 we may not log a CAP_SETGID check above, e.g.
 +                 in the case where new rgid = old egid
 +              */
-+              gr_learn_cap(current, new, CAP_SETGID);
++              gr_learn_cap(current, new, CAP_SETGID, true);
 +      }
 +
        if (rgid != (gid_t) -1 ||
@@ -143763,7 +144015,7 @@ index cf8ba54..314fca6 100644
 +                 we may not log a CAP_SETUID check above, e.g.
 +                 in the case where new ruid = old euid
 +              */
-+              gr_learn_cap(current, new, CAP_SETUID);
++              gr_learn_cap(current, new, CAP_SETUID, true);
                retval = set_user(new);
                if (retval < 0)
                        goto error;
@@ -156056,6 +156308,19 @@ index e9853df..4b57916 100644
  }
  
  int udp4_seq_show(struct seq_file *seq, void *v)
+diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c
+index 71acd00..d2c74ee 100644
+--- a/net/ipv4/xfrm4_mode_beet.c
++++ b/net/ipv4/xfrm4_mode_beet.c
+@@ -36,7 +36,7 @@ static void xfrm4_beet_make_header(struct sk_buff *skb)
+  *
+  * The top IP header will be constructed per 
draft-nikander-esp-beet-mode-06.txt.
+  */
+-static int xfrm4_beet_output(struct xfrm_state *x, struct sk_buff *skb)
++static int __intentional_overflow(0) xfrm4_beet_output(struct xfrm_state *x, 
struct sk_buff *skb)
+ {
+       struct ip_beet_phdr *ph;
+       struct iphdr *top_iph;
 diff --git a/net/ipv4/xfrm4_mode_transport.c b/net/ipv4/xfrm4_mode_transport.c
 index fd840c7..b517627 100644
 --- a/net/ipv4/xfrm4_mode_transport.c
@@ -156970,6 +157235,19 @@ index f96831d9..dae9a77 100644
        icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_PORT_UNREACH, 0);
  
        kfree_skb(skb);
+diff --git a/net/ipv6/xfrm6_mode_beet.c b/net/ipv6/xfrm6_mode_beet.c
+index 1e205c3..d71b846 100644
+--- a/net/ipv6/xfrm6_mode_beet.c
++++ b/net/ipv6/xfrm6_mode_beet.c
+@@ -37,7 +37,7 @@ static void xfrm6_beet_make_header(struct sk_buff *skb)
+  *
+  * The top IP header will be constructed per 
draft-nikander-esp-beet-mode-06.txt.
+  */
+-static int xfrm6_beet_output(struct xfrm_state *x, struct sk_buff *skb)
++static int __intentional_overflow(0) xfrm6_beet_output(struct xfrm_state *x, 
struct sk_buff *skb)
+ {
+       struct ipv6hdr *top_iph;
+       struct ip_beet_phdr *ph;
 diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c
 index 4e34410..232827a 100644
 --- a/net/ipv6/xfrm6_mode_transport.c

Reply via email to