summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2014-02-09 10:23:54 -0500
committerAnthony G. Basile <blueness@gentoo.org>2014-02-09 10:23:54 -0500
commit00426f28651cd1f5b3fd44116c5f09b629d064c2 (patch)
treefbc9cbaeb7e0bafe3a6aeb0677c3b9db51f9de00
parentGrsec/PaX: 3.0-{3.2.54,3.13.2}-201402062224 (diff)
downloadhardened-patchset-00426f28651cd1f5b3fd44116c5f09b629d064c2.tar.gz
hardened-patchset-00426f28651cd1f5b3fd44116c5f09b629d064c2.tar.bz2
hardened-patchset-00426f28651cd1f5b3fd44116c5f09b629d064c2.zip
Grsec/PaX: 3.0-{3.2.54,3.13.2}-20140209000220140209
-rw-r--r--3.13.2/0000_README2
-rw-r--r--3.13.2/4420_grsecurity-3.0-3.13.2-201402090002.patch (renamed from 3.13.2/4420_grsecurity-3.0-3.13.2-201402062224.patch)39
-rw-r--r--3.2.54/0000_README2
-rw-r--r--3.2.54/4420_grsecurity-3.0-3.2.54-201402090000.patch (renamed from 3.2.54/4420_grsecurity-3.0-3.2.54-201402062221.patch)3062
-rw-r--r--3.2.54/4450_grsec-kconfig-default-gids.patch12
-rw-r--r--3.2.54/4465_selinux-avc_audit-log-curr_ip.patch2
-rw-r--r--3.2.54/4470_disable-compat_vdso.patch2
7 files changed, 2907 insertions, 214 deletions
diff --git a/3.13.2/0000_README b/3.13.2/0000_README
index 850ef1e..a01567b 100644
--- a/3.13.2/0000_README
+++ b/3.13.2/0000_README
@@ -2,7 +2,7 @@ README
-----------------------------------------------------------------------------
Individual Patch Descriptions:
-----------------------------------------------------------------------------
-Patch: 4420_grsecurity-3.0-3.13.2-201402062224.patch
+Patch: 4420_grsecurity-3.0-3.13.2-201402090002.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.13.2/4420_grsecurity-3.0-3.13.2-201402062224.patch b/3.13.2/4420_grsecurity-3.0-3.13.2-201402090002.patch
index 824a474..76aaa29 100644
--- a/3.13.2/4420_grsecurity-3.0-3.13.2-201402062224.patch
+++ b/3.13.2/4420_grsecurity-3.0-3.13.2-201402090002.patch
@@ -1,5 +1,5 @@
diff --git a/Documentation/dontdiff b/Documentation/dontdiff
-index b89a739..31509cb 100644
+index b89a739..9aa2627 100644
--- a/Documentation/dontdiff
+++ b/Documentation/dontdiff
@@ -2,9 +2,11 @@
@@ -173,8 +173,8 @@ index b89a739..31509cb 100644
r300_reg_safe.h
r420_reg_safe.h
r600_reg_safe.h
-+randstruct.seed
-+randstruct.hashed_seed
++randomize_layout_hash.data
++randomize_layout_seed.h
+realmode.lds
+realmode.relocs
recordmcount
@@ -65436,10 +65436,10 @@ index 0000000..5307c8a
+endif
diff --git a/grsecurity/gracl.c b/grsecurity/gracl.c
new file mode 100644
-index 0000000..7232a45
+index 0000000..19a5b7c
--- /dev/null
+++ b/grsecurity/gracl.c
-@@ -0,0 +1,2677 @@
+@@ -0,0 +1,2678 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/sched.h>
@@ -67923,8 +67923,8 @@ index 0000000..7232a45
+void
+gr_acl_handle_psacct(struct task_struct *task, const long code)
+{
-+ unsigned long runtime;
-+ unsigned long cputime;
++ unsigned long runtime, cputime;
++ cputime_t utime, stime;
+ unsigned int wday, cday;
+ __u8 whr, chr;
+ __u8 wmin, cmin;
@@ -67937,19 +67937,20 @@ index 0000000..7232a45
+
+ do_posix_clock_monotonic_gettime(&timeval);
+ runtime = timeval.tv_sec - task->start_time.tv_sec;
-+ wday = runtime / (3600 * 24);
-+ runtime -= wday * (3600 * 24);
-+ whr = runtime / 3600;
-+ runtime -= whr * 3600;
++ wday = runtime / (60 * 60 * 24);
++ runtime -= wday * (60 * 60 * 24);
++ whr = runtime / (60 * 60);
++ runtime -= whr * (60 * 60);
+ wmin = runtime / 60;
+ runtime -= wmin * 60;
+ wsec = runtime;
+
-+ cputime = (task->utime + task->stime) / HZ;
-+ cday = cputime / (3600 * 24);
-+ cputime -= cday * (3600 * 24);
-+ chr = cputime / 3600;
-+ cputime -= chr * 3600;
++ task_cputime(task, &utime, &stime);
++ cputime = cputime_to_secs(utime + stime);
++ cday = cputime / (60 * 60 * 24);
++ cputime -= cday * (60 * 60 * 24);
++ chr = cputime / (60 * 60);
++ cputime -= chr * (60 * 60);
+ cmin = cputime / 60;
+ cputime -= cmin * 60;
+ csec = cputime;
@@ -103825,13 +103826,13 @@ index 7778b8e..3d619fc 100644
diff --git a/tools/gcc/.gitignore b/tools/gcc/.gitignore
new file mode 100644
-index 0000000..8eb55ca
+index 0000000..54052c3
--- /dev/null
+++ b/tools/gcc/.gitignore
@@ -0,0 +1,3 @@
+size_overflow_hash.h
-+randstruct.seed
-+randstruct.hashed_seed
++randomize_layout_seed.h
++randomize_layout_hash.data
diff --git a/tools/gcc/Makefile b/tools/gcc/Makefile
new file mode 100644
index 0000000..51a2ba2
diff --git a/3.2.54/0000_README b/3.2.54/0000_README
index 61f72a8..2e1f77c 100644
--- a/3.2.54/0000_README
+++ b/3.2.54/0000_README
@@ -134,7 +134,7 @@ Patch: 1053_linux-3.2.54.patch
From: http://www.kernel.org
Desc: Linux 3.2.54
-Patch: 4420_grsecurity-3.0-3.2.54-201402062221.patch
+Patch: 4420_grsecurity-3.0-3.2.54-201402090000.patch
From: http://www.grsecurity.net
Desc: hardened-sources base patch from upstream grsecurity
diff --git a/3.2.54/4420_grsecurity-3.0-3.2.54-201402062221.patch b/3.2.54/4420_grsecurity-3.0-3.2.54-201402090000.patch
index 88feed1..f378eea 100644
--- a/3.2.54/4420_grsecurity-3.0-3.2.54-201402062221.patch
+++ b/3.2.54/4420_grsecurity-3.0-3.2.54-201402090000.patch
@@ -1,5 +1,5 @@
diff --git a/Documentation/dontdiff b/Documentation/dontdiff
-index dfa6fc6..be27ac3 100644
+index dfa6fc6..58798e8 100644
--- a/Documentation/dontdiff
+++ b/Documentation/dontdiff
@@ -2,9 +2,11 @@
@@ -149,15 +149,18 @@ index dfa6fc6..be27ac3 100644
mkprep
mkregtable
mktables
-@@ -209,6 +229,7 @@ r300_reg_safe.h
+@@ -208,7 +228,10 @@ r200_reg_safe.h
+ r300_reg_safe.h
r420_reg_safe.h
r600_reg_safe.h
++randomize_layout_hash.data
++randomize_layout_seed.h
recordmcount
+regdb.c
relocs
rlim_names.h
rn50_reg_safe.h
-@@ -218,7 +239,10 @@ series
+@@ -218,7 +241,10 @@ series
setup
setup.bin
setup.elf
@@ -168,7 +171,7 @@ index dfa6fc6..be27ac3 100644
sm_tbl*
split-include
syscalltab.h
-@@ -229,6 +253,7 @@ tftpboot.img
+@@ -229,6 +255,7 @@ tftpboot.img
timeconst.h
times.h*
trix_boot.h
@@ -176,7 +179,7 @@ index dfa6fc6..be27ac3 100644
utsrelease.h*
vdso-syms.lds
vdso.lds
-@@ -246,7 +271,9 @@ vmlinux
+@@ -246,7 +273,9 @@ vmlinux
vmlinux-*
vmlinux.aout
vmlinux.bin.all
@@ -186,7 +189,7 @@ index dfa6fc6..be27ac3 100644
vmlinuz
voffset.h
vsyscall.lds
-@@ -254,9 +281,12 @@ vsyscall_32.lds
+@@ -254,9 +283,12 @@ vsyscall_32.lds
wanxlfw.inc
uImage
unifdef
@@ -270,7 +273,7 @@ index 88fd7f5..b318a78 100644
==============================================================
diff --git a/Makefile b/Makefile
-index 848be26..67efb38f 100644
+index 848be26..a460525 100644
--- a/Makefile
+++ b/Makefile
@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -285,7 +288,23 @@ index 848be26..67efb38f 100644
# Decide whether to build built-in, modular, or both.
# Normally, just do built-in.
-@@ -407,8 +408,8 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exc
+@@ -312,9 +313,15 @@ endif
+ # If the user is running make -s (silent mode), suppress echoing of
+ # commands
+
++ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
++ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
++ quiet=silent_
++endif
++else # make-3.8x
+ ifneq ($(findstring s,$(MAKEFLAGS)),)
+ quiet=silent_
+ endif
++endif
+
+ export quiet Q KBUILD_VERBOSE
+
+@@ -407,8 +414,8 @@ export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exc
# Rules shared between *config targets and build targets
# Basic helpers built in scripts/
@@ -296,7 +315,7 @@ index 848be26..67efb38f 100644
$(Q)$(MAKE) $(build)=scripts/basic
$(Q)rm -f .tmp_quiet_recordmcount
-@@ -564,6 +565,65 @@ else
+@@ -564,6 +571,74 @@ else
KBUILD_CFLAGS += -O2
endif
@@ -322,6 +341,14 @@ index 848be26..67efb38f 100644
+KERNEXEC_PLUGIN_CFLAGS += -fplugin-arg-kernexec_plugin-method=$(CONFIG_PAX_KERNEXEC_PLUGIN_METHOD) -DKERNEXEC_PLUGIN
+KERNEXEC_PLUGIN_AFLAGS := -DKERNEXEC_PLUGIN
+endif
++ifdef CONFIG_GRKERNSEC_RANDSTRUCT
++RANDSTRUCT_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/randomize_layout_plugin.so -DRANDSTRUCT_PLUGIN
++RANDSTRUCT_HASHED_SEED := $(shell cat "$(objtree)/tools/gcc/randomize_layout_hash.data")
++RANDSTRUCT_PLUGIN_CFLAGS += -DRANDSTRUCT_HASHED_SEED="\"$(RANDSTRUCT_HASHED_SEED)\""
++ifdef CONFIG_GRKERNSEC_RANDSTRUCT_PERFORMANCE
++RANDSTRUCT_PLUGIN_CFLAGS += -fplugin-arg-randomize_layout_plugin-performance-mode
++endif
++endif
+ifdef CONFIG_CHECKER_PLUGIN
+ifeq ($(call cc-ifversion, -ge, 0406, y), y)
+CHECKER_PLUGIN_CFLAGS := -fplugin=$(objtree)/tools/gcc/checker_plugin.so -DCHECKER_PLUGIN
@@ -340,6 +367,7 @@ index 848be26..67efb38f 100644
+GCC_PLUGINS_CFLAGS := $(CONSTIFY_PLUGIN_CFLAGS) $(STACKLEAK_PLUGIN_CFLAGS) $(KALLOCSTAT_PLUGIN_CFLAGS)
+GCC_PLUGINS_CFLAGS += $(KERNEXEC_PLUGIN_CFLAGS) $(CHECKER_PLUGIN_CFLAGS) $(COLORIZE_PLUGIN_CFLAGS)
+GCC_PLUGINS_CFLAGS += $(SIZE_OVERFLOW_PLUGIN_CFLAGS) $(LATENT_ENTROPY_PLUGIN_CFLAGS) $(STRUCTLEAK_PLUGIN_CFLAGS)
++GCC_PLUGINS_CFLAGS += $(RANDSTRUCT_PLUGIN_CFLAGS)
+GCC_PLUGINS_AFLAGS := $(KERNEXEC_PLUGIN_AFLAGS)
+export PLUGINCC CONSTIFY_PLUGIN
+ifeq ($(KBUILD_EXTMOD),)
@@ -362,7 +390,16 @@ index 848be26..67efb38f 100644
include $(srctree)/arch/$(SRCARCH)/Makefile
ifneq ($(CONFIG_FRAME_WARN),0)
-@@ -708,7 +768,7 @@ export mod_strip_cmd
+@@ -594,7 +669,7 @@ endif
+
+ ifdef CONFIG_DEBUG_INFO
+ KBUILD_CFLAGS += -g
+-KBUILD_AFLAGS += -gdwarf-2
++KBUILD_AFLAGS += -Wa,--gdwarf-2
+ endif
+
+ ifdef CONFIG_DEBUG_INFO_REDUCED
+@@ -708,7 +783,7 @@ export mod_strip_cmd
ifeq ($(KBUILD_EXTMOD),)
@@ -371,7 +408,7 @@ index 848be26..67efb38f 100644
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
-@@ -932,6 +992,8 @@ vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
+@@ -932,6 +1007,8 @@ vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
@@ -380,7 +417,7 @@ index 848be26..67efb38f 100644
$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
# Handle descending into subdirectories listed in $(vmlinux-dirs)
-@@ -941,7 +1003,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+@@ -941,7 +1018,7 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
# Error messages still appears in the original language
PHONY += $(vmlinux-dirs)
@@ -389,7 +426,7 @@ index 848be26..67efb38f 100644
$(Q)$(MAKE) $(build)=$@
# Store (new) KERNELRELASE string in include/config/kernel.release
-@@ -981,10 +1043,13 @@ prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
+@@ -981,10 +1058,13 @@ prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
archprepare: archscripts prepare1 scripts_basic
@@ -403,7 +440,7 @@ index 848be26..67efb38f 100644
prepare: prepare0
# Generate some files
-@@ -1089,6 +1154,8 @@ all: modules
+@@ -1089,6 +1169,8 @@ all: modules
# using awk while concatenating to the final file.
PHONY += modules
@@ -412,7 +449,7 @@ index 848be26..67efb38f 100644
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
@$(kecho) ' Building modules, stage 2.';
-@@ -1104,7 +1171,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
+@@ -1104,7 +1186,7 @@ modules.builtin: $(vmlinux-dirs:%=%/modules.builtin)
# Target to prepare building external modules
PHONY += modules_prepare
@@ -421,16 +458,19 @@ index 848be26..67efb38f 100644
# Target to install modules
PHONY += modules_install
-@@ -1163,7 +1230,7 @@ CLEAN_FILES += vmlinux System.map \
+@@ -1163,8 +1245,9 @@ CLEAN_FILES += vmlinux System.map \
MRPROPER_DIRS += include/config usr/include include/generated \
arch/*/include/generated
MRPROPER_FILES += .config .config.old .version .old_version \
- include/linux/version.h \
+- Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
+ include/linux/version.h tools/gcc/size_overflow_hash.h\
- Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
++ Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
++ tools/gcc/randomize_layout_seed.h tools/gcc/randomize_layout_hash.data
# clean - Delete most, but leave enough to build external modules
-@@ -1201,6 +1268,7 @@ distclean: mrproper
+ #
+@@ -1201,6 +1284,7 @@ distclean: mrproper
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-o -name '.*.rej' \
@@ -438,7 +478,7 @@ index 848be26..67efb38f 100644
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
-type f -print | xargs rm -f
-@@ -1361,6 +1429,8 @@ PHONY += $(module-dirs) modules
+@@ -1361,6 +1445,8 @@ PHONY += $(module-dirs) modules
$(module-dirs): crmodverdir $(objtree)/Module.symvers
$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
@@ -447,7 +487,7 @@ index 848be26..67efb38f 100644
modules: $(module-dirs)
@$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
-@@ -1487,17 +1557,21 @@ else
+@@ -1487,17 +1573,21 @@ else
target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
endif
@@ -473,7 +513,7 @@ index 848be26..67efb38f 100644
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
%.symtypes: %.c prepare scripts FORCE
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
-@@ -1507,11 +1581,15 @@ endif
+@@ -1507,11 +1597,15 @@ endif
$(cmd_crmodverdir)
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
$(build)=$(build-dir)
@@ -855,6 +895,18 @@ index fadd5f8..904e73a 100644
} else if (!cause) {
/* Allow reads even for write-only mappings */
if (!(vma->vm_flags & (VM_READ | VM_WRITE)))
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
+index 790ea68..e8c6879 100644
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -2012,6 +2012,7 @@ config XIP_PHYS_ADDR
+ config KEXEC
+ bool "Kexec system call (EXPERIMENTAL)"
+ depends on EXPERIMENTAL
++ depends on !GRKERNSEC_KMEM
+ help
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index b7c5d5d..4b0c4ed 100644
--- a/arch/arm/include/asm/assembler.h
@@ -3009,6 +3061,18 @@ index 0f01de2..d37d309 100644
#define __cacheline_aligned __aligned(L1_CACHE_BYTES)
#define ____cacheline_aligned __aligned(L1_CACHE_BYTES)
+diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
+index 27489b6..45ab736 100644
+--- a/arch/ia64/Kconfig
++++ b/arch/ia64/Kconfig
+@@ -570,6 +570,7 @@ source "drivers/sn/Kconfig"
+ config KEXEC
+ bool "kexec system call (EXPERIMENTAL)"
+ depends on EXPERIMENTAL && !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)
++ depends on !GRKERNSEC_KMEM
+ help
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
diff --git a/arch/ia64/include/asm/atomic.h b/arch/ia64/include/asm/atomic.h
index 2fc214b..7597423 100644
--- a/arch/ia64/include/asm/atomic.h
@@ -3646,6 +3710,18 @@ index 4efe96a..60e8699 100644
#define SMP_CACHE_BYTES L1_CACHE_BYTES
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index d46f1da..d72dc10 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -2254,6 +2254,7 @@ source "kernel/Kconfig.preempt"
+ config KEXEC
+ bool "Kexec system call (EXPERIMENTAL)"
+ depends on EXPERIMENTAL
++ depends on !GRKERNSEC_KMEM
+ help
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h
index 1d93f81..67794d0 100644
--- a/arch/mips/include/asm/atomic.h
@@ -4799,6 +4875,18 @@ index 18162ce..94de376 100644
/*
* If for any reason at all we couldn't handle the fault, make
+diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
+index 16ef838..4eac98f 100644
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -346,6 +346,7 @@ config ARCH_ENABLE_MEMORY_HOTREMOVE
+ config KEXEC
+ bool "kexec system call (EXPERIMENTAL)"
+ depends on (PPC_BOOK3S || FSL_BOOKE || (44x && !SMP && !PPC_47x)) && EXPERIMENTAL
++ depends on !GRKERNSEC_KMEM
+ help
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h
index 02e41b5..ec6e26c 100644
--- a/arch/powerpc/include/asm/atomic.h
@@ -9247,6 +9335,18 @@ index cbef74e..c38fead 100644
BTFIXUPSET_INT(page_kernel, pgprot_val(SRMMU_PAGE_KERNEL));
page_kernel = pgprot_val(SRMMU_PAGE_KERNEL);
+diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig
+index 6cb8319..ee12bac 100644
+--- a/arch/tile/Kconfig
++++ b/arch/tile/Kconfig
+@@ -142,6 +142,7 @@ source "kernel/Kconfig.hz"
+
+ config KEXEC
+ bool "kexec system call"
++ depends on !GRKERNSEC_KMEM
+ ---help---
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
diff --git a/arch/tile/include/asm/atomic_64.h b/arch/tile/include/asm/atomic_64.h
index 27fe667..36d474c 100644
--- a/arch/tile/include/asm/atomic_64.h
@@ -9420,7 +9520,7 @@ index ad8f795..2c7eec6 100644
/*
* Memory returned by kmalloc() may be used for DMA, so we must make
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
-index fb2e69d..27ff8ca 100644
+index fb2e69d..200616a 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -75,6 +75,7 @@ config X86
@@ -9483,7 +9583,15 @@ index fb2e69d..27ff8ca 100644
---help---
This option turns on the -fstack-protector GCC feature. This
feature puts, at the beginning of functions, a canary value on
-@@ -1616,6 +1619,8 @@ config X86_NEED_RELOCS
+@@ -1514,6 +1517,7 @@ source kernel/Kconfig.hz
+
+ config KEXEC
+ bool "kexec system call"
++ depends on !GRKERNSEC_KMEM
+ ---help---
+ kexec is a system call that implements the ability to shutdown your
+ current kernel, and to start another kernel. It is like a reboot
+@@ -1616,6 +1620,8 @@ config X86_NEED_RELOCS
config PHYSICAL_ALIGN
hex "Alignment value to which kernel should be aligned" if X86_32
default "0x1000000"
@@ -9492,7 +9600,7 @@ index fb2e69d..27ff8ca 100644
range 0x2000 0x1000000
---help---
This value puts the alignment restrictions on physical address
-@@ -1647,9 +1652,10 @@ config HOTPLUG_CPU
+@@ -1647,9 +1653,10 @@ config HOTPLUG_CPU
Say N if you want to disable CPU hotplug.
config COMPAT_VDSO
@@ -12850,6 +12958,39 @@ index cc70c1c..d96d011 100644
+extern void machine_emergency_restart(void) __noreturn;
#endif /* _ASM_X86_EMERGENCY_RESTART_H */
+diff --git a/arch/x86/include/asm/floppy.h b/arch/x86/include/asm/floppy.h
+index dbe82a5..459eb0b 100644
+--- a/arch/x86/include/asm/floppy.h
++++ b/arch/x86/include/asm/floppy.h
+@@ -229,18 +229,18 @@ static struct fd_routine_l {
+ int (*_dma_setup)(char *addr, unsigned long size, int mode, int io);
+ } fd_routine[] = {
+ {
+- request_dma,
+- free_dma,
+- get_dma_residue,
+- dma_mem_alloc,
+- hard_dma_setup
++ ._request_dma = request_dma,
++ ._free_dma = free_dma,
++ ._get_dma_residue = get_dma_residue,
++ ._dma_mem_alloc = dma_mem_alloc,
++ ._dma_setup = hard_dma_setup
+ },
+ {
+- vdma_request_dma,
+- vdma_nop,
+- vdma_get_dma_residue,
+- vdma_mem_alloc,
+- vdma_dma_setup
++ ._request_dma = vdma_request_dma,
++ ._free_dma = vdma_nop,
++ ._get_dma_residue = vdma_get_dma_residue,
++ ._dma_mem_alloc = vdma_mem_alloc,
++ ._dma_setup = vdma_dma_setup
+ }
+ };
+
diff --git a/arch/x86/include/asm/futex.h b/arch/x86/include/asm/futex.h
index d09bb03..0a3629b 100644
--- a/arch/x86/include/asm/futex.h
@@ -13684,7 +13825,7 @@ index 91e758b..cac1cd6 100644
#endif /* __ASSEMBLY__ */
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
-index faf2c04..5724dcd 100644
+index faf2c04..055c010 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -84,7 +84,7 @@ struct pv_init_ops {
@@ -13692,16 +13833,23 @@ index faf2c04..5724dcd 100644
unsigned (*patch)(u8 type, u16 clobber, void *insnbuf,
unsigned long addr, unsigned len);
-};
-+} __no_const;
++} __no_const __no_randomize_layout;
struct pv_lazy_ops {
-@@ -98,7 +98,7 @@ struct pv_time_ops {
+@@ -92,13 +92,13 @@ struct pv_lazy_ops {
+ void (*enter)(void);
+ void (*leave)(void);
+ void (*flush)(void);
+-};
++} __no_randomize_layout;
+
+ struct pv_time_ops {
unsigned long long (*sched_clock)(void);
unsigned long long (*steal_clock)(int cpu);
unsigned long (*get_tsc_khz)(void);
-};
-+} __no_const;
++} __no_const __no_randomize_layout;
struct pv_cpu_ops {
/* hooks for various privileged instructions */
@@ -13710,16 +13858,25 @@ index faf2c04..5724dcd 100644
void (*start_context_switch)(struct task_struct *prev);
void (*end_context_switch)(struct task_struct *next);
-};
-+} __no_const;
++} __no_const __no_randomize_layout;
struct pv_irq_ops {
/*
+@@ -217,7 +217,7 @@ struct pv_irq_ops {
+ #ifdef CONFIG_X86_64
+ void (*adjust_exception_frame)(void);
+ #endif
+-};
++} __no_randomize_layout;
+
+ struct pv_apic_ops {
+ #ifdef CONFIG_X86_LOCAL_APIC
@@ -225,7 +225,7 @@ struct pv_apic_ops {
unsigned long start_eip,
unsigned long start_esp);
#endif
-};
-+} __no_const;
++} __no_const __no_randomize_layout;
struct pv_mmu_ops {
unsigned long (*read_cr2)(void);
@@ -13731,28 +13888,47 @@ index faf2c04..5724dcd 100644
#endif /* PAGETABLE_LEVELS == 4 */
#endif /* PAGETABLE_LEVELS >= 3 */
-@@ -325,6 +326,12 @@ struct pv_mmu_ops {
+@@ -325,7 +326,13 @@ struct pv_mmu_ops {
an mfn. We can tell which is which from the index. */
void (*set_fixmap)(unsigned /* enum fixed_addresses */ idx,
phys_addr_t phys, pgprot_t flags);
+-};
+
+#ifdef CONFIG_PAX_KERNEXEC
+ unsigned long (*pax_open_kernel)(void);
+ unsigned long (*pax_close_kernel)(void);
+#endif
+
- };
++} __no_randomize_layout;
struct arch_spinlock;
-@@ -335,7 +342,7 @@ struct pv_lock_ops {
+ struct pv_lock_ops {
+@@ -335,11 +342,14 @@ struct pv_lock_ops {
void (*spin_lock_flags)(struct arch_spinlock *lock, unsigned long flags);
int (*spin_trylock)(struct arch_spinlock *lock);
void (*spin_unlock)(struct arch_spinlock *lock);
-};
-+} __no_const;
++} __no_const __no_randomize_layout;
/* This contains all the paravirt structures: we get a convenient
* number for each function using the offset which we use to indicate
+- * what to patch. */
++ * what to patch.
++ * shouldn't be randomized due to the "NEAT TRICK" in paravirt.c
++ */
++
+ struct paravirt_patch_template {
+ struct pv_init_ops pv_init_ops;
+ struct pv_time_ops pv_time_ops;
+@@ -348,7 +358,7 @@ struct paravirt_patch_template {
+ struct pv_apic_ops pv_apic_ops;
+ struct pv_mmu_ops pv_mmu_ops;
+ struct pv_lock_ops pv_lock_ops;
+-};
++} __no_randomize_layout;
+
+ extern struct pv_info pv_info;
+ extern struct pv_init_ops pv_init_ops;
diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h
index b4389a4..7024269 100644
--- a/arch/x86/include/asm/pgalloc.h
@@ -14333,9 +14509,18 @@ index 2dddb31..100c638 100644
/*
* x86-64 Task Priority Register, CR8
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
-index f7c89e2..9962bae 100644
+index f7c89e2..553040d 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
+@@ -110,7 +110,7 @@ struct cpuinfo_x86 {
+ /* Index into per_cpu list: */
+ u16 cpu_index;
+ u32 microcode;
+-} __attribute__((__aligned__(SMP_CACHE_BYTES)));
++} __attribute__((__aligned__(SMP_CACHE_BYTES))) __randomize_layout;
+
+ #define X86_VENDOR_INTEL 0
+ #define X86_VENDOR_CYRIX 1
@@ -266,7 +266,7 @@ struct tss_struct {
} ____cacheline_aligned;
@@ -20416,7 +20601,7 @@ index a979b5b..1d6db75 100644
.callback = dmi_io_delay_0xed_port,
.ident = "Compaq Presario V6000",
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
-index 8c96897..be66bfa 100644
+index 8c96897..060ff2d 100644
--- a/arch/x86/kernel/ioport.c
+++ b/arch/x86/kernel/ioport.c
@@ -6,6 +6,7 @@
@@ -20427,19 +20612,19 @@ index 8c96897..be66bfa 100644
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/ioport.h>
-@@ -28,6 +29,12 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
-
- if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
+@@ -30,6 +31,12 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
return -EINVAL;
+ if (turn_on && !capable(CAP_SYS_RAWIO))
+ return -EPERM;
+#ifdef CONFIG_GRKERNSEC_IO
+ if (turn_on && grsec_disable_privio) {
+ gr_handle_ioperm();
-+ return -EPERM;
++ return -ENODEV;
+ }
+#endif
- if (turn_on && !capable(CAP_SYS_RAWIO))
- return -EPERM;
+ /*
+ * If it's the first ioperm() call in this thread's lifetime, set the
@@ -54,7 +61,7 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
* because the ->io_bitmap_max value must match the bitmap
* contents:
@@ -20449,19 +20634,19 @@ index 8c96897..be66bfa 100644
if (turn_on)
bitmap_clear(t->io_bitmap_ptr, from, num);
-@@ -102,6 +109,12 @@ long sys_iopl(unsigned int level, struct pt_regs *regs)
- return -EINVAL;
- /* Trying to gain more privileges? */
+@@ -104,6 +111,12 @@ long sys_iopl(unsigned int level, struct pt_regs *regs)
if (level > old) {
+ if (!capable(CAP_SYS_RAWIO))
+ return -EPERM;
+#ifdef CONFIG_GRKERNSEC_IO
+ if (grsec_disable_privio) {
+ gr_handle_iopl();
-+ return -EPERM;
++ return -ENODEV;
+ }
+#endif
- if (!capable(CAP_SYS_RAWIO))
- return -EPERM;
}
+ regs->flags = (regs->flags & ~X86_EFLAGS_IOPL) | (level << 12);
+ t->iopl = level << 12;
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index fb2eb32..62793bd 100644
--- a/arch/x86/kernel/irq.c
@@ -22147,10 +22332,30 @@ index f2bb9c9..bed145d7 100644
1:
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
-index b506f41..33e9995 100644
+index b506f41..c954434 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
-@@ -447,7 +447,7 @@ static void __init parse_setup_data(void)
+@@ -176,9 +176,17 @@ static struct resource bss_resource = {
+
+ #ifdef CONFIG_X86_32
+ /* cpu data as detected by the assembly code in head.S */
+-struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1};
++struct cpuinfo_x86 new_cpu_data __cpuinitdata = {
++ .wp_works_ok = -1,
++ .hlt_works_ok = 1,
++ .fdiv_bug = -1,
++};
+ /* common cpu data for all cpus */
+-struct cpuinfo_x86 boot_cpu_data __read_mostly = {0, 0, 0, 0, -1, 1, 0, 0, -1};
++struct cpuinfo_x86 boot_cpu_data __read_mostly = {
++ .wp_works_ok = -1,
++ .hlt_works_ok = 1,
++ .fdiv_bug = -1,
++};
+ EXPORT_SYMBOL(boot_cpu_data);
+ static void set_mca_bus(int x)
+ {
+@@ -447,7 +455,7 @@ static void __init parse_setup_data(void)
switch (data->type) {
case SETUP_E820_EXT:
@@ -22159,7 +22364,7 @@ index b506f41..33e9995 100644
break;
case SETUP_DTB:
add_dtb(pa_data);
-@@ -727,7 +727,7 @@ static void __init trim_bios_range(void)
+@@ -727,7 +735,7 @@ static void __init trim_bios_range(void)
* area (640->1Mb) as ram even though it is not.
* take them out.
*/
@@ -22168,7 +22373,7 @@ index b506f41..33e9995 100644
sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
}
-@@ -852,14 +852,14 @@ void __init setup_arch(char **cmdline_p)
+@@ -852,14 +860,14 @@ void __init setup_arch(char **cmdline_p)
if (!boot_params.hdr.root_flags)
root_mountflags &= ~MS_RDONLY;
@@ -33019,7 +33224,7 @@ index d7ad865..61ddf2c 100644
}
diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h
-index 7fda30e..eb5dfe0 100644
+index 7fda30e..2f27946 100644
--- a/drivers/block/cciss.h
+++ b/drivers/block/cciss.h
@@ -101,7 +101,7 @@ struct ctlr_info
@@ -33031,6 +33236,49 @@ index 7fda30e..eb5dfe0 100644
/* queue and queue Info */
struct list_head reqQ;
+@@ -402,27 +402,27 @@ static bool SA5_performant_intr_pending(ctlr_info_t *h)
+ }
+
+ static struct access_method SA5_access = {
+- SA5_submit_command,
+- SA5_intr_mask,
+- SA5_fifo_full,
+- SA5_intr_pending,
+- SA5_completed,
++ .submit_command = SA5_submit_command,
++ .set_intr_mask = SA5_intr_mask,
++ .fifo_full = SA5_fifo_full,
++ .intr_pending = SA5_intr_pending,
++ .command_completed = SA5_completed,
+ };
+
+ static struct access_method SA5B_access = {
+- SA5_submit_command,
+- SA5B_intr_mask,
+- SA5_fifo_full,
+- SA5B_intr_pending,
+- SA5_completed,
++ .submit_command = SA5_submit_command,
++ .set_intr_mask = SA5B_intr_mask,
++ .fifo_full = SA5_fifo_full,
++ .intr_pending = SA5B_intr_pending,
++ .command_completed = SA5_completed,
+ };
+
+ static struct access_method SA5_performant_access = {
+- SA5_submit_command,
+- SA5_performant_intr_mask,
+- SA5_fifo_full,
+- SA5_performant_intr_pending,
+- SA5_performant_completed,
++ .submit_command = SA5_submit_command,
++ .set_intr_mask = SA5_performant_intr_mask,
++ .fifo_full = SA5_fifo_full,
++ .intr_pending = SA5_performant_intr_pending,
++ .command_completed = SA5_performant_completed,
+ };
+
+ struct board_type {
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
index 504bc16..e13b631 100644
--- a/drivers/block/cpqarray.c
@@ -33458,6 +33706,76 @@ index a63b0a2..30228d1 100644
static DEFINE_MUTEX(pktcdvd_mutex);
static struct pktcdvd_device *pkt_devs[MAX_WRITERS];
+diff --git a/drivers/block/smart1,2.h b/drivers/block/smart1,2.h
+index e5565fb..71be10b4 100644
+--- a/drivers/block/smart1,2.h
++++ b/drivers/block/smart1,2.h
+@@ -108,11 +108,11 @@ static unsigned long smart4_intr_pending(ctlr_info_t *h)
+ }
+
+ static struct access_method smart4_access = {
+- smart4_submit_command,
+- smart4_intr_mask,
+- smart4_fifo_full,
+- smart4_intr_pending,
+- smart4_completed,
++ .submit_command = smart4_submit_command,
++ .set_intr_mask = smart4_intr_mask,
++ .fifo_full = smart4_fifo_full,
++ .intr_pending = smart4_intr_pending,
++ .command_completed = smart4_completed,
+ };
+
+ /*
+@@ -144,11 +144,11 @@ static unsigned long smart2_intr_pending(ctlr_info_t *h)
+ }
+
+ static struct access_method smart2_access = {
+- smart2_submit_command,
+- smart2_intr_mask,
+- smart2_fifo_full,
+- smart2_intr_pending,
+- smart2_completed,
++ .submit_command = smart2_submit_command,
++ .set_intr_mask = smart2_intr_mask,
++ .fifo_full = smart2_fifo_full,
++ .intr_pending = smart2_intr_pending,
++ .command_completed = smart2_completed,
+ };
+
+ /*
+@@ -180,11 +180,11 @@ static unsigned long smart2e_intr_pending(ctlr_info_t *h)
+ }
+
+ static struct access_method smart2e_access = {
+- smart2e_submit_command,
+- smart2e_intr_mask,
+- smart2e_fifo_full,
+- smart2e_intr_pending,
+- smart2e_completed,
++ .submit_command = smart2e_submit_command,
++ .set_intr_mask = smart2e_intr_mask,
++ .fifo_full = smart2e_fifo_full,
++ .intr_pending = smart2e_intr_pending,
++ .command_completed = smart2e_completed,
+ };
+
+ /*
+@@ -270,9 +270,9 @@ static unsigned long smart1_intr_pending(ctlr_info_t *h)
+ }
+
+ static struct access_method smart1_access = {
+- smart1_submit_command,
+- smart1_intr_mask,
+- smart1_fifo_full,
+- smart1_intr_pending,
+- smart1_completed,
++ .submit_command = smart1_submit_command,
++ .set_intr_mask = smart1_intr_mask,
++ .fifo_full = smart1_fifo_full,
++ .intr_pending = smart1_intr_pending,
++ .command_completed = smart1_completed,
+ };
diff --git a/drivers/bluetooth/btwilink.c b/drivers/bluetooth/btwilink.c
index b5f83b4..2f49d18 100644
--- a/drivers/bluetooth/btwilink.c
@@ -37191,6 +37509,42 @@ index 475ba81..a6c530c 100644
int ret;
if (nr < DRM_COMMAND_BASE)
+diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
+index 36bec48..3a128f3 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
++++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
+@@ -812,11 +812,11 @@ nouveau_vram_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
+ }
+
+ const struct ttm_mem_type_manager_func nouveau_vram_manager = {
+- nouveau_vram_manager_init,
+- nouveau_vram_manager_fini,
+- nouveau_vram_manager_new,
+- nouveau_vram_manager_del,
+- nouveau_vram_manager_debug
++ .init = nouveau_vram_manager_init,
++ .takedown = nouveau_vram_manager_fini,
++ .get_node = nouveau_vram_manager_new,
++ .put_node = nouveau_vram_manager_del,
++ .debug = nouveau_vram_manager_debug
+ };
+
+ static int
+@@ -869,9 +869,9 @@ nouveau_gart_manager_debug(struct ttm_mem_type_manager *man, const char *prefix)
+ }
+
+ const struct ttm_mem_type_manager_func nouveau_gart_manager = {
+- nouveau_gart_manager_init,
+- nouveau_gart_manager_fini,
+- nouveau_gart_manager_new,
+- nouveau_gart_manager_del,
+- nouveau_gart_manager_debug
++ .init = nouveau_gart_manager_init,
++ .takedown = nouveau_gart_manager_fini,
++ .get_node = nouveau_gart_manager_new,
++ .put_node = nouveau_gart_manager_del,
++ .debug = nouveau_gart_manager_debug
+ };
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
index 01adcfb..c6726fe 100644
--- a/drivers/gpu/drm/nouveau/nouveau_state.c
@@ -37779,6 +38133,26 @@ index 3e72074..9fbe45b 100644
dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
}
+diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c
+index 038e947..4ae87f0 100644
+--- a/drivers/gpu/drm/ttm/ttm_bo_manager.c
++++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c
+@@ -148,10 +148,10 @@ static void ttm_bo_man_debug(struct ttm_mem_type_manager *man,
+ }
+
+ const struct ttm_mem_type_manager_func ttm_bo_manager_func = {
+- ttm_bo_man_init,
+- ttm_bo_man_takedown,
+- ttm_bo_man_get_node,
+- ttm_bo_man_put_node,
+- ttm_bo_man_debug
++ .init = ttm_bo_man_init,
++ .takedown = ttm_bo_man_takedown,
++ .get_node = ttm_bo_man_get_node,
++ .put_node = ttm_bo_man_put_node,
++ .debug = ttm_bo_man_debug
+ };
+ EXPORT_SYMBOL(ttm_bo_manager_func);
diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
index e70ddd8..ddfa1cd 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
@@ -37966,6 +38340,25 @@ index a0c2f12..68ae6cb 100644
} while (*seqno == 0);
if (!(fifo_state->capabilities & SVGA_FIFO_CAP_FENCE)) {
+diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
+index 5f71715..e40c528 100644
+--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
+@@ -153,9 +153,9 @@ static void vmw_gmrid_man_debug(struct ttm_mem_type_manager *man,
+ }
+
+ const struct ttm_mem_type_manager_func vmw_gmrid_manager_func = {
+- vmw_gmrid_man_init,
+- vmw_gmrid_man_takedown,
+- vmw_gmrid_man_get_node,
+- vmw_gmrid_man_put_node,
+- vmw_gmrid_man_debug
++ .init = vmw_gmrid_man_init,
++ .takedown = vmw_gmrid_man_takedown,
++ .get_node = vmw_gmrid_man_get_node,
++ .put_node = vmw_gmrid_man_put_node,
++ .debug = vmw_gmrid_man_debug
+ };
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
index 66917c6..2dcc8ae 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
@@ -39165,6 +39558,41 @@ index e571e60..523c505 100644
.notifier_call = comp_pool_callback,
.priority = 0,
};
+diff --git a/drivers/infiniband/hw/ipath/ipath_dma.c b/drivers/infiniband/hw/ipath/ipath_dma.c
+index 644c2c7..ecf0879 100644
+--- a/drivers/infiniband/hw/ipath/ipath_dma.c
++++ b/drivers/infiniband/hw/ipath/ipath_dma.c
+@@ -176,17 +176,17 @@ static void ipath_dma_free_coherent(struct ib_device *dev, size_t size,
+ }
+
+ struct ib_dma_mapping_ops ipath_dma_mapping_ops = {
+- ipath_mapping_error,
+- ipath_dma_map_single,
+- ipath_dma_unmap_single,
+- ipath_dma_map_page,
+- ipath_dma_unmap_page,
+- ipath_map_sg,
+- ipath_unmap_sg,
+- ipath_sg_dma_address,
+- ipath_sg_dma_len,
+- ipath_sync_single_for_cpu,
+- ipath_sync_single_for_device,
+- ipath_dma_alloc_coherent,
+- ipath_dma_free_coherent
++ .mapping_error = ipath_mapping_error,
++ .map_single = ipath_dma_map_single,
++ .unmap_single = ipath_dma_unmap_single,
++ .map_page = ipath_dma_map_page,
++ .unmap_page = ipath_dma_unmap_page,
++ .map_sg = ipath_map_sg,
++ .unmap_sg = ipath_unmap_sg,
++ .dma_address = ipath_sg_dma_address,
++ .dma_len = ipath_sg_dma_len,
++ .sync_single_for_cpu = ipath_sync_single_for_cpu,
++ .sync_single_for_device = ipath_sync_single_for_device,
++ .alloc_coherent = ipath_dma_alloc_coherent,
++ .free_coherent = ipath_dma_free_coherent
+ };
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c
index 31ae1b1..fe606ac 100644
--- a/drivers/infiniband/hw/ipath/ipath_fs.c
@@ -39410,7 +39838,7 @@ index 3ade373..f3b68b7 100644
extern u32 int_mod_timer_init;
extern u32 int_mod_cq_depth_256;
diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
-index 0a52d72..0642f36 100644
+index 0a52d72..23edf25 100644
--- a/drivers/infiniband/hw/nes/nes_cm.c
+++ b/drivers/infiniband/hw/nes/nes_cm.c
@@ -68,14 +68,14 @@ u32 cm_packets_dropped;
@@ -39435,7 +39863,33 @@ index 0a52d72..0642f36 100644
static inline int mini_cm_accelerated(struct nes_cm_core *, struct nes_cm_node *);
static struct nes_cm_listener *mini_cm_listen(struct nes_cm_core *, struct nes_vnic *, struct nes_cm_info *);
-@@ -148,13 +148,13 @@ static struct nes_cm_ops nes_cm_api = {
+@@ -133,28 +133,28 @@ static void print_core(struct nes_cm_core *core);
+ /* instance of function pointers for client API */
+ /* set address of this instance to cm_core->cm_ops at cm_core alloc */
+ static struct nes_cm_ops nes_cm_api = {
+- mini_cm_accelerated,
+- mini_cm_listen,
+- mini_cm_del_listen,
+- mini_cm_connect,
+- mini_cm_close,
+- mini_cm_accept,
+- mini_cm_reject,
+- mini_cm_recv_pkt,
+- mini_cm_dealloc_core,
+- mini_cm_get,
+- mini_cm_set
++ .accelerated = mini_cm_accelerated,
++ .listen = mini_cm_listen,
++ .stop_listener = mini_cm_del_listen,
++ .connect = mini_cm_connect,
++ .close = mini_cm_close,
++ .accept = mini_cm_accept,
++ .reject = mini_cm_reject,
++ .recv_pkt = mini_cm_recv_pkt,
++ .destroy_cm_core = mini_cm_dealloc_core,
++ .get = mini_cm_get,
++ .set = mini_cm_set
+ };
static struct nes_cm_core *g_cm_core;
@@ -39984,6 +40438,49 @@ index 2b33b26..a9c638b 100644
return NULL;
return rcu_dereference(capi_applications[applid - 1]);
+diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c
+index 492aa52..fe79ae4 100644
+--- a/drivers/isdn/gigaset/bas-gigaset.c
++++ b/drivers/isdn/gigaset/bas-gigaset.c
+@@ -2559,22 +2559,22 @@ static int gigaset_post_reset(struct usb_interface *intf)
+
+
+ static const struct gigaset_ops gigops = {
+- gigaset_write_cmd,
+- gigaset_write_room,
+- gigaset_chars_in_buffer,
+- gigaset_brkchars,
+- gigaset_init_bchannel,
+- gigaset_close_bchannel,
+- gigaset_initbcshw,
+- gigaset_freebcshw,
+- gigaset_reinitbcshw,
+- gigaset_initcshw,
+- gigaset_freecshw,
+- gigaset_set_modem_ctrl,
+- gigaset_baud_rate,
+- gigaset_set_line_ctrl,
+- gigaset_isoc_send_skb,
+- gigaset_isoc_input,
++ .write_cmd = gigaset_write_cmd,
++ .write_room = gigaset_write_room,
++ .chars_in_buffer = gigaset_chars_in_buffer,
++ .brkchars = gigaset_brkchars,
++ .init_bchannel = gigaset_init_bchannel,
++ .close_bchannel = gigaset_close_bchannel,
++ .initbcshw = gigaset_initbcshw,
++ .freebcshw = gigaset_freebcshw,
++ .reinitbcshw = gigaset_reinitbcshw,
++ .initcshw = gigaset_initcshw,
++ .freecshw = gigaset_freecshw,
++ .set_modem_ctrl = gigaset_set_modem_ctrl,
++ .baud_rate = gigaset_baud_rate,
++ .set_line_ctrl = gigaset_set_line_ctrl,
++ .send_skb = gigaset_isoc_send_skb,
++ .handle_input = gigaset_isoc_input,
+ };
+
+ /* bas_gigaset_init
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c
index db621db..825ea1a 100644
--- a/drivers/isdn/gigaset/common.c
@@ -40109,8 +40606,51 @@ index ee0a549..a7c9798 100644
dev_warn(cs->dev, "%s: device not opened\n", __func__);
goto out;
}
+diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
+index 86a5c4f..5a564c2 100644
+--- a/drivers/isdn/gigaset/ser-gigaset.c
++++ b/drivers/isdn/gigaset/ser-gigaset.c
+@@ -454,22 +454,22 @@ static int gigaset_set_line_ctrl(struct cardstate *cs, unsigned cflag)
+ }
+
+ static const struct gigaset_ops ops = {
+- gigaset_write_cmd,
+- gigaset_write_room,
+- gigaset_chars_in_buffer,
+- gigaset_brkchars,
+- gigaset_init_bchannel,
+- gigaset_close_bchannel,
+- gigaset_initbcshw,
+- gigaset_freebcshw,
+- gigaset_reinitbcshw,
+- gigaset_initcshw,
+- gigaset_freecshw,
+- gigaset_set_modem_ctrl,
+- gigaset_baud_rate,
+- gigaset_set_line_ctrl,
+- gigaset_m10x_send_skb, /* asyncdata.c */
+- gigaset_m10x_input, /* asyncdata.c */
++ .write_cmd = gigaset_write_cmd,
++ .write_room = gigaset_write_room,
++ .chars_in_buffer = gigaset_chars_in_buffer,
++ .brkchars = gigaset_brkchars,
++ .init_bchannel = gigaset_init_bchannel,
++ .close_bchannel = gigaset_close_bchannel,
++ .initbcshw = gigaset_initbcshw,
++ .freebcshw = gigaset_freebcshw,
++ .reinitbcshw = gigaset_reinitbcshw,
++ .initcshw = gigaset_initcshw,
++ .freecshw = gigaset_freecshw,
++ .set_modem_ctrl = gigaset_set_modem_ctrl,
++ .baud_rate = gigaset_baud_rate,
++ .set_line_ctrl = gigaset_set_line_ctrl,
++ .send_skb = gigaset_m10x_send_skb, /* asyncdata.c */
++ .handle_input = gigaset_m10x_input, /* asyncdata.c */
+ };
+
+
diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c
-index 5e3300d..dc7d752 100644
+index 5e3300d..b187acf 100644
--- a/drivers/isdn/gigaset/usb-gigaset.c
+++ b/drivers/isdn/gigaset/usb-gigaset.c
@@ -546,7 +546,7 @@ static int gigaset_brkchars(struct cardstate *cs, const unsigned char buf[6])
@@ -40122,6 +40662,45 @@ index 5e3300d..dc7d752 100644
}
static int gigaset_freebcshw(struct bc_state *bcs)
+@@ -869,22 +869,22 @@ static int gigaset_pre_reset(struct usb_interface *intf)
+ }
+
+ static const struct gigaset_ops ops = {
+- gigaset_write_cmd,
+- gigaset_write_room,
+- gigaset_chars_in_buffer,
+- gigaset_brkchars,
+- gigaset_init_bchannel,
+- gigaset_close_bchannel,
+- gigaset_initbcshw,
+- gigaset_freebcshw,
+- gigaset_reinitbcshw,
+- gigaset_initcshw,
+- gigaset_freecshw,
+- gigaset_set_modem_ctrl,
+- gigaset_baud_rate,
+- gigaset_set_line_ctrl,
+- gigaset_m10x_send_skb,
+- gigaset_m10x_input,
++ .write_cmd = gigaset_write_cmd,
++ .write_room = gigaset_write_room,
++ .chars_in_buffer = gigaset_chars_in_buffer,
++ .brkchars = gigaset_brkchars,
++ .init_bchannel = gigaset_init_bchannel,
++ .close_bchannel = gigaset_close_bchannel,
++ .initbcshw = gigaset_initbcshw,
++ .freebcshw = gigaset_freebcshw,
++ .reinitbcshw = gigaset_reinitbcshw,
++ .initcshw = gigaset_initcshw,
++ .freecshw = gigaset_freecshw,
++ .set_modem_ctrl = gigaset_set_modem_ctrl,
++ .baud_rate = gigaset_baud_rate,
++ .set_line_ctrl = gigaset_set_line_ctrl,
++ .send_skb = gigaset_m10x_send_skb,
++ .handle_input = gigaset_m10x_input,
+ };
+
+ /*
diff --git a/drivers/isdn/hardware/avm/b1.c b/drivers/isdn/hardware/avm/b1.c
index 2a57da59..e7a12ed 100644
--- a/drivers/isdn/hardware/avm/b1.c
@@ -40157,6 +40736,23 @@ index 6ddb795e..bd2e875 100644
if (arg) {
if (copy_to_user(argp, &dev, sizeof(ulong)))
return -EFAULT;
+diff --git a/drivers/isdn/i4l/isdn_concap.c b/drivers/isdn/i4l/isdn_concap.c
+index d568689..a53b90a 100644
+--- a/drivers/isdn/i4l/isdn_concap.c
++++ b/drivers/isdn/i4l/isdn_concap.c
+@@ -80,9 +80,9 @@ static int isdn_concap_dl_disconn_req(struct concap_proto *concap)
+ }
+
+ struct concap_device_ops isdn_concap_reliable_dl_dops = {
+- &isdn_concap_dl_data_req,
+- &isdn_concap_dl_connect_req,
+- &isdn_concap_dl_disconn_req
++ .data_req = &isdn_concap_dl_data_req,
++ .connect_req = &isdn_concap_dl_connect_req,
++ .disconn_req = &isdn_concap_dl_disconn_req
+ };
+
+ /* The following should better go into a dedicated source file such that
diff --git a/drivers/isdn/i4l/isdn_net.c b/drivers/isdn/i4l/isdn_net.c
index 2339d73..802ab87a 100644
--- a/drivers/isdn/i4l/isdn_net.c
@@ -40170,6 +40766,33 @@ index 2339d73..802ab87a 100644
switch (lp->p_encap) {
case ISDN_NET_ENCAP_ETHER:
+diff --git a/drivers/isdn/i4l/isdn_x25iface.c b/drivers/isdn/i4l/isdn_x25iface.c
+index fd10d7c..1eaf1f4 100644
+--- a/drivers/isdn/i4l/isdn_x25iface.c
++++ b/drivers/isdn/i4l/isdn_x25iface.c
+@@ -53,14 +53,14 @@ static int isdn_x25iface_disconn_ind( struct concap_proto * );
+
+
+ static struct concap_proto_ops ix25_pops = {
+- &isdn_x25iface_proto_new,
+- &isdn_x25iface_proto_del,
+- &isdn_x25iface_proto_restart,
+- &isdn_x25iface_proto_close,
+- &isdn_x25iface_xmit,
+- &isdn_x25iface_receive,
+- &isdn_x25iface_connect_ind,
+- &isdn_x25iface_disconn_ind
++ .proto_new = &isdn_x25iface_proto_new,
++ .proto_del = &isdn_x25iface_proto_del,
++ .restart = &isdn_x25iface_proto_restart,
++ .close = &isdn_x25iface_proto_close,
++ .encap_and_xmit = &isdn_x25iface_xmit,
++ .data_ind = &isdn_x25iface_receive,
++ .connect_ind = &isdn_x25iface_connect_ind,
++ .disconn_ind = &isdn_x25iface_disconn_ind
+ };
+
+ /* error message helper function */
diff --git a/drivers/isdn/icn/icn.c b/drivers/isdn/icn/icn.c
index 1f355bb..43f1fea 100644
--- a/drivers/isdn/icn/icn.c
@@ -42120,6 +42743,30 @@ index 851b2f2..a4ec097 100644
extern struct xpc_interface xpc_interface;
+diff --git a/drivers/misc/sgi-xp/xp_main.c b/drivers/misc/sgi-xp/xp_main.c
+index 01be66d..e3a0c7e 100644
+--- a/drivers/misc/sgi-xp/xp_main.c
++++ b/drivers/misc/sgi-xp/xp_main.c
+@@ -78,13 +78,13 @@ xpc_notloaded(void)
+ }
+
+ struct xpc_interface xpc_interface = {
+- (void (*)(int))xpc_notloaded,
+- (void (*)(int))xpc_notloaded,
+- (enum xp_retval(*)(short, int, u32, void *, u16))xpc_notloaded,
+- (enum xp_retval(*)(short, int, u32, void *, u16, xpc_notify_func,
++ .connect = (void (*)(int))xpc_notloaded,
++ .disconnect = (void (*)(int))xpc_notloaded,
++ .send = (enum xp_retval(*)(short, int, u32, void *, u16))xpc_notloaded,
++ .send_notify = (enum xp_retval(*)(short, int, u32, void *, u16, xpc_notify_func,
+ void *))xpc_notloaded,
+- (void (*)(short, int, void *))xpc_notloaded,
+- (enum xp_retval(*)(short, void *))xpc_notloaded
++ .received = (void (*)(short, int, void *))xpc_notloaded,
++ .partid_to_nasids = (enum xp_retval(*)(short, void *))xpc_notloaded
+ };
+ EXPORT_SYMBOL_GPL(xpc_interface);
+
diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h
index b94d5f7..7f494c5 100644
--- a/drivers/misc/sgi-xp/xpc.h
@@ -42432,6 +43079,25 @@ index da90ba5..dcba1fd 100644
#define CHIPREV_ID_5750_C2 0x4202
#define CHIPREV_ID_5752_A0_HW 0x5000
#define CHIPREV_ID_5752_A0 0x6000
+diff --git a/drivers/net/ethernet/brocade/bna/bna_enet.c b/drivers/net/ethernet/brocade/bna/bna_enet.c
+index 26f5c5a..9482b63 100644
+--- a/drivers/net/ethernet/brocade/bna/bna_enet.c
++++ b/drivers/net/ethernet/brocade/bna/bna_enet.c
+@@ -1688,10 +1688,10 @@ bna_cb_ioceth_reset(void *arg)
+ }
+
+ static struct bfa_ioc_cbfn bna_ioceth_cbfn = {
+- bna_cb_ioceth_enable,
+- bna_cb_ioceth_disable,
+- bna_cb_ioceth_hbfail,
+- bna_cb_ioceth_reset
++ .enable_cbfn = bna_cb_ioceth_enable,
++ .disable_cbfn = bna_cb_ioceth_disable,
++ .hbfail_cbfn = bna_cb_ioceth_hbfail,
++ .reset_cbfn = bna_cb_ioceth_reset
+ };
+
+ static void bna_attr_init(struct bna_ioceth *ioceth)
diff --git a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
index 4d15c8f..1bc7689 100644
--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
@@ -43425,6 +44091,174 @@ index e662cbc..8d4a102 100644
return -EINVAL;
}
+diff --git a/drivers/net/wan/lmc/lmc_media.c b/drivers/net/wan/lmc/lmc_media.c
+index 5920c99..ff2e4a5 100644
+--- a/drivers/net/wan/lmc/lmc_media.c
++++ b/drivers/net/wan/lmc/lmc_media.c
+@@ -95,62 +95,63 @@ static inline void write_av9110_bit (lmc_softc_t *, int);
+ static void write_av9110(lmc_softc_t *, u32, u32, u32, u32, u32);
+
+ lmc_media_t lmc_ds3_media = {
+- lmc_ds3_init, /* special media init stuff */
+- lmc_ds3_default, /* reset to default state */
+- lmc_ds3_set_status, /* reset status to state provided */
+- lmc_dummy_set_1, /* set clock source */
+- lmc_dummy_set2_1, /* set line speed */
+- lmc_ds3_set_100ft, /* set cable length */
+- lmc_ds3_set_scram, /* set scrambler */
+- lmc_ds3_get_link_status, /* get link status */
+- lmc_dummy_set_1, /* set link status */
+- lmc_ds3_set_crc_length, /* set CRC length */
+- lmc_dummy_set_1, /* set T1 or E1 circuit type */
+- lmc_ds3_watchdog
++ .init = lmc_ds3_init, /* special media init stuff */
++ .defaults = lmc_ds3_default, /* reset to default state */
++ .set_status = lmc_ds3_set_status, /* reset status to state provided */
++ .set_clock_source = lmc_dummy_set_1, /* set clock source */
++ .set_speed = lmc_dummy_set2_1, /* set line speed */
++ .set_cable_length = lmc_ds3_set_100ft, /* set cable length */
++ .set_scrambler = lmc_ds3_set_scram, /* set scrambler */
++ .get_link_status = lmc_ds3_get_link_status, /* get link status */
++ .set_link_status = lmc_dummy_set_1, /* set link status */
++ .set_crc_length = lmc_ds3_set_crc_length, /* set CRC length */
++ .set_circuit_type = lmc_dummy_set_1, /* set T1 or E1 circuit type */
++ .watchdog = lmc_ds3_watchdog
+ };
+
+ lmc_media_t lmc_hssi_media = {
+- lmc_hssi_init, /* special media init stuff */
+- lmc_hssi_default, /* reset to default state */
+- lmc_hssi_set_status, /* reset status to state provided */
+- lmc_hssi_set_clock, /* set clock source */
+- lmc_dummy_set2_1, /* set line speed */
+- lmc_dummy_set_1, /* set cable length */
+- lmc_dummy_set_1, /* set scrambler */
+- lmc_hssi_get_link_status, /* get link status */
+- lmc_hssi_set_link_status, /* set link status */
+- lmc_hssi_set_crc_length, /* set CRC length */
+- lmc_dummy_set_1, /* set T1 or E1 circuit type */
+- lmc_hssi_watchdog
++ .init = lmc_hssi_init, /* special media init stuff */
++ .defaults = lmc_hssi_default, /* reset to default state */
++ .set_status = lmc_hssi_set_status, /* reset status to state provided */
++ .set_clock_source = lmc_hssi_set_clock, /* set clock source */
++ .set_speed = lmc_dummy_set2_1, /* set line speed */
++ .set_cable_length = lmc_dummy_set_1, /* set cable length */
++ .set_scrambler = lmc_dummy_set_1, /* set scrambler */
++ .get_link_status = lmc_hssi_get_link_status, /* get link status */
++ .set_link_status = lmc_hssi_set_link_status, /* set link status */
++ .set_crc_length = lmc_hssi_set_crc_length, /* set CRC length */
++ .set_circuit_type = lmc_dummy_set_1, /* set T1 or E1 circuit type */
++ .watchdog = lmc_hssi_watchdog
+ };
+
+-lmc_media_t lmc_ssi_media = { lmc_ssi_init, /* special media init stuff */
+- lmc_ssi_default, /* reset to default state */
+- lmc_ssi_set_status, /* reset status to state provided */
+- lmc_ssi_set_clock, /* set clock source */
+- lmc_ssi_set_speed, /* set line speed */
+- lmc_dummy_set_1, /* set cable length */
+- lmc_dummy_set_1, /* set scrambler */
+- lmc_ssi_get_link_status, /* get link status */
+- lmc_ssi_set_link_status, /* set link status */
+- lmc_ssi_set_crc_length, /* set CRC length */
+- lmc_dummy_set_1, /* set T1 or E1 circuit type */
+- lmc_ssi_watchdog
++lmc_media_t lmc_ssi_media = {
++ .init = lmc_ssi_init, /* special media init stuff */
++ .defaults = lmc_ssi_default, /* reset to default state */
++ .set_status = lmc_ssi_set_status, /* reset status to state provided */
++ .set_clock_source = lmc_ssi_set_clock, /* set clock source */
++ .set_speed = lmc_ssi_set_speed, /* set line speed */
++ .set_cable_length = lmc_dummy_set_1, /* set cable length */
++ .set_scrambler = lmc_dummy_set_1, /* set scrambler */
++ .get_link_status = lmc_ssi_get_link_status, /* get link status */
++ .set_link_status = lmc_ssi_set_link_status, /* set link status */
++ .set_crc_length = lmc_ssi_set_crc_length, /* set CRC length */
++ .set_circuit_type = lmc_dummy_set_1, /* set T1 or E1 circuit type */
++ .watchdog = lmc_ssi_watchdog
+ };
+
+ lmc_media_t lmc_t1_media = {
+- lmc_t1_init, /* special media init stuff */
+- lmc_t1_default, /* reset to default state */
+- lmc_t1_set_status, /* reset status to state provided */
+- lmc_t1_set_clock, /* set clock source */
+- lmc_dummy_set2_1, /* set line speed */
+- lmc_dummy_set_1, /* set cable length */
+- lmc_dummy_set_1, /* set scrambler */
+- lmc_t1_get_link_status, /* get link status */
+- lmc_dummy_set_1, /* set link status */
+- lmc_t1_set_crc_length, /* set CRC length */
+- lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */
+- lmc_t1_watchdog
++ .init = lmc_t1_init, /* special media init stuff */
++ .defaults = lmc_t1_default, /* reset to default state */
++ .set_status = lmc_t1_set_status, /* reset status to state provided */
++ .set_clock_source = lmc_t1_set_clock, /* set clock source */
++ .set_speed = lmc_dummy_set2_1, /* set line speed */
++ .set_cable_length = lmc_dummy_set_1, /* set cable length */
++ .set_scrambler = lmc_dummy_set_1, /* set scrambler */
++ .get_link_status = lmc_t1_get_link_status, /* get link status */
++ .set_link_status = lmc_dummy_set_1, /* set link status */
++ .set_crc_length = lmc_t1_set_crc_length, /* set CRC length */
++ .set_circuit_type = lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */
++ .watchdog = lmc_t1_watchdog
+ };
+
+ static void
+diff --git a/drivers/net/wan/z85230.c b/drivers/net/wan/z85230.c
+index 0e57690..ad698bb 100644
+--- a/drivers/net/wan/z85230.c
++++ b/drivers/net/wan/z85230.c
+@@ -485,9 +485,9 @@ static void z8530_status(struct z8530_channel *chan)
+
+ struct z8530_irqhandler z8530_sync =
+ {
+- z8530_rx,
+- z8530_tx,
+- z8530_status
++ .rx = z8530_rx,
++ .tx = z8530_tx,
++ .status = z8530_status
+ };
+
+ EXPORT_SYMBOL(z8530_sync);
+@@ -605,15 +605,15 @@ static void z8530_dma_status(struct z8530_channel *chan)
+ }
+
+ static struct z8530_irqhandler z8530_dma_sync = {
+- z8530_dma_rx,
+- z8530_dma_tx,
+- z8530_dma_status
++ .rx = z8530_dma_rx,
++ .tx = z8530_dma_tx,
++ .status = z8530_dma_status
+ };
+
+ static struct z8530_irqhandler z8530_txdma_sync = {
+- z8530_rx,
+- z8530_dma_tx,
+- z8530_dma_status
++ .rx = z8530_rx,
++ .tx = z8530_dma_tx,
++ .status = z8530_dma_status
+ };
+
+ /**
+@@ -680,9 +680,9 @@ static void z8530_status_clear(struct z8530_channel *chan)
+
+ struct z8530_irqhandler z8530_nop=
+ {
+- z8530_rx_clear,
+- z8530_tx_clear,
+- z8530_status_clear
++ .rx = z8530_rx_clear,
++ .tx = z8530_tx_clear,
++ .status = z8530_status_clear
+ };
+
+
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index ac1176a..79e93d4 100644
--- a/drivers/net/wireless/airo.c
@@ -45033,6 +45867,69 @@ index 1080bcb..4a8ddd9 100644
void bfa_itn_create(struct bfa_s *bfa, struct bfa_rport_s *rport,
void (*isr)(struct bfa_s *bfa, struct bfi_msg_s *m));
+diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c
+index eaac57e..4b3fc1c 100644
+--- a/drivers/scsi/bfa/bfa_fcs.c
++++ b/drivers/scsi/bfa/bfa_fcs.c
+@@ -38,10 +38,21 @@ struct bfa_fcs_mod_s {
+ #define BFA_FCS_MODULE(_mod) { _mod ## _modinit, _mod ## _modexit }
+
+ static struct bfa_fcs_mod_s fcs_modules[] = {
+- { bfa_fcs_port_attach, NULL, NULL },
+- { bfa_fcs_uf_attach, NULL, NULL },
+- { bfa_fcs_fabric_attach, bfa_fcs_fabric_modinit,
+- bfa_fcs_fabric_modexit },
++ {
++ .attach = bfa_fcs_port_attach,
++ .modinit = NULL,
++ .modexit = NULL
++ },
++ {
++ .attach = bfa_fcs_uf_attach,
++ .modinit = NULL,
++ .modexit = NULL
++ },
++ {
++ .attach = bfa_fcs_fabric_attach,
++ .modinit = bfa_fcs_fabric_modinit,
++ .modexit = bfa_fcs_fabric_modexit
++ },
+ };
+
+ /*
+diff --git a/drivers/scsi/bfa/bfa_fcs_lport.c b/drivers/scsi/bfa/bfa_fcs_lport.c
+index d4f951f..6081753 100644
+--- a/drivers/scsi/bfa/bfa_fcs_lport.c
++++ b/drivers/scsi/bfa/bfa_fcs_lport.c
+@@ -57,13 +57,21 @@ static struct {
+ void (*offline) (struct bfa_fcs_lport_s *port);
+ } __port_action[] = {
+ {
+- bfa_fcs_lport_unknown_init, bfa_fcs_lport_unknown_online,
+- bfa_fcs_lport_unknown_offline}, {
+- bfa_fcs_lport_fab_init, bfa_fcs_lport_fab_online,
+- bfa_fcs_lport_fab_offline}, {
+- bfa_fcs_lport_n2n_init, bfa_fcs_lport_n2n_online,
+- bfa_fcs_lport_n2n_offline},
+- };
++ .init = bfa_fcs_lport_unknown_init,
++ .online = bfa_fcs_lport_unknown_online,
++ .offline = bfa_fcs_lport_unknown_offline
++ },
++ {
++ .init = bfa_fcs_lport_fab_init,
++ .online = bfa_fcs_lport_fab_online,
++ .offline = bfa_fcs_lport_fab_offline
++ },
++ {
++ .init = bfa_fcs_lport_n2n_init,
++ .online = bfa_fcs_lport_n2n_online,
++ .offline = bfa_fcs_lport_n2n_offline
++ },
++};
+
+ /*
+ * fcs_port_sm FCS logical port state machine
diff --git a/drivers/scsi/bfa/bfa_ioc.h b/drivers/scsi/bfa/bfa_ioc.h
index 546d46b..642fa5b 100644
--- a/drivers/scsi/bfa/bfa_ioc.h
@@ -45055,6 +45952,29 @@ index 546d46b..642fa5b 100644
/*
* Queue element to wait for room in request queue. FIFO order is
+diff --git a/drivers/scsi/bfa/bfa_modules.h b/drivers/scsi/bfa/bfa_modules.h
+index 2d36e48..5818d72 100644
+--- a/drivers/scsi/bfa/bfa_modules.h
++++ b/drivers/scsi/bfa/bfa_modules.h
+@@ -77,12 +77,12 @@ enum {
+ \
+ extern struct bfa_module_s hal_mod_ ## __mod; \
+ struct bfa_module_s hal_mod_ ## __mod = { \
+- bfa_ ## __mod ## _meminfo, \
+- bfa_ ## __mod ## _attach, \
+- bfa_ ## __mod ## _detach, \
+- bfa_ ## __mod ## _start, \
+- bfa_ ## __mod ## _stop, \
+- bfa_ ## __mod ## _iocdisable, \
++ .meminfo = bfa_ ## __mod ## _meminfo, \
++ .attach = bfa_ ## __mod ## _attach, \
++ .detach = bfa_ ## __mod ## _detach, \
++ .start = bfa_ ## __mod ## _start, \
++ .stop = bfa_ ## __mod ## _stop, \
++ .iocdisable = bfa_ ## __mod ## _iocdisable, \
+ }
+
+ #define BFA_CACHELINE_SZ (256)
diff --git a/drivers/scsi/bfa/bfad_debugfs.c b/drivers/scsi/bfa/bfad_debugfs.c
index dee1a09..24adab6 100644
--- a/drivers/scsi/bfa/bfad_debugfs.c
@@ -45240,7 +46160,7 @@ index 5b7e1bf..6e5521a 100644
}
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
-index c721509..8be5717 100644
+index c721509..3a9df95 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -73,7 +73,7 @@ struct ctlr_info {
@@ -45252,6 +46172,36 @@ index c721509..8be5717 100644
/* queue and queue Info */
struct list_head reqQ;
+@@ -351,19 +351,19 @@ static bool SA5_performant_intr_pending(struct ctlr_info *h)
+ }
+
+ static struct access_method SA5_access = {
+- SA5_submit_command,
+- SA5_intr_mask,
+- SA5_fifo_full,
+- SA5_intr_pending,
+- SA5_completed,
++ .submit_command = SA5_submit_command,
++ .set_intr_mask = SA5_intr_mask,
++ .fifo_full = SA5_fifo_full,
++ .intr_pending = SA5_intr_pending,
++ .command_completed = SA5_completed,
+ };
+
+ static struct access_method SA5_performant_access = {
+- SA5_submit_command,
+- SA5_performant_intr_mask,
+- SA5_fifo_full,
+- SA5_performant_intr_pending,
+- SA5_performant_completed,
++ .submit_command = SA5_submit_command,
++ .set_intr_mask = SA5_performant_intr_mask,
++ .fifo_full = SA5_fifo_full,
++ .intr_pending = SA5_performant_intr_pending,
++ .command_completed = SA5_performant_completed,
+ };
+
+ struct board_type {
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 9de9db2..1e09660 100644
--- a/drivers/scsi/libfc/fc_exch.c
@@ -46126,6 +47076,19 @@ index 66a34ad..65f6aea 100644
/* A userspace program has probably made an error if it tries to
* read something that is not a whole number of bpds.
+diff --git a/drivers/staging/media/solo6x10/g723.c b/drivers/staging/media/solo6x10/g723.c
+index 2cd0de2..0169c04 100644
+--- a/drivers/staging/media/solo6x10/g723.c
++++ b/drivers/staging/media/solo6x10/g723.c
+@@ -336,7 +336,7 @@ static int solo_snd_pcm_init(struct solo_dev *solo_dev)
+
+ int solo_g723_init(struct solo_dev *solo_dev)
+ {
+- static struct snd_device_ops ops = { NULL };
++ static struct snd_device_ops ops = { };
+ struct snd_card *card;
+ struct snd_kcontrol_new kctl;
+ char name[32];
diff --git a/drivers/staging/octeon/ethernet-rx.c b/drivers/staging/octeon/ethernet-rx.c
index 8b307b4..a97ac91 100644
--- a/drivers/staging/octeon/ethernet-rx.c
@@ -50861,6 +51824,49 @@ index 3c14e43..eafa544 100644
+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+4 4 4 4 4 4
+diff --git a/drivers/video/matrox/matroxfb_DAC1064.c b/drivers/video/matrox/matroxfb_DAC1064.c
+index 1717623..25907782 100644
+--- a/drivers/video/matrox/matroxfb_DAC1064.c
++++ b/drivers/video/matrox/matroxfb_DAC1064.c
+@@ -1088,14 +1088,20 @@ static void MGAG100_restore(struct matrox_fb_info *minfo)
+
+ #ifdef CONFIG_FB_MATROX_MYSTIQUE
+ struct matrox_switch matrox_mystique = {
+- MGA1064_preinit, MGA1064_reset, MGA1064_init, MGA1064_restore,
++ .preinit = MGA1064_preinit,
++ .reset = MGA1064_reset,
++ .init = MGA1064_init,
++ .restore = MGA1064_restore,
+ };
+ EXPORT_SYMBOL(matrox_mystique);
+ #endif
+
+ #ifdef CONFIG_FB_MATROX_G
+ struct matrox_switch matrox_G100 = {
+- MGAG100_preinit, MGAG100_reset, MGAG100_init, MGAG100_restore,
++ .preinit = MGAG100_preinit,
++ .reset = MGAG100_reset,
++ .init = MGAG100_init,
++ .restore = MGAG100_restore,
+ };
+ EXPORT_SYMBOL(matrox_G100);
+ #endif
+diff --git a/drivers/video/matrox/matroxfb_Ti3026.c b/drivers/video/matrox/matroxfb_Ti3026.c
+index 9a44cec..07e3b43 100644
+--- a/drivers/video/matrox/matroxfb_Ti3026.c
++++ b/drivers/video/matrox/matroxfb_Ti3026.c
+@@ -738,7 +738,10 @@ static int Ti3026_preinit(struct matrox_fb_info *minfo)
+ }
+
+ struct matrox_switch matrox_millennium = {
+- Ti3026_preinit, Ti3026_reset, Ti3026_init, Ti3026_restore
++ .preinit = Ti3026_preinit,
++ .reset = Ti3026_reset,
++ .init = Ti3026_init,
++ .restore = Ti3026_restore
+ };
+ EXPORT_SYMBOL(matrox_millennium);
+ #endif
diff --git a/drivers/video/mb862xx/mb862xxfb_accel.c b/drivers/video/mb862xx/mb862xxfb_accel.c
index fe92eed..106e085 100644
--- a/drivers/video/mb862xx/mb862xxfb_accel.c
@@ -60805,6 +61811,40 @@ index fe677c0..2a15fb2 100644
if (old_format_only(sb))
/* not a perfect generation count, as object ids can be reused, but
** this is as good as reiserfs can do right now.
+diff --git a/fs/reiserfs/item_ops.c b/fs/reiserfs/item_ops.c
+index 72cb1cc..a7d36d3 100644
+--- a/fs/reiserfs/item_ops.c
++++ b/fs/reiserfs/item_ops.c
+@@ -725,18 +725,18 @@ static void errcatch_print_vi(struct virtual_item *vi)
+ }
+
+ static struct item_operations errcatch_ops = {
+- errcatch_bytes_number,
+- errcatch_decrement_key,
+- errcatch_is_left_mergeable,
+- errcatch_print_item,
+- errcatch_check_item,
++ .bytes_number = errcatch_bytes_number,
++ .decrement_key = errcatch_decrement_key,
++ .is_left_mergeable = errcatch_is_left_mergeable,
++ .print_item = errcatch_print_item,
++ .check_item = errcatch_check_item,
+
+- errcatch_create_vi,
+- errcatch_check_left,
+- errcatch_check_right,
+- errcatch_part_size,
+- errcatch_unit_num,
+- errcatch_print_vi
++ .create_vi = errcatch_create_vi,
++ .check_left = errcatch_check_left,
++ .check_right = errcatch_check_right,
++ .part_size = errcatch_part_size,
++ .unit_num = errcatch_unit_num,
++ .print_vi = errcatch_print_vi
+ };
+
+ //////////////////////////////////////////////////////////////////////////////
diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c
index 7a99811..a7c96c4 100644
--- a/fs/reiserfs/procfs.c
@@ -61766,10 +62806,10 @@ index 8a89949..6776861 100644
xfs_init_zones(void)
diff --git a/grsecurity/Kconfig b/grsecurity/Kconfig
new file mode 100644
-index 0000000..c4717f9
+index 0000000..058b9e2
--- /dev/null
+++ b/grsecurity/Kconfig
-@@ -0,0 +1,1085 @@
+@@ -0,0 +1,1133 @@
+#
+# grecurity configuration
+#
@@ -61783,21 +62823,15 @@ index 0000000..c4717f9
+ help
+ If you say Y here, /dev/kmem and /dev/mem won't be allowed to
+ be written to or read from to modify or leak the contents of the running
-+ kernel. /dev/port will also not be allowed to be opened and support
-+ for /dev/cpu/*/msr will be removed. If you have module
-+ support disabled, enabling this will close up five ways that are
-+ currently used to insert malicious code into the running kernel.
++ kernel. /dev/port will also not be allowed to be opened, and support
++ for /dev/cpu/*/msr and kexec will be removed. If you have module
++ support disabled, enabling this will close up six ways that are
++ currently used to insert malicious code into the running kernel.
+
-+ Even with all these features enabled, we still highly recommend that
++ Even with this feature enabled, we still highly recommend that
+ you use the RBAC system, as it is still possible for an attacker to
-+ modify the running kernel through privileged I/O granted by ioperm/iopl.
-+
-+ If you are not using XFree86, you may be able to stop this additional
-+ case by enabling the 'Disable privileged I/O' option. Though nothing
-+ legitimately writes to /dev/kmem, XFree86 does need to write to /dev/mem,
-+ but only to video memory, which is the only writing we allow in this
-+ case. If /dev/kmem or /dev/mem are mmaped without PROT_WRITE, they will
-+ not be allowed to mprotect it with PROT_WRITE later.
++ modify the running kernel through other more obscure methods.
++
+ Enabling this feature will prevent the "cpupower" and "powertop" tools
+ from working.
+
@@ -61833,15 +62867,16 @@ index 0000000..c4717f9
+ the most notable of which are XFree86 and hwclock. hwclock can be
+ remedied by having RTC support in the kernel, so real-time
+ clock support is enabled if this option is enabled, to ensure
-+ that hwclock operates correctly. XFree86 still will not
-+ operate correctly with this option enabled, so DO NOT CHOOSE Y
-+ IF YOU USE XFree86. If you use XFree86 and you still want to
-+ protect your kernel against modification, use the RBAC system.
++ that hwclock operates correctly.
++
++ If you're using XFree86 or a version of Xorg from 2012 or earlier,
++ you may not be able to boot into a graphical environment with this
++ option enabled. In this case, you should use the RBAC system instead.
+
+config GRKERNSEC_JIT_HARDEN
+ bool "Harden BPF JIT against spray attacks"
+ default y if GRKERNSEC_CONFIG_AUTO
-+ depends on BPF_JIT
++ depends on BPF_JIT && X86
+ help
+ If you say Y here, the native code generated by the kernel's Berkeley
+ Packet Filter (BPF) JIT engine will be hardened against JIT-spraying
@@ -61935,7 +62970,6 @@ index 0000000..c4717f9
+ If the sysctl option is enabled, a sysctl option with name
+ "deter_bruteforce" is created.
+
-+
+config GRKERNSEC_MODHARDEN
+ bool "Harden module auto-loading"
+ default y if GRKERNSEC_CONFIG_AUTO
@@ -61988,6 +63022,38 @@ index 0000000..c4717f9
+ It is highly recommended that you enable GRKERNSEC_PERF_HARDEN
+ in addition to this feature.
+
++config GRKERNSEC_RANDSTRUCT
++ bool "Randomize layout of sensitive kernel structures"
++ default y if GRKERNSEC_CONFIG_AUTO
++ select GRKERNSEC_HIDESYM
++ select MODVERSIONS if MODULES
++ help
++ If you say Y here, the layouts of a number of sensitive kernel
++ structures (task, fs, cred, etc) and all structures composed entirely
++ of function pointers (aka "ops" structs) will be randomized at compile-time.
++ This can introduce the requirement of an additional infoleak
++ vulnerability for exploits targeting these structure types.
++
++ Enabling this feature will introduce some performance impact, slightly
++ increase memory usage, and prevent the use of forensic tools like
++ Volatility against the system (unless the kernel source tree isn't
++ cleaned after kernel installation).
++
++ The seed used for compilation is located at tools/gcc/randomize_layout_seed.h.
++ It remains after a make clean to allow for external modules to be compiled
++ with the existing seed and will be removed by a make mrproper or
++ make distclean.
++
++config GRKERNSEC_RANDSTRUCT_PERFORMANCE
++ bool "Use cacheline-aware structure randomization"
++ depends on GRKERNSEC_RANDSTRUCT
++ default y if GRKERNSEC_CONFIG_PRIORITY_PERF
++ help
++ If you say Y here, the RANDSTRUCT randomization will make a best effort
++ at restricting randomization to cacheline-sized groups of elements. It
++ will further not randomize bitfields in structures. This reduces the
++ performance hit of RANDSTRUCT at the cost of weakened randomization.
++
+config GRKERNSEC_KERN_LOCKOUT
+ bool "Active kernel exploit response"
+ default y if GRKERNSEC_CONFIG_AUTO
@@ -62555,6 +63621,28 @@ index 0000000..c4717f9
+ running with root privileges. If the sysctl option is enabled,
+ a sysctl option with name "consistent_setxid" is created.
+
++config GRKERNSEC_HARDEN_IPC
++ bool "Disallow access to overly-permissive IPC objects"
++ default y if GRKERNSEC_CONFIG_AUTO
++ depends on SYSVIPC
++ help
++ If you say Y here, access to overly-permissive IPC objects (shared
++ memory, message queues, and semaphores) will be denied for processes
++ given the following criteria beyond normal permission checks:
++ 1) If the IPC object is world-accessible and the euid doesn't match
++ that of the creator or current uid for the IPC object
++ 2) If the IPC object is group-accessible and the egid doesn't
++ match that of the creator or current gid for the IPC object
++ It's a common error to grant too much permission to these objects,
++ with impact ranging from denial of service and information leaking to
++ privilege escalation. This feature was developed in response to
++ research by Tim Brown:
++ http://labs.portcullis.co.uk/whitepapers/memory-squatting-attacks-on-system-v-shared-memory/
++ who found hundreds of such insecure usages. Processes with
++ CAP_IPC_OWNER are still permitted to access these IPC objects.
++ If the sysctl option is enabled, a sysctl option with name
++ "harden_ipc" is created.
++
+config GRKERNSEC_TPE
+ bool "Trusted Path Execution (TPE)"
+ default y if GRKERNSEC_CONFIG_AUTO && GRKERNSEC_CONFIG_SERVER
@@ -62857,7 +63945,7 @@ index 0000000..c4717f9
+endmenu
diff --git a/grsecurity/Makefile b/grsecurity/Makefile
new file mode 100644
-index 0000000..f96524e
+index 0000000..5307c8a
--- /dev/null
+++ b/grsecurity/Makefile
@@ -0,0 +1,54 @@
@@ -62884,7 +63972,7 @@ index 0000000..f96524e
+obj-y = grsec_chdir.o grsec_chroot.o grsec_exec.o grsec_fifo.o grsec_fork.o \
+ grsec_mount.o grsec_sig.o grsec_sysctl.o \
+ grsec_time.o grsec_tpe.o grsec_link.o grsec_pax.o grsec_ptrace.o \
-+ grsec_usb.o
++ grsec_usb.o grsec_ipc.o
+
+obj-$(CONFIG_GRKERNSEC) += grsec_init.o grsum.o gracl.o gracl_segv.o \
+ gracl_cap.o gracl_alloc.o gracl_shm.o grsec_mem.o gracl_fs.o \
@@ -62917,10 +64005,10 @@ index 0000000..f96524e
+endif
diff --git a/grsecurity/gracl.c b/grsecurity/gracl.c
new file mode 100644
-index 0000000..180140a
+index 0000000..bd57acb
--- /dev/null
+++ b/grsecurity/gracl.c
-@@ -0,0 +1,2825 @@
+@@ -0,0 +1,2826 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/sched.h>
@@ -65551,8 +66639,8 @@ index 0000000..180140a
+void
+gr_acl_handle_psacct(struct task_struct *task, const long code)
+{
-+ unsigned long runtime;
-+ unsigned long cputime;
++ unsigned long runtime, cputime;
++ cputime_t utime, stime;
+ unsigned int wday, cday;
+ __u8 whr, chr;
+ __u8 wmin, cmin;
@@ -65565,19 +66653,20 @@ index 0000000..180140a
+
+ do_posix_clock_monotonic_gettime(&timeval);
+ runtime = timeval.tv_sec - task->start_time.tv_sec;
-+ wday = runtime / (3600 * 24);
-+ runtime -= wday * (3600 * 24);
-+ whr = runtime / 3600;
-+ runtime -= whr * 3600;
++ wday = runtime / (60 * 60 * 24);
++ runtime -= wday * (60 * 60 * 24);
++ whr = runtime / (60 * 60);
++ runtime -= whr * (60 * 60);
+ wmin = runtime / 60;
+ runtime -= wmin * 60;
+ wsec = runtime;
+
-+ cputime = (task->utime + task->stime) / HZ;
-+ cday = cputime / (3600 * 24);
-+ cputime -= cday * (3600 * 24);
-+ chr = cputime / 3600;
-+ cputime -= chr * 3600;
++ task_times(task, &utime, &stime);
++ cputime = cputime_to_secs(utime + stime);
++ cday = cputime / (60 * 60 * 24);
++ cputime -= cday * (60 * 60 * 24);
++ chr = cputime / (60 * 60);
++ cputime -= chr * (60 * 60);
+ cmin = cputime / 60;
+ cputime -= cmin * 60;
+ csec = cputime;
@@ -70567,10 +71656,10 @@ index 0000000..8ca18bf
+}
diff --git a/grsecurity/grsec_init.c b/grsecurity/grsec_init.c
new file mode 100644
-index 0000000..264a9f3
+index 0000000..454a98e
--- /dev/null
+++ b/grsecurity/grsec_init.c
-@@ -0,0 +1,268 @@
+@@ -0,0 +1,272 @@
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
@@ -70588,6 +71677,7 @@ index 0000000..264a9f3
+int grsec_enable_link;
+int grsec_enable_dmesg;
+int grsec_enable_harden_ptrace;
++int grsec_enable_harden_ipc;
+int grsec_enable_fifo;
+int grsec_enable_execlog;
+int grsec_enable_signal;
@@ -70727,6 +71817,9 @@ index 0000000..264a9f3
+#ifdef CONFIG_GRKERNSEC_HARDEN_PTRACE
+ grsec_enable_harden_ptrace = 1;
+#endif
++#ifdef CONFIG_GRKERNSEC_HARDEN_IPC
++ grsec_enable_harden_ipc = 1;
++#endif
+#ifdef CONFIG_GRKERNSEC_AUDIT_MOUNT
+ grsec_enable_mount = 1;
+#endif
@@ -70839,6 +71932,60 @@ index 0000000..264a9f3
+
+ return;
+}
+diff --git a/grsecurity/grsec_ipc.c b/grsecurity/grsec_ipc.c
+new file mode 100644
+index 0000000..5377493
+--- /dev/null
++++ b/grsecurity/grsec_ipc.c
+@@ -0,0 +1,48 @@
++#include <linux/kernel.h>
++#include <linux/mm.h>
++#include <linux/sched.h>
++#include <linux/file.h>
++#include <linux/ipc.h>
++#include <linux/ipc_namespace.h>
++#include <linux/grsecurity.h>
++#include <linux/grinternal.h>
++
++int
++gr_ipc_permitted(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, int requested_mode, int granted_mode)
++{
++#ifdef CONFIG_GRKERNSEC_HARDEN_IPC
++ int write;
++ int orig_granted_mode;
++ uid_t euid;
++ gid_t egid;
++
++ if (!grsec_enable_harden_ipc)
++ return 0;
++
++ euid = current_euid();
++ egid = current_egid();
++
++ write = requested_mode & 00002;
++ orig_granted_mode = ipcp->mode;
++
++ if ((euid == ipcp->cuid) || (euid == ipcp->uid))
++ orig_granted_mode >>= 6;
++ else {
++ /* if likely wrong permissions, lock to user */
++ if (orig_granted_mode & 0007)
++ orig_granted_mode = 0;
++ /* otherwise do a egid-only check */
++ else if ((egid == ipcp->cgid) || (egid == ipcp->gid))
++ orig_granted_mode >>= 3;
++ /* otherwise, no access */
++ else
++ orig_granted_mode = 0;
++ }
++ if (!(requested_mode & ~granted_mode & 0007) && (requested_mode & ~orig_granted_mode & 0007) &&
++ !ns_capable_nolog(ns->user_ns, CAP_IPC_OWNER)) {
++ gr_log_str_int(GR_DONT_AUDIT, GR_IPC_DENIED_MSG, write ? "write" : "read", ipcp->cuid);
++ return 0;
++ }
++#endif
++ return 1;
++}
diff --git a/grsecurity/grsec_link.c b/grsecurity/grsec_link.c
new file mode 100644
index 0000000..8598e7f
@@ -71953,10 +73100,10 @@ index 0000000..4030d57
+}
diff --git a/grsecurity/grsec_sysctl.c b/grsecurity/grsec_sysctl.c
new file mode 100644
-index 0000000..6314062
+index 0000000..0d4723d
--- /dev/null
+++ b/grsecurity/grsec_sysctl.c
-@@ -0,0 +1,468 @@
+@@ -0,0 +1,477 @@
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/sysctl.h>
@@ -72394,6 +73541,15 @@ index 0000000..6314062
+ .proc_handler = &proc_dointvec,
+ },
+#endif
++#ifdef CONFIG_GRKERNSEC_HARDEN_IPC
++ {
++ .procname = "harden_ipc",
++ .data = &grsec_enable_harden_ipc,
++ .maxlen = sizeof(int),
++ .mode = 0600,
++ .proc_handler = &proc_dointvec,
++ },
++#endif
+ {
+ .procname = "grsec_lock",
+ .data = &grsec_lock,
@@ -73850,14 +75006,19 @@ index d42bd48..554dcd5 100644
/*
* epoll (fs/eventpoll.c) compat bits follow ...
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
-index 643d6c4..3e46a17 100644
+index 643d6c4..289dbb3 100644
--- a/include/linux/compiler-gcc4.h
+++ b/include/linux/compiler-gcc4.h
-@@ -46,6 +46,21 @@
+@@ -46,6 +46,26 @@
#endif
#if __GNUC_MINOR__ >= 5
+
++#ifdef RANDSTRUCT_PLUGIN
++#define __randomize_layout __attribute__((randomize_layout))
++#define __no_randomize_layout __attribute__((no_randomize_layout))
++#endif
++
+#ifdef CONSTIFY_PLUGIN
+#define __no_const __attribute__((no_const))
+#define __do_const __attribute__((do_const))
@@ -73875,7 +75036,7 @@ index 643d6c4..3e46a17 100644
/*
* Mark a position in code as unreachable. This can be used to
* suppress control flow warnings after asm blocks that transfer
-@@ -61,6 +76,11 @@
+@@ -61,6 +81,11 @@
#define __noclone __attribute__((__noclone__))
#endif
@@ -73888,7 +75049,7 @@ index 643d6c4..3e46a17 100644
#if __GNUC_MINOR__ > 0
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
-index 320d6c9..2d1df6b 100644
+index 320d6c9..f4c24bf 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -5,31 +5,51 @@
@@ -73955,10 +75116,18 @@ index 320d6c9..2d1df6b 100644
#endif
#ifdef __KERNEL__
-@@ -264,6 +286,22 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
+@@ -264,6 +286,30 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
# define __attribute_const__ /* unimplemented */
#endif
++#ifndef __randomize_layout
++# define __randomize_layout
++#endif
++
++#ifndef __no_randomize_layout
++# define __no_randomize_layout
++#endif
++
+#ifndef __no_const
+# define __no_const
+#endif
@@ -73978,7 +75147,7 @@ index 320d6c9..2d1df6b 100644
/*
* Tell gcc if a function is cold. The compiler will assume any path
* directly leading to the call is unlikely.
-@@ -273,6 +311,22 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
+@@ -273,6 +319,22 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
#define __cold
#endif
@@ -74001,7 +75170,7 @@ index 320d6c9..2d1df6b 100644
/* Simple shorthand for a section definition */
#ifndef __section
# define __section(S) __attribute__ ((__section__(#S)))
-@@ -292,6 +346,18 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
+@@ -292,6 +354,18 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
#endif
#ifndef __compiletime_error
# define __compiletime_error(message)
@@ -74020,7 +75189,7 @@ index 320d6c9..2d1df6b 100644
#endif
/*
-@@ -306,6 +372,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
+@@ -306,6 +380,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
* use is to mediate communication between process-level code and irq/NMI
* handlers, all running on the same CPU.
*/
@@ -74176,9 +75345,27 @@ index 4f7a632..b9e6f95 100644
/**
diff --git a/include/linux/cred.h b/include/linux/cred.h
-index 4030896..8d6f342 100644
+index 4030896..65aefc8 100644
--- a/include/linux/cred.h
+++ b/include/linux/cred.h
+@@ -34,7 +34,7 @@ struct group_info {
+ int nblocks;
+ gid_t small_block[NGROUPS_SMALL];
+ gid_t *blocks[0];
+-};
++} __randomize_layout;
+
+ /**
+ * get_group_info - Get a reference to a group info structure
+@@ -149,7 +149,7 @@ struct cred {
+ struct user_namespace *user_ns; /* cached user->user_ns */
+ struct group_info *group_info; /* supplementary groups for euid/fsgid */
+ struct rcu_head rcu; /* RCU deletion hook */
+-};
++} __randomize_layout;
+
+ extern void __put_cred(struct cred *);
+ extern void exit_creds(struct task_struct *);
@@ -207,6 +207,9 @@ static inline void validate_creds_for_do_exit(struct task_struct *tsk)
static inline void validate_process_creds(void)
{
@@ -74231,6 +75418,19 @@ index 8acfe31..6ffccd63 100644
{
return c | 0x20;
}
+diff --git a/include/linux/dcache.h b/include/linux/dcache.h
+index 1dfe974..3811bc2 100644
+--- a/include/linux/dcache.h
++++ b/include/linux/dcache.h
+@@ -142,7 +142,7 @@ struct dentry {
+ } d_u;
+ struct list_head d_subdirs; /* our children */
+ struct list_head d_alias; /* inode alias list */
+-};
++} __randomize_layout;
+
+ /*
+ * dentry->d_lock spinlock nesting subclasses:
diff --git a/include/linux/decompress/mm.h b/include/linux/decompress/mm.h
index 7925bf0..d5143d2 100644
--- a/include/linux/decompress/mm.h
@@ -74487,15 +75687,69 @@ index 8eeb205..13d571c 100644
#endif /* __KERNEL__ */
diff --git a/include/linux/fs.h b/include/linux/fs.h
-index dd74385..c745e49 100644
+index dd74385..1388ed4 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
+@@ -658,7 +658,7 @@ struct address_space {
+ spinlock_t private_lock; /* for use by the address_space */
+ struct list_head private_list; /* ditto */
+ struct address_space *assoc_mapping; /* ditto */
+-} __attribute__((aligned(sizeof(long))));
++} __attribute__((aligned(sizeof(long)))) __randomize_layout;
+ /*
+ * On most architectures that alignment is already the case; but
+ * must be enforced here for CRIS, to let the least significant bit
+@@ -699,7 +699,7 @@ struct block_device {
+ int bd_fsfreeze_count;
+ /* Mutex for freeze */
+ struct mutex bd_fsfreeze_mutex;
+-};
++} __randomize_layout;
+
+ /*
+ * Radix-tree tags, for tagging dirty and writeback pages within the pagecache
+@@ -843,7 +843,7 @@ struct inode {
+ atomic_t i_readcount; /* struct files open RO */
+ #endif
+ void *i_private; /* fs or device private pointer */
+-};
++} __randomize_layout;
+
+ static inline int inode_unhashed(struct inode *inode)
+ {
+@@ -1017,7 +1017,7 @@ struct file {
+ #ifdef CONFIG_DEBUG_WRITECOUNT
+ unsigned long f_mnt_write_state;
+ #endif
+-};
++} __randomize_layout;
+
+ struct file_handle {
+ __u32 handle_bytes;
+@@ -1162,7 +1162,7 @@ struct file_lock {
+ int state; /* state of grant or error if -ve */
+ } afs;
+ } fl_u;
+-};
++} __randomize_layout;
+
+ /* The following constant reflects the upper bound of the file/locking space */
+ #ifndef OFFSET_MAX
+@@ -1497,7 +1497,7 @@ struct super_block {
+ int cleancache_poolid;
+
+ struct shrinker s_shrink; /* per-sb shrinker handle */
+-};
++} __randomize_layout;
+
+ /* superblock cache pruning functions */
+ extern void prune_icache_sb(struct super_block *sb, int nr_to_scan);
@@ -1624,7 +1624,8 @@ struct file_operations {
int (*setlease)(struct file *, long, struct file_lock **);
long (*fallocate)(struct file *file, int mode, loff_t offset,
loff_t len);
-};
-+} __do_const;
++} __do_const __randomize_layout;
+typedef struct file_operations __no_const file_operations_no_const;
struct inode_operations {
@@ -74526,10 +75780,10 @@ index dd74385..c745e49 100644
#endif /* __KERNEL__ */
#endif /* _LINUX_FS_H */
diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h
-index 003dc0f..3c4ea97 100644
+index 003dc0f..82513b5 100644
--- a/include/linux/fs_struct.h
+++ b/include/linux/fs_struct.h
-@@ -6,7 +6,7 @@
+@@ -6,13 +6,13 @@
#include <linux/seqlock.h>
struct fs_struct {
@@ -74538,6 +75792,13 @@ index 003dc0f..3c4ea97 100644
spinlock_t lock;
seqcount_t seq;
int umask;
+ int in_exec;
+ struct path root, pwd;
+-};
++} __randomize_layout;
+
+ extern struct kmem_cache *fs_cachep;
+
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h
index ce31408..b1ad003 100644
--- a/include/linux/fscache-cache.h
@@ -75355,10 +76616,10 @@ index 0000000..be66033
+#endif
diff --git a/include/linux/grinternal.h b/include/linux/grinternal.h
new file mode 100644
-index 0000000..44d8215
+index 0000000..7dc4203
--- /dev/null
+++ b/include/linux/grinternal.h
-@@ -0,0 +1,236 @@
+@@ -0,0 +1,237 @@
+#ifndef __GRINTERNAL_H
+#define __GRINTERNAL_H
+
@@ -75441,6 +76702,7 @@ index 0000000..44d8215
+extern int grsec_enable_blackhole;
+extern int grsec_lastack_retries;
+extern int grsec_enable_brute;
++extern int grsec_enable_harden_ipc;
+extern int grsec_lock;
+
+extern spinlock_t grsec_alert_lock;
@@ -75597,10 +76859,10 @@ index 0000000..44d8215
+#endif
diff --git a/include/linux/grmsg.h b/include/linux/grmsg.h
new file mode 100644
-index 0000000..1357a24
+index 0000000..195cbe4
--- /dev/null
+++ b/include/linux/grmsg.h
-@@ -0,0 +1,114 @@
+@@ -0,0 +1,115 @@
+#define DEFAULTSECMSG "%.256s[%.16s:%d] uid/euid:%u/%u gid/egid:%u/%u, parent %.256s[%.16s:%d] uid/euid:%u/%u gid/egid:%u/%u"
+#define GR_ACL_PROCACCT_MSG "%.256s[%.16s:%d] IP:%pI4 TTY:%.64s uid/euid:%u/%u gid/egid:%u/%u run time:[%ud %uh %um %us] cpu time:[%ud %uh %um %us] %s with exit code %ld, parent %.256s[%.16s:%d] IP:%pI4 TTY:%.64s uid/euid:%u/%u gid/egid:%u/%u"
+#define GR_PTRACE_ACL_MSG "denied ptrace of %.950s(%.16s:%d) by "
@@ -75715,6 +76977,7 @@ index 0000000..1357a24
+#define GR_SYMLINKOWNER_MSG "denied following symlink %.950s since symlink owner %u does not match target owner %u, by "
+#define GR_BRUTE_DAEMON_MSG "bruteforce prevention initiated for the next 30 minutes or until service restarted, stalling each fork 30 seconds. Please investigate the crash report for "
+#define GR_BRUTE_SUID_MSG "bruteforce prevention initiated due to crash of %.950s against uid %u, banning suid/sgid execs for %u minutes. Please investigate the crash report for "
++#define GR_IPC_DENIED_MSG "denied %s of overly-permissive IPC object with creator uid %u by "
diff --git a/include/linux/grsecurity.h b/include/linux/grsecurity.h
new file mode 100644
index 0000000..8996115
@@ -76183,6 +77446,19 @@ index 9d57a71..8d0f701 100644
{
return res->end - res->start + 1;
}
+diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
+index 497c6cc..0c785f8 100644
+--- a/include/linux/ipc_namespace.h
++++ b/include/linux/ipc_namespace.h
+@@ -65,7 +65,7 @@ struct ipc_namespace {
+
+ /* user_ns which owns the ipc ns */
+ struct user_namespace *user_ns;
+-};
++} __randomize_layout;
+
+ extern struct ipc_namespace init_ipc_ns;
+ extern atomic_t nr_ipc_ns;
diff --git a/include/linux/irq.h b/include/linux/irq.h
index bff29c5..7437762 100644
--- a/include/linux/irq.h
@@ -76383,7 +77659,7 @@ index f8d4b27..8560882 100644
char **envp;
enum umh_wait wait;
diff --git a/include/linux/kobject.h b/include/linux/kobject.h
-index 445f978..3a02264 100644
+index 445f978..24e427c 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -111,7 +111,7 @@ struct kobj_type {
@@ -76403,6 +77679,15 @@ index 445f978..3a02264 100644
extern const struct sysfs_ops kobj_sysfs_ops;
+@@ -161,7 +162,7 @@ struct kset {
+ spinlock_t list_lock;
+ struct kobject kobj;
+ const struct kset_uevent_ops *uevent_ops;
+-};
++} __randomize_layout;
+
+ extern void kset_init(struct kset *kset);
+ extern int __must_check kset_register(struct kset *kset);
diff --git a/include/linux/kobject_ns.h b/include/linux/kobject_ns.h
index f66b065..c2c29b4 100644
--- a/include/linux/kobject_ns.h
@@ -76811,22 +78096,25 @@ index 305fd75..cdbfb05 100644
#endif /* __KERNEL__ */
#endif /* _LINUX_MM_H */
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
-index de3a321..8761f4a 100644
+index de3a321..8fb84fc 100644
--- a/include/linux/mm_types.h
+++ b/include/linux/mm_types.h
-@@ -253,6 +253,8 @@ struct vm_area_struct {
+@@ -253,7 +253,9 @@ struct vm_area_struct {
#ifdef CONFIG_NUMA
struct mempolicy *vm_policy; /* NUMA policy for the VMA */
#endif
+-};
+
+ struct vm_area_struct *vm_mirror;/* PaX: mirror vma or NULL */
- };
++} __randomize_layout;
struct core_thread {
-@@ -390,6 +392,24 @@ struct mm_struct {
+ struct task_struct *task;
+@@ -390,7 +392,25 @@ struct mm_struct {
#ifdef CONFIG_CPUMASK_OFFSTACK
struct cpumask cpumask_allocation;
#endif
+-};
+
+#if defined(CONFIG_PAX_NOEXEC) || defined(CONFIG_PAX_ASLR)
+ unsigned long pax_flags;
@@ -76845,9 +78133,10 @@ index de3a321..8761f4a 100644
+ unsigned long delta_stack; /* randomized offset */
+#endif
+
- };
++} __randomize_layout;
static inline void mm_init_cpumask(struct mm_struct *mm)
+ {
diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h
index c5d5278..f0b68c8 100644
--- a/include/linux/mmiotrace.h
@@ -76935,7 +78224,7 @@ index 468819c..c02b63b 100644
* struct dmi_device_id appears during expansion of
* "MODULE_DEVICE_TABLE(dmi, x)". Compiler doesn't look inside it
diff --git a/include/linux/module.h b/include/linux/module.h
-index 3cb7839..56d41ff 100644
+index 3cb7839..2e0d4ee4 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -17,9 +17,11 @@
@@ -76950,6 +78239,15 @@ index 3cb7839..56d41ff 100644
#include <trace/events/module.h>
+@@ -41,7 +43,7 @@ struct module_kobject {
+ struct module *mod;
+ struct kobject *drivers_dir;
+ struct module_param_attrs *mp;
+-};
++} __randomize_layout;
+
+ struct module_attribute {
+ struct attribute attr;
@@ -53,12 +55,13 @@ struct module_attribute {
int (*test)(struct module *);
void (*free)(struct module *);
@@ -77009,6 +78307,15 @@ index 3cb7839..56d41ff 100644
#endif
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
unsigned int num_ftrace_callsites;
+@@ -358,7 +362,7 @@ struct module
+ ctor_fn_t *ctors;
+ unsigned int num_ctors;
+ #endif
+-};
++} __randomize_layout;
+ #ifndef MODULE_ARCH_INIT
+ #define MODULE_ARCH_INIT {}
+ #endif
@@ -379,16 +383,46 @@ bool is_module_address(unsigned long addr);
bool is_module_percpu_address(unsigned long addr);
bool is_module_text_address(unsigned long addr);
@@ -77087,9 +78394,26 @@ index b2be02e..6a9fdb1 100644
or 0. */
int apply_relocate(Elf_Shdr *sechdrs,
diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
-index 7939f63..ec6df57 100644
+index 7939f63..c573d38 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
+@@ -159,13 +159,13 @@ struct kparam_array
+ { arg } }
+
+ /* Obsolete - use module_param_cb() */
+-#define module_param_call(name, set, get, arg, perm) \
++#define module_param_call(name, _set, _get, arg, perm) \
+ static struct kernel_param_ops __param_ops_##name = \
+- { (void *)set, (void *)get }; \
++ { .set = (void *)_set, .get = (void *)_get }; \
+ __module_param_call(MODULE_PARAM_PREFIX, \
+ name, &__param_ops_##name, arg, \
+ __same_type(arg, bool *), \
+- (perm) + sizeof(__check_old_set_param(set))*0)
++ (perm) + sizeof(__check_old_set_param(_set))*0)
+
+ /* We don't get oldget: it's often a new-style param_get_uint, etc. */
+ static inline int
@@ -260,7 +260,7 @@ static inline void __kernel_param_unlock(void)
* @len is usually just sizeof(string).
*/
@@ -77108,6 +78432,19 @@ index 7939f63..ec6df57 100644
= { .max = ARRAY_SIZE(array), .num = nump, \
.ops = &param_ops_##type, \
.elemsize = sizeof(array[0]), .elem = array }; \
+diff --git a/include/linux/mount.h b/include/linux/mount.h
+index 33fe53d..c54903f 100644
+--- a/include/linux/mount.h
++++ b/include/linux/mount.h
+@@ -86,7 +86,7 @@ struct vfsmount {
+ int mnt_expiry_mark; /* true if marked for expiry */
+ int mnt_pinned;
+ int mnt_ghosts;
+-};
++} __randomize_layout;
+
+ struct file; /* forward dec */
+
diff --git a/include/linux/namei.h b/include/linux/namei.h
index ffc0213..2c1f2cb 100644
--- a/include/linux/namei.h
@@ -77374,6 +78711,19 @@ index 8fc7dd1a..c19d89e 100644
MMAP_PAGE_ZERO)
/*
+diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
+index 38d1032..d3f6744 100644
+--- a/include/linux/pid_namespace.h
++++ b/include/linux/pid_namespace.h
+@@ -30,7 +30,7 @@ struct pid_namespace {
+ #ifdef CONFIG_BSD_PROCESS_ACCT
+ struct bsd_acct_struct *bacct;
+ #endif
+-};
++} __randomize_layout;
+
+ extern struct pid_namespace init_pid_ns;
+
diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
index 0072a53..c5dcca5 100644
--- a/include/linux/pipe_fs_i.h
@@ -77491,9 +78841,18 @@ index f0e22f7..82dd544 100644
void log_buf_kexec_setup(void);
void __init setup_log_buf(int early);
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
-index 643b96c..9544c71 100644
+index 643b96c..1bd456a 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
+@@ -76,7 +76,7 @@ struct proc_dir_entry {
+ spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
+ u8 namelen;
+ char name[];
+-};
++} __randomize_layout;
+
+ enum kcore_type {
+ KCORE_TEXT,
@@ -155,6 +155,19 @@ static inline struct proc_dir_entry *proc_create(const char *name, mode_t mode,
return proc_create_data(name, mode, parent, proc_fops, NULL);
}
@@ -77523,6 +78882,15 @@ index 643b96c..9544c71 100644
extern const struct proc_ns_operations netns_operations;
extern const struct proc_ns_operations utsns_operations;
extern const struct proc_ns_operations ipcns_operations;
+@@ -273,7 +286,7 @@ struct proc_inode {
+ void *ns;
+ const struct proc_ns_operations *ns_ops;
+ struct inode vfs_inode;
+-};
++} __randomize_layout;
+
+ static inline struct proc_inode *PROC_I(const struct inode *inode)
+ {
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 800f113..13b3715 100644
--- a/include/linux/ptrace.h
@@ -77856,7 +79224,7 @@ index 2148b12..519b820 100644
static inline void anon_vma_merge(struct vm_area_struct *vma,
diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 312d047..a4bff08 100644
+index 312d047..a357e91 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -101,6 +101,7 @@ struct bio_list;
@@ -77930,6 +79298,15 @@ index 312d047..a4bff08 100644
#ifdef CONFIG_AUDIT
unsigned audit_tty;
struct tty_audit_buf *tty_audit_buf;
+@@ -657,7 +687,7 @@ struct signal_struct {
+ struct mutex cred_guard_mutex; /* guard against foreign influences on
+ * credential calculations
+ * (notably. ptrace) */
+-};
++} __randomize_layout;
+
+ /* Context switch must be unlocked if interrupts are to be enabled */
+ #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW
@@ -715,6 +745,14 @@ struct user_struct {
struct key *session_keyring; /* UID's default session keyring */
#endif
@@ -77945,6 +79322,15 @@ index 312d047..a4bff08 100644
/* Hash table maintenance information */
struct hlist_node uidhash_node;
uid_t uid;
+@@ -723,7 +761,7 @@ struct user_struct {
+ #ifdef CONFIG_PERF_EVENTS
+ atomic_long_t locked_vm;
+ #endif
+-};
++} __randomize_layout;
+
+ extern int uids_sysfs_init(void);
+
@@ -1129,7 +1167,7 @@ struct sched_class {
#ifdef CONFIG_FAIR_GROUP_SCHED
void (*task_move_group) (struct task_struct *p, int on_rq);
@@ -78057,10 +79443,13 @@ index 312d047..a4bff08 100644
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
/* Index of current stored address in ret_stack */
int curr_ret_stack;
-@@ -1582,6 +1652,53 @@ struct task_struct {
+@@ -1580,7 +1650,54 @@ struct task_struct {
+ #ifdef CONFIG_HAVE_HW_BREAKPOINT
+ atomic_t ptrace_bp_refcnt;
#endif
- };
-
+-};
++} __randomize_layout;
++
+#define MF_PAX_PAGEEXEC 0x01000000 /* Paging based non-executable pages */
+#define MF_PAX_EMUTRAMP 0x02000000 /* Emulate trampolines */
+#define MF_PAX_MPROTECT 0x04000000 /* Restrict mprotect() */
@@ -78107,10 +79496,9 @@ index 312d047..a4bff08 100644
+extern void pax_report_fault(struct pt_regs *regs, void *pc, void *sp);
+extern void pax_report_insns(struct pt_regs *regs, void *pc, void *sp);
+extern void pax_report_refcount_overflow(struct pt_regs *regs);
-+
+
/* Future-safe accessor for struct task_struct's cpus_allowed. */
#define tsk_cpus_allowed(tsk) (&(tsk)->cpus_allowed)
-
@@ -2097,7 +2214,9 @@ void yield(void);
extern struct exec_domain default_exec_domain;
@@ -78919,7 +80307,7 @@ index 27b3b0b..e093dd9 100644
extern void register_syscore_ops(struct syscore_ops *ops);
extern void unregister_syscore_ops(struct syscore_ops *ops);
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
-index 703cfa33..04ef3d7 100644
+index 703cfa33..305427e 100644
--- a/include/linux/sysctl.h
+++ b/include/linux/sysctl.h
@@ -155,8 +155,6 @@ enum
@@ -78952,7 +80340,7 @@ index 703cfa33..04ef3d7 100644
void *extra1;
void *extra2;
-};
-+} __do_const;
++} __do_const __randomize_layout;
+typedef struct ctl_table __no_const ctl_table_no_const;
+typedef struct ctl_table ctl_table;
@@ -79083,8 +80471,21 @@ index a71a292..51bd91d 100644
}
/**
+diff --git a/include/linux/tty.h b/include/linux/tty.h
+index 5dbb3cb..a192962 100644
+--- a/include/linux/tty.h
++++ b/include/linux/tty.h
+@@ -331,7 +331,7 @@ struct tty_struct {
+ /* If the tty has a pending do_SAK, queue it here - akpm */
+ struct work_struct SAK_work;
+ struct tty_port *port;
+-};
++} __randomize_layout;
+
+ /* Each of a tty's open files has private_data pointing to tty_file_private */
+ struct tty_file_private {
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
-index ecdaeb9..8d27e20 100644
+index ecdaeb9..a7e29ec 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -286,7 +286,7 @@ struct tty_operations {
@@ -79096,6 +80497,15 @@ index ecdaeb9..8d27e20 100644
struct tty_driver {
int magic; /* magic number for this structure */
+@@ -321,7 +321,7 @@ struct tty_driver {
+
+ const struct tty_operations *ops;
+ struct list_head tty_drivers;
+-};
++} __randomize_layout;
+
+ extern struct list_head tty_drivers;
+
diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h
index ff7dc08..893e1bd 100644
--- a/include/linux/tty_ldisc.h
@@ -79266,11 +80676,37 @@ index 76f4396..3e0a4a8 100644
};
static inline struct usb_driver *driver_of(struct usb_interface *intf)
+diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
+index faf4679..f4819bf 100644
+--- a/include/linux/user_namespace.h
++++ b/include/linux/user_namespace.h
+@@ -14,7 +14,7 @@ struct user_namespace {
+ struct hlist_head uidhash_table[UIDHASH_SZ];
+ struct user_struct *creator;
+ struct work_struct destroyer;
+-};
++} __randomize_layout;
+
+ extern struct user_namespace init_user_ns;
+
+diff --git a/include/linux/utsname.h b/include/linux/utsname.h
+index c714ed7..fb6d16c 100644
+--- a/include/linux/utsname.h
++++ b/include/linux/utsname.h
+@@ -52,7 +52,7 @@ struct uts_namespace {
+ struct kref kref;
+ struct new_utsname name;
+ struct user_namespace *user_ns;
+-};
++} __randomize_layout;
+ extern struct uts_namespace init_uts_ns;
+
+ #ifdef CONFIG_UTS_NS
diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h
-index 6f8fbcf..8259001 100644
+index 6f8fbcf..e2a0e61 100644
--- a/include/linux/vermagic.h
+++ b/include/linux/vermagic.h
-@@ -25,9 +25,35 @@
+@@ -25,9 +25,41 @@
#define MODULE_ARCH_VERMAGIC ""
#endif
@@ -79292,6 +80728,12 @@ index 6f8fbcf..8259001 100644
+#define MODULE_STACKLEAK_PLUGIN ""
+#endif
+
++#ifdef RANDSTRUCT_PLUGIN
++#define MODULE_RANDSTRUCT_PLUGIN "RANDSTRUCT_PLUGIN_" RANDSTRUCT_HASHED_SEED
++#else
++#define MODULE_RANDSTRUCT_PLUGIN
++#endif
++
+#ifdef CONFIG_GRKERNSEC
+#define MODULE_GRSEC "GRSEC "
+#else
@@ -79305,7 +80747,7 @@ index 6f8fbcf..8259001 100644
- MODULE_ARCH_VERMAGIC
+ MODULE_ARCH_VERMAGIC \
+ MODULE_PAX_REFCOUNT MODULE_CONSTIFY_PLUGIN MODULE_STACKLEAK_PLUGIN \
-+ MODULE_GRSEC
++ MODULE_GRSEC MODULE_RANDSTRUCT_PLUGIN
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
index 45a7698..76e6993 100644
@@ -79827,7 +81269,7 @@ index 1a6201a..66d9531 100644
static inline int rate_supported(struct ieee80211_sta *sta,
enum ieee80211_band band,
diff --git a/include/net/neighbour.h b/include/net/neighbour.h
-index 2720884..3aa5c25 100644
+index 2720884..bbc0141 100644
--- a/include/net/neighbour.h
+++ b/include/net/neighbour.h
@@ -122,7 +122,7 @@ struct neigh_ops {
@@ -79839,10 +81281,28 @@ index 2720884..3aa5c25 100644
struct pneigh_entry {
struct pneigh_entry *next;
+@@ -176,7 +176,7 @@ struct neigh_table {
+ struct neigh_statistics __percpu *stats;
+ struct neigh_hash_table __rcu *nht;
+ struct pneigh_entry **phash_buckets;
+-};
++} __randomize_layout;
+
+ /* flags for neigh_update() */
+ #define NEIGH_UPDATE_F_OVERRIDE 0x00000001
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
-index 3bb6fa0..3af7393 100644
+index 3bb6fa0..4ea5d1c 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
+@@ -101,7 +101,7 @@ struct net {
+ struct netns_xfrm xfrm;
+ #endif
+ struct netns_ipvs *ipvs;
+-};
++} __randomize_layout;
+
+
+ #include <linux/seq_file_net.h>
@@ -240,10 +240,16 @@ static inline struct net *read_pnet(struct net * const *pnet)
#define __net_init
#define __net_exit
@@ -81436,6 +82896,30 @@ index 326a20b..62e6b7e 100644
size = i_size_read(path.dentry->d_inode);
shm_unlock(shp);
+diff --git a/ipc/util.c b/ipc/util.c
+index 75261a3..7060953 100644
+--- a/ipc/util.c
++++ b/ipc/util.c
+@@ -47,6 +47,8 @@ struct ipc_proc_iface {
+ int (*show)(struct seq_file *, void *);
+ };
+
++extern int gr_ipc_permitted(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, int requested_mode, int granted_mode);
++
+ #ifdef CONFIG_MEMORY_HOTPLUG
+
+ static void ipc_memory_notifier(struct work_struct *work)
+@@ -617,6 +619,10 @@ int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flag)
+ granted_mode >>= 6;
+ else if (in_group_p(ipcp->cgid) || in_group_p(ipcp->gid))
+ granted_mode >>= 3;
++
++ if (!gr_ipc_permitted(ns, ipcp, requested_mode, granted_mode))
++ return -1;
++
+ /* is there some bit set in requested_mode but not in granted_mode? */
+ if ((requested_mode & ~granted_mode & 0007) &&
+ !ns_capable(ns->user_ns, CAP_IPC_OWNER))
diff --git a/kernel/acct.c b/kernel/acct.c
index fa7eb3d..7faf116 100644
--- a/kernel/acct.c
@@ -83487,7 +84971,7 @@ index 91c32a0..7b88d63 100644
seq_printf(m, "%40s %14lu %29s %pS\n",
name, stats->contending_point[i],
diff --git a/kernel/module.c b/kernel/module.c
-index 65362d9..96ac6ba 100644
+index 65362d9..4226e37 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -58,6 +58,7 @@
@@ -83535,7 +85019,39 @@ index 65362d9..96ac6ba 100644
printk(KERN_WARNING "%s: per-cpu alignment %li > %li\n",
mod->name, align, PAGE_SIZE);
align = PAGE_SIZE;
-@@ -1183,7 +1185,7 @@ resolve_symbol_wait(struct module *mod,
+@@ -1062,13 +1064,29 @@ static int check_version(Elf_Shdr *sechdrs,
+ goto bad_version;
+ }
+
+- printk(KERN_WARNING "%s: no symbol version for %s\n",
+- mod->name, symname);
++#ifdef CONFIG_GRKERNSEC_RANDSTRUCT
++ /*
++ * avoid potentially printing jibberish on attempted load
++ * of a module randomized with a different seed
++ */
++ pr_warn("no symbol version for %s\n", symname);
++#else
++ pr_warn("%s: no symbol version for %s\n", mod->name, symname);
++#endif
+ return 0;
+
+ bad_version:
++#ifdef CONFIG_GRKERNSEC_RANDSTRUCT
++ /*
++ * avoid potentially printing jibberish on attempted load
++ * of a module randomized with a different seed
++ */
++ printk("attempted module disagrees about version of symbol %s\n",
++ symname);
++#else
+ printk("%s: disagrees about version of symbol %s\n",
+ mod->name, symname);
++#endif
+ return 0;
+ }
+
+@@ -1183,7 +1201,7 @@ resolve_symbol_wait(struct module *mod,
*/
#ifdef CONFIG_SYSFS
@@ -83544,7 +85060,7 @@ index 65362d9..96ac6ba 100644
static inline bool sect_empty(const Elf_Shdr *sect)
{
return !(sect->sh_flags & SHF_ALLOC) || sect->sh_size == 0;
-@@ -1323,7 +1325,7 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
+@@ -1323,7 +1341,7 @@ static void add_notes_attrs(struct module *mod, const struct load_info *info)
{
unsigned int notes, loaded, i;
struct module_notes_attrs *notes_attrs;
@@ -83553,7 +85069,7 @@ index 65362d9..96ac6ba 100644
/* failed to create section attributes, so can't create notes */
if (!mod->sect_attrs)
-@@ -1435,7 +1437,7 @@ static void del_usage_links(struct module *mod)
+@@ -1435,7 +1453,7 @@ static void del_usage_links(struct module *mod)
static int module_add_modinfo_attrs(struct module *mod)
{
struct module_attribute *attr;
@@ -83562,7 +85078,7 @@ index 65362d9..96ac6ba 100644
int error = 0;
int i;
-@@ -1649,21 +1651,21 @@ static void set_section_ro_nx(void *base,
+@@ -1649,21 +1667,21 @@ static void set_section_ro_nx(void *base,
static void unset_module_core_ro_nx(struct module *mod)
{
@@ -83592,7 +85108,7 @@ index 65362d9..96ac6ba 100644
set_memory_rw);
}
-@@ -1674,14 +1676,14 @@ void set_all_modules_text_rw(void)
+@@ -1674,14 +1692,14 @@ void set_all_modules_text_rw(void)
mutex_lock(&module_mutex);
list_for_each_entry_rcu(mod, &modules, list) {
@@ -83613,7 +85129,7 @@ index 65362d9..96ac6ba 100644
set_memory_rw);
}
}
-@@ -1695,14 +1697,14 @@ void set_all_modules_text_ro(void)
+@@ -1695,14 +1713,14 @@ void set_all_modules_text_ro(void)
mutex_lock(&module_mutex);
list_for_each_entry_rcu(mod, &modules, list) {
@@ -83634,7 +85150,7 @@ index 65362d9..96ac6ba 100644
set_memory_ro);
}
}
-@@ -1748,16 +1750,19 @@ static void free_module(struct module *mod)
+@@ -1748,16 +1766,19 @@ static void free_module(struct module *mod)
/* This may be NULL, but that's OK */
unset_module_init_ro_nx(mod);
@@ -83657,7 +85173,7 @@ index 65362d9..96ac6ba 100644
#ifdef CONFIG_MPU
update_protections(current->mm);
-@@ -1826,10 +1831,31 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
+@@ -1826,10 +1847,31 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
unsigned int i;
int ret = 0;
const struct kernel_symbol *ksym;
@@ -83689,7 +85205,7 @@ index 65362d9..96ac6ba 100644
switch (sym[i].st_shndx) {
case SHN_COMMON:
/* We compiled with -fno-common. These are not
-@@ -1850,7 +1876,9 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
+@@ -1850,7 +1892,9 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
ksym = resolve_symbol_wait(mod, info, name);
/* Ok if resolved. */
if (ksym && !IS_ERR(ksym)) {
@@ -83699,7 +85215,7 @@ index 65362d9..96ac6ba 100644
break;
}
-@@ -1869,11 +1897,20 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
+@@ -1869,11 +1913,20 @@ static int simplify_symbols(struct module *mod, const struct load_info *info)
secbase = (unsigned long)mod_percpu(mod);
else
secbase = info->sechdrs[sym[i].st_shndx].sh_addr;
@@ -83720,7 +85236,7 @@ index 65362d9..96ac6ba 100644
return ret;
}
-@@ -1977,22 +2014,12 @@ static void layout_sections(struct module *mod, struct load_info *info)
+@@ -1977,22 +2030,12 @@ static void layout_sections(struct module *mod, struct load_info *info)
|| s->sh_entsize != ~0UL
|| strstarts(sname, ".init"))
continue;
@@ -83747,7 +85263,7 @@ index 65362d9..96ac6ba 100644
}
DEBUGP("Init section allocation order:\n");
-@@ -2006,23 +2033,13 @@ static void layout_sections(struct module *mod, struct load_info *info)
+@@ -2006,23 +2049,13 @@ static void layout_sections(struct module *mod, struct load_info *info)
|| s->sh_entsize != ~0UL
|| !strstarts(sname, ".init"))
continue;
@@ -83776,7 +85292,7 @@ index 65362d9..96ac6ba 100644
}
}
-@@ -2187,7 +2204,7 @@ static void layout_symtab(struct module *mod, struct load_info *info)
+@@ -2187,7 +2220,7 @@ static void layout_symtab(struct module *mod, struct load_info *info)
/* Put symbol section at end of init part of module. */
symsect->sh_flags |= SHF_ALLOC;
@@ -83785,7 +85301,7 @@ index 65362d9..96ac6ba 100644
info->index.sym) | INIT_OFFSET_MASK;
DEBUGP("\t%s\n", info->secstrings + symsect->sh_name);
-@@ -2206,19 +2223,19 @@ static void layout_symtab(struct module *mod, struct load_info *info)
+@@ -2206,19 +2239,19 @@ static void layout_symtab(struct module *mod, struct load_info *info)
}
/* Append room for core symbols at end of core part. */
@@ -83810,7 +85326,7 @@ index 65362d9..96ac6ba 100644
}
static void add_kallsyms(struct module *mod, const struct load_info *info)
-@@ -2234,11 +2251,13 @@ static void add_kallsyms(struct module *mod, const struct load_info *info)
+@@ -2234,11 +2267,13 @@ static void add_kallsyms(struct module *mod, const struct load_info *info)
/* Make sure we get permanent strtab: don't use info->strtab. */
mod->strtab = (void *)info->sechdrs[info->index.str].sh_addr;
@@ -83825,7 +85341,7 @@ index 65362d9..96ac6ba 100644
src = mod->symtab;
for (ndst = i = 0; i < mod->num_symtab; i++) {
if (i == 0 ||
-@@ -2251,10 +2270,12 @@ static void add_kallsyms(struct module *mod, const struct load_info *info)
+@@ -2251,10 +2286,12 @@ static void add_kallsyms(struct module *mod, const struct load_info *info)
}
mod->core_num_syms = ndst;
@@ -83839,7 +85355,7 @@ index 65362d9..96ac6ba 100644
}
#else
static inline void layout_symtab(struct module *mod, struct load_info *info)
-@@ -2288,17 +2309,33 @@ void * __weak module_alloc(unsigned long size)
+@@ -2288,17 +2325,33 @@ void * __weak module_alloc(unsigned long size)
return size == 0 ? NULL : vmalloc_exec(size);
}
@@ -83878,7 +85394,25 @@ index 65362d9..96ac6ba 100644
mutex_unlock(&module_mutex);
}
return ret;
-@@ -2475,8 +2512,14 @@ static struct module *setup_load_info(struct load_info *info)
+@@ -2458,8 +2511,15 @@ static struct module *setup_load_info(struct load_info *info)
+ mod = (void *)info->sechdrs[info->index.mod].sh_addr;
+
+ if (info->index.sym == 0) {
+- printk(KERN_WARNING "%s: module has no symbols (stripped?)\n",
+- mod->name);
++#ifdef CONFIG_GRKERNSEC_RANDSTRUCT
++ /*
++ * avoid potentially printing jibberish on attempted load
++ * of a module randomized with a different seed
++ */
++ pr_warn("module has no symbols (stripped?)\n");
++#else
++ pr_warn("%s: module has no symbols (stripped?)\n", mod->name);
++#endif
+ return ERR_PTR(-ENOEXEC);
+ }
+
+@@ -2475,8 +2535,14 @@ static struct module *setup_load_info(struct load_info *info)
static int check_modinfo(struct module *mod, struct load_info *info)
{
const char *modmagic = get_modinfo(info, "vermagic");
@@ -83893,7 +85427,7 @@ index 65362d9..96ac6ba 100644
/* This is allowed: modprobe --force will invalidate it. */
if (!modmagic) {
err = try_to_force_load(mod, "bad vermagic");
-@@ -2499,7 +2542,7 @@ static int check_modinfo(struct module *mod, struct load_info *info)
+@@ -2499,7 +2565,7 @@ static int check_modinfo(struct module *mod, struct load_info *info)
}
/* Set up license info based on the info section */
@@ -83902,7 +85436,7 @@ index 65362d9..96ac6ba 100644
return 0;
}
-@@ -2593,7 +2636,7 @@ static int move_module(struct module *mod, struct load_info *info)
+@@ -2593,7 +2659,7 @@ static int move_module(struct module *mod, struct load_info *info)
void *ptr;
/* Do the allocs. */
@@ -83911,7 +85445,7 @@ index 65362d9..96ac6ba 100644
/*
* The pointer to this block is stored in the module structure
* which is inside the block. Just mark it as not being a
-@@ -2603,10 +2646,10 @@ static int move_module(struct module *mod, struct load_info *info)
+@@ -2603,10 +2669,10 @@ static int move_module(struct module *mod, struct load_info *info)
if (!ptr)
return -ENOMEM;
@@ -83925,7 +85459,7 @@ index 65362d9..96ac6ba 100644
/*
* The pointer to this block is stored in the module structure
* which is inside the block. This block doesn't need to be
-@@ -2614,12 +2657,39 @@ static int move_module(struct module *mod, struct load_info *info)
+@@ -2614,12 +2680,39 @@ static int move_module(struct module *mod, struct load_info *info)
* after the module is initialized.
*/
kmemleak_ignore(ptr);
@@ -83969,7 +85503,7 @@ index 65362d9..96ac6ba 100644
/* Transfer each section which specifies SHF_ALLOC */
DEBUGP("final section addresses:\n");
-@@ -2630,16 +2700,45 @@ static int move_module(struct module *mod, struct load_info *info)
+@@ -2630,16 +2723,45 @@ static int move_module(struct module *mod, struct load_info *info)
if (!(shdr->sh_flags & SHF_ALLOC))
continue;
@@ -84022,7 +85556,7 @@ index 65362d9..96ac6ba 100644
DEBUGP("\t0x%lx %s\n",
shdr->sh_addr, info->secstrings + shdr->sh_name);
}
-@@ -2694,12 +2793,12 @@ static void flush_module_icache(const struct module *mod)
+@@ -2694,12 +2816,12 @@ static void flush_module_icache(const struct module *mod)
* Do it before processing of module parameters, so the module
* can provide parameter accessor functions of its own.
*/
@@ -84041,7 +85575,7 @@ index 65362d9..96ac6ba 100644
set_fs(old_fs);
}
-@@ -2779,8 +2878,10 @@ static void module_deallocate(struct module *mod, struct load_info *info)
+@@ -2779,8 +2901,10 @@ static void module_deallocate(struct module *mod, struct load_info *info)
{
kfree(info->strmap);
percpu_modfree(mod);
@@ -84054,7 +85588,7 @@ index 65362d9..96ac6ba 100644
}
int __weak module_finalize(const Elf_Ehdr *hdr,
-@@ -2844,9 +2945,38 @@ static struct module *load_module(void __user *umod,
+@@ -2844,9 +2968,38 @@ static struct module *load_module(void __user *umod,
if (err)
goto free_unload;
@@ -84093,7 +85627,7 @@ index 65362d9..96ac6ba 100644
/* Fix up syms, so that st_value is a pointer to location. */
err = simplify_symbols(mod, &info);
if (err < 0)
-@@ -2862,13 +2992,6 @@ static struct module *load_module(void __user *umod,
+@@ -2862,13 +3015,6 @@ static struct module *load_module(void __user *umod,
flush_module_icache(mod);
@@ -84107,7 +85641,7 @@ index 65362d9..96ac6ba 100644
/* Mark state as coming so strong_try_module_get() ignores us. */
mod->state = MODULE_STATE_COMING;
-@@ -2926,11 +3049,10 @@ static struct module *load_module(void __user *umod,
+@@ -2926,11 +3072,10 @@ static struct module *load_module(void __user *umod,
unlock:
mutex_unlock(&module_mutex);
synchronize_sched();
@@ -84120,7 +85654,7 @@ index 65362d9..96ac6ba 100644
free_unload:
module_unload_free(mod);
free_module:
-@@ -2971,16 +3093,16 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
+@@ -2971,16 +3116,16 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
MODULE_STATE_COMING, mod);
/* Set RO and NX regions for core */
@@ -84145,7 +85679,7 @@ index 65362d9..96ac6ba 100644
do_mod_ctors(mod);
/* Start the module */
-@@ -3026,11 +3148,12 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
+@@ -3026,11 +3171,12 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
mod->strtab = mod->core_strtab;
#endif
unset_module_init_ro_nx(mod);
@@ -84163,7 +85697,7 @@ index 65362d9..96ac6ba 100644
mutex_unlock(&module_mutex);
return 0;
-@@ -3061,10 +3184,16 @@ static const char *get_ksymbol(struct module *mod,
+@@ -3061,10 +3207,16 @@ static const char *get_ksymbol(struct module *mod,
unsigned long nextval;
/* At worse, next value is at end of module */
@@ -84183,7 +85717,7 @@ index 65362d9..96ac6ba 100644
/* Scan for closest preceding symbol, and next symbol. (ELF
starts real symbols at 1). */
-@@ -3312,7 +3441,7 @@ static int m_show(struct seq_file *m, void *p)
+@@ -3312,7 +3464,7 @@ static int m_show(struct seq_file *m, void *p)
char buf[8];
seq_printf(m, "%s %u",
@@ -84192,7 +85726,7 @@ index 65362d9..96ac6ba 100644
print_unload_info(m, mod);
/* Informative for users. */
-@@ -3321,7 +3450,7 @@ static int m_show(struct seq_file *m, void *p)
+@@ -3321,7 +3473,7 @@ static int m_show(struct seq_file *m, void *p)
mod->state == MODULE_STATE_COMING ? "Loading":
"Live");
/* Used by oprofile and other similar tools. */
@@ -84201,7 +85735,7 @@ index 65362d9..96ac6ba 100644
/* Taints info */
if (mod->taints)
-@@ -3357,7 +3486,17 @@ static const struct file_operations proc_modules_operations = {
+@@ -3357,7 +3509,17 @@ static const struct file_operations proc_modules_operations = {
static int __init proc_modules_init(void)
{
@@ -84219,7 +85753,7 @@ index 65362d9..96ac6ba 100644
return 0;
}
module_init(proc_modules_init);
-@@ -3416,12 +3555,12 @@ struct module *__module_address(unsigned long addr)
+@@ -3416,12 +3578,12 @@ struct module *__module_address(unsigned long addr)
{
struct module *mod;
@@ -84235,7 +85769,7 @@ index 65362d9..96ac6ba 100644
return mod;
return NULL;
}
-@@ -3455,11 +3594,20 @@ bool is_module_text_address(unsigned long addr)
+@@ -3455,11 +3617,20 @@ bool is_module_text_address(unsigned long addr)
*/
struct module *__module_text_address(unsigned long addr)
{
@@ -94518,6 +96052,23 @@ index f41f026..fe76ea8 100644
__SONET_ITEMS
#undef __HANDLE_ITEM
}
+diff --git a/net/atm/lec.c b/net/atm/lec.c
+index f1964ca..f309d61 100644
+--- a/net/atm/lec.c
++++ b/net/atm/lec.c
+@@ -116,9 +116,9 @@ static inline void lec_arp_put(struct lec_arp_table *entry)
+ }
+
+ static struct lane2_ops lane2_ops = {
+- lane2_resolve, /* resolve, spec 3.1.3 */
+- lane2_associate_req, /* associate_req, spec 3.1.4 */
+- NULL /* associate indicator, spec 3.1.5 */
++ .resolve = lane2_resolve,
++ .associate_req = lane2_associate_req,
++ .associate_indicator = NULL
+ };
+
+ static unsigned char bus_mac[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
diff --git a/net/atm/lec.h b/net/atm/lec.h
index dfc0719..47c5322 100644
--- a/net/atm/lec.h
@@ -94531,6 +96082,62 @@ index dfc0719..47c5322 100644
/*
* ATM LAN Emulation supports both LLC & Dix Ethernet EtherType
+diff --git a/net/atm/mpoa_caches.c b/net/atm/mpoa_caches.c
+index d1b2d9a..d549f7f 100644
+--- a/net/atm/mpoa_caches.c
++++ b/net/atm/mpoa_caches.c
+@@ -535,30 +535,30 @@ static void eg_destroy_cache(struct mpoa_client *mpc)
+
+
+ static struct in_cache_ops ingress_ops = {
+- in_cache_add_entry, /* add_entry */
+- in_cache_get, /* get */
+- in_cache_get_with_mask, /* get_with_mask */
+- in_cache_get_by_vcc, /* get_by_vcc */
+- in_cache_put, /* put */
+- in_cache_remove_entry, /* remove_entry */
+- cache_hit, /* cache_hit */
+- clear_count_and_expired, /* clear_count */
+- check_resolving_entries, /* check_resolving */
+- refresh_entries, /* refresh */
+- in_destroy_cache /* destroy_cache */
++ .add_entry = in_cache_add_entry,
++ .get = in_cache_get,
++ .get_with_mask = in_cache_get_with_mask,
++ .get_by_vcc = in_cache_get_by_vcc,
++ .put = in_cache_put,
++ .remove_entry = in_cache_remove_entry,
++ .cache_hit = cache_hit,
++ .clear_count = clear_count_and_expired,
++ .check_resolving = check_resolving_entries,
++ .refresh = refresh_entries,
++ .destroy_cache = in_destroy_cache
+ };
+
+ static struct eg_cache_ops egress_ops = {
+- eg_cache_add_entry, /* add_entry */
+- eg_cache_get_by_cache_id, /* get_by_cache_id */
+- eg_cache_get_by_tag, /* get_by_tag */
+- eg_cache_get_by_vcc, /* get_by_vcc */
+- eg_cache_get_by_src_ip, /* get_by_src_ip */
+- eg_cache_put, /* put */
+- eg_cache_remove_entry, /* remove_entry */
+- update_eg_cache_entry, /* update */
+- clear_expired, /* clear_expired */
+- eg_destroy_cache /* destroy_cache */
++ .add_entry = eg_cache_add_entry,
++ .get_by_cache_id = eg_cache_get_by_cache_id,
++ .get_by_tag = eg_cache_get_by_tag,
++ .get_by_vcc = eg_cache_get_by_vcc,
++ .get_by_src_ip = eg_cache_get_by_src_ip,
++ .put = eg_cache_put,
++ .remove_entry = eg_cache_remove_entry,
++ .update = update_eg_cache_entry,
++ .clear_expired = clear_expired,
++ .destroy_cache = eg_destroy_cache
+ };
+
+
diff --git a/net/atm/proc.c b/net/atm/proc.c
index 0d020de..011c7bb 100644
--- a/net/atm/proc.c
@@ -96036,6 +97643,19 @@ index 16fbf8c..ff4b0fc 100644
};
static struct sock *dn_alloc_sock(struct net *net, struct socket *sock, gfp_t gfp)
+diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c
+index 74d321a..3314f68 100644
+--- a/net/decnet/dn_dev.c
++++ b/net/decnet/dn_dev.c
+@@ -201,7 +201,7 @@ static struct dn_dev_sysctl_table {
+ .extra1 = &min_t3,
+ .extra2 = &max_t3
+ },
+- {0}
++ { }
+ },
+ };
+
diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c
index d50a13c..1f612ff 100644
--- a/net/decnet/sysctl_net_decnet.c
@@ -101378,6 +102998,19 @@ index 0af7f54..c916d2f 100644
err = handler(dev, info, (union iwreq_data *) iwp, extra);
iwp->length += essid_compat;
+diff --git a/net/x25/sysctl_net_x25.c b/net/x25/sysctl_net_x25.c
+index d2efd29..ffeadf5 100644
+--- a/net/x25/sysctl_net_x25.c
++++ b/net/x25/sysctl_net_x25.c
+@@ -70,7 +70,7 @@ static struct ctl_table x25_table[] = {
+ .mode = 0644,
+ .proc_handler = proc_dointvec,
+ },
+- { 0, },
++ { },
+ };
+
+ static struct ctl_path x25_path[] = {
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 113d20e..2bb5a4e 100644
--- a/net/xfrm/xfrm_policy.c
@@ -101661,6 +103294,16 @@ index ede01a8..756e6bd 100644
if (err)
goto out;
+diff --git a/scripts/Makefile b/scripts/Makefile
+index 3626666..4d873cd 100644
+--- a/scripts/Makefile
++++ b/scripts/Makefile
+@@ -35,3 +35,5 @@ subdir-$(CONFIG_DTC) += dtc
+
+ # Let clean descend into subdirs
+ subdir- += basic kconfig package selinux
++
++clean-files := randstruct.seed
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index d2b366c..2d5a6f8 100644
--- a/scripts/Makefile.build
@@ -104865,6 +106508,21 @@ index 638600b..2e6b1fd 100644
break;
default:
result = -EINVAL;
+diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c
+index 8d4d5e8..fdd0826 100644
+--- a/sound/core/seq/oss/seq_oss.c
++++ b/sound/core/seq/oss/seq_oss.c
+@@ -75,8 +75,8 @@ static int __init alsa_seq_oss_init(void)
+ {
+ int rc;
+ static struct snd_seq_dev_ops ops = {
+- snd_seq_oss_synth_register,
+- snd_seq_oss_synth_unregister,
++ .init_device = snd_seq_oss_synth_register,
++ .free_device = snd_seq_oss_synth_unregister,
+ };
+
+ snd_seq_autoload_lock();
diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c
index 5cf8d65..912a79c 100644
--- a/sound/core/seq/seq_device.c
@@ -104905,6 +106563,21 @@ index 5cf8d65..912a79c 100644
dev->status = SNDRV_SEQ_DEVICE_FREE;
dev->driver_data = NULL;
ops->num_init_devices--;
+diff --git a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c
+index 64069db..3c6d392 100644
+--- a/sound/core/seq/seq_midi.c
++++ b/sound/core/seq/seq_midi.c
+@@ -462,8 +462,8 @@ snd_seq_midisynth_unregister_port(struct snd_seq_device *dev)
+ static int __init alsa_seq_midi_init(void)
+ {
+ static struct snd_seq_dev_ops ops = {
+- snd_seq_midisynth_register_port,
+- snd_seq_midisynth_unregister_port,
++ .init_device = snd_seq_midisynth_register_port,
++ .free_device = snd_seq_midisynth_unregister_port,
+ };
+ memset(&synths, 0, sizeof(synths));
+ snd_seq_autoload_lock();
diff --git a/sound/core/sound.c b/sound/core/sound.c
index 8e17b4d..6819e80 100644
--- a/sound/core/sound.c
@@ -104978,6 +106651,21 @@ index f24bf9a..1f7b67c 100644
return 0;
}
+diff --git a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c
+index 723562e..c3ff2f5 100644
+--- a/sound/drivers/opl3/opl3_seq.c
++++ b/sound/drivers/opl3/opl3_seq.c
+@@ -281,8 +281,8 @@ static int __init alsa_opl3_seq_init(void)
+ {
+ static struct snd_seq_dev_ops ops =
+ {
+- snd_opl3_seq_new_device,
+- snd_opl3_seq_delete_device
++ .init_device = snd_opl3_seq_new_device,
++ .free_device = snd_opl3_seq_delete_device
+ };
+
+ return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_OPL3, &ops,
diff --git a/sound/drivers/opl4/opl4_lib.c b/sound/drivers/opl4/opl4_lib.c
index b953fb4..1999c01 100644
--- a/sound/drivers/opl4/opl4_lib.c
@@ -104991,6 +106679,21 @@ index b953fb4..1999c01 100644
{
int timeout = 10;
while ((inb(opl4->fm_port) & OPL4_STATUS_BUSY) && --timeout > 0)
+diff --git a/sound/drivers/opl4/opl4_seq.c b/sound/drivers/opl4/opl4_seq.c
+index 9919769..d7de36c 100644
+--- a/sound/drivers/opl4/opl4_seq.c
++++ b/sound/drivers/opl4/opl4_seq.c
+@@ -198,8 +198,8 @@ static int snd_opl4_seq_delete_device(struct snd_seq_device *dev)
+ static int __init alsa_opl4_synth_init(void)
+ {
+ static struct snd_seq_dev_ops ops = {
+- snd_opl4_seq_new_device,
+- snd_opl4_seq_delete_device
++ .init_device = snd_opl4_seq_new_device,
++ .free_device = snd_opl4_seq_delete_device
+ };
+
+ return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_OPL4, &ops,
diff --git a/sound/drivers/portman2x4.c b/sound/drivers/portman2x4.c
index f664823..590c745 100644
--- a/sound/drivers/portman2x4.c
@@ -105091,6 +106794,21 @@ index cd094ec..eca1277 100644
break;
default:
return -EINVAL;
+diff --git a/sound/isa/sb/emu8000_synth.c b/sound/isa/sb/emu8000_synth.c
+index 4e3fcfb..ab45a9d 100644
+--- a/sound/isa/sb/emu8000_synth.c
++++ b/sound/isa/sb/emu8000_synth.c
+@@ -120,8 +120,8 @@ static int __init alsa_emu8000_init(void)
+ {
+
+ static struct snd_seq_dev_ops ops = {
+- snd_emu8000_new_device,
+- snd_emu8000_delete_device,
++ .init_device = snd_emu8000_new_device,
++ .free_device = snd_emu8000_delete_device,
+ };
+ return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_EMU8000, &ops,
+ sizeof(struct snd_emu8000*));
diff --git a/sound/oss/sb_audio.c b/sound/oss/sb_audio.c
index 733b014..56ce96f 100644
--- a/sound/oss/sb_audio.c
@@ -105142,6 +106860,21 @@ index 09d4648..cf234c7 100644
list_add(&s->list, &cs4297a_devs);
+diff --git a/sound/pci/emu10k1/emu10k1_synth.c b/sound/pci/emu10k1/emu10k1_synth.c
+index 4c41c90..37f3631 100644
+--- a/sound/pci/emu10k1/emu10k1_synth.c
++++ b/sound/pci/emu10k1/emu10k1_synth.c
+@@ -108,8 +108,8 @@ static int __init alsa_emu10k1_synth_init(void)
+ {
+
+ static struct snd_seq_dev_ops ops = {
+- snd_emu10k1_synth_new_device,
+- snd_emu10k1_synth_delete_device,
++ .init_device = snd_emu10k1_synth_new_device,
++ .free_device = snd_emu10k1_synth_delete_device,
+ };
+ return snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH, &ops,
+ sizeof(struct snd_emu10k1_synth_arg));
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index faabaa5..9888f8b 100644
--- a/sound/pci/hda/hda_codec.c
@@ -105260,6 +106993,31 @@ index 6ce2778..f25c378 100644
return s->unit_minor;
fail:
+diff --git a/sound/synth/emux/emux_seq.c b/sound/synth/emux/emux_seq.c
+index 7778b8e..3d619fc 100644
+--- a/sound/synth/emux/emux_seq.c
++++ b/sound/synth/emux/emux_seq.c
+@@ -33,13 +33,13 @@ static int snd_emux_unuse(void *private_data, struct snd_seq_port_subscribe *inf
+ * MIDI emulation operators
+ */
+ static struct snd_midi_op emux_ops = {
+- snd_emux_note_on,
+- snd_emux_note_off,
+- snd_emux_key_press,
+- snd_emux_terminate_note,
+- snd_emux_control,
+- snd_emux_nrpn,
+- snd_emux_sysex,
++ .note_on = snd_emux_note_on,
++ .note_off = snd_emux_note_off,
++ .key_press = snd_emux_key_press,
++ .note_terminate = snd_emux_terminate_note,
++ .control = snd_emux_control,
++ .nrpn = snd_emux_nrpn,
++ .sysex = snd_emux_sysex,
+ };
+
+
diff --git a/sound/usb/card.h b/sound/usb/card.h
index 0a7ca6c..f4b948c 100644
--- a/sound/usb/card.h
@@ -105283,17 +107041,19 @@ index 0a7ca6c..f4b948c 100644
};
diff --git a/tools/gcc/.gitignore b/tools/gcc/.gitignore
new file mode 100644
-index 0000000..50f2f2f
+index 0000000..54052c3
--- /dev/null
+++ b/tools/gcc/.gitignore
-@@ -0,0 +1 @@
+@@ -0,0 +1,3 @@
+size_overflow_hash.h
++randomize_layout_seed.h
++randomize_layout_hash.data
diff --git a/tools/gcc/Makefile b/tools/gcc/Makefile
new file mode 100644
-index 0000000..270a5bc
+index 0000000..51a2ba2
--- /dev/null
+++ b/tools/gcc/Makefile
-@@ -0,0 +1,45 @@
+@@ -0,0 +1,55 @@
+#CC := gcc
+#PLUGIN_SOURCE_FILES := pax_plugin.c
+#PLUGIN_OBJECT_FILES := $(patsubst %.c,%.o,$(PLUGIN_SOURCE_FILES))
@@ -105317,6 +107077,7 @@ index 0000000..270a5bc
+$(HOSTLIBS)-$(CONFIG_PAX_SIZE_OVERFLOW) += size_overflow_plugin.so
+$(HOSTLIBS)-$(CONFIG_PAX_LATENT_ENTROPY) += latent_entropy_plugin.so
+$(HOSTLIBS)-$(CONFIG_PAX_MEMORY_STRUCTLEAK) += structleak_plugin.so
++$(HOSTLIBS)-$(CONFIG_GRKERNSEC_RANDSTRUCT) += randomize_layout_plugin.so
+
+always := $($(HOSTLIBS)-y)
+
@@ -105329,8 +107090,11 @@ index 0000000..270a5bc
+size_overflow_plugin-objs := size_overflow_plugin.o
+latent_entropy_plugin-objs := latent_entropy_plugin.o
+structleak_plugin-objs := structleak_plugin.o
++randomize_layout_plugin-objs := randomize_layout_plugin.o
+
+$(obj)/size_overflow_plugin.o: $(objtree)/$(obj)/size_overflow_hash.h
++$(obj)/randomize_layout_plugin.o: $(objtree)/$(obj)/randomize_layout_seed.h \
++ $(objtree)/$(obj)/randomize_layout_hash.data
+
+quiet_cmd_build_size_overflow_hash = GENHASH $@
+ cmd_build_size_overflow_hash = \
@@ -105338,7 +107102,13 @@ index 0000000..270a5bc
+$(objtree)/$(obj)/size_overflow_hash.h: $(src)/size_overflow_hash.data FORCE
+ $(call if_changed,build_size_overflow_hash)
+
-+targets += size_overflow_hash.h
++quiet_cmd_create_randomize_layout_seed = GENSEED $@
++ cmd_create_randomize_layout_seed = \
++ $(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/$(obj)/randomize_layout_hash.data
++$(objtree)/$(obj)/randomize_layout_seed.h $(objtree)/$(obj)/randomize_layout_hash.data: FORCE
++ $(call if_changed,create_randomize_layout_seed)
++
++targets += size_overflow_hash.h randomize_layout_seed.h randomize_layout_hash.data
diff --git a/tools/gcc/checker_plugin.c b/tools/gcc/checker_plugin.c
new file mode 100644
index 0000000..5452feea
@@ -106230,10 +108000,10 @@ index 0000000..4f67ac1
+}
diff --git a/tools/gcc/gcc-common.h b/tools/gcc/gcc-common.h
new file mode 100644
-index 0000000..986f39b
+index 0000000..312d3b6
--- /dev/null
+++ b/tools/gcc/gcc-common.h
-@@ -0,0 +1,267 @@
+@@ -0,0 +1,268 @@
+#ifndef GCC_COMMON_H_INCLUDED
+#define GCC_COMMON_H_INCLUDED
+
@@ -106324,6 +108094,7 @@ index 0000000..986f39b
+#if BUILDING_GCC_VERSION >= 4009
+#include "tree-ssa-operands.h"
+#include "tree-phinodes.h"
++#include "tree-cfg.h"
+#include "gimple-iterator.h"
+#include "gimple-ssa.h"
+#include "ssa-iterators.h"
@@ -106501,6 +108272,19 @@ index 0000000..986f39b
+#endif
+
+#endif
+diff --git a/tools/gcc/gen-random-seed.sh b/tools/gcc/gen-random-seed.sh
+new file mode 100644
+index 0000000..8030e6e
+--- /dev/null
++++ b/tools/gcc/gen-random-seed.sh
+@@ -0,0 +1,7 @@
++#!/bin/sh
++
++if [ ! -f "$1" ]; then
++ SEED=`od -A n -t x8 -N 32 /dev/urandom | tr -d ' \n'`
++ echo "const char *randstruct_seed = \"$SEED\";" > "$1"
++ echo -n "$SEED" | sha256sum | cut -d" " -f1 | tr -d "\n" > "$2"
++fi
diff --git a/tools/gcc/generate_size_overflow_hash.sh b/tools/gcc/generate_size_overflow_hash.sh
new file mode 100644
index 0000000..e518932
@@ -107316,7 +109100,7 @@ index 0000000..dd73713
+}
diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c
new file mode 100644
-index 0000000..f04b680
+index 0000000..592b923
--- /dev/null
+++ b/tools/gcc/latent_entropy_plugin.c
@@ -0,0 +1,325 @@
@@ -107639,12 +109423,920 @@ index 0000000..f04b680
+ }
+
+ register_callback(plugin_name, PLUGIN_INFO, NULL, &latent_entropy_plugin_info);
-+ register_callback ("start_unit", PLUGIN_START_UNIT, &start_unit_callback, NULL);
++ register_callback(plugin_name, PLUGIN_START_UNIT, &start_unit_callback, NULL);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &latent_entropy_pass_info);
+ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL);
+
+ return 0;
+}
+diff --git a/tools/gcc/randomize_layout_plugin.c b/tools/gcc/randomize_layout_plugin.c
+new file mode 100644
+index 0000000..fed12bf
+--- /dev/null
++++ b/tools/gcc/randomize_layout_plugin.c
+@@ -0,0 +1,902 @@
++/*
++ * Copyright 2014 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net>
++ * and PaX Team <pageexec@freemail.hu>
++ * Licensed under the GPL v2
++ *
++ * Usage:
++ * $ # for 4.5/4.6/C based 4.7
++ * $ gcc -I`gcc -print-file-name=plugin`/include -I`gcc -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o randomize_layout_plugin.so randomize_layout_plugin.c
++ * $ # for C++ based 4.7/4.8+
++ * $ g++ -I`g++ -print-file-name=plugin`/include -I`g++ -print-file-name=plugin`/include/c-family -fPIC -shared -O2 -o randomize_layout_plugin.so randomize_layout_plugin.c
++ * $ gcc -fplugin=./randomize_layout_plugin.so test.c -O2
++ */
++
++#include "gcc-common.h"
++#include "randomize_layout_seed.h"
++
++#define ORIG_TYPE_NAME(node) \
++ (TYPE_NAME(TYPE_MAIN_VARIANT(node)) != NULL_TREE ? ((const unsigned char *)IDENTIFIER_POINTER(TYPE_NAME(TYPE_MAIN_VARIANT(node)))) : (const unsigned char *)"anonymous")
++
++int plugin_is_GPL_compatible;
++
++static int performance_mode;
++
++static struct plugin_info randomize_layout_plugin_info = {
++ .version = "201402061950",
++ .help = "disable\t\t\tdo not activate plugin\n"
++ "performance-mode\tenable cacheline-aware layout randomization\n"
++};
++
++/* from old Linux dcache.h */
++static inline unsigned long
++partial_name_hash(unsigned long c, unsigned long prevhash)
++{
++ return (prevhash + (c << 4) + (c >> 4)) * 11;
++}
++static inline unsigned int
++name_hash(const unsigned char *name)
++{
++ unsigned long hash = 0;
++ unsigned int len = strlen((const char *)name);
++ while (len--)
++ hash = partial_name_hash(*name++, hash);
++ return (unsigned int)hash;
++}
++
++static tree handle_randomize_layout_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs)
++{
++ tree type;
++
++ *no_add_attrs = true;
++ if (TREE_CODE(*node) == FUNCTION_DECL) {
++ error("%qE attribute does not apply to functions (%qF)", name, *node);
++ return NULL_TREE;
++ }
++
++ if (TREE_CODE(*node) == PARM_DECL) {
++ error("%qE attribute does not apply to function parameters (%qD)", name, *node);
++ return NULL_TREE;
++ }
++
++ if (TREE_CODE(*node) == VAR_DECL) {
++ error("%qE attribute does not apply to variables (%qD)", name, *node);
++ return NULL_TREE;
++ }
++
++ if (TYPE_P(*node)) {
++ type = *node;
++ } else {
++ gcc_assert(TREE_CODE(*node) == TYPE_DECL);
++ type = TREE_TYPE(*node);
++ }
++
++ if (TREE_CODE(type) != RECORD_TYPE) {
++ error("%qE attribute used on %qT applies to struct types only", name, type);
++ return NULL_TREE;
++ }
++
++ if (lookup_attribute(IDENTIFIER_POINTER(name), TYPE_ATTRIBUTES(type))) {
++ error("%qE attribute is already applied to the type %qT", name, type);
++ return NULL_TREE;
++ }
++
++ *no_add_attrs = false;
++
++ return NULL_TREE;
++}
++
++/* set on complete types that we don't need to inspect further at all */
++static tree handle_randomize_considered_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs)
++{
++ *no_add_attrs = false;
++ return NULL_TREE;
++}
++
++/*
++ * set on types that we've performed a shuffle on, to prevent re-shuffling
++ * this does not preclude us from inspecting its fields for potential shuffles
++ */
++static tree handle_randomize_performed_attr(tree *node, tree name, tree args, int flags, bool *no_add_attrs)
++{
++ *no_add_attrs = false;
++ return NULL_TREE;
++}
++
++/*
++ * 64bit variant of Bob Jenkins' public domain PRNG
++ * 256 bits of internal state
++ */
++
++typedef unsigned long long u64;
++
++typedef struct ranctx { u64 a; u64 b; u64 c; u64 d; } ranctx;
++
++#define rot(x,k) (((x)<<(k))|((x)>>(64-(k))))
++static u64 ranval(ranctx *x) {
++ u64 e = x->a - rot(x->b, 7);
++ x->a = x->b ^ rot(x->c, 13);
++ x->b = x->c + rot(x->d, 37);
++ x->c = x->d + e;
++ x->d = e + x->a;
++ return x->d;
++}
++
++static void raninit(ranctx *x, u64 *seed) {
++ int i;
++
++ x->a = seed[0];
++ x->b = seed[1];
++ x->c = seed[2];
++ x->d = seed[3];
++
++ for (i=0; i < 30; ++i)
++ (void)ranval(x);
++}
++
++static u64 shuffle_seed[4];
++
++struct partition_group {
++ tree tree_start;
++ unsigned long start;
++ unsigned long length;
++};
++
++static void partition_struct(tree *fields, unsigned long length, struct partition_group *size_groups, unsigned long *num_groups)
++{
++ unsigned long i;
++ unsigned long accum_size = 0;
++ unsigned long accum_length = 0;
++ unsigned long group_idx = 0;
++
++ gcc_assert(length < INT_MAX);
++
++ memset(size_groups, 0, sizeof(struct partition_group) * length);
++
++ for (i = 0; i < length; i++) {
++ if (size_groups[group_idx].tree_start == NULL_TREE) {
++ size_groups[group_idx].tree_start = fields[i];
++ size_groups[group_idx].start = i;
++ accum_length = 0;
++ accum_size = 0;
++ }
++ accum_size += (unsigned long)int_size_in_bytes(TREE_TYPE(fields[i]));
++ accum_length++;
++ if (accum_size >= 64) {
++ size_groups[group_idx].length = accum_length;
++ accum_length = 0;
++ group_idx++;
++ }
++ }
++
++ if (size_groups[group_idx].tree_start != NULL_TREE &&
++ !size_groups[group_idx].length) {
++ size_groups[group_idx].length = accum_length;
++ group_idx++;
++ }
++
++ *num_groups = group_idx;
++}
++
++static void performance_shuffle(tree *newtree, unsigned long length, ranctx *prng_state)
++{
++ unsigned long i, x;
++ struct partition_group size_group[length];
++ unsigned long num_groups = 0;
++ unsigned long randnum;
++
++ partition_struct(newtree, length, (struct partition_group *)&size_group, &num_groups);
++ for (i = num_groups - 1; i > 0; i--) {
++ struct partition_group tmp;
++ randnum = ranval(prng_state) % (i + 1);
++ tmp = size_group[i];
++ size_group[i] = size_group[randnum];
++ size_group[randnum] = tmp;
++ }
++
++ for (x = 0; x < num_groups; x++) {
++ for (i = size_group[x].start + size_group[x].length - 1; i > size_group[x].start; i--) {
++ tree tmp;
++ if (DECL_BIT_FIELD_TYPE(newtree[i]))
++ continue;
++ randnum = ranval(prng_state) % (i + 1);
++ // we could handle this case differently if desired
++ if (DECL_BIT_FIELD_TYPE(newtree[randnum]))
++ continue;
++ tmp = newtree[i];
++ newtree[i] = newtree[randnum];
++ newtree[randnum] = tmp;
++ }
++ }
++}
++
++static void full_shuffle(tree *newtree, unsigned long length, ranctx *prng_state)
++{
++ unsigned long i, randnum;
++
++ for (i = length - 1; i > 0; i--) {
++ tree tmp;
++ randnum = ranval(prng_state) % (i + 1);
++ tmp = newtree[i];
++ newtree[i] = newtree[randnum];
++ newtree[randnum] = tmp;
++ }
++}
++
++/* modern in-place Fisher-Yates shuffle */
++static void shuffle(const_tree type, tree *newtree, unsigned long length)
++{
++ unsigned long i;
++ u64 seed[4];
++ ranctx prng_state;
++ const unsigned char *structname;
++
++ if (length == 0)
++ return;
++
++ gcc_assert(TREE_CODE(type) == RECORD_TYPE);
++
++ structname = ORIG_TYPE_NAME(type);
++
++#ifdef __DEBUG_PLUGIN
++ fprintf(stderr, "Shuffling struct %s %p\n", (const char *)structname, type);
++#ifdef __DEBUG_VERBOSE
++ debug_tree((tree)type);
++#endif
++#endif
++
++ for (i = 0; i < 4; i++) {
++ seed[i] = shuffle_seed[i];
++ seed[i] ^= name_hash(structname);
++ }
++
++ raninit(&prng_state, (u64 *)&seed);
++
++ if (performance_mode)
++ performance_shuffle(newtree, length, &prng_state);
++ else
++ full_shuffle(newtree, length, &prng_state);
++}
++
++static bool is_flexible_array(const_tree field)
++{
++ const_tree fieldtype;
++ const_tree typesize;
++ const_tree elemtype;
++ const_tree elemsize;
++
++ fieldtype = TREE_TYPE(field);
++ typesize = TYPE_SIZE(fieldtype);
++
++ if (TREE_CODE(fieldtype) != ARRAY_TYPE)
++ return false;
++
++ elemtype = TREE_TYPE(fieldtype);
++ elemsize = TYPE_SIZE(elemtype);
++
++ /* size of type is represented in bits */
++
++ if (typesize == NULL_TREE && TYPE_DOMAIN(fieldtype) != NULL_TREE &&
++ TYPE_MAX_VALUE(TYPE_DOMAIN(fieldtype)) == NULL_TREE)
++ return true;
++
++ if (typesize != NULL_TREE &&
++ (TREE_CONSTANT(typesize) && (!TREE_INT_CST_LOW(typesize) ||
++ TREE_INT_CST_LOW(typesize) == TREE_INT_CST_LOW(elemsize))))
++ return true;
++
++ return false;
++}
++
++static int relayout_struct(tree type)
++{
++ unsigned long num_fields = (unsigned long)list_length(TYPE_FIELDS(type));
++ unsigned long shuffle_length = num_fields;
++ tree field;
++ tree newtree[num_fields];
++ unsigned long i;
++ tree list;
++ tree variant;
++ expanded_location xloc;
++
++ if (TYPE_FIELDS(type) == NULL_TREE)
++ return 0;
++
++ if (num_fields < 2)
++ return 0;
++
++ gcc_assert(TREE_CODE(type) == RECORD_TYPE);
++
++ gcc_assert(num_fields < INT_MAX);
++
++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(type)) ||
++ lookup_attribute("no_randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))))
++ return 0;
++
++ /* throw out any structs in uapi */
++ xloc = expand_location(DECL_SOURCE_LOCATION(TYPE_FIELDS(type)));
++
++ if (strstr(xloc.file, "/uapi/"))
++ error(G_("attempted to randomize userland API struct %s"), ORIG_TYPE_NAME(type));
++
++ for (field = TYPE_FIELDS(type), i = 0; field; field = TREE_CHAIN(field), i++) {
++ gcc_assert(TREE_CODE(field) == FIELD_DECL);
++ newtree[i] = field;
++ }
++
++ /*
++ * enforce that we don't randomize the layout of the last
++ * element of a struct if it's a 0 or 1-length array
++ * or a proper flexible array
++ */
++ if (is_flexible_array(newtree[num_fields - 1]))
++ shuffle_length--;
++
++ shuffle(type, (tree *)newtree, shuffle_length);
++
++ /*
++ * set up a bogus anonymous struct field designed to error out on unnamed struct initializers
++ * as gcc provides no other way to detect such code
++ */
++ list = make_node(FIELD_DECL);
++ TREE_CHAIN(list) = newtree[0];
++ TREE_TYPE(list) = void_type_node;
++ DECL_SIZE(list) = bitsize_zero_node;
++ DECL_NONADDRESSABLE_P(list) = 1;
++ DECL_FIELD_BIT_OFFSET(list) = bitsize_zero_node;
++ DECL_SIZE_UNIT(list) = size_zero_node;
++ DECL_FIELD_OFFSET(list) = size_zero_node;
++ // to satisfy the constify plugin
++ TREE_READONLY(list) = 1;
++
++ for (i = 0; i < num_fields - 1; i++)
++ TREE_CHAIN(newtree[i]) = newtree[i+1];
++ TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE;
++
++ for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) {
++ TYPE_FIELDS(variant) = list;
++ TYPE_ATTRIBUTES(variant) = copy_list(TYPE_ATTRIBUTES(variant));
++ TYPE_ATTRIBUTES(variant) = tree_cons(get_identifier("randomize_performed"), NULL_TREE, TYPE_ATTRIBUTES(variant));
++ // force a re-layout
++ TYPE_SIZE(variant) = NULL_TREE;
++ layout_type(variant);
++ }
++
++ return 1;
++}
++
++/* from constify plugin */
++static const_tree get_field_type(const_tree field)
++{
++ return strip_array_types(TREE_TYPE(field));
++}
++
++/* from constify plugin */
++static bool is_fptr(const_tree fieldtype)
++{
++ if (TREE_CODE(fieldtype) != POINTER_TYPE)
++ return false;
++
++ return TREE_CODE(TREE_TYPE(fieldtype)) == FUNCTION_TYPE;
++}
++
++/* derived from constify plugin */
++static int is_pure_ops_struct(const_tree node)
++{
++ const_tree field;
++
++ gcc_assert(TREE_CODE(node) == RECORD_TYPE || TREE_CODE(node) == UNION_TYPE);
++
++ for (field = TYPE_FIELDS(node); field; field = TREE_CHAIN(field)) {
++ const_tree fieldtype = get_field_type(field);
++ enum tree_code code = TREE_CODE(fieldtype);
++
++ if (node == fieldtype)
++ continue;
++
++ if (!is_fptr(fieldtype))
++ return 0;
++
++ if (code != RECORD_TYPE && code != UNION_TYPE)
++ continue;
++
++ if (!is_pure_ops_struct(fieldtype))
++ return 0;
++ }
++
++ return 1;
++}
++
++static void randomize_type(tree type)
++{
++ tree variant;
++
++ gcc_assert(TREE_CODE(type) == RECORD_TYPE);
++
++ if (lookup_attribute("randomize_considered", TYPE_ATTRIBUTES(type)))
++ return;
++
++ if (lookup_attribute("randomize_layout", TYPE_ATTRIBUTES(TYPE_MAIN_VARIANT(type))) || is_pure_ops_struct(type))
++ relayout_struct(type);
++
++ for (variant = TYPE_MAIN_VARIANT(type); variant; variant = TYPE_NEXT_VARIANT(variant)) {
++ TYPE_ATTRIBUTES(type) = copy_list(TYPE_ATTRIBUTES(type));
++ TYPE_ATTRIBUTES(type) = tree_cons(get_identifier("randomize_considered"), NULL_TREE, TYPE_ATTRIBUTES(type));
++ }
++#ifdef __DEBUG_PLUGIN
++ fprintf(stderr, "Marking randomize_considered on struct %s\n", ORIG_TYPE_NAME(type));
++#ifdef __DEBUG_VERBOSE
++ debug_tree(type);
++#endif
++#endif
++}
++
++static void finish_decl(void *event_data, void *data)
++{
++ tree decl = (tree)event_data;
++ tree type;
++
++ if (decl == NULL_TREE || decl == error_mark_node)
++ return;
++
++ type = TREE_TYPE(decl);
++
++ if (TREE_CODE(decl) != VAR_DECL)
++ return;
++
++ if (TREE_CODE(type) != RECORD_TYPE && TREE_CODE(type) != UNION_TYPE)
++ return;
++
++ if (!lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(type)))
++ return;
++
++ relayout_decl(decl);
++}
++
++static void finish_type(void *event_data, void *data)
++{
++ tree type = (tree)event_data;
++
++ if (type == NULL_TREE || type == error_mark_node)
++ return;
++
++ if (TREE_CODE(type) != RECORD_TYPE)
++ return;
++
++ if (TYPE_FIELDS(type) == NULL_TREE)
++ return;
++
++ if (lookup_attribute("randomize_considered", TYPE_ATTRIBUTES(type)))
++ return;
++
++#ifdef __DEBUG_PLUGIN
++ fprintf(stderr, "Calling randomize_type on %s\n", ORIG_TYPE_NAME(type));
++#endif
++#ifdef __DEBUG_VERBOSE
++ debug_tree(type);
++#endif
++ randomize_type(type);
++
++ return;
++}
++
++static struct attribute_spec randomize_layout_attr = {
++ .name = "randomize_layout",
++ // related to args
++ .min_length = 0,
++ .max_length = 0,
++ .decl_required = false,
++ // need type declaration
++ .type_required = true,
++ .function_type_required = false,
++ .handler = handle_randomize_layout_attr,
++#if BUILDING_GCC_VERSION >= 4007
++ .affects_type_identity = true
++#endif
++};
++
++static struct attribute_spec no_randomize_layout_attr = {
++ .name = "no_randomize_layout",
++ // related to args
++ .min_length = 0,
++ .max_length = 0,
++ .decl_required = false,
++ // need type declaration
++ .type_required = true,
++ .function_type_required = false,
++ .handler = handle_randomize_layout_attr,
++#if BUILDING_GCC_VERSION >= 4007
++ .affects_type_identity = true
++#endif
++};
++
++static struct attribute_spec randomize_considered_attr = {
++ .name = "randomize_considered",
++ // related to args
++ .min_length = 0,
++ .max_length = 0,
++ .decl_required = false,
++ // need type declaration
++ .type_required = true,
++ .function_type_required = false,
++ .handler = handle_randomize_considered_attr,
++#if BUILDING_GCC_VERSION >= 4007
++ .affects_type_identity = false
++#endif
++};
++
++static struct attribute_spec randomize_performed_attr = {
++ .name = "randomize_performed",
++ // related to args
++ .min_length = 0,
++ .max_length = 0,
++ .decl_required = false,
++ // need type declaration
++ .type_required = true,
++ .function_type_required = false,
++ .handler = handle_randomize_performed_attr,
++#if BUILDING_GCC_VERSION >= 4007
++ .affects_type_identity = false
++#endif
++};
++
++static void register_attributes(void *event_data, void *data)
++{
++ register_attribute(&randomize_layout_attr);
++ register_attribute(&no_randomize_layout_attr);
++ register_attribute(&randomize_considered_attr);
++ register_attribute(&randomize_performed_attr);
++}
++
++static void check_bad_casts_in_constructor(tree var, tree init)
++{
++ unsigned HOST_WIDE_INT idx;
++ tree field, val;
++ tree field_type, val_type;
++
++ FOR_EACH_CONSTRUCTOR_ELT(CONSTRUCTOR_ELTS(init), idx, field, val) {
++ if (TREE_CODE(val) == CONSTRUCTOR) {
++ check_bad_casts_in_constructor(var, val);
++ continue;
++ }
++
++ field_type = TREE_TYPE(field);
++ val_type = TREE_TYPE(val);
++
++ if (TREE_CODE(field_type) != POINTER_TYPE || TREE_CODE(val_type) != POINTER_TYPE)
++ continue;
++
++ if (field_type == val_type)
++ continue;
++
++ field_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(field_type))));
++ val_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(val_type))));
++
++ if (field_type == void_type_node)
++ continue;
++ if (field_type == val_type)
++ continue;
++ if (TREE_CODE(val_type) != RECORD_TYPE)
++ continue;
++
++ if (!lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(val_type)))
++ continue;
++ inform(DECL_SOURCE_LOCATION(var), "found mismatched struct pointer types: %qT and %qT\n", TYPE_MAIN_VARIANT(field_type), TYPE_MAIN_VARIANT(val_type));
++ }
++}
++
++/* derived from the constify plugin */
++static void check_global_variables(void *event_data, void *data)
++{
++ struct varpool_node *node;
++ tree init;
++
++ FOR_EACH_VARIABLE(node) {
++ tree var = NODE_DECL(node);
++ init = DECL_INITIAL(var);
++ if (init == NULL_TREE)
++ continue;
++
++ if (TREE_CODE(init) != CONSTRUCTOR)
++ continue;
++
++ check_bad_casts_in_constructor(var, init);
++ }
++}
++
++static bool dominated_by_is_err(const_tree rhs, basic_block bb)
++{
++ basic_block dom;
++ gimple dom_stmt;
++ gimple call_stmt;
++ const_tree dom_lhs;
++ const_tree poss_is_err_cond;
++ const_tree poss_is_err_func;
++ const_tree is_err_arg;
++
++ dom = get_immediate_dominator(CDI_DOMINATORS, bb);
++ if (!dom)
++ return false;
++
++ dom_stmt = last_stmt(dom);
++ if (!dom_stmt)
++ return false;
++
++ if (gimple_code(dom_stmt) != GIMPLE_COND)
++ return false;
++
++ if (gimple_cond_code(dom_stmt) != NE_EXPR)
++ return false;
++
++ if (!integer_zerop(gimple_cond_rhs(dom_stmt)))
++ return false;
++
++ poss_is_err_cond = gimple_cond_lhs(dom_stmt);
++
++ if (TREE_CODE(poss_is_err_cond) != SSA_NAME)
++ return false;
++
++ call_stmt = SSA_NAME_DEF_STMT(poss_is_err_cond);
++
++ if (gimple_code(call_stmt) != GIMPLE_CALL)
++ return false;
++
++ dom_lhs = gimple_get_lhs(call_stmt);
++ poss_is_err_func = gimple_call_fndecl(call_stmt);
++ if (!poss_is_err_func)
++ return false;
++ if (dom_lhs != poss_is_err_cond)
++ return false;
++ if (strcmp(DECL_NAME_POINTER(poss_is_err_func), "IS_ERR"))
++ return false;
++
++ is_err_arg = gimple_call_arg(call_stmt, 0);
++ if (!is_err_arg)
++ return false;
++
++ if (is_err_arg != rhs)
++ return false;
++
++ return true;
++}
++
++static void handle_local_var_initializers(void)
++{
++ tree var;
++ unsigned int i;
++
++ FOR_EACH_LOCAL_DECL(cfun, i, var) {
++ tree init = DECL_INITIAL(var);
++ if (!init)
++ continue;
++ if (TREE_CODE(init) != CONSTRUCTOR)
++ continue;
++ check_bad_casts_in_constructor(var, init);
++ }
++}
++
++/*
++ * iterate over all statements to find "bad" casts:
++ * those where the address of the start of a structure is cast
++ * to a pointer of a structure of a different type, or a
++ * structure pointer type is cast to a different structure pointer type
++ */
++static unsigned int find_bad_casts(void)
++{
++ basic_block bb;
++
++ handle_local_var_initializers();
++
++ FOR_ALL_BB_FN(bb, cfun) {
++ gimple_stmt_iterator gsi;
++
++ for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) {
++ gimple stmt;
++ const_tree lhs;
++ const_tree lhs_type;
++ const_tree rhs1;
++ const_tree rhs_type;
++ const_tree ptr_lhs_type;
++ const_tree ptr_rhs_type;
++ const_tree op0;
++ const_tree op0_type;
++ enum tree_code rhs_code;
++
++ stmt = gsi_stmt(gsi);
++
++#ifdef __DEBUG_PLUGIN
++#ifdef __DEBUG_VERBOSE
++ debug_gimple_stmt(stmt);
++ debug_tree(gimple_get_lhs(stmt));
++#endif
++#endif
++
++ if (gimple_code(stmt) != GIMPLE_ASSIGN)
++ continue;
++
++#ifdef __DEBUG_PLUGIN
++#ifdef __DEBUG_VERBOSE
++ debug_tree(gimple_assign_rhs1(stmt));
++#endif
++#endif
++
++ rhs_code = gimple_assign_rhs_code(stmt);
++
++ if (rhs_code != ADDR_EXPR && rhs_code != SSA_NAME)
++ continue;
++
++ lhs = gimple_get_lhs(stmt);
++ lhs_type = TREE_TYPE(lhs);
++ rhs1 = gimple_assign_rhs1(stmt);
++ rhs_type = TREE_TYPE(rhs1);
++
++ if (TREE_CODE(rhs_type) != POINTER_TYPE ||
++ TREE_CODE(lhs_type) != POINTER_TYPE)
++ continue;
++
++ ptr_lhs_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(lhs_type))));
++ ptr_rhs_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(rhs_type))));
++
++ if (ptr_rhs_type == void_type_node)
++ continue;
++
++ if (ptr_lhs_type == void_type_node)
++ continue;
++
++ if (dominated_by_is_err(rhs1, bb))
++ continue;
++
++ if (TREE_CODE(ptr_rhs_type) != RECORD_TYPE) {
++#ifndef __DEBUG_PLUGIN
++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_lhs_type)))
++#endif
++ inform(gimple_location(stmt), "found mismatched struct pointer types: %qT and %qT\n", ptr_lhs_type, ptr_rhs_type);
++ continue;
++ }
++
++ if (rhs_code == SSA_NAME && ptr_lhs_type == ptr_rhs_type)
++ continue;
++
++ if (rhs_code == ADDR_EXPR) {
++ op0 = TREE_OPERAND(rhs1, 0);
++
++ if (op0 == NULL_TREE)
++ continue;
++
++ if (TREE_CODE(op0) != VAR_DECL)
++ continue;
++
++ op0_type = TYPE_MAIN_VARIANT(strip_array_types(TYPE_MAIN_VARIANT(TREE_TYPE(op0))));
++ if (op0_type == ptr_lhs_type)
++ continue;
++
++#ifndef __DEBUG_PLUGIN
++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(op0_type)))
++#endif
++ inform(gimple_location(stmt), "found mismatched struct pointer types: %qT and %qT\n", ptr_lhs_type, op0_type);
++ } else {
++ const_tree ssa_name_var = SSA_NAME_VAR(rhs1);
++ /* skip bogus type casts introduced by container_of */
++ if (ssa_name_var != NULL_TREE && DECL_NAME(ssa_name_var) &&
++ !strcmp((const char *)DECL_NAME_POINTER(ssa_name_var), "__mptr"))
++ continue;
++#ifndef __DEBUG_PLUGIN
++ if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_rhs_type)))
++#endif
++ inform(gimple_location(stmt), "found mismatched struct pointer types: %qT and %qT\n", ptr_lhs_type, ptr_rhs_type);
++ }
++
++ }
++ }
++ return 0;
++}
++
++#if BUILDING_GCC_VERSION >= 4009
++static const struct pass_data randomize_layout_bad_cast_data = {
++#else
++static struct gimple_opt_pass randomize_layout_bad_cast = {
++ .pass = {
++#endif
++ .type = GIMPLE_PASS,
++ .name = "randomize_layout_bad_cast",
++#if BUILDING_GCC_VERSION >= 4008
++ .optinfo_flags = OPTGROUP_NONE,
++#endif
++#if BUILDING_GCC_VERSION >= 4009
++ .has_gate = false,
++ .has_execute = true,
++#else
++ .gate = NULL,
++ .execute = find_bad_casts,
++ .sub = NULL,
++ .next = NULL,
++ .static_pass_number = 0,
++#endif
++ .tv_id = TV_NONE,
++ .properties_required = PROP_cfg,
++ .properties_provided = 0,
++ .properties_destroyed = 0,
++ .todo_flags_start = 0,
++ .todo_flags_finish = TODO_dump_func
++#if BUILDING_GCC_VERSION < 4009
++ }
++#endif
++};
++
++#if BUILDING_GCC_VERSION >= 4009
++namespace {
++class randomize_layout_bad_cast : public gimple_opt_pass {
++public:
++ randomize_layout_bad_cast() : gimple_opt_pass(randomize_layout_bad_cast_data, g) {}
++ unsigned int execute() { return find_bad_casts(); }
++};
++}
++#endif
++
++static struct opt_pass *make_randomize_layout_bad_cast(void)
++{
++#if BUILDING_GCC_VERSION >= 4009
++ return new randomize_layout_bad_cast();
++#else
++ return &randomize_layout_bad_cast.pass;
++#endif
++}
++
++int plugin_init(struct plugin_name_args *plugin_info, struct plugin_gcc_version *version)
++{
++ int i;
++ const char * const plugin_name = plugin_info->base_name;
++ const int argc = plugin_info->argc;
++ const struct plugin_argument * const argv = plugin_info->argv;
++ bool enable = true;
++ int obtained_seed = 0;
++ struct register_pass_info randomize_layout_bad_cast_info;
++
++ randomize_layout_bad_cast_info.pass = make_randomize_layout_bad_cast();
++ randomize_layout_bad_cast_info.reference_pass_name = "ssa";
++ randomize_layout_bad_cast_info.ref_pass_instance_number = 1;
++ randomize_layout_bad_cast_info.pos_op = PASS_POS_INSERT_AFTER;
++
++ if (!plugin_default_version_check(version, &gcc_version)) {
++ error(G_("incompatible gcc/plugin versions"));
++ return 1;
++ }
++
++ if (strcmp(lang_hooks.name, "GNU C")) {
++ inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name);
++ enable = false;
++ }
++
++ for (i = 0; i < argc; ++i) {
++ if (!strcmp(argv[i].key, "disable")) {
++ enable = false;
++ continue;
++ }
++ if (!strcmp(argv[i].key, "performance-mode")) {
++ performance_mode = 1;
++ continue;
++ }
++ error(G_("unkown option '-fplugin-arg-%s-%s'"), plugin_name, argv[i].key);
++ }
++
++ if (strlen(randstruct_seed) != 64) {
++ error(G_("invalid seed value supplied for %s plugin"), plugin_name);
++ return 1;
++ }
++ obtained_seed = sscanf(randstruct_seed, "%016llx%016llx%016llx%016llx",
++ &shuffle_seed[0], &shuffle_seed[1], &shuffle_seed[2], &shuffle_seed[3]);
++ if (obtained_seed != 4) {
++ error(G_("Invalid seed supplied for %s plugin"), plugin_name);
++ return 1;
++ }
++
++ register_callback(plugin_name, PLUGIN_INFO, NULL, &randomize_layout_plugin_info);
++ if (enable) {
++ register_callback(plugin_name, PLUGIN_ALL_IPA_PASSES_START, check_global_variables, NULL);
++ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &randomize_layout_bad_cast_info);
++ register_callback(plugin_name, PLUGIN_FINISH_TYPE, finish_type, NULL);
++ register_callback(plugin_name, PLUGIN_FINISH_DECL, finish_decl, NULL);
++ }
++ register_callback(plugin_name, PLUGIN_ATTRIBUTES, register_attributes, NULL);
++
++ return 0;
++}
diff --git a/tools/gcc/size_overflow_hash.data b/tools/gcc/size_overflow_hash.data
new file mode 100644
index 0000000..7b67f2b
@@ -113654,7 +116346,7 @@ index 0000000..7b67f2b
+selnl_msglen_65499 selnl_msglen 0 65499 NULL
diff --git a/tools/gcc/size_overflow_plugin.c b/tools/gcc/size_overflow_plugin.c
new file mode 100644
-index 0000000..94aa56d
+index 0000000..4a637ab
--- /dev/null
+++ b/tools/gcc/size_overflow_plugin.c
@@ -0,0 +1,4040 @@
@@ -117688,7 +120380,7 @@ index 0000000..94aa56d
+
+ register_callback(plugin_name, PLUGIN_INFO, NULL, &size_overflow_plugin_info);
+ if (enable) {
-+ register_callback("start_unit", PLUGIN_START_UNIT, &start_unit_callback, NULL);
++ register_callback(plugin_name, PLUGIN_START_UNIT, &start_unit_callback, NULL);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &insert_size_overflow_asm_pass_info);
+// register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &dump_before_pass_info);
+ register_callback(plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL, &ipa_pass_info);
diff --git a/3.2.54/4450_grsec-kconfig-default-gids.patch b/3.2.54/4450_grsec-kconfig-default-gids.patch
index 71f6231..4f345d6 100644
--- a/3.2.54/4450_grsec-kconfig-default-gids.patch
+++ b/3.2.54/4450_grsec-kconfig-default-gids.patch
@@ -16,7 +16,7 @@ from shooting themselves in the foot.
diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
--- a/grsecurity/Kconfig 2012-10-13 09:51:35.000000000 -0400
+++ b/grsecurity/Kconfig 2012-10-13 09:52:32.000000000 -0400
-@@ -617,7 +617,7 @@
+@@ -643,7 +643,7 @@
config GRKERNSEC_AUDIT_GID
int "GID for auditing"
depends on GRKERNSEC_AUDIT_GROUP
@@ -25,7 +25,7 @@ diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
config GRKERNSEC_EXECLOG
bool "Exec logging"
-@@ -826,7 +826,7 @@
+@@ -874,7 +874,7 @@
config GRKERNSEC_TPE_UNTRUSTED_GID
int "GID for TPE-untrusted users"
depends on GRKERNSEC_TPE && !GRKERNSEC_TPE_INVERT
@@ -34,7 +34,7 @@ diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
help
Setting this GID determines what group TPE restrictions will be
*enabled* for. If the sysctl option is enabled, a sysctl option
-@@ -835,7 +835,7 @@
+@@ -883,7 +883,7 @@
config GRKERNSEC_TPE_TRUSTED_GID
int "GID for TPE-trusted users"
depends on GRKERNSEC_TPE && GRKERNSEC_TPE_INVERT
@@ -43,7 +43,7 @@ diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
help
Setting this GID determines what group TPE restrictions will be
*disabled* for. If the sysctl option is enabled, a sysctl option
-@@ -928,7 +928,7 @@
+@@ -976,7 +976,7 @@
config GRKERNSEC_SOCKET_ALL_GID
int "GID to deny all sockets for"
depends on GRKERNSEC_SOCKET_ALL
@@ -52,7 +52,7 @@ diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
help
Here you can choose the GID to disable socket access for. Remember to
add the users you want socket access disabled for to the GID
-@@ -949,7 +949,7 @@
+@@ -997,7 +997,7 @@
config GRKERNSEC_SOCKET_CLIENT_GID
int "GID to deny client sockets for"
depends on GRKERNSEC_SOCKET_CLIENT
@@ -61,7 +61,7 @@ diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
help
Here you can choose the GID to disable client socket access for.
Remember to add the users you want client socket access disabled for to
-@@ -967,7 +967,7 @@
+@@ -1015,7 +1015,7 @@
config GRKERNSEC_SOCKET_SERVER_GID
int "GID to deny server sockets for"
depends on GRKERNSEC_SOCKET_SERVER
diff --git a/3.2.54/4465_selinux-avc_audit-log-curr_ip.patch b/3.2.54/4465_selinux-avc_audit-log-curr_ip.patch
index a946b66..0545d51 100644
--- a/3.2.54/4465_selinux-avc_audit-log-curr_ip.patch
+++ b/3.2.54/4465_selinux-avc_audit-log-curr_ip.patch
@@ -28,7 +28,7 @@ Signed-off-by: Lorenzo Hernandez Garcia-Hierro <lorenzo@gnu.org>
diff -Naur a/grsecurity/Kconfig b/grsecurity/Kconfig
--- a/grsecurity/Kconfig 2011-04-17 19:25:54.000000000 -0400
+++ b/grsecurity/Kconfig 2011-04-17 19:32:53.000000000 -0400
-@@ -1062,6 +1062,27 @@
+@@ -1110,6 +1110,27 @@
menu "Logging Options"
depends on GRKERNSEC
diff --git a/3.2.54/4470_disable-compat_vdso.patch b/3.2.54/4470_disable-compat_vdso.patch
index 6905571..f6eb9f7 100644
--- a/3.2.54/4470_disable-compat_vdso.patch
+++ b/3.2.54/4470_disable-compat_vdso.patch
@@ -26,7 +26,7 @@ Closes bug: http://bugs.gentoo.org/show_bug.cgi?id=210138
diff -urp a/arch/x86/Kconfig b/arch/x86/Kconfig
--- a/arch/x86/Kconfig 2009-07-31 01:36:57.323857684 +0100
+++ b/arch/x86/Kconfig 2009-07-31 01:51:39.395749681 +0100
-@@ -1653,17 +1653,8 @@
+@@ -1654,17 +1654,8 @@
config COMPAT_VDSO
def_bool n