diff options
-rw-r--r-- | 3.14.39/0000_README | 2 | ||||
-rw-r--r-- | 3.14.39/4420_grsecurity-3.1-3.14.39-201504270826.patch (renamed from 3.14.39/4420_grsecurity-3.1-3.14.39-201504190814.patch) | 384 | ||||
-rw-r--r-- | 3.19.5/0000_README | 2 | ||||
-rw-r--r-- | 3.19.5/4420_grsecurity-3.1-3.19.5-201504270827.patch (renamed from 3.19.5/4420_grsecurity-3.1-3.19.5-201504190814.patch) | 516 | ||||
-rw-r--r-- | 3.2.68/0000_README | 2 | ||||
-rw-r--r-- | 3.2.68/4420_grsecurity-3.1-3.2.68-201504270825.patch (renamed from 3.2.68/4420_grsecurity-3.1-3.2.68-201504142258.patch) | 409 |
6 files changed, 1034 insertions, 281 deletions
diff --git a/3.14.39/0000_README b/3.14.39/0000_README index df5ef6d..7ed8450 100644 --- a/3.14.39/0000_README +++ b/3.14.39/0000_README @@ -2,7 +2,7 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 4420_grsecurity-3.1-3.14.39-201504190814.patch +Patch: 4420_grsecurity-3.1-3.14.39-201504270826.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.14.39/4420_grsecurity-3.1-3.14.39-201504190814.patch b/3.14.39/4420_grsecurity-3.1-3.14.39-201504270826.patch index 71f78fb..3fbeaa8 100644 --- a/3.14.39/4420_grsecurity-3.1-3.14.39-201504190814.patch +++ b/3.14.39/4420_grsecurity-3.1-3.14.39-201504270826.patch @@ -45938,7 +45938,7 @@ index 2fd9009..278cc1e 100644 radio = devm_kzalloc(&pdev->dev, sizeof(*radio), GFP_KERNEL); if (!radio) diff --git a/drivers/media/radio/wl128x/fmdrv_common.c b/drivers/media/radio/wl128x/fmdrv_common.c -index 4b2e9e8..c2900d9 100644 +index 4b2e9e8..c2900d99 100644 --- a/drivers/media/radio/wl128x/fmdrv_common.c +++ b/drivers/media/radio/wl128x/fmdrv_common.c @@ -71,7 +71,7 @@ module_param(default_rds_buf, uint, 0444); @@ -48304,6 +48304,19 @@ index d7a3682..9ce272a 100644 rc = efx_mcdi_rpc_start(efx, MC_CMD_PTP, synch_buf, MC_CMD_PTP_IN_SYNCHRONIZE_LEN); EFX_BUG_ON_PARANOID(rc); +diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c +index 2664181..c9fcf6f 100644 +--- a/drivers/net/ethernet/sfc/selftest.c ++++ b/drivers/net/ethernet/sfc/selftest.c +@@ -46,7 +46,7 @@ struct efx_loopback_payload { + struct iphdr ip; + struct udphdr udp; + __be16 iteration; +- const char msg[64]; ++ char msg[64]; + } __packed; + + /* Loopback test source MAC address */ diff --git a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c index 50617c5..b13724c 100644 --- a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c @@ -61108,7 +61121,7 @@ index e4141f2..d8263e8 100644 i += packet_length_size; if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size)) diff --git a/fs/exec.c b/fs/exec.c -index ea4449d..c3fd55e 100644 +index ea4449d..747fc21 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -56,8 +56,20 @@ @@ -61425,7 +61438,23 @@ index ea4449d..c3fd55e 100644 tsk->mm->vmacache_seqnum = 0; vmacache_flush(tsk); task_unlock(tsk); -@@ -1261,7 +1340,7 @@ static void check_unsafe_exec(struct linux_binprm *bprm) +@@ -913,10 +992,14 @@ static int de_thread(struct task_struct *tsk) + if (!thread_group_leader(tsk)) { + struct task_struct *leader = tsk->group_leader; + +- sig->notify_count = -1; /* for exit_notify() */ + for (;;) { + threadgroup_change_begin(tsk); + write_lock_irq(&tasklist_lock); ++ /* ++ * Do this under tasklist_lock to ensure that ++ * exit_notify() can't miss ->group_exit_task ++ */ ++ sig->notify_count = -1; + if (likely(leader->exit_state)) + break; + __set_current_state(TASK_KILLABLE); +@@ -1261,13 +1344,60 @@ static void check_unsafe_exec(struct linux_binprm *bprm) } rcu_read_unlock(); @@ -61434,7 +61463,98 @@ index ea4449d..c3fd55e 100644 bprm->unsafe |= LSM_UNSAFE_SHARE; else p->fs->in_exec = 1; -@@ -1437,6 +1516,31 @@ static int exec_binprm(struct linux_binprm *bprm) + spin_unlock(&p->fs->lock); + } + ++static void bprm_fill_uid(struct linux_binprm *bprm) ++{ ++ struct inode *inode; ++ unsigned int mode; ++ kuid_t uid; ++ kgid_t gid; ++ ++ /* clear any previous set[ug]id data from a previous binary */ ++ bprm->cred->euid = current_euid(); ++ bprm->cred->egid = current_egid(); ++ ++ if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) ++ return; ++ ++ if (current->no_new_privs) ++ return; ++ ++ inode = file_inode(bprm->file); ++ mode = ACCESS_ONCE(inode->i_mode); ++ if (!(mode & (S_ISUID|S_ISGID))) ++ return; ++ ++ /* Be careful if suid/sgid is set */ ++ mutex_lock(&inode->i_mutex); ++ ++ /* reload atomically mode/uid/gid now that lock held */ ++ mode = inode->i_mode; ++ uid = inode->i_uid; ++ gid = inode->i_gid; ++ mutex_unlock(&inode->i_mutex); ++ ++ /* We ignore suid/sgid if there are no mappings for them in the ns */ ++ if (!kuid_has_mapping(bprm->cred->user_ns, uid) || ++ !kgid_has_mapping(bprm->cred->user_ns, gid)) ++ return; ++ ++ if (mode & S_ISUID) { ++ bprm->per_clear |= PER_CLEAR_ON_SETID; ++ bprm->cred->euid = uid; ++ } ++ ++ if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { ++ bprm->per_clear |= PER_CLEAR_ON_SETID; ++ bprm->cred->egid = gid; ++ } ++} ++ + /* + * Fill the binprm structure from the inode. + * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes +@@ -1276,36 +1406,9 @@ static void check_unsafe_exec(struct linux_binprm *bprm) + */ + int prepare_binprm(struct linux_binprm *bprm) + { +- struct inode *inode = file_inode(bprm->file); +- umode_t mode = inode->i_mode; + int retval; + +- +- /* clear any previous set[ug]id data from a previous binary */ +- bprm->cred->euid = current_euid(); +- bprm->cred->egid = current_egid(); +- +- if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) && +- !current->no_new_privs && +- kuid_has_mapping(bprm->cred->user_ns, inode->i_uid) && +- kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) { +- /* Set-uid? */ +- if (mode & S_ISUID) { +- bprm->per_clear |= PER_CLEAR_ON_SETID; +- bprm->cred->euid = inode->i_uid; +- } +- +- /* Set-gid? */ +- /* +- * If setgid is set but no group execute bit then this +- * is a candidate for mandatory locking, not a setgid +- * executable. +- */ +- if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { +- bprm->per_clear |= PER_CLEAR_ON_SETID; +- bprm->cred->egid = inode->i_gid; +- } +- } ++ bprm_fill_uid(bprm); + + /* fill in binprm security blob */ + retval = security_bprm_set_creds(bprm); +@@ -1437,6 +1540,31 @@ static int exec_binprm(struct linux_binprm *bprm) return ret; } @@ -61466,7 +61586,7 @@ index ea4449d..c3fd55e 100644 /* * sys_execve() executes a new program. */ -@@ -1444,6 +1548,11 @@ static int do_execve_common(struct filename *filename, +@@ -1444,6 +1572,11 @@ static int do_execve_common(struct filename *filename, struct user_arg_ptr argv, struct user_arg_ptr envp) { @@ -61478,7 +61598,7 @@ index ea4449d..c3fd55e 100644 struct linux_binprm *bprm; struct file *file; struct files_struct *displaced; -@@ -1452,6 +1561,8 @@ static int do_execve_common(struct filename *filename, +@@ -1452,6 +1585,8 @@ static int do_execve_common(struct filename *filename, if (IS_ERR(filename)) return PTR_ERR(filename); @@ -61487,7 +61607,7 @@ index ea4449d..c3fd55e 100644 /* * We move the actual failure in case of RLIMIT_NPROC excess from * set*uid() to execve() because too many poorly written programs -@@ -1489,11 +1600,21 @@ static int do_execve_common(struct filename *filename, +@@ -1489,11 +1624,21 @@ static int do_execve_common(struct filename *filename, if (IS_ERR(file)) goto out_unmark; @@ -61509,7 +61629,7 @@ index ea4449d..c3fd55e 100644 retval = bprm_mm_init(bprm); if (retval) goto out_unmark; -@@ -1510,24 +1631,70 @@ static int do_execve_common(struct filename *filename, +@@ -1510,24 +1655,70 @@ static int do_execve_common(struct filename *filename, if (retval < 0) goto out; @@ -61584,7 +61704,7 @@ index ea4449d..c3fd55e 100644 current->fs->in_exec = 0; current->in_execve = 0; acct_update_integrals(current); -@@ -1538,6 +1705,14 @@ static int do_execve_common(struct filename *filename, +@@ -1538,6 +1729,14 @@ static int do_execve_common(struct filename *filename, put_files_struct(displaced); return retval; @@ -61599,7 +61719,7 @@ index ea4449d..c3fd55e 100644 out: if (bprm->mm) { acct_arg_size(bprm, 0); -@@ -1629,3 +1804,312 @@ asmlinkage long compat_sys_execve(const char __user * filename, +@@ -1629,3 +1828,312 @@ asmlinkage long compat_sys_execve(const char __user * filename, return compat_do_execve(getname(filename), argv, envp); } #endif @@ -65576,6 +65696,19 @@ index 553f53c..aaf5133 100644 }; enum ocfs2_local_alloc_state +diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c +index 6ba4bcb..88a6f7d 100644 +--- a/fs/ocfs2/refcounttree.c ++++ b/fs/ocfs2/refcounttree.c +@@ -4279,7 +4279,7 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, + error = posix_acl_create(dir, &mode, &default_acl, &acl); + if (error) { + mlog_errno(error); +- goto out; ++ return error; + } + + error = ocfs2_create_inode_in_orphan(dir, mode, diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 47ae266..6e8b793 100644 --- a/fs/ocfs2/suballoc.c @@ -81734,10 +81867,10 @@ index 2507fd2..55203f8 100644 * Mark a position in code as unreachable. This can be used to * suppress control flow warnings after asm blocks that transfer diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h -index cdd1cc2..59dc542 100644 +index cdd1cc2..2401b2e 100644 --- a/include/linux/compiler-gcc5.h +++ b/include/linux/compiler-gcc5.h -@@ -28,6 +28,28 @@ +@@ -28,6 +28,26 @@ # define __compiletime_error(message) __attribute__((error(message))) #endif /* __CHECKER__ */ @@ -81747,7 +81880,6 @@ index cdd1cc2..59dc542 100644 +#define __bos1(ptr) __bos((ptr), 1) + +#ifdef CONSTIFY_PLUGIN -+#error not yet +#define __no_const __attribute__((no_const)) +#define __do_const __attribute__((do_const)) +#endif @@ -81759,13 +81891,20 @@ index cdd1cc2..59dc542 100644 +#endif + +#ifdef LATENT_ENTROPY_PLUGIN -+#error not yet +#define __latent_entropy __attribute__((latent_entropy)) +#endif + /* * Mark a position in code as unreachable. This can be used to * suppress control flow warnings after asm blocks that transfer +@@ -53,7 +73,6 @@ + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 + * + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. +- * Fixed in GCC 4.8.2 and later versions. + * + * (asm goto is automatically volatile - the naming reflects this.) + */ diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 2472740..4857634 100644 --- a/include/linux/compiler.h @@ -109509,6 +109648,9 @@ index 0000000..eaa4fce + exit 0 +fi +exit 1 +diff --git a/scripts/gcc-version.sh b/scripts/gcc-version.sh +old mode 100644 +new mode 100755 diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh index 5de5660..d3deb89 100644 --- a/scripts/headers_install.sh @@ -112499,12 +112641,12 @@ index 0000000..5452feea +} diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c new file mode 100644 -index 0000000..d44bd9f +index 0000000..0c96d8a --- /dev/null +++ b/tools/gcc/colorize_plugin.c @@ -0,0 +1,215 @@ +/* -+ * Copyright 2012-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2012-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -112597,6 +112739,7 @@ index 0000000..d44bd9f +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data colorize_rearm_pass_data = { +#else +struct simple_ipa_opt_pass colorize_rearm_pass = { @@ -112630,7 +112773,6 @@ index 0000000..d44bd9f +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class colorize_rearm_pass : public simple_ipa_opt_pass { +public: + colorize_rearm_pass() : simple_ipa_opt_pass(colorize_rearm_pass_data, g) {} @@ -112720,13 +112862,13 @@ index 0000000..d44bd9f +} diff --git a/tools/gcc/constify_plugin.c b/tools/gcc/constify_plugin.c new file mode 100644 -index 0000000..3b5af59 +index 0000000..93b181d --- /dev/null +++ b/tools/gcc/constify_plugin.c -@@ -0,0 +1,558 @@ +@@ -0,0 +1,563 @@ +/* + * Copyright 2011 by Emese Revfy <re.emese@gmail.com> -+ * Copyright 2011-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2, or (at your option) v3 + * + * This gcc plugin constifies all structures which contain only function pointers or are explicitly marked for constification. @@ -112741,7 +112883,7 @@ index 0000000..3b5af59 + +#include "gcc-common.h" + -+// unused C type flag in all versions 4.5-4.9 ++// unused C type flag in all versions 4.5-5.0 +#define TYPE_CONSTIFY_VISITED(TYPE) TYPE_LANG_FLAG_4(TYPE) + +int plugin_is_GPL_compatible; @@ -113047,6 +113189,11 @@ index 0000000..3b5af59 + if (type == NULL_TREE || type == error_mark_node) + return; + ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ + if (TYPE_FIELDS(type) == NULL_TREE || TYPE_CONSTIFY_VISITED(type)) + return; + @@ -113147,6 +113294,7 @@ index 0000000..3b5af59 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data check_local_variables_pass_data = { +#else +static struct gimple_opt_pass check_local_variables_pass = { @@ -113180,7 +113328,6 @@ index 0000000..3b5af59 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class check_local_variables_pass : public gimple_opt_pass { +public: + check_local_variables_pass() : gimple_opt_pass(check_local_variables_pass_data, g) {} @@ -113284,10 +113431,10 @@ index 0000000..3b5af59 +} diff --git a/tools/gcc/gcc-common.h b/tools/gcc/gcc-common.h new file mode 100644 -index 0000000..14ec226 +index 0000000..19fedf2 --- /dev/null +++ b/tools/gcc/gcc-common.h -@@ -0,0 +1,520 @@ +@@ -0,0 +1,540 @@ +#ifndef GCC_COMMON_H_INCLUDED +#define GCC_COMMON_H_INCLUDED + @@ -113389,11 +113536,13 @@ index 0000000..14ec226 +//#include "diagnostic-color.h" +#include "context.h" +#include "tree-ssa-alias.h" ++#include "tree-ssa.h" +#include "stringpool.h" +#include "tree-ssanames.h" +#include "print-tree.h" +#include "tree-eh.h" +#include "stmt.h" ++#include "gimplify.h" +#endif + +#include "gimple.h" @@ -113416,6 +113565,7 @@ index 0000000..14ec226 +//#include "lto-compress.h" +#if BUILDING_GCC_VERSION >= 5000 +//#include "lto-section-names.h" ++#include "builtins.h" +#endif + +//#include "expr.h" where are you... @@ -113643,6 +113793,7 @@ index 0000000..14ec226 +typedef union gimple_statement_d gasm; +typedef union gimple_statement_d gassign; +typedef union gimple_statement_d gcall; ++typedef union gimple_statement_d gdebug; +typedef union gimple_statement_d gphi; +typedef union gimple_statement_d greturn; +#endif @@ -113669,6 +113820,7 @@ index 0000000..14ec226 +typedef struct gimple_statement_base gasm; +typedef struct gimple_statement_base gassign; +typedef struct gimple_statement_base gcall; ++typedef struct gimple_statement_base gdebug; +typedef struct gimple_statement_base gphi; +typedef struct gimple_statement_base greturn; +#endif @@ -113685,6 +113837,11 @@ index 0000000..14ec226 +{ + return stmt; +} ++ ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return stmt; ++} +#endif + +#if BUILDING_GCC_VERSION >= 4009 @@ -113705,16 +113862,16 @@ index 0000000..14ec226 + +#define INSN_DELETED_P(insn) (insn)->deleted() + -+extern bool is_simple_builtin(tree); -+ +// symtab/cgraph related +#define debug_cgraph_node(node) (node)->debug() +#define cgraph_get_node(decl) cgraph_node::get(decl) +#define cgraph_n_nodes symtab->cgraph_count +#define cgraph_max_uid symtab->cgraph_max_uid ++#define varpool_get_node(decl) varpool_node::get(decl) + +typedef struct cgraph_node *cgraph_node_ptr; +typedef struct cgraph_edge *cgraph_edge_p; ++typedef struct varpool_node *varpool_node_ptr; + +static inline void change_decl_assembler_name(tree decl, tree name) +{ @@ -113792,11 +113949,21 @@ index 0000000..14ec226 + return as_a<gasm *>(stmt); +} + ++static inline const gasm *as_a_gasm(const_gimple stmt) ++{ ++ return as_a<const gasm *>(stmt); ++} ++ +static inline gcall *as_a_gcall(gimple stmt) +{ + return as_a<gcall *>(stmt); +} + ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return as_a<greturn *>(stmt); ++} ++ +// IPA/LTO related +#define ipa_ref_list_referring_iterate(L,I,P) (L)->referring.iterate((I), &(P)) +#define ipa_ref_list_reference_iterate(L,I,P) (L)->reference.iterate((I), &(P)) @@ -113824,12 +113991,12 @@ index 0000000..7514850 +fi diff --git a/tools/gcc/kallocstat_plugin.c b/tools/gcc/kallocstat_plugin.c new file mode 100644 -index 0000000..d81c094 +index 0000000..457d54e --- /dev/null +++ b/tools/gcc/kallocstat_plugin.c -@@ -0,0 +1,183 @@ +@@ -0,0 +1,188 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -113940,6 +114107,7 @@ index 0000000..d81c094 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data kallocstat_pass_data = { +#else +static struct gimple_opt_pass kallocstat_pass = { @@ -113950,7 +114118,8 @@ index 0000000..d81c094 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = false, + .has_execute = true, +#else @@ -113972,11 +114141,14 @@ index 0000000..d81c094 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class kallocstat_pass : public gimple_opt_pass { +public: + kallocstat_pass() : gimple_opt_pass(kallocstat_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return execute_kallocstat(); } ++#else + unsigned int execute() { return execute_kallocstat(); } ++#endif +}; +} + @@ -114013,12 +114185,12 @@ index 0000000..d81c094 +} diff --git a/tools/gcc/kernexec_plugin.c b/tools/gcc/kernexec_plugin.c new file mode 100644 -index 0000000..89f256d +index 0000000..71716e7 --- /dev/null +++ b/tools/gcc/kernexec_plugin.c -@@ -0,0 +1,522 @@ +@@ -0,0 +1,547 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -114051,7 +114223,7 @@ index 0000000..89f256d + */ +static void kernexec_reload_fptr_mask(gimple_stmt_iterator *gsi) +{ -+ gimple asm_movabs_stmt; ++ gasm *asm_movabs_stmt; + + // build asm volatile("movabs $0x8000000000000000, %%r12\n\t" : : : ); + asm_movabs_stmt = gimple_build_asm_vec("movabs $0x8000000000000000, %%r12\n\t", NULL, NULL, NULL, NULL); @@ -114073,14 +114245,17 @@ index 0000000..89f256d + + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + // gimple match: __asm__ ("" : : : "r12"); -+ gimple asm_stmt; ++ gimple stmt; ++ gasm *asm_stmt; + size_t nclobbers; + + // is it an asm ... -+ asm_stmt = gsi_stmt(gsi); -+ if (gimple_code(asm_stmt) != GIMPLE_ASM) ++ stmt = gsi_stmt(gsi); ++ if (gimple_code(stmt) != GIMPLE_ASM) + continue; + ++ asm_stmt = as_a_gasm(stmt); ++ + // ... clobbering r12 + nclobbers = gimple_asm_nclobbers(asm_stmt); + while (nclobbers--) { @@ -114103,10 +114278,11 @@ index 0000000..89f256d + */ +static void kernexec_instrument_fptr_bts(gimple_stmt_iterator *gsi) +{ -+ gimple assign_intptr, assign_new_fptr, call_stmt; ++ gimple assign_intptr, assign_new_fptr; ++ gcall *call_stmt; + tree intptr, orptr, old_fptr, new_fptr, kernexec_mask; + -+ call_stmt = gsi_stmt(*gsi); ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); + old_fptr = gimple_call_fn(call_stmt); + + // create temporary unsigned long variable used for bitops and cast fptr to it @@ -114144,7 +114320,8 @@ index 0000000..89f256d + +static void kernexec_instrument_fptr_or(gimple_stmt_iterator *gsi) +{ -+ gimple asm_or_stmt, call_stmt; ++ gasm *asm_or_stmt; ++ gcall *call_stmt; + tree old_fptr, new_fptr, input, output; +#if BUILDING_GCC_VERSION <= 4007 + VEC(tree, gc) *inputs = NULL; @@ -114154,7 +114331,7 @@ index 0000000..89f256d + vec<tree, va_gc> *outputs = NULL; +#endif + -+ call_stmt = gsi_stmt(*gsi); ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); + old_fptr = gimple_call_fn(call_stmt); + + // create temporary fptr variable @@ -114199,12 +114376,14 @@ index 0000000..89f256d + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + // gimple match: h_1 = get_fptr (); D.2709_3 = h_1 (x_2(D)); + tree fn; -+ gimple call_stmt; ++ gimple stmt; ++ gcall *call_stmt; + + // is it a call ... -+ call_stmt = gsi_stmt(gsi); -+ if (!is_gimple_call(call_stmt)) ++ stmt = gsi_stmt(gsi); ++ if (!is_gimple_call(stmt)) + continue; ++ call_stmt = as_a_gcall(stmt); + fn = gimple_call_fn(call_stmt); + if (TREE_CODE(fn) == ADDR_EXPR) + continue; @@ -114277,7 +114456,7 @@ index 0000000..89f256d + */ +static unsigned int execute_kernexec_retaddr(void) +{ -+ rtx insn; ++ rtx_insn *insn; + +// if (stack_realign_drap) +// inform(DECL_SOURCE_LOCATION(current_function_decl), "drap detected in %s\n", IDENTIFIER_POINTER(DECL_NAME(current_function_decl))); @@ -114325,6 +114504,7 @@ index 0000000..89f256d +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data kernexec_reload_pass_data = { +#else +static struct gimple_opt_pass kernexec_reload_pass = { @@ -114335,7 +114515,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -114367,7 +114548,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -114399,7 +114581,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -114421,26 +114604,40 @@ index 0000000..89f256d +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class kernexec_reload_pass : public gimple_opt_pass { +public: + kernexec_reload_pass() : gimple_opt_pass(kernexec_reload_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_reload(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_reload(); } ++#endif +}; + +class kernexec_fptr_pass : public gimple_opt_pass { +public: + kernexec_fptr_pass() : gimple_opt_pass(kernexec_fptr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_fptr(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_fptr(); } ++#endif +}; + +class kernexec_retaddr_pass : public rtl_opt_pass { +public: + kernexec_retaddr_pass() : rtl_opt_pass(kernexec_retaddr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_retaddr(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_retaddr(); } ++#endif +}; +} + @@ -114541,12 +114738,12 @@ index 0000000..89f256d +} diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c new file mode 100644 -index 0000000..2a39357 +index 0000000..d383708 --- /dev/null +++ b/tools/gcc/latent_entropy_plugin.c -@@ -0,0 +1,467 @@ +@@ -0,0 +1,473 @@ +/* -+ * Copyright 2012-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2012-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -114926,6 +115123,7 @@ index 0000000..2a39357 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data latent_entropy_pass_data = { +#else +static struct gimple_opt_pass latent_entropy_pass = { @@ -114936,7 +115134,8 @@ index 0000000..2a39357 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -114958,12 +115157,16 @@ index 0000000..2a39357 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class latent_entropy_pass : public gimple_opt_pass { +public: + latent_entropy_pass() : gimple_opt_pass(latent_entropy_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_latent_entropy(); } ++ virtual unsigned int execute(function *) { return execute_latent_entropy(); } ++#else + bool gate() { return gate_latent_entropy(); } + unsigned int execute() { return execute_latent_entropy(); } ++#endif +}; +} + @@ -115014,12 +115217,12 @@ index 0000000..2a39357 +} diff --git a/tools/gcc/randomize_layout_plugin.c b/tools/gcc/randomize_layout_plugin.c new file mode 100644 -index 0000000..a5cb46b +index 0000000..e1983c0 --- /dev/null +++ b/tools/gcc/randomize_layout_plugin.c -@@ -0,0 +1,915 @@ +@@ -0,0 +1,917 @@ +/* -+ * Copyright 2014 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> ++ * Copyright 2014,2015 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> + * and PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * @@ -115034,7 +115237,8 @@ index 0000000..a5cb46b +#include "gcc-common.h" +#include "randomize_layout_seed.h" + -+#if BUILDING_GCC_MAJOR < 4 || BUILDING_GCC_MINOR < 6 || (BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) ++#if BUILDING_GCC_MAJOR < 4 || (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR < 6) || \ ++ (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) +#error "The RANDSTRUCT plugin requires GCC 4.6.4 or newer." +#endif + @@ -115834,7 +116038,8 @@ index 0000000..a5cb46b +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 + .has_gate = false, + .has_execute = true, +#else @@ -115894,8 +116099,8 @@ index 0000000..a5cb46b + return 1; + } + -+ if (strcmp(lang_hooks.name, "GNU C")) { -+ inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); ++ if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { ++ inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); + enable = false; + } + @@ -127073,12 +127278,12 @@ index 0000000..0888f6c + diff --git a/tools/gcc/stackleak_plugin.c b/tools/gcc/stackleak_plugin.c new file mode 100644 -index 0000000..90125d6 +index 0000000..51dc09d --- /dev/null +++ b/tools/gcc/stackleak_plugin.c -@@ -0,0 +1,396 @@ +@@ -0,0 +1,408 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -127205,7 +127410,7 @@ index 0000000..90125d6 + +static unsigned int execute_stackleak_final(void) +{ -+ rtx insn, next; ++ rtx_insn *insn, *next; + + if (cfun->calls_alloca) + return 0; @@ -127299,6 +127504,7 @@ index 0000000..90125d6 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data stackleak_tree_instrument_pass_data = { +#else +static struct gimple_opt_pass stackleak_tree_instrument_pass = { @@ -127309,7 +127515,8 @@ index 0000000..90125d6 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -127341,7 +127548,8 @@ index 0000000..90125d6 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -127363,19 +127571,28 @@ index 0000000..90125d6 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class stackleak_tree_instrument_pass : public gimple_opt_pass { +public: + stackleak_tree_instrument_pass() : gimple_opt_pass(stackleak_tree_instrument_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_tree_instrument(); } ++#else + bool gate() { return gate_stackleak_track_stack(); } + unsigned int execute() { return execute_stackleak_tree_instrument(); } ++#endif +}; + +class stackleak_final_rtl_opt_pass : public rtl_opt_pass { +public: + stackleak_final_rtl_opt_pass() : rtl_opt_pass(stackleak_final_rtl_opt_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_final(); } ++#else + bool gate() { return gate_stackleak_track_stack(); } + unsigned int execute() { return execute_stackleak_final(); } ++#endif +}; +} + @@ -127475,12 +127692,12 @@ index 0000000..90125d6 +} diff --git a/tools/gcc/structleak_plugin.c b/tools/gcc/structleak_plugin.c new file mode 100644 -index 0000000..4ee2231 +index 0000000..4436cbe --- /dev/null +++ b/tools/gcc/structleak_plugin.c -@@ -0,0 +1,274 @@ +@@ -0,0 +1,287 @@ +/* -+ * Copyright 2013-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2013-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -127507,8 +127724,8 @@ index 0000000..4ee2231 + +#include "gcc-common.h" + -+// unused C type flag in all versions 4.5-4.9 -+#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_3(TYPE) ++// unused C type flag in all versions 4.5-5.0 ++#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_5(TYPE) + +int plugin_is_GPL_compatible; + @@ -127575,6 +127792,14 @@ index 0000000..4ee2231 +{ + tree type = (tree)event_data; + ++ if (type == NULL_TREE || type == error_mark_node) ++ return; ++ ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ + if (TYPE_USERSPACE(type)) + return; + @@ -127661,6 +127886,7 @@ index 0000000..4ee2231 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data structleak_pass_data = { +#else +static struct gimple_opt_pass structleak_pass = { @@ -127671,7 +127897,8 @@ index 0000000..4ee2231 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = false, + .has_execute = true, +#else @@ -127693,11 +127920,14 @@ index 0000000..4ee2231 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class structleak_pass : public gimple_opt_pass { +public: + structleak_pass() : gimple_opt_pass(structleak_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return handle_function(); } ++#else + unsigned int execute() { return handle_function(); } ++#endif +}; +} + @@ -127731,7 +127961,7 @@ index 0000000..4ee2231 + return 1; + } + -+ if (strcmp(lang_hooks.name, "GNU C")) { ++ if (strncmp(lang_hooks.name, "GNU C", 5) || !strncmp(lang_hooks.name, "GNU C+", 6)) { + inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); + enable = false; + } diff --git a/3.19.5/0000_README b/3.19.5/0000_README index fe57086..4fd49ef 100644 --- a/3.19.5/0000_README +++ b/3.19.5/0000_README @@ -2,7 +2,7 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 4420_grsecurity-3.1-3.19.5-201504190814.patch +Patch: 4420_grsecurity-3.1-3.19.5-201504270827.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.19.5/4420_grsecurity-3.1-3.19.5-201504190814.patch b/3.19.5/4420_grsecurity-3.1-3.19.5-201504270827.patch index 6ae0a6e..2036ebb 100644 --- a/3.19.5/4420_grsecurity-3.1-3.19.5-201504190814.patch +++ b/3.19.5/4420_grsecurity-3.1-3.19.5-201504270827.patch @@ -965,7 +965,7 @@ index 97d07ed..2931f2b 100644 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/atomic.h b/arch/arm/include/asm/atomic.h -index e22c119..eaa807d 100644 +index e22c119..abe7041 100644 --- a/arch/arm/include/asm/atomic.h +++ b/arch/arm/include/asm/atomic.h @@ -18,17 +18,41 @@ @@ -1059,8 +1059,8 @@ index e22c119..eaa807d 100644 -#define ATOMIC_OP_RETURN(op, c_op, asm_op) \ -static inline int atomic_##op##_return(int i, atomic_t *v) \ -+#define ATOMIC_OP(op, c_op, asm_op) __ATOMIC_OP(op, , c_op, asm_op, , )\ -+ __ATOMIC_OP(op, _unchecked, c_op, asm_op##s, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++#define ATOMIC_OP(op, c_op, asm_op) __ATOMIC_OP(op, _unchecked, c_op, asm_op, , )\ ++ __ATOMIC_OP(op, , c_op, asm_op##s, __OVERFLOW_POST, __OVERFLOW_EXTABLE) + +#define __ATOMIC_OP_RETURN(op, suffix, c_op, asm_op, post_op, extable) \ +static inline int atomic_##op##_return##suffix(int i, atomic##suffix##_t *v)\ @@ -1088,8 +1088,8 @@ index e22c119..eaa807d 100644 return result; \ } -+#define ATOMIC_OP_RETURN(op, c_op, asm_op) __ATOMIC_OP_RETURN(op, , c_op, asm_op, , )\ -+ __ATOMIC_OP_RETURN(op, _unchecked, c_op, asm_op##s, __OVERFLOW_POST_RETURN, __OVERFLOW_EXTABLE) ++#define ATOMIC_OP_RETURN(op, c_op, asm_op) __ATOMIC_OP_RETURN(op, _unchecked, c_op, asm_op, , )\ ++ __ATOMIC_OP_RETURN(op, , c_op, asm_op##s, __OVERFLOW_POST_RETURN, __OVERFLOW_EXTABLE) + static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) { @@ -1363,8 +1363,8 @@ index e22c119..eaa807d 100644 -#define ATOMIC64_OP_RETURN(op, op1, op2) \ -static inline long long atomic64_##op##_return(long long i, atomic64_t *v) \ -+#define ATOMIC64_OP(op, op1, op2) __ATOMIC64_OP(op, , op1, op2, , ) \ -+ __ATOMIC64_OP(op, _unchecked, op1, op2##s, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++#define ATOMIC64_OP(op, op1, op2) __ATOMIC64_OP(op, _unchecked, op1, op2, , ) \ ++ __ATOMIC64_OP(op, , op1, op2##s, __OVERFLOW_POST, __OVERFLOW_EXTABLE) + +#define __ATOMIC64_OP_RETURN(op, suffix, op1, op2, post_op, extable) \ +static inline long long atomic64_##op##_return##suffix(long long i, atomic64##suffix##_t *v) \ @@ -1393,8 +1393,8 @@ index e22c119..eaa807d 100644 return result; \ } -+#define ATOMIC64_OP_RETURN(op, op1, op2) __ATOMIC64_OP_RETURN(op, , op1, op2, , ) \ -+ __ATOMIC64_OP_RETURN(op, _unchecked, op1, op2##s, __OVERFLOW_POST_RETURN, __OVERFLOW_EXTABLE) ++#define ATOMIC64_OP_RETURN(op, op1, op2) __ATOMIC64_OP_RETURN(op, _unchecked, op1, op2, , ) \ ++ __ATOMIC64_OP_RETURN(op, , op1, op2##s, __OVERFLOW_POST_RETURN, __OVERFLOW_EXTABLE) + #define ATOMIC64_OPS(op, op1, op2) \ ATOMIC64_OP(op, op1, op2) \ @@ -5747,7 +5747,7 @@ index 3778655..1dff0a9 100644 static dma_addr_t octeon_unity_phys_to_dma(struct device *dev, phys_addr_t paddr) diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h -index 857da84..3f4458b 100644 +index 857da84..0fee5e2 100644 --- a/arch/mips/include/asm/atomic.h +++ b/arch/mips/include/asm/atomic.h @@ -22,15 +22,39 @@ @@ -5880,8 +5880,8 @@ index 857da84..3f4458b 100644 -#define ATOMIC_OP_RETURN(op, c_op, asm_op) \ -static __inline__ int atomic_##op##_return(int i, atomic_t * v) \ -+#define ATOMIC_OP(op, asm_op) __ATOMIC_OP(op, , asm_op##u) \ -+ __ATOMIC_OP(op, _unchecked, asm_op) ++#define ATOMIC_OP(op, asm_op) __ATOMIC_OP(op, _unchecked, asm_op##u, ) \ ++ __ATOMIC_OP(op, , asm_op, __OVERFLOW_EXTABLE) + +#define __ATOMIC_OP_RETURN(op, suffix, asm_op, post_op, extable) \ +static inline int atomic_##op##_return##suffix(int i, atomic##suffix##_t * v) \ @@ -5963,8 +5963,8 @@ index 857da84..3f4458b 100644 -#define ATOMIC_OPS(op, c_op, asm_op) \ - ATOMIC_OP(op, c_op, asm_op) \ - ATOMIC_OP_RETURN(op, c_op, asm_op) -+#define ATOMIC_OP_RETURN(op, asm_op) __ATOMIC_OP_RETURN(op, , asm_op##u, , __OVERFLOW_EXTABLE) \ -+ __ATOMIC_OP_RETURN(op, _unchecked, asm_op, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++#define ATOMIC_OP_RETURN(op, asm_op) __ATOMIC_OP_RETURN(op, _unchecked, asm_op##u, , ) \ ++ __ATOMIC_OP_RETURN(op, , asm_op, __OVERFLOW_POST, __OVERFLOW_EXTABLE) -ATOMIC_OPS(add, +=, addu) -ATOMIC_OPS(sub, -=, subu) @@ -6155,8 +6155,8 @@ index 857da84..3f4458b 100644 -#define ATOMIC64_OP_RETURN(op, c_op, asm_op) \ -static __inline__ long atomic64_##op##_return(long i, atomic64_t * v) \ -+#define ATOMIC64_OP(op, asm_op) __ATOMIC64_OP(op, , asm_op##u) \ -+ __ATOMIC64_OP(op, _unchecked, asm_op) ++#define ATOMIC64_OP(op, asm_op) __ATOMIC64_OP(op, _unchecked, asm_op##u, ) \ ++ __ATOMIC64_OP(op, , asm_op, __OVERFLOW_EXTABLE) + +#define __ATOMIC64_OP_RETURN(op, suffix, asm_op, post_op, extable) \ +static inline long atomic64_##op##_return##suffix(long i, atomic64##suffix##_t * v)\ @@ -6240,8 +6240,8 @@ index 857da84..3f4458b 100644 -#define ATOMIC64_OPS(op, c_op, asm_op) \ - ATOMIC64_OP(op, c_op, asm_op) \ - ATOMIC64_OP_RETURN(op, c_op, asm_op) -+#define ATOMIC64_OP_RETURN(op, asm_op) __ATOMIC64_OP_RETURN(op, , asm_op##u, , __OVERFLOW_EXTABLE) \ -+ __ATOMIC64_OP_RETURN(op, _unchecked, asm_op, __OVERFLOW_POST, __OVERFLOW_EXTABLE) ++#define ATOMIC64_OP_RETURN(op, asm_op) __ATOMIC64_OP_RETURN(op, _unchecked, asm_op##u, , ) \ ++ __ATOMIC64_OP_RETURN(op, , asm_op, __OVERFLOW_POST, __OVERFLOW_EXTABLE) -ATOMIC64_OPS(add, +=, daddu) -ATOMIC64_OPS(sub, -=, dsubu) @@ -48232,6 +48232,19 @@ index 6b861e3..204ac86 100644 rc = efx_mcdi_rpc_start(efx, MC_CMD_PTP, synch_buf, MC_CMD_PTP_IN_SYNCHRONIZE_LEN); EFX_BUG_ON_PARANOID(rc); +diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c +index 10b6173..b605dfd5 100644 +--- a/drivers/net/ethernet/sfc/selftest.c ++++ b/drivers/net/ethernet/sfc/selftest.c +@@ -46,7 +46,7 @@ struct efx_loopback_payload { + struct iphdr ip; + struct udphdr udp; + __be16 iteration; +- const char msg[64]; ++ char msg[64]; + } __packed; + + /* Loopback test source MAC address */ diff --git a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c index 08c483b..2c4a553 100644 --- a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c @@ -60679,7 +60692,7 @@ index e4141f2..d8263e8 100644 i += packet_length_size; if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size)) diff --git a/fs/exec.c b/fs/exec.c -index ad8798e..5f872c9 100644 +index ad8798e..e3f50ec 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -56,8 +56,20 @@ @@ -60999,7 +61012,23 @@ index ad8798e..5f872c9 100644 tsk->mm->vmacache_seqnum = 0; vmacache_flush(tsk); task_unlock(tsk); -@@ -1252,7 +1331,7 @@ static void check_unsafe_exec(struct linux_binprm *bprm) +@@ -920,10 +999,14 @@ static int de_thread(struct task_struct *tsk) + if (!thread_group_leader(tsk)) { + struct task_struct *leader = tsk->group_leader; + +- sig->notify_count = -1; /* for exit_notify() */ + for (;;) { + threadgroup_change_begin(tsk); + write_lock_irq(&tasklist_lock); ++ /* ++ * Do this under tasklist_lock to ensure that ++ * exit_notify() can't miss ->group_exit_task ++ */ ++ sig->notify_count = -1; + if (likely(leader->exit_state)) + break; + __set_current_state(TASK_KILLABLE); +@@ -1252,13 +1335,60 @@ static void check_unsafe_exec(struct linux_binprm *bprm) } rcu_read_unlock(); @@ -61008,7 +61037,98 @@ index ad8798e..5f872c9 100644 bprm->unsafe |= LSM_UNSAFE_SHARE; else p->fs->in_exec = 1; -@@ -1433,6 +1512,31 @@ static int exec_binprm(struct linux_binprm *bprm) + spin_unlock(&p->fs->lock); + } + ++static void bprm_fill_uid(struct linux_binprm *bprm) ++{ ++ struct inode *inode; ++ unsigned int mode; ++ kuid_t uid; ++ kgid_t gid; ++ ++ /* clear any previous set[ug]id data from a previous binary */ ++ bprm->cred->euid = current_euid(); ++ bprm->cred->egid = current_egid(); ++ ++ if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) ++ return; ++ ++ if (task_no_new_privs(current)) ++ return; ++ ++ inode = file_inode(bprm->file); ++ mode = READ_ONCE(inode->i_mode); ++ if (!(mode & (S_ISUID|S_ISGID))) ++ return; ++ ++ /* Be careful if suid/sgid is set */ ++ mutex_lock(&inode->i_mutex); ++ ++ /* reload atomically mode/uid/gid now that lock held */ ++ mode = inode->i_mode; ++ uid = inode->i_uid; ++ gid = inode->i_gid; ++ mutex_unlock(&inode->i_mutex); ++ ++ /* We ignore suid/sgid if there are no mappings for them in the ns */ ++ if (!kuid_has_mapping(bprm->cred->user_ns, uid) || ++ !kgid_has_mapping(bprm->cred->user_ns, gid)) ++ return; ++ ++ if (mode & S_ISUID) { ++ bprm->per_clear |= PER_CLEAR_ON_SETID; ++ bprm->cred->euid = uid; ++ } ++ ++ if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { ++ bprm->per_clear |= PER_CLEAR_ON_SETID; ++ bprm->cred->egid = gid; ++ } ++} ++ + /* + * Fill the binprm structure from the inode. + * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes +@@ -1267,36 +1397,9 @@ static void check_unsafe_exec(struct linux_binprm *bprm) + */ + int prepare_binprm(struct linux_binprm *bprm) + { +- struct inode *inode = file_inode(bprm->file); +- umode_t mode = inode->i_mode; + int retval; + +- +- /* clear any previous set[ug]id data from a previous binary */ +- bprm->cred->euid = current_euid(); +- bprm->cred->egid = current_egid(); +- +- if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) && +- !task_no_new_privs(current) && +- kuid_has_mapping(bprm->cred->user_ns, inode->i_uid) && +- kgid_has_mapping(bprm->cred->user_ns, inode->i_gid)) { +- /* Set-uid? */ +- if (mode & S_ISUID) { +- bprm->per_clear |= PER_CLEAR_ON_SETID; +- bprm->cred->euid = inode->i_uid; +- } +- +- /* Set-gid? */ +- /* +- * If setgid is set but no group execute bit then this +- * is a candidate for mandatory locking, not a setgid +- * executable. +- */ +- if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { +- bprm->per_clear |= PER_CLEAR_ON_SETID; +- bprm->cred->egid = inode->i_gid; +- } +- } ++ bprm_fill_uid(bprm); + + /* fill in binprm security blob */ + retval = security_bprm_set_creds(bprm); +@@ -1433,6 +1536,31 @@ static int exec_binprm(struct linux_binprm *bprm) return ret; } @@ -61040,7 +61160,7 @@ index ad8798e..5f872c9 100644 /* * sys_execve() executes a new program. */ -@@ -1441,6 +1545,11 @@ static int do_execveat_common(int fd, struct filename *filename, +@@ -1441,6 +1569,11 @@ static int do_execveat_common(int fd, struct filename *filename, struct user_arg_ptr envp, int flags) { @@ -61052,7 +61172,7 @@ index ad8798e..5f872c9 100644 char *pathbuf = NULL; struct linux_binprm *bprm; struct file *file; -@@ -1450,6 +1559,8 @@ static int do_execveat_common(int fd, struct filename *filename, +@@ -1450,6 +1583,8 @@ static int do_execveat_common(int fd, struct filename *filename, if (IS_ERR(filename)) return PTR_ERR(filename); @@ -61061,7 +61181,7 @@ index ad8798e..5f872c9 100644 /* * We move the actual failure in case of RLIMIT_NPROC excess from * set*uid() to execve() because too many poorly written programs -@@ -1487,6 +1598,11 @@ static int do_execveat_common(int fd, struct filename *filename, +@@ -1487,6 +1622,11 @@ static int do_execveat_common(int fd, struct filename *filename, if (IS_ERR(file)) goto out_unmark; @@ -61073,7 +61193,7 @@ index ad8798e..5f872c9 100644 sched_exec(); bprm->file = file; -@@ -1513,6 +1629,11 @@ static int do_execveat_common(int fd, struct filename *filename, +@@ -1513,6 +1653,11 @@ static int do_execveat_common(int fd, struct filename *filename, } bprm->interp = bprm->filename; @@ -61085,7 +61205,7 @@ index ad8798e..5f872c9 100644 retval = bprm_mm_init(bprm); if (retval) goto out_unmark; -@@ -1529,24 +1650,70 @@ static int do_execveat_common(int fd, struct filename *filename, +@@ -1529,24 +1674,70 @@ static int do_execveat_common(int fd, struct filename *filename, if (retval < 0) goto out; @@ -61160,7 +61280,7 @@ index ad8798e..5f872c9 100644 current->fs->in_exec = 0; current->in_execve = 0; acct_update_integrals(current); -@@ -1558,6 +1725,14 @@ static int do_execveat_common(int fd, struct filename *filename, +@@ -1558,6 +1749,14 @@ static int do_execveat_common(int fd, struct filename *filename, put_files_struct(displaced); return retval; @@ -61175,7 +61295,7 @@ index ad8798e..5f872c9 100644 out: if (bprm->mm) { acct_arg_size(bprm, 0); -@@ -1704,3 +1879,312 @@ COMPAT_SYSCALL_DEFINE5(execveat, int, fd, +@@ -1704,3 +1903,312 @@ COMPAT_SYSCALL_DEFINE5(execveat, int, fd, argv, envp, flags); } #endif @@ -65002,6 +65122,19 @@ index 7d6b7d0..5fb529a 100644 }; enum ocfs2_local_alloc_state +diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c +index d81f6e2..e794c38 100644 +--- a/fs/ocfs2/refcounttree.c ++++ b/fs/ocfs2/refcounttree.c +@@ -4278,7 +4278,7 @@ static int ocfs2_reflink(struct dentry *old_dentry, struct inode *dir, + error = posix_acl_create(dir, &mode, &default_acl, &acl); + if (error) { + mlog_errno(error); +- goto out; ++ return error; + } + + error = ocfs2_create_inode_in_orphan(dir, mode, diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 0cb889a..6a26b24 100644 --- a/fs/ocfs2/suballoc.c @@ -80413,10 +80546,10 @@ index d1a5582..4424efa 100644 * Mark a position in code as unreachable. This can be used to * suppress control flow warnings after asm blocks that transfer diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h -index c8c5659..d09f2ad 100644 +index c8c5659..2401b2e 100644 --- a/include/linux/compiler-gcc5.h +++ b/include/linux/compiler-gcc5.h -@@ -28,6 +28,28 @@ +@@ -28,6 +28,26 @@ # define __compiletime_error(message) __attribute__((error(message))) #endif /* __CHECKER__ */ @@ -80426,7 +80559,6 @@ index c8c5659..d09f2ad 100644 +#define __bos1(ptr) __bos((ptr), 1) + +#ifdef CONSTIFY_PLUGIN -+#error not yet +#define __no_const __attribute__((no_const)) +#define __do_const __attribute__((do_const)) +#endif @@ -80438,7 +80570,6 @@ index c8c5659..d09f2ad 100644 +#endif + +#ifdef LATENT_ENTROPY_PLUGIN -+#error not yet +#define __latent_entropy __attribute__((latent_entropy)) +#endif + @@ -83621,6 +83752,19 @@ index 6d34aa2..d73d848 100644 static inline void mm_init_cpumask(struct mm_struct *mm) { +diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h +index cb2b040..f3c9f5c 100644 +--- a/include/linux/mmc/core.h ++++ b/include/linux/mmc/core.h +@@ -79,7 +79,7 @@ struct mmc_command { + #define mmc_cmd_type(cmd) ((cmd)->flags & MMC_CMD_MASK) + + unsigned int retries; /* max number of retries */ +- unsigned int error; /* command error */ ++ int error; /* command error */ + + /* + * Standard errno values are used for errors, but some have specific diff --git a/include/linux/mmiotrace.h b/include/linux/mmiotrace.h index c5d5278..f0b68c8 100644 --- a/include/linux/mmiotrace.h @@ -88279,6 +88423,20 @@ index 536edc2..d28c85d 100644 if (!access_ok(VERIFY_READ, uattr, 1)) return -EFAULT; +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index a28e09c..36508e6 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -1380,7 +1380,8 @@ peek_stack: + /* tell verifier to check for equivalent states + * after every call and jump + */ +- env->explored_states[t + 1] = STATE_LIST_MARK; ++ if (t + 1 < insn_cnt) ++ env->explored_states[t + 1] = STATE_LIST_MARK; + } else { + /* conditional jump with two edges */ + ret = push_insn(t, t + 1, FALLTHROUGH, env); diff --git a/kernel/capability.c b/kernel/capability.c index 989f5bf..d317ca0 100644 --- a/kernel/capability.c @@ -101995,7 +102153,7 @@ index 3b6899b..cf36238 100644 { struct socket *sock; diff --git a/net/core/skbuff.c b/net/core/skbuff.c -index 62c67be..01893a0a 100644 +index 62c67be..361c354 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2123,7 +2123,7 @@ EXPORT_SYMBOL(__skb_checksum); @@ -102024,6 +102182,31 @@ index 62c67be..01893a0a 100644 NULL); } +@@ -4141,18 +4143,20 @@ EXPORT_SYMBOL(skb_try_coalesce); + */ + void skb_scrub_packet(struct sk_buff *skb, bool xnet) + { +- if (xnet) +- skb_orphan(skb); + skb->tstamp.tv64 = 0; + skb->pkt_type = PACKET_HOST; + skb->skb_iif = 0; + skb->ignore_df = 0; + skb_dst_drop(skb); +- skb->mark = 0; +- skb_init_secmark(skb); + secpath_reset(skb); + nf_reset(skb); + nf_reset_trace(skb); ++ ++ if (!xnet) ++ return; ++ ++ skb_orphan(skb); ++ skb->mark = 0; + } + EXPORT_SYMBOL_GPL(skb_scrub_packet); + diff --git a/net/core/sock.c b/net/core/sock.c index 1c7a33d..a3817e2 100644 --- a/net/core/sock.c @@ -103269,8 +103452,24 @@ index e0ee384..e2688d9 100644 if (net->ipv4.ipv4_hdr == NULL) goto err_reg; +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 3075723..aa6f6e5 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -520,8 +520,10 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) + + /* Race breaker. If space is freed after + * wspace test but before the flags are set, +- * IO signal will be lost. ++ * IO signal will be lost. Memory barrier ++ * pairs with the input side. + */ ++ smp_mb__after_atomic(); + if (sk_stream_is_writeable(sk)) + mask |= POLLOUT | POLLWRNORM; + } diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c -index 075ab4d..623bb9d 100644 +index 075ab4d..8d0580a 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -766,7 +766,7 @@ static void tcp_update_pacing_rate(struct sock *sk) @@ -103291,7 +103490,16 @@ index 075ab4d..623bb9d 100644 struct sk_buff *head, struct sk_buff *tail, u32 start, u32 end) { -@@ -5506,6 +5506,7 @@ discard: +@@ -4786,6 +4786,8 @@ static void tcp_check_space(struct sock *sk) + { + if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) { + sock_reset_flag(sk, SOCK_QUEUE_SHRUNK); ++ /* pairs with tcp_poll() */ ++ smp_mb__after_atomic(); + if (sk->sk_socket && + test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) + tcp_new_space(sk); +@@ -5506,6 +5508,7 @@ discard: tcp_paws_reject(&tp->rx_opt, 0)) goto discard_and_undo; @@ -103299,7 +103507,7 @@ index 075ab4d..623bb9d 100644 if (th->syn) { /* We see SYN without ACK. It is attempt of * simultaneous connect with crossed SYNs. -@@ -5556,6 +5557,7 @@ discard: +@@ -5556,6 +5559,7 @@ discard: goto discard; #endif } @@ -103307,7 +103515,7 @@ index 075ab4d..623bb9d 100644 /* "fifth, if neither of the SYN or RST bits is set then * drop the segment and return." */ -@@ -5602,7 +5604,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, +@@ -5602,7 +5606,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, goto discard; if (th->syn) { @@ -105245,6 +105453,26 @@ index 11d85b3..7fcc420 100644 goto nla_put_failure; if (data_len) { +diff --git a/net/netfilter/nft_compat.c b/net/netfilter/nft_compat.c +index b636486..9898807 100644 +--- a/net/netfilter/nft_compat.c ++++ b/net/netfilter/nft_compat.c +@@ -274,14 +274,7 @@ static void nft_match_eval(const struct nft_expr *expr, + return; + } + +- switch(ret) { +- case true: +- data[NFT_REG_VERDICT].verdict = NFT_CONTINUE; +- break; +- case false: +- data[NFT_REG_VERDICT].verdict = NFT_BREAK; +- break; +- } ++ data[NFT_REG_VERDICT].verdict = ret ? NFT_CONTINUE : NFT_BREAK; + } + + static const struct nla_policy nft_match_policy[NFTA_MATCH_MAX + 1] = { diff --git a/net/netfilter/xt_gradm.c b/net/netfilter/xt_gradm.c new file mode 100644 index 0000000..c566332 @@ -110585,12 +110813,12 @@ index 0000000..5452feea +} diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c new file mode 100644 -index 0000000..d44bd9f +index 0000000..0c96d8a --- /dev/null +++ b/tools/gcc/colorize_plugin.c @@ -0,0 +1,215 @@ +/* -+ * Copyright 2012-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2012-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -110683,6 +110911,7 @@ index 0000000..d44bd9f +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data colorize_rearm_pass_data = { +#else +struct simple_ipa_opt_pass colorize_rearm_pass = { @@ -110716,7 +110945,6 @@ index 0000000..d44bd9f +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class colorize_rearm_pass : public simple_ipa_opt_pass { +public: + colorize_rearm_pass() : simple_ipa_opt_pass(colorize_rearm_pass_data, g) {} @@ -110806,13 +111034,13 @@ index 0000000..d44bd9f +} diff --git a/tools/gcc/constify_plugin.c b/tools/gcc/constify_plugin.c new file mode 100644 -index 0000000..3b5af59 +index 0000000..93b181d --- /dev/null +++ b/tools/gcc/constify_plugin.c -@@ -0,0 +1,558 @@ +@@ -0,0 +1,563 @@ +/* + * Copyright 2011 by Emese Revfy <re.emese@gmail.com> -+ * Copyright 2011-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2, or (at your option) v3 + * + * This gcc plugin constifies all structures which contain only function pointers or are explicitly marked for constification. @@ -110827,7 +111055,7 @@ index 0000000..3b5af59 + +#include "gcc-common.h" + -+// unused C type flag in all versions 4.5-4.9 ++// unused C type flag in all versions 4.5-5.0 +#define TYPE_CONSTIFY_VISITED(TYPE) TYPE_LANG_FLAG_4(TYPE) + +int plugin_is_GPL_compatible; @@ -111133,6 +111361,11 @@ index 0000000..3b5af59 + if (type == NULL_TREE || type == error_mark_node) + return; + ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ + if (TYPE_FIELDS(type) == NULL_TREE || TYPE_CONSTIFY_VISITED(type)) + return; + @@ -111233,6 +111466,7 @@ index 0000000..3b5af59 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data check_local_variables_pass_data = { +#else +static struct gimple_opt_pass check_local_variables_pass = { @@ -111266,7 +111500,6 @@ index 0000000..3b5af59 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class check_local_variables_pass : public gimple_opt_pass { +public: + check_local_variables_pass() : gimple_opt_pass(check_local_variables_pass_data, g) {} @@ -111370,10 +111603,10 @@ index 0000000..3b5af59 +} diff --git a/tools/gcc/gcc-common.h b/tools/gcc/gcc-common.h new file mode 100644 -index 0000000..14ec226 +index 0000000..19fedf2 --- /dev/null +++ b/tools/gcc/gcc-common.h -@@ -0,0 +1,520 @@ +@@ -0,0 +1,540 @@ +#ifndef GCC_COMMON_H_INCLUDED +#define GCC_COMMON_H_INCLUDED + @@ -111475,11 +111708,13 @@ index 0000000..14ec226 +//#include "diagnostic-color.h" +#include "context.h" +#include "tree-ssa-alias.h" ++#include "tree-ssa.h" +#include "stringpool.h" +#include "tree-ssanames.h" +#include "print-tree.h" +#include "tree-eh.h" +#include "stmt.h" ++#include "gimplify.h" +#endif + +#include "gimple.h" @@ -111502,6 +111737,7 @@ index 0000000..14ec226 +//#include "lto-compress.h" +#if BUILDING_GCC_VERSION >= 5000 +//#include "lto-section-names.h" ++#include "builtins.h" +#endif + +//#include "expr.h" where are you... @@ -111729,6 +111965,7 @@ index 0000000..14ec226 +typedef union gimple_statement_d gasm; +typedef union gimple_statement_d gassign; +typedef union gimple_statement_d gcall; ++typedef union gimple_statement_d gdebug; +typedef union gimple_statement_d gphi; +typedef union gimple_statement_d greturn; +#endif @@ -111755,6 +111992,7 @@ index 0000000..14ec226 +typedef struct gimple_statement_base gasm; +typedef struct gimple_statement_base gassign; +typedef struct gimple_statement_base gcall; ++typedef struct gimple_statement_base gdebug; +typedef struct gimple_statement_base gphi; +typedef struct gimple_statement_base greturn; +#endif @@ -111771,6 +112009,11 @@ index 0000000..14ec226 +{ + return stmt; +} ++ ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return stmt; ++} +#endif + +#if BUILDING_GCC_VERSION >= 4009 @@ -111791,16 +112034,16 @@ index 0000000..14ec226 + +#define INSN_DELETED_P(insn) (insn)->deleted() + -+extern bool is_simple_builtin(tree); -+ +// symtab/cgraph related +#define debug_cgraph_node(node) (node)->debug() +#define cgraph_get_node(decl) cgraph_node::get(decl) +#define cgraph_n_nodes symtab->cgraph_count +#define cgraph_max_uid symtab->cgraph_max_uid ++#define varpool_get_node(decl) varpool_node::get(decl) + +typedef struct cgraph_node *cgraph_node_ptr; +typedef struct cgraph_edge *cgraph_edge_p; ++typedef struct varpool_node *varpool_node_ptr; + +static inline void change_decl_assembler_name(tree decl, tree name) +{ @@ -111878,11 +112121,21 @@ index 0000000..14ec226 + return as_a<gasm *>(stmt); +} + ++static inline const gasm *as_a_gasm(const_gimple stmt) ++{ ++ return as_a<const gasm *>(stmt); ++} ++ +static inline gcall *as_a_gcall(gimple stmt) +{ + return as_a<gcall *>(stmt); +} + ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return as_a<greturn *>(stmt); ++} ++ +// IPA/LTO related +#define ipa_ref_list_referring_iterate(L,I,P) (L)->referring.iterate((I), &(P)) +#define ipa_ref_list_reference_iterate(L,I,P) (L)->reference.iterate((I), &(P)) @@ -111910,12 +112163,12 @@ index 0000000..7514850 +fi diff --git a/tools/gcc/kallocstat_plugin.c b/tools/gcc/kallocstat_plugin.c new file mode 100644 -index 0000000..d81c094 +index 0000000..457d54e --- /dev/null +++ b/tools/gcc/kallocstat_plugin.c -@@ -0,0 +1,183 @@ +@@ -0,0 +1,188 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -112026,6 +112279,7 @@ index 0000000..d81c094 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data kallocstat_pass_data = { +#else +static struct gimple_opt_pass kallocstat_pass = { @@ -112036,7 +112290,8 @@ index 0000000..d81c094 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = false, + .has_execute = true, +#else @@ -112058,11 +112313,14 @@ index 0000000..d81c094 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class kallocstat_pass : public gimple_opt_pass { +public: + kallocstat_pass() : gimple_opt_pass(kallocstat_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return execute_kallocstat(); } ++#else + unsigned int execute() { return execute_kallocstat(); } ++#endif +}; +} + @@ -112099,12 +112357,12 @@ index 0000000..d81c094 +} diff --git a/tools/gcc/kernexec_plugin.c b/tools/gcc/kernexec_plugin.c new file mode 100644 -index 0000000..89f256d +index 0000000..71716e7 --- /dev/null +++ b/tools/gcc/kernexec_plugin.c -@@ -0,0 +1,522 @@ +@@ -0,0 +1,547 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -112137,7 +112395,7 @@ index 0000000..89f256d + */ +static void kernexec_reload_fptr_mask(gimple_stmt_iterator *gsi) +{ -+ gimple asm_movabs_stmt; ++ gasm *asm_movabs_stmt; + + // build asm volatile("movabs $0x8000000000000000, %%r12\n\t" : : : ); + asm_movabs_stmt = gimple_build_asm_vec("movabs $0x8000000000000000, %%r12\n\t", NULL, NULL, NULL, NULL); @@ -112159,14 +112417,17 @@ index 0000000..89f256d + + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + // gimple match: __asm__ ("" : : : "r12"); -+ gimple asm_stmt; ++ gimple stmt; ++ gasm *asm_stmt; + size_t nclobbers; + + // is it an asm ... -+ asm_stmt = gsi_stmt(gsi); -+ if (gimple_code(asm_stmt) != GIMPLE_ASM) ++ stmt = gsi_stmt(gsi); ++ if (gimple_code(stmt) != GIMPLE_ASM) + continue; + ++ asm_stmt = as_a_gasm(stmt); ++ + // ... clobbering r12 + nclobbers = gimple_asm_nclobbers(asm_stmt); + while (nclobbers--) { @@ -112189,10 +112450,11 @@ index 0000000..89f256d + */ +static void kernexec_instrument_fptr_bts(gimple_stmt_iterator *gsi) +{ -+ gimple assign_intptr, assign_new_fptr, call_stmt; ++ gimple assign_intptr, assign_new_fptr; ++ gcall *call_stmt; + tree intptr, orptr, old_fptr, new_fptr, kernexec_mask; + -+ call_stmt = gsi_stmt(*gsi); ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); + old_fptr = gimple_call_fn(call_stmt); + + // create temporary unsigned long variable used for bitops and cast fptr to it @@ -112230,7 +112492,8 @@ index 0000000..89f256d + +static void kernexec_instrument_fptr_or(gimple_stmt_iterator *gsi) +{ -+ gimple asm_or_stmt, call_stmt; ++ gasm *asm_or_stmt; ++ gcall *call_stmt; + tree old_fptr, new_fptr, input, output; +#if BUILDING_GCC_VERSION <= 4007 + VEC(tree, gc) *inputs = NULL; @@ -112240,7 +112503,7 @@ index 0000000..89f256d + vec<tree, va_gc> *outputs = NULL; +#endif + -+ call_stmt = gsi_stmt(*gsi); ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); + old_fptr = gimple_call_fn(call_stmt); + + // create temporary fptr variable @@ -112285,12 +112548,14 @@ index 0000000..89f256d + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + // gimple match: h_1 = get_fptr (); D.2709_3 = h_1 (x_2(D)); + tree fn; -+ gimple call_stmt; ++ gimple stmt; ++ gcall *call_stmt; + + // is it a call ... -+ call_stmt = gsi_stmt(gsi); -+ if (!is_gimple_call(call_stmt)) ++ stmt = gsi_stmt(gsi); ++ if (!is_gimple_call(stmt)) + continue; ++ call_stmt = as_a_gcall(stmt); + fn = gimple_call_fn(call_stmt); + if (TREE_CODE(fn) == ADDR_EXPR) + continue; @@ -112363,7 +112628,7 @@ index 0000000..89f256d + */ +static unsigned int execute_kernexec_retaddr(void) +{ -+ rtx insn; ++ rtx_insn *insn; + +// if (stack_realign_drap) +// inform(DECL_SOURCE_LOCATION(current_function_decl), "drap detected in %s\n", IDENTIFIER_POINTER(DECL_NAME(current_function_decl))); @@ -112411,6 +112676,7 @@ index 0000000..89f256d +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data kernexec_reload_pass_data = { +#else +static struct gimple_opt_pass kernexec_reload_pass = { @@ -112421,7 +112687,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -112453,7 +112720,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -112485,7 +112753,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -112507,26 +112776,40 @@ index 0000000..89f256d +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class kernexec_reload_pass : public gimple_opt_pass { +public: + kernexec_reload_pass() : gimple_opt_pass(kernexec_reload_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_reload(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_reload(); } ++#endif +}; + +class kernexec_fptr_pass : public gimple_opt_pass { +public: + kernexec_fptr_pass() : gimple_opt_pass(kernexec_fptr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_fptr(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_fptr(); } ++#endif +}; + +class kernexec_retaddr_pass : public rtl_opt_pass { +public: + kernexec_retaddr_pass() : rtl_opt_pass(kernexec_retaddr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_retaddr(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_retaddr(); } ++#endif +}; +} + @@ -112627,12 +112910,12 @@ index 0000000..89f256d +} diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c new file mode 100644 -index 0000000..2a39357 +index 0000000..d383708 --- /dev/null +++ b/tools/gcc/latent_entropy_plugin.c -@@ -0,0 +1,467 @@ +@@ -0,0 +1,473 @@ +/* -+ * Copyright 2012-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2012-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -113012,6 +113295,7 @@ index 0000000..2a39357 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data latent_entropy_pass_data = { +#else +static struct gimple_opt_pass latent_entropy_pass = { @@ -113022,7 +113306,8 @@ index 0000000..2a39357 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -113044,12 +113329,16 @@ index 0000000..2a39357 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class latent_entropy_pass : public gimple_opt_pass { +public: + latent_entropy_pass() : gimple_opt_pass(latent_entropy_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_latent_entropy(); } ++ virtual unsigned int execute(function *) { return execute_latent_entropy(); } ++#else + bool gate() { return gate_latent_entropy(); } + unsigned int execute() { return execute_latent_entropy(); } ++#endif +}; +} + @@ -113100,12 +113389,12 @@ index 0000000..2a39357 +} diff --git a/tools/gcc/randomize_layout_plugin.c b/tools/gcc/randomize_layout_plugin.c new file mode 100644 -index 0000000..a5cb46b +index 0000000..e1983c0 --- /dev/null +++ b/tools/gcc/randomize_layout_plugin.c -@@ -0,0 +1,915 @@ +@@ -0,0 +1,917 @@ +/* -+ * Copyright 2014 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> ++ * Copyright 2014,2015 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> + * and PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * @@ -113120,7 +113409,8 @@ index 0000000..a5cb46b +#include "gcc-common.h" +#include "randomize_layout_seed.h" + -+#if BUILDING_GCC_MAJOR < 4 || BUILDING_GCC_MINOR < 6 || (BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) ++#if BUILDING_GCC_MAJOR < 4 || (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR < 6) || \ ++ (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) +#error "The RANDSTRUCT plugin requires GCC 4.6.4 or newer." +#endif + @@ -113920,7 +114210,8 @@ index 0000000..a5cb46b +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 + .has_gate = false, + .has_execute = true, +#else @@ -113980,8 +114271,8 @@ index 0000000..a5cb46b + return 1; + } + -+ if (strcmp(lang_hooks.name, "GNU C")) { -+ inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); ++ if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { ++ inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); + enable = false; + } + @@ -147228,12 +147519,12 @@ index 0000000..fd4aa92 +} diff --git a/tools/gcc/stackleak_plugin.c b/tools/gcc/stackleak_plugin.c new file mode 100644 -index 0000000..90125d6 +index 0000000..51dc09d --- /dev/null +++ b/tools/gcc/stackleak_plugin.c -@@ -0,0 +1,396 @@ +@@ -0,0 +1,408 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -147360,7 +147651,7 @@ index 0000000..90125d6 + +static unsigned int execute_stackleak_final(void) +{ -+ rtx insn, next; ++ rtx_insn *insn, *next; + + if (cfun->calls_alloca) + return 0; @@ -147454,6 +147745,7 @@ index 0000000..90125d6 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data stackleak_tree_instrument_pass_data = { +#else +static struct gimple_opt_pass stackleak_tree_instrument_pass = { @@ -147464,7 +147756,8 @@ index 0000000..90125d6 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -147496,7 +147789,8 @@ index 0000000..90125d6 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -147518,19 +147812,28 @@ index 0000000..90125d6 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class stackleak_tree_instrument_pass : public gimple_opt_pass { +public: + stackleak_tree_instrument_pass() : gimple_opt_pass(stackleak_tree_instrument_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_tree_instrument(); } ++#else + bool gate() { return gate_stackleak_track_stack(); } + unsigned int execute() { return execute_stackleak_tree_instrument(); } ++#endif +}; + +class stackleak_final_rtl_opt_pass : public rtl_opt_pass { +public: + stackleak_final_rtl_opt_pass() : rtl_opt_pass(stackleak_final_rtl_opt_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_final(); } ++#else + bool gate() { return gate_stackleak_track_stack(); } + unsigned int execute() { return execute_stackleak_final(); } ++#endif +}; +} + @@ -147630,12 +147933,12 @@ index 0000000..90125d6 +} diff --git a/tools/gcc/structleak_plugin.c b/tools/gcc/structleak_plugin.c new file mode 100644 -index 0000000..4ee2231 +index 0000000..4436cbe --- /dev/null +++ b/tools/gcc/structleak_plugin.c -@@ -0,0 +1,274 @@ +@@ -0,0 +1,287 @@ +/* -+ * Copyright 2013-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2013-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -147662,8 +147965,8 @@ index 0000000..4ee2231 + +#include "gcc-common.h" + -+// unused C type flag in all versions 4.5-4.9 -+#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_3(TYPE) ++// unused C type flag in all versions 4.5-5.0 ++#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_5(TYPE) + +int plugin_is_GPL_compatible; + @@ -147730,6 +148033,14 @@ index 0000000..4ee2231 +{ + tree type = (tree)event_data; + ++ if (type == NULL_TREE || type == error_mark_node) ++ return; ++ ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ + if (TYPE_USERSPACE(type)) + return; + @@ -147816,6 +148127,7 @@ index 0000000..4ee2231 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data structleak_pass_data = { +#else +static struct gimple_opt_pass structleak_pass = { @@ -147826,7 +148138,8 @@ index 0000000..4ee2231 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = false, + .has_execute = true, +#else @@ -147848,11 +148161,14 @@ index 0000000..4ee2231 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class structleak_pass : public gimple_opt_pass { +public: + structleak_pass() : gimple_opt_pass(structleak_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return handle_function(); } ++#else + unsigned int execute() { return handle_function(); } ++#endif +}; +} + @@ -147886,7 +148202,7 @@ index 0000000..4ee2231 + return 1; + } + -+ if (strcmp(lang_hooks.name, "GNU C")) { ++ if (strncmp(lang_hooks.name, "GNU C", 5) || !strncmp(lang_hooks.name, "GNU C+", 6)) { + inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); + enable = false; + } diff --git a/3.2.68/0000_README b/3.2.68/0000_README index 1221adb..15188a5 100644 --- a/3.2.68/0000_README +++ b/3.2.68/0000_README @@ -190,7 +190,7 @@ Patch: 1067_linux-3.2.68.patch From: http://www.kernel.org Desc: Linux 3.2.68 -Patch: 4420_grsecurity-3.1-3.2.68-201504142258.patch +Patch: 4420_grsecurity-3.1-3.2.68-201504270825.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.2.68/4420_grsecurity-3.1-3.2.68-201504142258.patch b/3.2.68/4420_grsecurity-3.1-3.2.68-201504270825.patch index 6147d13..5f8c996 100644 --- a/3.2.68/4420_grsecurity-3.1-3.2.68-201504142258.patch +++ b/3.2.68/4420_grsecurity-3.1-3.2.68-201504270825.patch @@ -45874,6 +45874,19 @@ index a3bd0ba..8a34a90 100644 int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv); int (*get_settings)(struct net_device *, struct ethtool_cmd *); +diff --git a/drivers/net/ethernet/sfc/selftest.c b/drivers/net/ethernet/sfc/selftest.c +index 4907885..af3d197 100644 +--- a/drivers/net/ethernet/sfc/selftest.c ++++ b/drivers/net/ethernet/sfc/selftest.c +@@ -37,7 +37,7 @@ struct efx_loopback_payload { + struct iphdr ip; + struct udphdr udp; + __be16 iteration; +- const char msg[64]; ++ char msg[64]; + } __packed; + + /* Loopback test source MAC address */ diff --git a/drivers/net/ethernet/sis/sis190.c b/drivers/net/ethernet/sis/sis190.c index 1b4658c..a30dabb 100644 --- a/drivers/net/ethernet/sis/sis190.c @@ -58869,7 +58882,7 @@ index 451b9b8..12e5a03 100644 out_free_fd: diff --git a/fs/exec.c b/fs/exec.c -index 78199eb..abce65a 100644 +index 78199eb..ffeac65 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -55,12 +55,35 @@ @@ -59203,7 +59216,22 @@ index 78199eb..abce65a 100644 task_unlock(tsk); arch_pick_mmap_layout(mm); if (old_mm) { -@@ -1070,6 +1149,21 @@ void set_task_comm(struct task_struct *tsk, char *buf) +@@ -903,9 +982,13 @@ static int de_thread(struct task_struct *tsk) + if (!thread_group_leader(tsk)) { + struct task_struct *leader = tsk->group_leader; + +- sig->notify_count = -1; /* for exit_notify() */ + for (;;) { + write_lock_irq(&tasklist_lock); ++ /* ++ * Do this under tasklist_lock to ensure that ++ * exit_notify() can't miss ->group_exit_task ++ */ ++ sig->notify_count = -1; + if (likely(leader->exit_state)) + break; + __set_current_state(TASK_UNINTERRUPTIBLE); +@@ -1070,6 +1153,21 @@ void set_task_comm(struct task_struct *tsk, char *buf) perf_event_comm(tsk); } @@ -59225,7 +59253,7 @@ index 78199eb..abce65a 100644 int flush_old_exec(struct linux_binprm * bprm) { int retval; -@@ -1084,6 +1178,7 @@ int flush_old_exec(struct linux_binprm * bprm) +@@ -1084,6 +1182,7 @@ int flush_old_exec(struct linux_binprm * bprm) set_mm_exe_file(bprm->mm, bprm->file); @@ -59233,7 +59261,7 @@ index 78199eb..abce65a 100644 /* * Release all of the old mmap stuff */ -@@ -1116,10 +1211,6 @@ EXPORT_SYMBOL(would_dump); +@@ -1116,10 +1215,6 @@ EXPORT_SYMBOL(would_dump); void setup_new_exec(struct linux_binprm * bprm) { @@ -59244,7 +59272,7 @@ index 78199eb..abce65a 100644 arch_pick_mmap_layout(current->mm); /* This is the point of no return */ -@@ -1130,18 +1221,7 @@ void setup_new_exec(struct linux_binprm * bprm) +@@ -1130,18 +1225,7 @@ void setup_new_exec(struct linux_binprm * bprm) else set_dumpable(current->mm, suid_dumpable); @@ -59264,7 +59292,7 @@ index 78199eb..abce65a 100644 /* Set the new mm task size. We have to do that late because it may * depend on TIF_32BIT which is only updated in flush_thread() on -@@ -1229,7 +1309,7 @@ void install_exec_creds(struct linux_binprm *bprm) +@@ -1229,7 +1313,7 @@ void install_exec_creds(struct linux_binprm *bprm) * wait until new credentials are committed * by commit_creds() above */ @@ -59273,7 +59301,7 @@ index 78199eb..abce65a 100644 perf_event_exit_task(current); /* * cred_guard_mutex must be held at least to this point to prevent -@@ -1259,6 +1339,13 @@ int check_unsafe_exec(struct linux_binprm *bprm) +@@ -1259,6 +1343,13 @@ int check_unsafe_exec(struct linux_binprm *bprm) bprm->unsafe |= LSM_UNSAFE_PTRACE; } @@ -59287,7 +59315,7 @@ index 78199eb..abce65a 100644 n_fs = 1; spin_lock(&p->fs->lock); rcu_read_lock(); -@@ -1268,7 +1355,7 @@ int check_unsafe_exec(struct linux_binprm *bprm) +@@ -1268,7 +1359,7 @@ int check_unsafe_exec(struct linux_binprm *bprm) } rcu_read_unlock(); @@ -59296,17 +59324,99 @@ index 78199eb..abce65a 100644 bprm->unsafe |= LSM_UNSAFE_SHARE; } else { res = -EAGAIN; -@@ -1302,7 +1389,8 @@ int prepare_binprm(struct linux_binprm *bprm) +@@ -1282,45 +1373,60 @@ int check_unsafe_exec(struct linux_binprm *bprm) + return res; + } + +-/* +- * Fill the binprm structure from the inode. +- * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes +- * +- * This may be called multiple times for binary chains (scripts for example). +- */ +-int prepare_binprm(struct linux_binprm *bprm) ++static void bprm_fill_uid(struct linux_binprm *bprm) + { +- umode_t mode; +- struct inode * inode = bprm->file->f_path.dentry->d_inode; +- int retval; +- +- mode = inode->i_mode; +- if (bprm->file->f_op == NULL) +- return -EACCES; ++ struct inode *inode; ++ unsigned int mode; ++ uid_t uid; ++ gid_t gid; + + /* clear any previous set[ug]id data from a previous binary */ bprm->cred->euid = current_euid(); bprm->cred->egid = current_egid(); - if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)) { -+ if (!(bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) && -+ !current->no_new_privs) { - /* Set-uid? */ - if (mode & S_ISUID) { - bprm->per_clear |= PER_CLEAR_ON_SETID; -@@ -1463,6 +1551,31 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) +- /* Set-uid? */ +- if (mode & S_ISUID) { +- bprm->per_clear |= PER_CLEAR_ON_SETID; +- bprm->cred->euid = inode->i_uid; +- } +- +- /* Set-gid? */ +- /* +- * If setgid is set but no group execute bit then this +- * is a candidate for mandatory locking, not a setgid +- * executable. +- */ +- if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { +- bprm->per_clear |= PER_CLEAR_ON_SETID; +- bprm->cred->egid = inode->i_gid; +- } ++ if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID) ++ return; ++ ++ if (current->no_new_privs) ++ return; ++ ++ inode = bprm->file->f_path.dentry->d_inode; ++ mode = ACCESS_ONCE(inode->i_mode); ++ if (!(mode & (S_ISUID|S_ISGID))) ++ return; ++ ++ /* Be careful if suid/sgid is set */ ++ mutex_lock(&inode->i_mutex); ++ ++ /* reload atomically mode/uid/gid now that lock held */ ++ mode = inode->i_mode; ++ uid = inode->i_uid; ++ gid = inode->i_gid; ++ mutex_unlock(&inode->i_mutex); ++ ++ if (mode & S_ISUID) { ++ bprm->per_clear |= PER_CLEAR_ON_SETID; ++ bprm->cred->euid = uid; + } + ++ if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) { ++ bprm->per_clear |= PER_CLEAR_ON_SETID; ++ bprm->cred->egid = gid; ++ } ++} ++ ++/* ++ * Fill the binprm structure from the inode. ++ * Check permissions, then read the first 128 (BINPRM_BUF_SIZE) bytes ++ * ++ * This may be called multiple times for binary chains (scripts for example). ++ */ ++int prepare_binprm(struct linux_binprm *bprm) ++{ ++ int retval; ++ ++ bprm_fill_uid(bprm); ++ + /* fill in binprm security blob */ + retval = security_bprm_set_creds(bprm); + if (retval) +@@ -1463,6 +1569,31 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) EXPORT_SYMBOL(search_binary_handler); @@ -59338,7 +59448,7 @@ index 78199eb..abce65a 100644 /* * sys_execve() executes a new program. */ -@@ -1471,6 +1584,11 @@ static int do_execve_common(const char *filename, +@@ -1471,6 +1602,11 @@ static int do_execve_common(const char *filename, struct user_arg_ptr envp, struct pt_regs *regs) { @@ -59350,7 +59460,7 @@ index 78199eb..abce65a 100644 struct linux_binprm *bprm; struct file *file; struct files_struct *displaced; -@@ -1478,6 +1596,8 @@ static int do_execve_common(const char *filename, +@@ -1478,6 +1614,8 @@ static int do_execve_common(const char *filename, int retval; const struct cred *cred = current_cred(); @@ -59359,7 +59469,7 @@ index 78199eb..abce65a 100644 /* * We move the actual failure in case of RLIMIT_NPROC excess from * set*uid() to execve() because too many poorly written programs -@@ -1518,12 +1638,22 @@ static int do_execve_common(const char *filename, +@@ -1518,12 +1656,22 @@ static int do_execve_common(const char *filename, if (IS_ERR(file)) goto out_unmark; @@ -59382,7 +59492,7 @@ index 78199eb..abce65a 100644 retval = bprm_mm_init(bprm); if (retval) goto out_file; -@@ -1540,24 +1670,70 @@ static int do_execve_common(const char *filename, +@@ -1540,24 +1688,70 @@ static int do_execve_common(const char *filename, if (retval < 0) goto out; @@ -59457,7 +59567,7 @@ index 78199eb..abce65a 100644 current->fs->in_exec = 0; current->in_execve = 0; acct_update_integrals(current); -@@ -1566,6 +1742,14 @@ static int do_execve_common(const char *filename, +@@ -1566,6 +1760,14 @@ static int do_execve_common(const char *filename, put_files_struct(displaced); return retval; @@ -59472,7 +59582,7 @@ index 78199eb..abce65a 100644 out: if (bprm->mm) { acct_arg_size(bprm, 0); -@@ -1639,7 +1823,7 @@ static int expand_corename(struct core_name *cn) +@@ -1639,7 +1841,7 @@ static int expand_corename(struct core_name *cn) { char *old_corename = cn->corename; @@ -59481,7 +59591,7 @@ index 78199eb..abce65a 100644 cn->corename = krealloc(old_corename, cn->size, GFP_KERNEL); if (!cn->corename) { -@@ -1736,7 +1920,7 @@ static int format_corename(struct core_name *cn, long signr) +@@ -1736,7 +1938,7 @@ static int format_corename(struct core_name *cn, long signr) int pid_in_pattern = 0; int err = 0; @@ -59490,7 +59600,7 @@ index 78199eb..abce65a 100644 cn->corename = kmalloc(cn->size, GFP_KERNEL); cn->used = 0; -@@ -1833,6 +2017,309 @@ out: +@@ -1833,6 +2035,309 @@ out: return ispipe; } @@ -59800,7 +59910,7 @@ index 78199eb..abce65a 100644 static int zap_process(struct task_struct *start, int exit_code) { struct task_struct *t; -@@ -2006,17 +2493,17 @@ static void coredump_finish(struct mm_struct *mm) +@@ -2006,17 +2511,17 @@ static void coredump_finish(struct mm_struct *mm) void set_dumpable(struct mm_struct *mm, int value) { switch (value) { @@ -59821,7 +59931,7 @@ index 78199eb..abce65a 100644 set_bit(MMF_DUMP_SECURELY, &mm->flags); smp_wmb(); set_bit(MMF_DUMPABLE, &mm->flags); -@@ -2029,7 +2516,7 @@ static int __get_dumpable(unsigned long mm_flags) +@@ -2029,7 +2534,7 @@ static int __get_dumpable(unsigned long mm_flags) int ret; ret = mm_flags & MMF_DUMPABLE_MASK; @@ -59830,7 +59940,7 @@ index 78199eb..abce65a 100644 } /* -@@ -2050,17 +2537,17 @@ static void wait_for_dump_helpers(struct file *file) +@@ -2050,17 +2555,17 @@ static void wait_for_dump_helpers(struct file *file) pipe = file->f_path.dentry->d_inode->i_pipe; pipe_lock(pipe); @@ -59853,7 +59963,7 @@ index 78199eb..abce65a 100644 pipe_unlock(pipe); } -@@ -2121,7 +2608,8 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) +@@ -2121,7 +2626,8 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) int retval = 0; int flag = 0; int ispipe; @@ -59863,7 +59973,7 @@ index 78199eb..abce65a 100644 struct coredump_params cprm = { .signr = signr, .regs = regs, -@@ -2136,6 +2624,9 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) +@@ -2136,6 +2642,9 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) audit_core_dumps(signr); @@ -59873,7 +59983,7 @@ index 78199eb..abce65a 100644 binfmt = mm->binfmt; if (!binfmt || !binfmt->core_dump) goto fail; -@@ -2146,14 +2637,16 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) +@@ -2146,14 +2655,16 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) if (!cred) goto fail; /* @@ -59894,7 +60004,7 @@ index 78199eb..abce65a 100644 } retval = coredump_wait(exit_code, &core_state); -@@ -2203,7 +2696,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) +@@ -2203,7 +2714,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) } cprm.limit = RLIM_INFINITY; @@ -59903,7 +60013,7 @@ index 78199eb..abce65a 100644 if (core_pipe_limit && (core_pipe_limit < dump_count)) { printk(KERN_WARNING "Pid %d(%s) over core_pipe_limit\n", task_tgid_vnr(current), current->comm); -@@ -2230,9 +2723,19 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) +@@ -2230,9 +2741,19 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs) } else { struct inode *inode; @@ -59923,7 +60033,7 @@ index 78199eb..abce65a 100644 cprm.file = filp_open(cn.corename, O_CREAT | 2 | O_NOFOLLOW | O_LARGEFILE | flag, 0600); -@@ -2273,7 +2776,7 @@ close_fail: +@@ -2273,7 +2794,7 @@ close_fail: filp_close(cprm.file, NULL); fail_dropcount: if (ispipe) @@ -59932,7 +60042,7 @@ index 78199eb..abce65a 100644 fail_unlock: kfree(cn.corename); fail_corename: -@@ -2292,7 +2795,7 @@ fail: +@@ -2292,7 +2813,7 @@ fail: */ int dump_write(struct file *file, const void *addr, int nr) { @@ -80307,10 +80417,10 @@ index e2a360a..1d61efb 100644 #if __GNUC_MINOR__ > 0 diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h -index cdd1cc2..59dc542 100644 +index cdd1cc2..2401b2e 100644 --- a/include/linux/compiler-gcc5.h +++ b/include/linux/compiler-gcc5.h -@@ -28,6 +28,28 @@ +@@ -28,6 +28,26 @@ # define __compiletime_error(message) __attribute__((error(message))) #endif /* __CHECKER__ */ @@ -80320,7 +80430,6 @@ index cdd1cc2..59dc542 100644 +#define __bos1(ptr) __bos((ptr), 1) + +#ifdef CONSTIFY_PLUGIN -+#error not yet +#define __no_const __attribute__((no_const)) +#define __do_const __attribute__((do_const)) +#endif @@ -80332,13 +80441,20 @@ index cdd1cc2..59dc542 100644 +#endif + +#ifdef LATENT_ENTROPY_PLUGIN -+#error not yet +#define __latent_entropy __attribute__((latent_entropy)) +#endif + /* * Mark a position in code as unreachable. This can be used to * suppress control flow warnings after asm blocks that transfer +@@ -53,7 +73,6 @@ + * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 + * + * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. +- * Fixed in GCC 4.8.2 and later versions. + * + * (asm goto is automatically volatile - the naming reflects this.) + */ diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 7c7546b..92ea3ae 100644 --- a/include/linux/compiler.h @@ -82714,7 +82830,7 @@ index 9146f39..536519a 100644 #define __meminitconst __section(.meminit.rodata) #define __memexit __section(.memexit.text) __exitused __cold notrace diff --git a/include/linux/init_task.h b/include/linux/init_task.h -index cdde2b3..d782954 100644 +index cdde2b37..d782954 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h @@ -144,6 +144,12 @@ extern struct task_group root_task_group; @@ -111376,6 +111492,9 @@ index 0000000..eaa4fce + exit 0 +fi +exit 1 +diff --git a/scripts/gcc-version.sh b/scripts/gcc-version.sh +old mode 100644 +new mode 100755 diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl index 48462be..3e08f94 100644 --- a/scripts/headers_install.pl @@ -115394,12 +115513,12 @@ index 0000000..5452feea +} diff --git a/tools/gcc/colorize_plugin.c b/tools/gcc/colorize_plugin.c new file mode 100644 -index 0000000..d44bd9f +index 0000000..0c96d8a --- /dev/null +++ b/tools/gcc/colorize_plugin.c @@ -0,0 +1,215 @@ +/* -+ * Copyright 2012-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2012-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -115492,6 +115611,7 @@ index 0000000..d44bd9f +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data colorize_rearm_pass_data = { +#else +struct simple_ipa_opt_pass colorize_rearm_pass = { @@ -115525,7 +115645,6 @@ index 0000000..d44bd9f +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class colorize_rearm_pass : public simple_ipa_opt_pass { +public: + colorize_rearm_pass() : simple_ipa_opt_pass(colorize_rearm_pass_data, g) {} @@ -115615,13 +115734,13 @@ index 0000000..d44bd9f +} diff --git a/tools/gcc/constify_plugin.c b/tools/gcc/constify_plugin.c new file mode 100644 -index 0000000..3b5af59 +index 0000000..93b181d --- /dev/null +++ b/tools/gcc/constify_plugin.c -@@ -0,0 +1,558 @@ +@@ -0,0 +1,563 @@ +/* + * Copyright 2011 by Emese Revfy <re.emese@gmail.com> -+ * Copyright 2011-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2, or (at your option) v3 + * + * This gcc plugin constifies all structures which contain only function pointers or are explicitly marked for constification. @@ -115636,7 +115755,7 @@ index 0000000..3b5af59 + +#include "gcc-common.h" + -+// unused C type flag in all versions 4.5-4.9 ++// unused C type flag in all versions 4.5-5.0 +#define TYPE_CONSTIFY_VISITED(TYPE) TYPE_LANG_FLAG_4(TYPE) + +int plugin_is_GPL_compatible; @@ -115942,6 +116061,11 @@ index 0000000..3b5af59 + if (type == NULL_TREE || type == error_mark_node) + return; + ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ + if (TYPE_FIELDS(type) == NULL_TREE || TYPE_CONSTIFY_VISITED(type)) + return; + @@ -116042,6 +116166,7 @@ index 0000000..3b5af59 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data check_local_variables_pass_data = { +#else +static struct gimple_opt_pass check_local_variables_pass = { @@ -116075,7 +116200,6 @@ index 0000000..3b5af59 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class check_local_variables_pass : public gimple_opt_pass { +public: + check_local_variables_pass() : gimple_opt_pass(check_local_variables_pass_data, g) {} @@ -116179,10 +116303,10 @@ index 0000000..3b5af59 +} diff --git a/tools/gcc/gcc-common.h b/tools/gcc/gcc-common.h new file mode 100644 -index 0000000..14ec226 +index 0000000..19fedf2 --- /dev/null +++ b/tools/gcc/gcc-common.h -@@ -0,0 +1,520 @@ +@@ -0,0 +1,540 @@ +#ifndef GCC_COMMON_H_INCLUDED +#define GCC_COMMON_H_INCLUDED + @@ -116284,11 +116408,13 @@ index 0000000..14ec226 +//#include "diagnostic-color.h" +#include "context.h" +#include "tree-ssa-alias.h" ++#include "tree-ssa.h" +#include "stringpool.h" +#include "tree-ssanames.h" +#include "print-tree.h" +#include "tree-eh.h" +#include "stmt.h" ++#include "gimplify.h" +#endif + +#include "gimple.h" @@ -116311,6 +116437,7 @@ index 0000000..14ec226 +//#include "lto-compress.h" +#if BUILDING_GCC_VERSION >= 5000 +//#include "lto-section-names.h" ++#include "builtins.h" +#endif + +//#include "expr.h" where are you... @@ -116538,6 +116665,7 @@ index 0000000..14ec226 +typedef union gimple_statement_d gasm; +typedef union gimple_statement_d gassign; +typedef union gimple_statement_d gcall; ++typedef union gimple_statement_d gdebug; +typedef union gimple_statement_d gphi; +typedef union gimple_statement_d greturn; +#endif @@ -116564,6 +116692,7 @@ index 0000000..14ec226 +typedef struct gimple_statement_base gasm; +typedef struct gimple_statement_base gassign; +typedef struct gimple_statement_base gcall; ++typedef struct gimple_statement_base gdebug; +typedef struct gimple_statement_base gphi; +typedef struct gimple_statement_base greturn; +#endif @@ -116580,6 +116709,11 @@ index 0000000..14ec226 +{ + return stmt; +} ++ ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return stmt; ++} +#endif + +#if BUILDING_GCC_VERSION >= 4009 @@ -116600,16 +116734,16 @@ index 0000000..14ec226 + +#define INSN_DELETED_P(insn) (insn)->deleted() + -+extern bool is_simple_builtin(tree); -+ +// symtab/cgraph related +#define debug_cgraph_node(node) (node)->debug() +#define cgraph_get_node(decl) cgraph_node::get(decl) +#define cgraph_n_nodes symtab->cgraph_count +#define cgraph_max_uid symtab->cgraph_max_uid ++#define varpool_get_node(decl) varpool_node::get(decl) + +typedef struct cgraph_node *cgraph_node_ptr; +typedef struct cgraph_edge *cgraph_edge_p; ++typedef struct varpool_node *varpool_node_ptr; + +static inline void change_decl_assembler_name(tree decl, tree name) +{ @@ -116687,11 +116821,21 @@ index 0000000..14ec226 + return as_a<gasm *>(stmt); +} + ++static inline const gasm *as_a_gasm(const_gimple stmt) ++{ ++ return as_a<const gasm *>(stmt); ++} ++ +static inline gcall *as_a_gcall(gimple stmt) +{ + return as_a<gcall *>(stmt); +} + ++static inline greturn *as_a_greturn(gimple stmt) ++{ ++ return as_a<greturn *>(stmt); ++} ++ +// IPA/LTO related +#define ipa_ref_list_referring_iterate(L,I,P) (L)->referring.iterate((I), &(P)) +#define ipa_ref_list_reference_iterate(L,I,P) (L)->reference.iterate((I), &(P)) @@ -116719,12 +116863,12 @@ index 0000000..7514850 +fi diff --git a/tools/gcc/kallocstat_plugin.c b/tools/gcc/kallocstat_plugin.c new file mode 100644 -index 0000000..d81c094 +index 0000000..457d54e --- /dev/null +++ b/tools/gcc/kallocstat_plugin.c -@@ -0,0 +1,183 @@ +@@ -0,0 +1,188 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -116835,6 +116979,7 @@ index 0000000..d81c094 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data kallocstat_pass_data = { +#else +static struct gimple_opt_pass kallocstat_pass = { @@ -116845,7 +116990,8 @@ index 0000000..d81c094 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = false, + .has_execute = true, +#else @@ -116867,11 +117013,14 @@ index 0000000..d81c094 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class kallocstat_pass : public gimple_opt_pass { +public: + kallocstat_pass() : gimple_opt_pass(kallocstat_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return execute_kallocstat(); } ++#else + unsigned int execute() { return execute_kallocstat(); } ++#endif +}; +} + @@ -116908,12 +117057,12 @@ index 0000000..d81c094 +} diff --git a/tools/gcc/kernexec_plugin.c b/tools/gcc/kernexec_plugin.c new file mode 100644 -index 0000000..89f256d +index 0000000..71716e7 --- /dev/null +++ b/tools/gcc/kernexec_plugin.c -@@ -0,0 +1,522 @@ +@@ -0,0 +1,547 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -116946,7 +117095,7 @@ index 0000000..89f256d + */ +static void kernexec_reload_fptr_mask(gimple_stmt_iterator *gsi) +{ -+ gimple asm_movabs_stmt; ++ gasm *asm_movabs_stmt; + + // build asm volatile("movabs $0x8000000000000000, %%r12\n\t" : : : ); + asm_movabs_stmt = gimple_build_asm_vec("movabs $0x8000000000000000, %%r12\n\t", NULL, NULL, NULL, NULL); @@ -116968,14 +117117,17 @@ index 0000000..89f256d + + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + // gimple match: __asm__ ("" : : : "r12"); -+ gimple asm_stmt; ++ gimple stmt; ++ gasm *asm_stmt; + size_t nclobbers; + + // is it an asm ... -+ asm_stmt = gsi_stmt(gsi); -+ if (gimple_code(asm_stmt) != GIMPLE_ASM) ++ stmt = gsi_stmt(gsi); ++ if (gimple_code(stmt) != GIMPLE_ASM) + continue; + ++ asm_stmt = as_a_gasm(stmt); ++ + // ... clobbering r12 + nclobbers = gimple_asm_nclobbers(asm_stmt); + while (nclobbers--) { @@ -116998,10 +117150,11 @@ index 0000000..89f256d + */ +static void kernexec_instrument_fptr_bts(gimple_stmt_iterator *gsi) +{ -+ gimple assign_intptr, assign_new_fptr, call_stmt; ++ gimple assign_intptr, assign_new_fptr; ++ gcall *call_stmt; + tree intptr, orptr, old_fptr, new_fptr, kernexec_mask; + -+ call_stmt = gsi_stmt(*gsi); ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); + old_fptr = gimple_call_fn(call_stmt); + + // create temporary unsigned long variable used for bitops and cast fptr to it @@ -117039,7 +117192,8 @@ index 0000000..89f256d + +static void kernexec_instrument_fptr_or(gimple_stmt_iterator *gsi) +{ -+ gimple asm_or_stmt, call_stmt; ++ gasm *asm_or_stmt; ++ gcall *call_stmt; + tree old_fptr, new_fptr, input, output; +#if BUILDING_GCC_VERSION <= 4007 + VEC(tree, gc) *inputs = NULL; @@ -117049,7 +117203,7 @@ index 0000000..89f256d + vec<tree, va_gc> *outputs = NULL; +#endif + -+ call_stmt = gsi_stmt(*gsi); ++ call_stmt = as_a_gcall(gsi_stmt(*gsi)); + old_fptr = gimple_call_fn(call_stmt); + + // create temporary fptr variable @@ -117094,12 +117248,14 @@ index 0000000..89f256d + for (gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi)) { + // gimple match: h_1 = get_fptr (); D.2709_3 = h_1 (x_2(D)); + tree fn; -+ gimple call_stmt; ++ gimple stmt; ++ gcall *call_stmt; + + // is it a call ... -+ call_stmt = gsi_stmt(gsi); -+ if (!is_gimple_call(call_stmt)) ++ stmt = gsi_stmt(gsi); ++ if (!is_gimple_call(stmt)) + continue; ++ call_stmt = as_a_gcall(stmt); + fn = gimple_call_fn(call_stmt); + if (TREE_CODE(fn) == ADDR_EXPR) + continue; @@ -117172,7 +117328,7 @@ index 0000000..89f256d + */ +static unsigned int execute_kernexec_retaddr(void) +{ -+ rtx insn; ++ rtx_insn *insn; + +// if (stack_realign_drap) +// inform(DECL_SOURCE_LOCATION(current_function_decl), "drap detected in %s\n", IDENTIFIER_POINTER(DECL_NAME(current_function_decl))); @@ -117220,6 +117376,7 @@ index 0000000..89f256d +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data kernexec_reload_pass_data = { +#else +static struct gimple_opt_pass kernexec_reload_pass = { @@ -117230,7 +117387,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -117262,7 +117420,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -117294,7 +117453,8 @@ index 0000000..89f256d +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -117316,26 +117476,40 @@ index 0000000..89f256d +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class kernexec_reload_pass : public gimple_opt_pass { +public: + kernexec_reload_pass() : gimple_opt_pass(kernexec_reload_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_reload(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_reload(); } ++#endif +}; + +class kernexec_fptr_pass : public gimple_opt_pass { +public: + kernexec_fptr_pass() : gimple_opt_pass(kernexec_fptr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_fptr(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_fptr(); } ++#endif +}; + +class kernexec_retaddr_pass : public rtl_opt_pass { +public: + kernexec_retaddr_pass() : rtl_opt_pass(kernexec_retaddr_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return kernexec_cmodel_check(); } ++ virtual unsigned int execute(function *) { return execute_kernexec_retaddr(); } ++#else + bool gate() { return kernexec_cmodel_check(); } + unsigned int execute() { return execute_kernexec_retaddr(); } ++#endif +}; +} + @@ -117436,12 +117610,12 @@ index 0000000..89f256d +} diff --git a/tools/gcc/latent_entropy_plugin.c b/tools/gcc/latent_entropy_plugin.c new file mode 100644 -index 0000000..2a39357 +index 0000000..d383708 --- /dev/null +++ b/tools/gcc/latent_entropy_plugin.c -@@ -0,0 +1,467 @@ +@@ -0,0 +1,473 @@ +/* -+ * Copyright 2012-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2012-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -117821,6 +117995,7 @@ index 0000000..2a39357 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data latent_entropy_pass_data = { +#else +static struct gimple_opt_pass latent_entropy_pass = { @@ -117831,7 +118006,8 @@ index 0000000..2a39357 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -117853,12 +118029,16 @@ index 0000000..2a39357 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class latent_entropy_pass : public gimple_opt_pass { +public: + latent_entropy_pass() : gimple_opt_pass(latent_entropy_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_latent_entropy(); } ++ virtual unsigned int execute(function *) { return execute_latent_entropy(); } ++#else + bool gate() { return gate_latent_entropy(); } + unsigned int execute() { return execute_latent_entropy(); } ++#endif +}; +} + @@ -117909,12 +118089,12 @@ index 0000000..2a39357 +} diff --git a/tools/gcc/randomize_layout_plugin.c b/tools/gcc/randomize_layout_plugin.c new file mode 100644 -index 0000000..a5cb46b +index 0000000..e1983c0 --- /dev/null +++ b/tools/gcc/randomize_layout_plugin.c -@@ -0,0 +1,915 @@ +@@ -0,0 +1,917 @@ +/* -+ * Copyright 2014 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> ++ * Copyright 2014,2015 by Open Source Security, Inc., Brad Spengler <spender@grsecurity.net> + * and PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * @@ -117929,7 +118109,8 @@ index 0000000..a5cb46b +#include "gcc-common.h" +#include "randomize_layout_seed.h" + -+#if BUILDING_GCC_MAJOR < 4 || BUILDING_GCC_MINOR < 6 || (BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) ++#if BUILDING_GCC_MAJOR < 4 || (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR < 6) || \ ++ (BUILDING_GCC_MAJOR == 4 && BUILDING_GCC_MINOR == 6 && BUILDING_GCC_PATCHLEVEL < 4) +#error "The RANDSTRUCT plugin requires GCC 4.6.4 or newer." +#endif + @@ -118729,7 +118910,8 @@ index 0000000..a5cb46b +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION >= 4009 + .has_gate = false, + .has_execute = true, +#else @@ -118789,8 +118971,8 @@ index 0000000..a5cb46b + return 1; + } + -+ if (strcmp(lang_hooks.name, "GNU C")) { -+ inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); ++ if (strncmp(lang_hooks.name, "GNU C", 5) && !strncmp(lang_hooks.name, "GNU C+", 6)) { ++ inform(UNKNOWN_LOCATION, G_("%s supports C only, not %s"), plugin_name, lang_hooks.name); + enable = false; + } + @@ -129043,12 +129225,12 @@ index 0000000..0888f6c + diff --git a/tools/gcc/stackleak_plugin.c b/tools/gcc/stackleak_plugin.c new file mode 100644 -index 0000000..90125d6 +index 0000000..51dc09d --- /dev/null +++ b/tools/gcc/stackleak_plugin.c -@@ -0,0 +1,396 @@ +@@ -0,0 +1,408 @@ +/* -+ * Copyright 2011-2014 by the PaX Team <pageexec@freemail.hu> ++ * Copyright 2011-2015 by the PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -129175,7 +129357,7 @@ index 0000000..90125d6 + +static unsigned int execute_stackleak_final(void) +{ -+ rtx insn, next; ++ rtx_insn *insn, *next; + + if (cfun->calls_alloca) + return 0; @@ -129269,6 +129451,7 @@ index 0000000..90125d6 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data stackleak_tree_instrument_pass_data = { +#else +static struct gimple_opt_pass stackleak_tree_instrument_pass = { @@ -129279,7 +129462,8 @@ index 0000000..90125d6 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -129311,7 +129495,8 @@ index 0000000..90125d6 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = true, + .has_execute = true, +#else @@ -129333,19 +129518,28 @@ index 0000000..90125d6 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class stackleak_tree_instrument_pass : public gimple_opt_pass { +public: + stackleak_tree_instrument_pass() : gimple_opt_pass(stackleak_tree_instrument_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_tree_instrument(); } ++#else + bool gate() { return gate_stackleak_track_stack(); } + unsigned int execute() { return execute_stackleak_tree_instrument(); } ++#endif +}; + +class stackleak_final_rtl_opt_pass : public rtl_opt_pass { +public: + stackleak_final_rtl_opt_pass() : rtl_opt_pass(stackleak_final_rtl_opt_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual bool gate(function *) { return gate_stackleak_track_stack(); } ++ virtual unsigned int execute(function *) { return execute_stackleak_final(); } ++#else + bool gate() { return gate_stackleak_track_stack(); } + unsigned int execute() { return execute_stackleak_final(); } ++#endif +}; +} + @@ -129445,12 +129639,12 @@ index 0000000..90125d6 +} diff --git a/tools/gcc/structleak_plugin.c b/tools/gcc/structleak_plugin.c new file mode 100644 -index 0000000..4ee2231 +index 0000000..4436cbe --- /dev/null +++ b/tools/gcc/structleak_plugin.c -@@ -0,0 +1,274 @@ +@@ -0,0 +1,287 @@ +/* -+ * Copyright 2013-2014 by PaX Team <pageexec@freemail.hu> ++ * Copyright 2013-2015 by PaX Team <pageexec@freemail.hu> + * Licensed under the GPL v2 + * + * Note: the choice of the license means that the compilation process is @@ -129477,8 +129671,8 @@ index 0000000..4ee2231 + +#include "gcc-common.h" + -+// unused C type flag in all versions 4.5-4.9 -+#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_3(TYPE) ++// unused C type flag in all versions 4.5-5.0 ++#define TYPE_USERSPACE(TYPE) TYPE_LANG_FLAG_5(TYPE) + +int plugin_is_GPL_compatible; + @@ -129545,6 +129739,14 @@ index 0000000..4ee2231 +{ + tree type = (tree)event_data; + ++ if (type == NULL_TREE || type == error_mark_node) ++ return; ++ ++#if BUILDING_GCC_VERSION >= 5000 ++ if (TREE_CODE(type) == ENUMERAL_TYPE) ++ return; ++#endif ++ + if (TYPE_USERSPACE(type)) + return; + @@ -129631,6 +129833,7 @@ index 0000000..4ee2231 +} + +#if BUILDING_GCC_VERSION >= 4009 ++namespace { +static const struct pass_data structleak_pass_data = { +#else +static struct gimple_opt_pass structleak_pass = { @@ -129641,7 +129844,8 @@ index 0000000..4ee2231 +#if BUILDING_GCC_VERSION >= 4008 + .optinfo_flags = OPTGROUP_NONE, +#endif -+#if BUILDING_GCC_VERSION >= 4009 ++#if BUILDING_GCC_VERSION >= 5000 ++#elif BUILDING_GCC_VERSION == 4009 + .has_gate = false, + .has_execute = true, +#else @@ -129663,11 +129867,14 @@ index 0000000..4ee2231 +}; + +#if BUILDING_GCC_VERSION >= 4009 -+namespace { +class structleak_pass : public gimple_opt_pass { +public: + structleak_pass() : gimple_opt_pass(structleak_pass_data, g) {} ++#if BUILDING_GCC_VERSION >= 5000 ++ virtual unsigned int execute(function *) { return handle_function(); } ++#else + unsigned int execute() { return handle_function(); } ++#endif +}; +} + @@ -129701,7 +129908,7 @@ index 0000000..4ee2231 + return 1; + } + -+ if (strcmp(lang_hooks.name, "GNU C")) { ++ if (strncmp(lang_hooks.name, "GNU C", 5) || !strncmp(lang_hooks.name, "GNU C+", 6)) { + inform(UNKNOWN_LOCATION, G_("%s supports C only"), plugin_name); + enable = false; + } |