commit: 9417a236d9dfc4d648ce711a2fac162a6fe2a353 Author: Anthony G. Basile <blueness <AT> gentoo <DOT> org> AuthorDate: Tue Nov 24 08:54:22 2015 +0000 Commit: Anthony G. Basile <blueness <AT> gentoo <DOT> org> CommitDate: Tue Nov 24 08:54:22 2015 +0000 URL: https://gitweb.gentoo.org/proj/hardened-patchset.git/commit/?id=9417a236
grsecurity-3.1-4.2.6-201511211841 4.2.6/0000_README | 2 +- ...> 4420_grsecurity-3.1-4.2.6-201511211841.patch} | 338 ++++++++++++++------- 2 files changed, 229 insertions(+), 111 deletions(-) diff --git a/4.2.6/0000_README b/4.2.6/0000_README index 9ebf533..454ccd7 100644 --- a/4.2.6/0000_README +++ b/4.2.6/0000_README @@ -2,7 +2,7 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 4420_grsecurity-3.1-4.2.6-201511182042.patch +Patch: 4420_grsecurity-3.1-4.2.6-201511211841.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/4.2.6/4420_grsecurity-3.1-4.2.6-201511182042.patch b/4.2.6/4420_grsecurity-3.1-4.2.6-201511211841.patch similarity index 99% rename from 4.2.6/4420_grsecurity-3.1-4.2.6-201511182042.patch rename to 4.2.6/4420_grsecurity-3.1-4.2.6-201511211841.patch index ec705cc..30663c2 100644 --- a/4.2.6/4420_grsecurity-3.1-4.2.6-201511182042.patch +++ b/4.2.6/4420_grsecurity-3.1-4.2.6-201511211841.patch @@ -77233,7 +77233,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 1977c2a..b6b953a 100644 +index 1977c2a..53bf9a0 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -56,8 +56,20 @@ @@ -77729,7 +77729,7 @@ index 1977c2a..b6b953a 100644 out: if (bprm->mm) { acct_arg_size(bprm, 0); -@@ -1743,3 +1918,324 @@ COMPAT_SYSCALL_DEFINE5(execveat, int, fd, +@@ -1743,3 +1918,313 @@ COMPAT_SYSCALL_DEFINE5(execveat, int, fd, argv, envp, flags); } #endif @@ -78035,22 +78035,11 @@ index 1977c2a..b6b953a 100644 + +#ifdef CONFIG_PAX_SIZE_OVERFLOW + -+#ifdef CONFIG_PAX_SIZE_OVERFLOW_DISABLE_KILL -+static DEFINE_RATELIMIT_STATE(size_overflow_ratelimit, 15 * HZ, 3); -+#endif -+ +void __nocapture(1, 3, 4) __used report_size_overflow(const char *file, unsigned int line, const char *func, const char *ssa_name) +{ -+#ifdef CONFIG_PAX_SIZE_OVERFLOW_DISABLE_KILL -+ if (__ratelimit(&size_overflow_ratelimit)) { -+ printk(KERN_EMERG "PAX: size overflow detected in function %s %s:%u %s", func, file, line, ssa_name); -+ dump_stack(); -+ } -+#else + printk(KERN_EMERG "PAX: size overflow detected in function %s %s:%u %s", func, file, line, ssa_name); + dump_stack(); + do_group_exit(SIGKILL); -+#endif +} +EXPORT_SYMBOL(report_size_overflow); +#endif @@ -97435,7 +97424,7 @@ index dfaa7b3..58cebfb 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.h b/include/linux/compiler.h -index e08a6ae..2e5e776 100644 +index e08a6ae..8d965c5 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h @@ -5,11 +5,14 @@ @@ -97507,46 +97496,63 @@ index e08a6ae..2e5e776 100644 #endif /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ -@@ -201,27 +225,27 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - static __always_inline void __read_once_size(const volatile void *p, void *res, int size) - { - switch (size) { +@@ -198,34 +222,6 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); + + #include <uapi/linux/types.h> + +-static __always_inline void __read_once_size(const volatile void *p, void *res, int size) +-{ +- switch (size) { - case 1: *(__u8 *)res = *(volatile __u8 *)p; break; - case 2: *(__u16 *)res = *(volatile __u16 *)p; break; - case 4: *(__u32 *)res = *(volatile __u32 *)p; break; - case 8: *(__u64 *)res = *(volatile __u64 *)p; break; -+ case 1: *(__u8 *)res = *(const volatile __u8 *)p; break; -+ case 2: *(__u16 *)res = *(const volatile __u16 *)p; break; -+ case 4: *(__u32 *)res = *(const volatile __u32 *)p; break; -+ case 8: *(__u64 *)res = *(const volatile __u64 *)p; break; - default: - barrier(); +- default: +- barrier(); - __builtin_memcpy((void *)res, (const void *)p, size); -+ __builtin_memcpy(res, (const void *)p, size); - barrier(); - } - } - +- barrier(); +- } +-} +- -static __always_inline void __write_once_size(volatile void *p, void *res, int size) -+static __always_inline void __write_once_size(volatile void *p, const void *res, int size) - { - switch (size) { +-{ +- switch (size) { - case 1: *(volatile __u8 *)p = *(__u8 *)res; break; - case 2: *(volatile __u16 *)p = *(__u16 *)res; break; - case 4: *(volatile __u32 *)p = *(__u32 *)res; break; - case 8: *(volatile __u64 *)p = *(__u64 *)res; break; -+ case 1: *(volatile __u8 *)p = *(const __u8 *)res; break; -+ case 2: *(volatile __u16 *)p = *(const __u16 *)res; break; -+ case 4: *(volatile __u32 *)p = *(const __u32 *)res; break; -+ case 8: *(volatile __u64 *)p = *(const __u64 *)res; break; - default: - barrier(); +- default: +- barrier(); - __builtin_memcpy((void *)p, (const void *)res, size); -+ __builtin_memcpy((void *)p, res, size); - barrier(); - } - } -@@ -370,6 +394,38 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s +- barrier(); +- } +-} +- + /* + * Prevent the compiler from merging or refetching reads or writes. The + * compiler is also forbidden from reordering successive instances of +@@ -248,11 +244,16 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s + * required ordering. + */ + +-#define READ_ONCE(x) \ +- ({ union { typeof(x) __val; char __c[1]; } __u; __read_once_size(&(x), __u.__c, sizeof(x)); __u.__val; }) ++#define READ_ONCE(x) ({ \ ++ typeof(x) __val = *(volatile typeof(x) *)&(x); \ ++ __val; \ ++}) + +-#define WRITE_ONCE(x, val) \ +- ({ union { typeof(x) __val; char __c[1]; } __u = { .__val = (val) }; __write_once_size(&(x), __u.__c, sizeof(x)); __u.__val; }) ++#define WRITE_ONCE(x, val) ({ \ ++ typeof(x) __val = (val); \ ++ (x) = *(volatile typeof(x) *)&__val; \ ++ __val; \ ++}) + + /** + * READ_ONCE_CTRL - Read a value heading a control dependency +@@ -370,6 +371,38 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s # define __attribute_const__ /* unimplemented */ #endif @@ -97585,7 +97591,7 @@ index e08a6ae..2e5e776 100644 /* * Tell gcc if a function is cold. The compiler will assume any path * directly leading to the call is unlikely. -@@ -379,6 +435,22 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s +@@ -379,6 +412,22 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s #define __cold #endif @@ -97608,7 +97614,7 @@ index e08a6ae..2e5e776 100644 /* Simple shorthand for a section definition */ #ifndef __section # define __section(S) __attribute__ ((__section__(#S))) -@@ -393,6 +465,8 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s +@@ -393,6 +442,8 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) #endif @@ -97617,7 +97623,7 @@ index e08a6ae..2e5e776 100644 /* Is this type a native word size -- useful for atomic operations */ #ifndef __native_word # define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) -@@ -472,8 +546,9 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s +@@ -472,8 +523,9 @@ static __always_inline void __write_once_size(volatile void *p, void *res, int s */ #define __ACCESS_ONCE(x) ({ \ __maybe_unused typeof(x) __var = (__force typeof(x)) 0; \ @@ -103391,7 +103397,7 @@ index 5122b5e..598b440 100644 void v9fs_register_trans(struct p9_trans_module *m); void v9fs_unregister_trans(struct p9_trans_module *m); diff --git a/include/net/af_unix.h b/include/net/af_unix.h -index cb1b9bb..56b3ee0 100644 +index cb1b9bb..deaf939 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h @@ -36,7 +36,7 @@ struct unix_skb_parms { @@ -103403,6 +103409,14 @@ index cb1b9bb..56b3ee0 100644 #define UNIXCB(skb) (*(struct unix_skb_parms *)&((skb)->cb)) +@@ -62,6 +62,7 @@ struct unix_sock { + #define UNIX_GC_CANDIDATE 0 + #define UNIX_GC_MAYBE_CYCLE 1 + struct socket_wq peer_wq; ++ wait_queue_t wait; + }; + + static inline struct unix_sock *unix_sk(struct sock *sk) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 2239a37..a83461f 100644 --- a/include/net/bluetooth/l2cap.h @@ -124572,10 +124586,19 @@ index 350cca3..a108fc5 100644 sub->evt.event = htohl(event, sub->swap); sub->evt.found_lower = htohl(found_lower, sub->swap); diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c -index 94f6582..2272bfc 100644 +index 94f6582..0883e68 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c -@@ -440,6 +440,7 @@ static void unix_release_sock(struct sock *sk, int embrion) +@@ -420,6 +420,8 @@ static void unix_release_sock(struct sock *sk, int embrion) + skpair = unix_peer(sk); + + if (skpair != NULL) { ++ if (sk->sk_type != SOCK_STREAM) ++ remove_wait_queue(&unix_sk(skpair)->peer_wait, &u->wait); + if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) { + unix_state_lock(skpair); + /* No more writes */ +@@ -440,6 +442,7 @@ static void unix_release_sock(struct sock *sk, int embrion) if (state == TCP_LISTEN) unix_release_sock(skb->sk, 1); /* passed fds are erased in the kfree_skb hook */ @@ -124583,7 +124606,32 @@ index 94f6582..2272bfc 100644 kfree_skb(skb); } -@@ -802,6 +803,12 @@ static struct sock *unix_find_other(struct net *net, +@@ -636,6 +639,16 @@ static struct proto unix_proto = { + */ + static struct lock_class_key af_unix_sk_receive_queue_lock_key; + ++static int peer_wake(wait_queue_t *wait, unsigned mode, int sync, void *key) ++{ ++ struct unix_sock *u; ++ ++ u = container_of(wait, struct unix_sock, wait); ++ wake_up_interruptible_sync_poll(sk_sleep(&u->sk), key); ++ ++ return 0; ++} ++ + static struct sock *unix_create1(struct net *net, struct socket *sock, int kern) + { + struct sock *sk = NULL; +@@ -664,6 +677,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern) + INIT_LIST_HEAD(&u->link); + mutex_init(&u->readlock); /* single task reading lock */ + init_waitqueue_head(&u->peer_wait); ++ init_waitqueue_func_entry(&u->wait, peer_wake); + unix_insert_socket(unix_sockets_unbound(sk), sk); + out: + if (sk == NULL) +@@ -802,6 +816,12 @@ static struct sock *unix_find_other(struct net *net, err = -ECONNREFUSED; if (!S_ISSOCK(inode->i_mode)) goto put_fail; @@ -124596,7 +124644,7 @@ index 94f6582..2272bfc 100644 u = unix_find_socket_byinode(inode); if (!u) goto put_fail; -@@ -822,6 +829,13 @@ static struct sock *unix_find_other(struct net *net, +@@ -822,6 +842,13 @@ static struct sock *unix_find_other(struct net *net, if (u) { struct dentry *dentry; dentry = unix_sk(u)->path.dentry; @@ -124610,7 +124658,7 @@ index 94f6582..2272bfc 100644 if (dentry) touch_atime(&unix_sk(u)->path); } else -@@ -855,12 +869,18 @@ static int unix_mknod(const char *sun_path, umode_t mode, struct path *res) +@@ -855,12 +882,18 @@ static int unix_mknod(const char *sun_path, umode_t mode, struct path *res) */ err = security_path_mknod(&path, dentry, mode, 0); if (!err) { @@ -124629,7 +124677,68 @@ index 94f6582..2272bfc 100644 done_path_create(&path, dentry); return err; } -@@ -1798,6 +1818,7 @@ alloc_skb: +@@ -1030,7 +1063,10 @@ restart: + */ + if (unix_peer(sk)) { + struct sock *old_peer = unix_peer(sk); ++ ++ remove_wait_queue(&unix_sk(old_peer)->peer_wait, &unix_sk(sk)->wait); + unix_peer(sk) = other; ++ add_wait_queue(&unix_sk(other)->peer_wait, &unix_sk(sk)->wait); + unix_state_double_unlock(sk, other); + + if (other != old_peer) +@@ -1038,8 +1074,12 @@ restart: + sock_put(old_peer); + } else { + unix_peer(sk) = other; ++ add_wait_queue(&unix_sk(other)->peer_wait, &unix_sk(sk)->wait); + unix_state_double_unlock(sk, other); + } ++ /* New remote may have created write space for us */ ++ wake_up_interruptible_sync_poll(sk_sleep(sk), ++ POLLOUT | POLLWRNORM | POLLWRBAND); + return 0; + + out_unlock: +@@ -1194,6 +1234,8 @@ restart: + + sock_hold(sk); + unix_peer(newsk) = sk; ++ if (sk->sk_type == SOCK_SEQPACKET) ++ add_wait_queue(&unix_sk(sk)->peer_wait, &unix_sk(newsk)->wait); + newsk->sk_state = TCP_ESTABLISHED; + newsk->sk_type = sk->sk_type; + init_peercred(newsk); +@@ -1220,6 +1262,8 @@ restart: + + smp_mb__after_atomic(); /* sock_hold() does an atomic_inc() */ + unix_peer(sk) = newsk; ++ if (sk->sk_type == SOCK_SEQPACKET) ++ add_wait_queue(&unix_sk(newsk)->peer_wait, &unix_sk(sk)->wait); + + unix_state_unlock(sk); + +@@ -1254,6 +1298,10 @@ static int unix_socketpair(struct socket *socka, struct socket *sockb) + sock_hold(skb); + unix_peer(ska) = skb; + unix_peer(skb) = ska; ++ if (ska->sk_type != SOCK_STREAM) { ++ add_wait_queue(&unix_sk(ska)->peer_wait, &unix_sk(skb)->wait); ++ add_wait_queue(&unix_sk(skb)->peer_wait, &unix_sk(ska)->wait); ++ } + init_peercred(ska); + init_peercred(skb); + +@@ -1565,6 +1613,7 @@ restart: + unix_state_lock(sk); + if (unix_peer(sk) == other) { + unix_peer(sk) = NULL; ++ remove_wait_queue(&unix_sk(other)->peer_wait, &u->wait); + unix_state_unlock(sk); + + unix_dgram_disconnected(sk, other); +@@ -1798,6 +1847,7 @@ alloc_skb: * this - does no harm */ consume_skb(newskb); @@ -124637,7 +124746,7 @@ index 94f6582..2272bfc 100644 } if (skb_append_pagefrags(skb, page, offset, size)) { -@@ -1810,8 +1831,11 @@ alloc_skb: +@@ -1810,8 +1860,11 @@ alloc_skb: skb->truesize += size; atomic_add(size, &sk->sk_wmem_alloc); @@ -124650,7 +124759,7 @@ index 94f6582..2272bfc 100644 unix_state_unlock(other); mutex_unlock(&unix_sk(other)->readlock); -@@ -2071,6 +2095,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state) +@@ -2071,6 +2124,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state) do { int chunk; @@ -124658,7 +124767,7 @@ index 94f6582..2272bfc 100644 struct sk_buff *skb, *last; unix_state_lock(sk); -@@ -2151,7 +2176,11 @@ unlock: +@@ -2151,7 +2205,11 @@ unlock: } chunk = min_t(unsigned int, unix_skb_len(skb) - skip, size); @@ -124670,7 +124779,7 @@ index 94f6582..2272bfc 100644 if (chunk < 0) { if (copied == 0) copied = -EFAULT; -@@ -2160,6 +2189,18 @@ unlock: +@@ -2160,6 +2218,18 @@ unlock: copied += chunk; size -= chunk; @@ -124689,24 +124798,15 @@ index 94f6582..2272bfc 100644 /* Mark read part of skb as used */ if (!(flags & MSG_PEEK)) { UNIXCB(skb).consumed += chunk; -@@ -2455,11 +2496,14 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, - writable = unix_writable(sk); +@@ -2456,7 +2526,6 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock, other = unix_peer_get(sk); if (other) { -- if (unix_peer(other) != sk) { -+ unix_state_lock(other); -+ if (!sock_flag(other, SOCK_DEAD) && unix_peer(other) != sk) { -+ unix_state_unlock(other); - sock_poll_wait(file, &unix_sk(other)->peer_wait, wait); + if (unix_peer(other) != sk) { +- sock_poll_wait(file, &unix_sk(other)->peer_wait, wait); if (unix_recvq_full(other)) writable = 0; -- } -+ } else -+ unix_state_unlock(other); - sock_put(other); - } - -@@ -2556,9 +2600,13 @@ static int unix_seq_show(struct seq_file *seq, void *v) + } +@@ -2556,9 +2625,13 @@ static int unix_seq_show(struct seq_file *seq, void *v) seq_puts(seq, "Num RefCount Protocol Flags Type St " "Inode Path\n"); else { @@ -124721,7 +124821,7 @@ index 94f6582..2272bfc 100644 seq_printf(seq, "%pK: %08X %08X %08X %04X %02X %5lu", s, -@@ -2583,10 +2631,29 @@ static int unix_seq_show(struct seq_file *seq, void *v) +@@ -2583,10 +2656,29 @@ static int unix_seq_show(struct seq_file *seq, void *v) seq_putc(seq, '@'); i++; } @@ -125965,10 +126065,10 @@ index c0a932d..817c587 100755 # Find all available archs find_all_archs() diff --git a/security/Kconfig b/security/Kconfig -index bf4ec46..faa8418 100644 +index bf4ec46..6748ce1 100644 --- a/security/Kconfig +++ b/security/Kconfig -@@ -4,6 +4,985 @@ +@@ -4,6 +4,980 @@ menu "Security options" @@ -126914,11 +127014,6 @@ index bf4ec46..faa8418 100644 + i.e., gcc 4.5 or newer. You may need to install the supporting + headers explicitly in addition to the normal gcc package. + -+config PAX_SIZE_OVERFLOW_DISABLE_KILL -+ bool "Do not kill process on overflow detection" -+ default n -+ depends on PAX_SIZE_OVERFLOW -+ +config PAX_LATENT_ENTROPY + bool "Generate some entropy during boot and runtime" + default y if GRKERNSEC_CONFIG_AUTO @@ -126954,7 +127049,7 @@ index bf4ec46..faa8418 100644 source security/keys/Kconfig config SECURITY_DMESG_RESTRICT -@@ -104,7 +1083,7 @@ config INTEL_TXT +@@ -104,7 +1078,7 @@ config INTEL_TXT config LSM_MMAP_MIN_ADDR int "Low address space for LSM to protect from user allocation" depends on SECURITY && SECURITY_SELINUX @@ -129143,15 +129238,19 @@ index 0000000..b884a56 +} diff --git a/tools/gcc/gcc-common.h b/tools/gcc/gcc-common.h new file mode 100644 -index 0000000..9660b09 +index 0000000..5f73f93 --- /dev/null +++ b/tools/gcc/gcc-common.h -@@ -0,0 +1,790 @@ +@@ -0,0 +1,813 @@ +#ifndef GCC_COMMON_H_INCLUDED +#define GCC_COMMON_H_INCLUDED + -+#include "plugin.h" +#include "bversion.h" ++#if BUILDING_GCC_VERSION >= 6000 ++#include "gcc-plugin.h" ++#else ++#include "plugin.h" ++#endif +#include "plugin-version.h" +#include "config.h" +#include "system.h" @@ -129749,6 +129848,21 @@ index 0000000..9660b09 +#define NODE_IMPLICIT_ALIAS(node) (node)->cpp_implicit_alias +#endif + ++#if BUILDING_GCC_VERSION < 6000 ++#define get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, preversep, pvolatilep, keep_aligning) get_inner_reference(exp, pbitsize, pbitpos, poffset, pmode, punsignedp, pvolatilep, keep_aligning) ++#define gen_rtx_set(ARG0, ARG1) gen_rtx_SET(VOIDmode, (ARG0), (ARG1)) ++#endif ++ ++#if BUILDING_GCC_VERSION == 5000 ++// gimple related ++template <> ++template <> ++inline bool is_a_helper<const gassign *>::test(const_gimple gs) ++{ ++ return gs->code == GIMPLE_ASSIGN; ++} ++#endif ++ +#if BUILDING_GCC_VERSION >= 5000 +#define TODO_verify_ssa TODO_verify_il +#define TODO_verify_flow TODO_verify_il @@ -129851,6 +129965,13 @@ index 0000000..9660b09 + symtab->remove_cgraph_duplication_hook(entry); +} + ++ ++#if BUILDING_GCC_VERSION >= 6000 ++typedef gimple *gimple_ptr; ++typedef const gimple *const_gimple; ++#define gimple gimple_ptr ++#endif ++ +// gimple related +static inline gimple gimple_build_assign_with_ops(enum tree_code subcode, tree lhs, tree op1, tree op2 MEM_STAT_DECL) +{ @@ -129859,13 +129980,6 @@ index 0000000..9660b09 + +template <> +template <> -+inline bool is_a_helper<const gassign *>::test(const_gimple gs) -+{ -+ return gs->code == GIMPLE_ASSIGN; -+} -+ -+template <> -+template <> +inline bool is_a_helper<const greturn *>::test(const_gimple gs) +{ + return gs->code == GIMPLE_RETURN; @@ -129936,6 +130050,10 @@ index 0000000..9660b09 +} +#endif + ++#if BUILDING_GCC_VERSION >= 6000 ++#define gen_rtx_set(ARG0, ARG1) gen_rtx_SET((ARG0), (ARG1)) ++#endif ++ +#endif diff --git a/tools/gcc/gen-random-seed.sh b/tools/gcc/gen-random-seed.sh new file mode 100644 @@ -129953,7 +130071,7 @@ index 0000000..7514850 +fi diff --git a/tools/gcc/initify_plugin.c b/tools/gcc/initify_plugin.c new file mode 100644 -index 0000000..2abfe4b +index 0000000..b5684e8 --- /dev/null +++ b/tools/gcc/initify_plugin.c @@ -0,0 +1,552 @@ @@ -130166,7 +130284,7 @@ index 0000000..2abfe4b + tree decl, offset; + HOST_WIDE_INT bitsize, bitpos; + enum machine_mode mode; -+ int unsignedp, volatilep; ++ int unsignedp, reversep, volatilep; + enum tree_code code = TREE_CODE(op); + + if (TREE_CODE_CLASS(code) == tcc_exceptional && code != SSA_NAME) @@ -130178,7 +130296,7 @@ index 0000000..2abfe4b + if (TREE_CODE(op) == COMPONENT_REF) + return false; + -+ decl = get_inner_reference(op, &bitsize, &bitpos, &offset, &mode, &unsignedp, &volatilep, true); ++ decl = get_inner_reference(op, &bitsize, &bitpos, &offset, &mode, &unsignedp, &reversep, &volatilep, true); + + switch (TREE_CODE_CLASS(TREE_CODE(decl))) { + case tcc_constant: @@ -132715,10 +132833,10 @@ index 0000000..4c7f7c6 +targets += size_overflow_hash.h size_overflow_hash_aux.h disable_size_overflow_hash.h diff --git a/tools/gcc/size_overflow_plugin/disable_size_overflow_hash.data b/tools/gcc/size_overflow_plugin/disable_size_overflow_hash.data new file mode 100644 -index 0000000..0adc842 +index 0000000..b0e0cdf --- /dev/null +++ b/tools/gcc/size_overflow_plugin/disable_size_overflow_hash.data -@@ -0,0 +1,12414 @@ +@@ -0,0 +1,12419 @@ +disable_so_interrupt_pnode_gru_message_queue_desc_4 interrupt_pnode gru_message_queue_desc 0 4 NULL +disable_so_bch_btree_insert_fndecl_12 bch_btree_insert fndecl 0 12 NULL +disable_so_macvlan_sync_address_fndecl_22 macvlan_sync_address fndecl 0 22 NULL nohasharray @@ -144419,7 +144537,8 @@ index 0000000..0adc842 +disable_so_freq_offset_khz_uhf_dib0090_config_61716 freq_offset_khz_uhf dib0090_config 0 61716 NULL +disable_so_sha1_generic_block_fn_fndecl_61724 sha1_generic_block_fn fndecl 3 61724 NULL +disable_so_xc4000_get_signal_fndecl_61727 xc4000_get_signal fndecl 0 61727 NULL -+disable_so_vf_addr_hi_bnx2x_vf_mbx_61734 vf_addr_hi bnx2x_vf_mbx 0 61734 NULL ++disable_so_vf_addr_hi_bnx2x_vf_mbx_61734 vf_addr_hi bnx2x_vf_mbx 0 61734 NULL nohasharray ++enable_so_exit_info_2_vmcb_control_area_61734 exit_info_2 vmcb_control_area 0 61734 &disable_so_vf_addr_hi_bnx2x_vf_mbx_61734 +disable_so_pcxhr_update_timer_pos_fndecl_61736 pcxhr_update_timer_pos fndecl 3 61736 NULL nohasharray +disable_so_adis16480_set_filter_freq_fndecl_61736 adis16480_set_filter_freq fndecl 0 61736 &disable_so_pcxhr_update_timer_pos_fndecl_61736 nohasharray +disable_so_xfs_daddr_to_agbno_fndecl_61736 xfs_daddr_to_agbno fndecl 0-2 61736 &disable_so_adis16480_set_filter_freq_fndecl_61736 @@ -145133,6 +145252,10 @@ index 0000000..0adc842 +enable_so_read_fw_status_reg_megasas_instance_template_13572 read_fw_status_reg megasas_instance_template 0 13572 NULL +enable_so_eip_x86_emulate_ctxt_12354 eip x86_emulate_ctxt 0 12354 NULL +enable_so_next_rip_x86_instruction_info_56868 next_rip x86_instruction_info 0 56868 NULL ++enable_so_exit_int_info_vmcb_control_area_18357 exit_int_info vmcb_control_area 0 18357 NULL ++enable_so_exit_info_1_vmcb_control_area_20200 exit_info_1 vmcb_control_area 0 20200 NULL ++enable_so_event_inj_vmcb_control_area_23434 event_inj vmcb_control_area 0 23434 NULL ++enable_so_iopm_base_pa_vmcb_control_area_57998 iopm_base_pa vmcb_control_area 0 57998 NULL diff --git a/tools/gcc/size_overflow_plugin/generate_size_overflow_hash.sh b/tools/gcc/size_overflow_plugin/generate_size_overflow_hash.sh new file mode 100644 index 0000000..be9724d @@ -145666,7 +145789,7 @@ index 0000000..37e2e91 +#endif diff --git a/tools/gcc/size_overflow_plugin/intentional_overflow.c b/tools/gcc/size_overflow_plugin/intentional_overflow.c new file mode 100644 -index 0000000..62eb578 +index 0000000..a662b4b --- /dev/null +++ b/tools/gcc/size_overflow_plugin/intentional_overflow.c @@ -0,0 +1,947 @@ @@ -145908,10 +146031,10 @@ index 0000000..62eb578 + break; + } + case FIELD_DECL: -+ case VAR_DECL: + // !!! temporarily ignore bitfield types + if (DECL_BIT_FIELD_TYPE(node)) + return MARK_YES; ++ case VAR_DECL: + if (is_end_intentional_intentional_attr(node)) + return MARK_END_INTENTIONAL; + if (is_turn_off_intentional_attr(node)) @@ -147290,10 +147413,10 @@ index 0000000..ab2d25a +} diff --git a/tools/gcc/size_overflow_plugin/size_overflow_hash.data b/tools/gcc/size_overflow_plugin/size_overflow_hash.data new file mode 100644 -index 0000000..a883e73 +index 0000000..b683d96 --- /dev/null +++ b/tools/gcc/size_overflow_plugin/size_overflow_hash.data -@@ -0,0 +1,20743 @@ +@@ -0,0 +1,20738 @@ +enable_so_recv_ctrl_pipe_us_data_0 recv_ctrl_pipe us_data 0 0 NULL +enable_so___earlyonly_bootmem_alloc_fndecl_3 __earlyonly_bootmem_alloc fndecl 2-3-4 3 NULL +enable_so_size_ttm_mem_reg_8 size ttm_mem_reg 0 8 NULL @@ -153024,8 +153147,7 @@ index 0000000..a883e73 +enable_so_rfcomm_send_frame_fndecl_18352 rfcomm_send_frame fndecl 3 18352 NULL +enable_so_mgsl_load_tx_dma_buffer_fndecl_18355 mgsl_load_tx_dma_buffer fndecl 3 18355 NULL +enable_so_vm_pgoff_vm_area_struct_18357 vm_pgoff vm_area_struct 0 18357 NULL nohasharray -+enable_so_exit_int_info_vmcb_control_area_18357 exit_int_info vmcb_control_area 0 18357 &enable_so_vm_pgoff_vm_area_struct_18357 nohasharray -+enable_so_elfnotes_sz_vardecl_vmcore_c_18357 elfnotes_sz vardecl_vmcore.c 0 18357 &enable_so_exit_int_info_vmcb_control_area_18357 ++enable_so_elfnotes_sz_vardecl_vmcore_c_18357 elfnotes_sz vardecl_vmcore.c 0 18357 &enable_so_vm_pgoff_vm_area_struct_18357 +enable_so_lbs_rdrf_write_fndecl_18361 lbs_rdrf_write fndecl 3 18361 NULL +enable_so_ascii2desc_fndecl_18370 ascii2desc fndecl 0-3 18370 NULL +enable_so_ecryptfs_write_lower_fndecl_18373 ecryptfs_write_lower fndecl 4 18373 NULL @@ -153596,7 +153718,6 @@ index 0000000..a883e73 +enable_so_iram_base_intel_sst_drv_20196 iram_base intel_sst_drv 0 20196 &enable_so_agp_memory_reserved_vardecl_20196 +enable_so_qxl_gem_object_create_with_handle_fndecl_20198 qxl_gem_object_create_with_handle fndecl 4 20198 NULL +enable_so_fpage_size_genwqe_sgl_20199 fpage_size genwqe_sgl 0 20199 NULL -+enable_so_exit_info_1_vmcb_control_area_20200 exit_info_1 vmcb_control_area 0 20200 NULL +enable_so_sectors_per_block_bits_dm_bufio_client_20202 sectors_per_block_bits dm_bufio_client 0 20202 NULL +enable_so_max_frame_size__mgslpc_info_20204 max_frame_size _mgslpc_info 0 20204 NULL +enable_so_sbq_len_rx_ring_20205 sbq_len rx_ring 0 20205 NULL @@ -154632,8 +154753,7 @@ index 0000000..a883e73 +enable_so_max_snd_interval_23422 max snd_interval 0 23422 NULL +enable_so_configfs_read_file_fndecl_23424 configfs_read_file fndecl 3 23424 NULL +enable_so___qib_get_user_pages_fndecl_23426 __qib_get_user_pages fndecl 1 23426 NULL -+enable_so_event_inj_vmcb_control_area_23434 event_inj vmcb_control_area 0 23434 NULL nohasharray -+enable_so_nilfs_attach_snapshot_fndecl_23434 nilfs_attach_snapshot fndecl 2 23434 &enable_so_event_inj_vmcb_control_area_23434 ++enable_so_nilfs_attach_snapshot_fndecl_23434 nilfs_attach_snapshot fndecl 2 23434 NULL +enable_so_ftdi_instances_vardecl_ftdi_elan_c_23438 ftdi_instances vardecl_ftdi-elan.c 0 23438 NULL +enable_so_set_xfer_rate_fndecl_23440 set_xfer_rate fndecl 2 23440 NULL +enable_so_mei_cl_recv_fndecl_23442 mei_cl_recv fndecl 0-3 23442 NULL @@ -165673,7 +165793,6 @@ index 0000000..a883e73 +enable_so_faultin_page_fndecl_57994 faultin_page fndecl 3 57994 NULL +enable_so_perf_sample_ustack_size_fndecl_57995 perf_sample_ustack_size fndecl 0-2-1 57995 NULL +enable_so_max_idx_node_sz_ubifs_info_57997 max_idx_node_sz ubifs_info 0 57997 NULL -+enable_so_iopm_base_pa_vmcb_control_area_57998 iopm_base_pa vmcb_control_area 0 57998 NULL +enable_so_SSIDlen_StatusRid_58002 SSIDlen StatusRid 0 58002 NULL nohasharray +enable_so_di_size_dinode_58002 di_size dinode 0 58002 &enable_so_SSIDlen_StatusRid_58002 +enable_so_set_alt_usb_function_58003 set_alt usb_function 0 58003 NULL @@ -166843,7 +166962,6 @@ index 0000000..a883e73 +enable_so_do_lfb_size_fndecl_61720 do_lfb_size fndecl 0 61720 NULL +enable_so_dm_bufio_new_fndecl_61727 dm_bufio_new fndecl 2 61727 NULL +enable_so_btrfs_prev_leaf_fndecl_61728 btrfs_prev_leaf fndecl 0 61728 NULL -+enable_so_exit_info_2_vmcb_control_area_61734 exit_info_2 vmcb_control_area 0 61734 NULL +enable_so_n_patterns_cfg80211_wowlan_61737 n_patterns cfg80211_wowlan 0 61737 NULL +enable_so_pci_msix_vec_count_fndecl_61742 pci_msix_vec_count fndecl 0 61742 NULL +enable_so_count_nfs_pgio_args_61745 count nfs_pgio_args 0 61745 NULL nohasharray @@ -170562,7 +170680,7 @@ index 0000000..317cd6c + diff --git a/tools/gcc/size_overflow_plugin/size_overflow_transform.c b/tools/gcc/size_overflow_plugin/size_overflow_transform.c new file mode 100644 -index 0000000..78e16db +index 0000000..a974b2d --- /dev/null +++ b/tools/gcc/size_overflow_plugin/size_overflow_transform.c @@ -0,0 +1,746 @@ @@ -170752,7 +170870,7 @@ index 0000000..78e16db + if (skip_types(orig_node)) + return head; + // !!! temporarily ignore bitfield types -+ if (DECL_BIT_FIELD_TYPE(orig_node)) ++ if (orig_code == FIELD_DECL && DECL_BIT_FIELD_TYPE(orig_node)) + return head; + + // find a defining marked caller argument or struct field for arg @@ -171110,7 +171228,7 @@ index 0000000..78e16db + return head; + + // !!! temporarily ignore bitfield types -+ if (DECL_BIT_FIELD_TYPE(decl)) ++ if (TREE_CODE(decl) == FIELD_DECL && DECL_BIT_FIELD_TYPE(decl)) + return head; + + next_node = get_interesting_function_next_node(decl, 0);