| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 | diff --git a/Kconfig b/Kconfigindex c13f48d..e18713e 100644--- a/Kconfig+++ b/Kconfig@@ -9,3 +9,4 @@ config SRCARCH 	option env="SRCARCH"  source "arch/$SRCARCH/Kconfig"+source "graphene/Kconfig"diff --git a/Makefile b/Makefileindex e5ac8a6..116ac82 100644--- a/Makefile+++ b/Makefile@@ -779,7 +779,7 @@ export mod_sign_cmd   ifeq ($(KBUILD_EXTMOD),)-core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/+core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/ graphene/  vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ 		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \diff --git a/include/linux/miscdevice.h b/include/linux/miscdevice.hindex 3737f72..f7a4aba 100644--- a/include/linux/miscdevice.h+++ b/include/linux/miscdevice.h@@ -3,6 +3,7 @@ #include <linux/major.h> #include <linux/list.h> #include <linux/types.h>+#include <../graphene/graphene.h>  /*  *	These allocations are managed by device@lanana.org. If you use andiff --git a/include/linux/sched.h b/include/linux/sched.hindex a781dec..3381137 100644--- a/include/linux/sched.h+++ b/include/linux/sched.h@@ -1161,6 +1161,11 @@ enum perf_event_task_context { 	perf_nr_task_contexts, }; +#ifdef CONFIG_GRAPHENE+# include <../graphene/graphene.h>+struct graphene_struct;+#endif+ struct task_struct { 	volatile long state;	/* -1 unrunnable, 0 runnable, >0 stopped */ 	void *stack;@@ -1581,6 +1586,11 @@ struct task_struct { 	unsigned int	sequential_io; 	unsigned int	sequential_io_avg; #endif++#ifdef CONFIG_GRAPHENE+	/* for graphene tasks */+	struct graphene_struct *graphene; /* structure to store graphene info */+#endif };  /* Future-safe accessor for struct task_struct's cpus_allowed. */diff --git a/kernel/fork.c b/kernel/fork.cindex a17621c..41d5958 100644--- a/kernel/fork.c+++ b/kernel/fork.c@@ -11,6 +11,7 @@  * management can be a bitch. See 'mm/memory.c': 'copy_page_range()'  */ +#include <linux/version.h> #include <linux/slab.h> #include <linux/init.h> #include <linux/unistd.h>@@ -84,6 +85,10 @@ #define CREATE_TRACE_POINTS #include <trace/events/task.h> +#ifdef CONFIG_GRAPHENE+# include <../graphene/graphene.h>+#endif+ /*  * Protected counters by write_lock_irq(&tasklist_lock)  */@@ -242,6 +247,10 @@ void __put_task_struct(struct task_struct *tsk) 	delayacct_tsk_free(tsk); 	put_signal_struct(tsk->signal); +#ifdef CONFIG_GRAPHENE+	put_graphene_struct(tsk);+#endif+ 	if (!profile_handoff_task(tsk)) 		free_task(tsk); }@@ -322,6 +331,16 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) 	tsk->stack_canary = get_random_int(); #endif +#ifdef CONFIG_GRAPHENE+	err = dup_graphene_struct(tsk);+	if (err)+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)+		goto free_ti;+#else+		goto out;+#endif+#endif+ 	/* 	 * One for us, one for whoever does the "release_task()" (usually 	 * parent)diff -ruNp linux-3.19/mm/mmap.c linux-3.19.new/mm/mmap.c--- linux-3.19/mm/mmap.c	2015-02-08 21:54:22.000000000 -0500+++ linux-3.19.new/mm/mmap.c	2016-08-23 22:15:18.387511888 -0400@@ -2000,6 +2000,10 @@ arch_get_unmapped_area_topdown(struct fi } #endif +#ifdef CONFIG_GRAPHENE+# include <../graphene/graphene.h>+#endif+ unsigned long get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, 		unsigned long pgoff, unsigned long flags)@@ -2018,6 +2022,10 @@ get_unmapped_area(struct file *file, uns 	get_area = current->mm->get_unmapped_area; 	if (file && file->f_op->get_unmapped_area) 		get_area = file->f_op->get_unmapped_area;+#ifdef CONFIG_GRAPHENE+	if (file && current->in_execve && GRAPHENE_ENABLED())+		get_area = graphene_execve_get_area;+#endif 	addr = get_area(file, addr, len, pgoff, flags); 	if (IS_ERR_VALUE(addr)) 		return addr;diff --git a/security/apparmor/lsm.c b/security/apparmor/lsm.cindex 4257b7e..b21c19d 100644--- a/security/apparmor/lsm.c+++ b/security/apparmor/lsm.c@@ -36,6 +36,10 @@ #include "include/policy.h" #include "include/procattr.h" +#ifdef CONFIG_GRAPHENE+# include <../graphene/graphene.h>+#endif+ /* Flag indicating whether initialization completed */ int apparmor_initialized __initdata; @@ -165,6 +169,12 @@ static int common_perm(int op, struct path *path, u32 mask, 	struct aa_profile *profile; 	int error = 0; +#ifdef CONFIG_GRAPHENE+	if (GRAPHENE_ENABLED() &&+	    (error = graphene_common_perm(op, path, mask)))+		return error;+#endif+ 	profile = __aa_current_profile(); 	if (!unconfined(profile)) 		error = aa_path_perm(op, profile, path, 0, mask, cond);@@ -377,6 +387,7 @@ static int apparmor_file_open(struct file *file, const struct cred *cred) { 	struct aa_file_cxt *fcxt = file->f_security; 	struct aa_profile *profile;+	u32 mask; 	int error = 0;  	if (!mediated_filesystem(file_inode(file)))@@ -388,10 +399,21 @@ static int apparmor_file_open(struct file *file, const struct cred *cred) 	 * actually execute the image. 	 */ 	if (current->in_execve) {+#ifdef CONFIG_GRAPHENE+		if (GRAPHENE_ENABLED() && (error = graphene_execve_open(file)))+			return error;+#endif 		fcxt->allow = MAY_EXEC | MAY_READ | AA_EXEC_MMAP; 		return 0; 	} +#ifdef CONFIG_GRAPHENE+	mask = aa_map_file_to_perms(file);+	if (GRAPHENE_ENABLED() &&+	    (error = graphene_common_perm(OP_OPEN, &file->f_path, mask)))+		return error;+#endif+ 	profile = aa_cred_profile(cred); 	if (!unconfined(profile)) { 		struct inode *inode = file_inode(file);@@ -647,6 +669,14 @@ static struct security_operations apparmor_ops = { 	.getprocattr =			apparmor_getprocattr, 	.setprocattr =			apparmor_setprocattr, +#ifdef CONFIG_GRAPHENE+	.socket_bind =			graphene_socket_bind,+	.socket_listen =		graphene_socket_listen,+	.socket_connect =		graphene_socket_connect,+	.socket_sendmsg =		graphene_socket_sendmsg,+	.socket_recvmsg =		graphene_socket_recvmsg,+#endif+ 	.cred_alloc_blank =		apparmor_cred_alloc_blank, 	.cred_free =			apparmor_cred_free, 	.cred_prepare =			apparmor_cred_prepare,@@ -658,6 +688,10 @@ static struct security_operations apparmor_ops = { 	.bprm_secureexec =		apparmor_bprm_secureexec,  	.task_setrlimit =		apparmor_task_setrlimit,++#ifdef CONFIG_GRAPHENE+	.task_kill =			graphene_task_kill,+#endif };  /*
 |