aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/linux-grsec/APKBUILD10
-rw-r--r--main/linux-grsec/grsecurity-2.2.2-3.2.4-201202051927.patch (renamed from main/linux-grsec/grsecurity-2.2.2-3.2.2-201201302345.patch)919
2 files changed, 430 insertions, 499 deletions
diff --git a/main/linux-grsec/APKBUILD b/main/linux-grsec/APKBUILD
index 3726f6cd39..500e8b4c42 100644
--- a/main/linux-grsec/APKBUILD
+++ b/main/linux-grsec/APKBUILD
@@ -2,9 +2,9 @@
_flavor=grsec
pkgname=linux-${_flavor}
-pkgver=3.2.2
+pkgver=3.2.4
_kernver=3.2
-pkgrel=3
+pkgrel=0
pkgdesc="Linux kernel with grsecurity"
url=http://grsecurity.net
depends="mkinitfs linux-firmware"
@@ -14,7 +14,7 @@ _config=${config:-kernelconfig.${CARCH}}
install=
source="ftp://ftp.kernel.org/pub/linux/kernel/v3.0/linux-$_kernver.tar.bz2
ftp://ftp.kernel.org/pub/linux/kernel/v3.0/patch-$pkgver.bz2
- grsecurity-2.2.2-3.2.2-201201302345.patch
+ grsecurity-2.2.2-3.2.4-201202051927.patch
0004-arp-flush-arp-cache-on-device-change.patch
@@ -140,8 +140,8 @@ dev() {
}
md5sums="7ceb61f87c097fc17509844b71268935 linux-3.2.tar.bz2
-e9e53fba37c5e2afa4cdecab234120bd patch-3.2.2.bz2
-54c66601d38283f4561acd7cf48f7a0a grsecurity-2.2.2-3.2.2-201201302345.patch
+02adf3e0450969dec6219ca52ff2a68a patch-3.2.4.bz2
+87a8ebc1d936b51263e09f0ba95ca0ad grsecurity-2.2.2-3.2.4-201202051927.patch
776adeeb5272093574f8836c5037dd7d 0004-arp-flush-arp-cache-on-device-change.patch
f3eda7112ef074a4121ec6de943c63ee x86-centaur-enable-cx8-for-via-eden-too.patch
62cc7d7b5ba7ef05b72ff91c0411c189 linux-3.0.x-regression-with-ipv4-routes-having-mtu.patch
diff --git a/main/linux-grsec/grsecurity-2.2.2-3.2.2-201201302345.patch b/main/linux-grsec/grsecurity-2.2.2-3.2.4-201202051927.patch
index 5a35b2ea25..b2dcf41b69 100644
--- a/main/linux-grsec/grsecurity-2.2.2-3.2.2-201201302345.patch
+++ b/main/linux-grsec/grsecurity-2.2.2-3.2.4-201202051927.patch
@@ -186,7 +186,7 @@ index 81c287f..d456d02 100644
pcd. [PARIDE]
diff --git a/Makefile b/Makefile
-index 2f684da..bf21f8d 100644
+index c8e187e..c445af7 100644
--- a/Makefile
+++ b/Makefile
@@ -245,8 +245,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
@@ -12223,19 +12223,18 @@ index 2af127d..8ff7ac0 100644
atomic_set(&mce_callin, 0);
atomic_set(&global_nwo, 0);
diff --git a/arch/x86/kernel/cpu/mcheck/p5.c b/arch/x86/kernel/cpu/mcheck/p5.c
-index 5c0e653..51ddf2c 100644
+index 5c0e653..0882b0a 100644
--- a/arch/x86/kernel/cpu/mcheck/p5.c
+++ b/arch/x86/kernel/cpu/mcheck/p5.c
-@@ -11,7 +11,7 @@
- #include <asm/processor.h>
+@@ -12,6 +12,7 @@
#include <asm/system.h>
#include <asm/mce.h>
--#include <asm/msr.h>
+ #include <asm/msr.h>
+#include <asm/pgtable.h>
/* By default disabled */
int mce_p5_enabled __read_mostly;
-@@ -50,7 +50,9 @@ void intel_p5_mcheck_init(struct cpuinfo_x86 *c)
+@@ -50,7 +51,9 @@ void intel_p5_mcheck_init(struct cpuinfo_x86 *c)
if (!cpu_has(c, X86_FEATURE_MCE))
return;
@@ -22963,7 +22962,7 @@ index 7b179b4..6bd1777 100644
return (void *)vaddr;
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
-index be1ef57..9680edc 100644
+index be1ef57..55f0160 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -97,7 +97,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
@@ -22975,7 +22974,17 @@ index be1ef57..9680edc 100644
return NULL;
WARN_ON_ONCE(is_ram);
}
-@@ -344,7 +344,7 @@ static int __init early_ioremap_debug_setup(char *str)
+@@ -315,6 +315,9 @@ void *xlate_dev_mem_ptr(unsigned long phys)
+
+ /* If page is RAM, we can use __va. Otherwise ioremap and unmap. */
+ if (page_is_ram(start >> PAGE_SHIFT))
++#ifdef CONFIG_HIGHMEM
++ if ((start >> PAGE_SHIFT) < max_low_pfn)
++#endif
+ return __va(phys);
+
+ addr = (void __force *)ioremap_cache(start, PAGE_SIZE);
+@@ -344,7 +347,7 @@ static int __init early_ioremap_debug_setup(char *str)
early_param("early_ioremap_debug", early_ioremap_debug_setup);
static __initdata int after_paging_init;
@@ -22984,7 +22993,7 @@ index be1ef57..9680edc 100644
static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
{
-@@ -381,8 +381,7 @@ void __init early_ioremap_init(void)
+@@ -381,8 +384,7 @@ void __init early_ioremap_init(void)
slot_virt[i] = __fix_to_virt(FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*i);
pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
@@ -23725,7 +23734,7 @@ index 6687022..ceabcfa 100644
+ pax_force_retaddr
ret
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
-index 7b65f75..63097f6 100644
+index 7c1b765..180e3b2 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -117,6 +117,10 @@ static inline void bpf_flush_icache(void *start, void *end)
@@ -23750,7 +23759,7 @@ index 7b65f75..63097f6 100644
/* Before first pass, make a rough estimation of addrs[]
* each bpf instruction is translated to less than 64 bytes
*/
-@@ -585,11 +593,12 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
+@@ -592,11 +600,12 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
if (image) {
if (unlikely(proglen + ilen > oldproglen)) {
pr_err("bpb_jit_compile fatal error\n");
@@ -23766,7 +23775,7 @@ index 7b65f75..63097f6 100644
}
proglen += ilen;
addrs[i] = proglen;
-@@ -609,7 +618,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
+@@ -617,7 +626,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
break;
}
if (proglen == oldproglen) {
@@ -23775,7 +23784,7 @@ index 7b65f75..63097f6 100644
proglen,
sizeof(struct work_struct)));
if (!image)
-@@ -631,24 +640,27 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
+@@ -639,24 +648,27 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
fp->bpf_func = (void *)image;
}
out:
@@ -24994,109 +25003,6 @@ index 671d4d6..5f24030 100644
static void cryptd_queue_worker(struct work_struct *work);
-diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c
-index 9ed9f60..88f160b 100644
---- a/crypto/sha512_generic.c
-+++ b/crypto/sha512_generic.c
-@@ -21,8 +21,6 @@
- #include <linux/percpu.h>
- #include <asm/byteorder.h>
-
--static DEFINE_PER_CPU(u64[80], msg_schedule);
--
- static inline u64 Ch(u64 x, u64 y, u64 z)
- {
- return z ^ (x & (y ^ z));
-@@ -80,7 +78,7 @@ static inline void LOAD_OP(int I, u64 *W, const u8 *input)
-
- static inline void BLEND_OP(int I, u64 *W)
- {
-- W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
-+ W[I % 16] += s1(W[(I-2) % 16]) + W[(I-7) % 16] + s0(W[(I-15) % 16]);
- }
-
- static void
-@@ -89,38 +87,48 @@ sha512_transform(u64 *state, const u8 *input)
- u64 a, b, c, d, e, f, g, h, t1, t2;
-
- int i;
-- u64 *W = get_cpu_var(msg_schedule);
-+ u64 W[16];
-
- /* load the input */
- for (i = 0; i < 16; i++)
- LOAD_OP(i, W, input);
-
-- for (i = 16; i < 80; i++) {
-- BLEND_OP(i, W);
-- }
--
- /* load the state into our registers */
- a=state[0]; b=state[1]; c=state[2]; d=state[3];
- e=state[4]; f=state[5]; g=state[6]; h=state[7];
-
-- /* now iterate */
-- for (i=0; i<80; i+=8) {
-- t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[i ];
-- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
-- t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[i+1];
-- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
-- t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[i+2];
-- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
-- t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[i+3];
-- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
-- t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[i+4];
-- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
-- t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[i+5];
-- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
-- t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[i+6];
-- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
-- t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[i+7];
-- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-+#define SHA512_0_15(i, a, b, c, d, e, f, g, h) \
-+ t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[i]; \
-+ t2 = e0(a) + Maj(a, b, c); \
-+ d += t1; \
-+ h = t1 + t2
-+
-+#define SHA512_16_79(i, a, b, c, d, e, f, g, h) \
-+ BLEND_OP(i, W); \
-+ t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[(i)%16]; \
-+ t2 = e0(a) + Maj(a, b, c); \
-+ d += t1; \
-+ h = t1 + t2
-+
-+ for (i = 0; i < 16; i += 8) {
-+ SHA512_0_15(i, a, b, c, d, e, f, g, h);
-+ SHA512_0_15(i + 1, h, a, b, c, d, e, f, g);
-+ SHA512_0_15(i + 2, g, h, a, b, c, d, e, f);
-+ SHA512_0_15(i + 3, f, g, h, a, b, c, d, e);
-+ SHA512_0_15(i + 4, e, f, g, h, a, b, c, d);
-+ SHA512_0_15(i + 5, d, e, f, g, h, a, b, c);
-+ SHA512_0_15(i + 6, c, d, e, f, g, h, a, b);
-+ SHA512_0_15(i + 7, b, c, d, e, f, g, h, a);
-+ }
-+ for (i = 16; i < 80; i += 8) {
-+ SHA512_16_79(i, a, b, c, d, e, f, g, h);
-+ SHA512_16_79(i + 1, h, a, b, c, d, e, f, g);
-+ SHA512_16_79(i + 2, g, h, a, b, c, d, e, f);
-+ SHA512_16_79(i + 3, f, g, h, a, b, c, d, e);
-+ SHA512_16_79(i + 4, e, f, g, h, a, b, c, d);
-+ SHA512_16_79(i + 5, d, e, f, g, h, a, b, c);
-+ SHA512_16_79(i + 6, c, d, e, f, g, h, a, b);
-+ SHA512_16_79(i + 7, b, c, d, e, f, g, h, a);
- }
-
- state[0] += a; state[1] += b; state[2] += c; state[3] += d;
-@@ -128,8 +136,6 @@ sha512_transform(u64 *state, const u8 *input)
-
- /* erase our data */
- a = b = c = d = e = f = g = h = t1 = t2 = 0;
-- memset(W, 0, sizeof(__get_cpu_var(msg_schedule)));
-- put_cpu_var(msg_schedule);
- }
-
- static int
diff --git a/drivers/acpi/apei/cper.c b/drivers/acpi/apei/cper.c
index 5d41894..22021e4 100644
--- a/drivers/acpi/apei/cper.c
@@ -27943,7 +27849,7 @@ index 40c187c..5746164 100644
DRM_DEBUG("pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n",
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
-index 4911e1d..484c8a3 100644
+index 828bf65..cdaa0e9 100644
--- a/drivers/gpu/drm/drm_fops.c
+++ b/drivers/gpu/drm/drm_fops.c
@@ -71,7 +71,7 @@ static int drm_setup(struct drm_device * dev)
@@ -27982,9 +27888,9 @@ index 4911e1d..484c8a3 100644
- dev->open_count);
+ local_read(&dev->open_count));
- /* if the master has gone away we can't do anything with the lock */
- if (file_priv->minor->master)
-@@ -566,8 +566,8 @@ int drm_release(struct inode *inode, struct file *filp)
+ /* Release any auth tokens that might point to this file_priv,
+ (do that under the drm_global_mutex) */
+@@ -571,8 +571,8 @@ int drm_release(struct inode *inode, struct file *filp)
* End inline drm_release
*/
@@ -29164,7 +29070,7 @@ index 66f6729..2d6de0a 100644
mutex_lock(&resource->lock);
resource->trip[attr->index - 7] = temp;
diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c
-index fe4104c..346febb 100644
+index 5357925..6cf0418 100644
--- a/drivers/hwmon/sht15.c
+++ b/drivers/hwmon/sht15.c
@@ -166,7 +166,7 @@ struct sht15_data {
@@ -41419,80 +41325,8 @@ index f3a257d..715ac0f 100644
parent, NULL, NULL);
}
EXPORT_SYMBOL_GPL(debugfs_create_dir);
-diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
-index 2a83425..b082cec 100644
---- a/fs/ecryptfs/crypto.c
-+++ b/fs/ecryptfs/crypto.c
-@@ -417,17 +417,6 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page,
- (unsigned long long)(extent_base + extent_offset), rc);
- goto out;
- }
-- if (unlikely(ecryptfs_verbosity > 0)) {
-- ecryptfs_printk(KERN_DEBUG, "Encrypting extent "
-- "with iv:\n");
-- ecryptfs_dump_hex(extent_iv, crypt_stat->iv_bytes);
-- ecryptfs_printk(KERN_DEBUG, "First 8 bytes before "
-- "encryption:\n");
-- ecryptfs_dump_hex((char *)
-- (page_address(page)
-- + (extent_offset * crypt_stat->extent_size)),
-- 8);
-- }
- rc = ecryptfs_encrypt_page_offset(crypt_stat, enc_extent_page, 0,
- page, (extent_offset
- * crypt_stat->extent_size),
-@@ -440,14 +429,6 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page,
- goto out;
- }
- rc = 0;
-- if (unlikely(ecryptfs_verbosity > 0)) {
-- ecryptfs_printk(KERN_DEBUG, "Encrypt extent [0x%.16llx]; "
-- "rc = [%d]\n",
-- (unsigned long long)(extent_base + extent_offset), rc);
-- ecryptfs_printk(KERN_DEBUG, "First 8 bytes after "
-- "encryption:\n");
-- ecryptfs_dump_hex((char *)(page_address(enc_extent_page)), 8);
-- }
- out:
- return rc;
- }
-@@ -543,17 +524,6 @@ static int ecryptfs_decrypt_extent(struct page *page,
- (unsigned long long)(extent_base + extent_offset), rc);
- goto out;
- }
-- if (unlikely(ecryptfs_verbosity > 0)) {
-- ecryptfs_printk(KERN_DEBUG, "Decrypting extent "
-- "with iv:\n");
-- ecryptfs_dump_hex(extent_iv, crypt_stat->iv_bytes);
-- ecryptfs_printk(KERN_DEBUG, "First 8 bytes before "
-- "decryption:\n");
-- ecryptfs_dump_hex((char *)
-- (page_address(enc_extent_page)
-- + (extent_offset * crypt_stat->extent_size)),
-- 8);
-- }
- rc = ecryptfs_decrypt_page_offset(crypt_stat, page,
- (extent_offset
- * crypt_stat->extent_size),
-@@ -567,16 +537,6 @@ static int ecryptfs_decrypt_extent(struct page *page,
- goto out;
- }
- rc = 0;
-- if (unlikely(ecryptfs_verbosity > 0)) {
-- ecryptfs_printk(KERN_DEBUG, "Decrypt extent [0x%.16llx]; "
-- "rc = [%d]\n",
-- (unsigned long long)(extent_base + extent_offset), rc);
-- ecryptfs_printk(KERN_DEBUG, "First 8 bytes after "
-- "decryption:\n");
-- ecryptfs_dump_hex((char *)(page_address(page)
-- + (extent_offset
-- * crypt_stat->extent_size)), 8);
-- }
- out:
- return rc;
- }
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
-index 32f90a3..a766407 100644
+index d2039ca..a766407 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -691,7 +691,7 @@ static int ecryptfs_readlink_lower(struct dentry *dentry, char **buf,
@@ -41522,84 +41356,8 @@ index 32f90a3..a766407 100644
if (!IS_ERR(buf)) {
/* Free the char* */
kfree(buf);
-@@ -841,18 +841,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia,
- size_t num_zeros = (PAGE_CACHE_SIZE
- - (ia->ia_size & ~PAGE_CACHE_MASK));
-
--
-- /*
-- * XXX(truncate) this should really happen at the begginning
-- * of ->setattr. But the code is too messy to that as part
-- * of a larger patch. ecryptfs is also totally missing out
-- * on the inode_change_ok check at the beginning of
-- * ->setattr while would include this.
-- */
-- rc = inode_newsize_ok(inode, ia->ia_size);
-- if (rc)
-- goto out;
--
- if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
- truncate_setsize(inode, ia->ia_size);
- lower_ia->ia_size = ia->ia_size;
-@@ -902,6 +890,28 @@ out:
- return rc;
- }
-
-+static int ecryptfs_inode_newsize_ok(struct inode *inode, loff_t offset)
-+{
-+ struct ecryptfs_crypt_stat *crypt_stat;
-+ loff_t lower_oldsize, lower_newsize;
-+
-+ crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
-+ lower_oldsize = upper_size_to_lower_size(crypt_stat,
-+ i_size_read(inode));
-+ lower_newsize = upper_size_to_lower_size(crypt_stat, offset);
-+ if (lower_newsize > lower_oldsize) {
-+ /*
-+ * The eCryptfs inode and the new *lower* size are mixed here
-+ * because we may not have the lower i_mutex held and/or it may
-+ * not be appropriate to call inode_newsize_ok() with inodes
-+ * from other filesystems.
-+ */
-+ return inode_newsize_ok(inode, lower_newsize);
-+ }
-+
-+ return 0;
-+}
-+
- /**
- * ecryptfs_truncate
- * @dentry: The ecryptfs layer dentry
-@@ -918,6 +928,10 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
- struct iattr lower_ia = { .ia_valid = 0 };
- int rc;
-
-+ rc = ecryptfs_inode_newsize_ok(dentry->d_inode, new_length);
-+ if (rc)
-+ return rc;
-+
- rc = truncate_upper(dentry, &ia, &lower_ia);
- if (!rc && lower_ia.ia_valid & ATTR_SIZE) {
- struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
-@@ -997,6 +1011,16 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia)
- }
- }
- mutex_unlock(&crypt_stat->cs_mutex);
-+
-+ rc = inode_change_ok(inode, ia);
-+ if (rc)
-+ goto out;
-+ if (ia->ia_valid & ATTR_SIZE) {
-+ rc = ecryptfs_inode_newsize_ok(inode, ia->ia_size);
-+ if (rc)
-+ goto out;
-+ }
-+
- if (S_ISREG(inode->i_mode)) {
- rc = filemap_write_and_wait(inode->i_mapping);
- if (rc)
diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c
-index 940a82e..d3cdeea 100644
+index 0dc5a3d..d3cdeea 100644
--- a/fs/ecryptfs/miscdev.c
+++ b/fs/ecryptfs/miscdev.c
@@ -328,7 +328,7 @@ check_list:
@@ -41611,82 +41369,8 @@ index 940a82e..d3cdeea 100644
goto out_unlock_msg_ctx;
i += packet_length_size;
if (copy_to_user(&buf[i], msg_ctx->msg, msg_ctx->msg_size))
-@@ -409,11 +409,47 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf,
- ssize_t sz = 0;
- char *data;
- uid_t euid = current_euid();
-+ unsigned char packet_size_peek[3];
- int rc;
-
-- if (count == 0)
-+ if (count == 0) {
- goto out;
-+ } else if (count == (1 + 4)) {
-+ /* Likely a harmless MSG_HELO or MSG_QUIT - no packet length */
-+ goto memdup;
-+ } else if (count < (1 + 4 + 1)
-+ || count > (1 + 4 + 2 + sizeof(struct ecryptfs_message) + 4
-+ + ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES)) {
-+ printk(KERN_WARNING "%s: Acceptable packet size range is "
-+ "[%d-%lu], but amount of data written is [%zu].",
-+ __func__, (1 + 4 + 1),
-+ (1 + 4 + 2 + sizeof(struct ecryptfs_message) + 4
-+ + ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES), count);
-+ return -EINVAL;
-+ }
-
-+ if (copy_from_user(packet_size_peek, (buf + 1 + 4),
-+ sizeof(packet_size_peek))) {
-+ printk(KERN_WARNING "%s: Error while inspecting packet size\n",
-+ __func__);
-+ return -EFAULT;
-+ }
-+
-+ rc = ecryptfs_parse_packet_length(packet_size_peek, &packet_size,
-+ &packet_size_length);
-+ if (rc) {
-+ printk(KERN_WARNING "%s: Error parsing packet length; "
-+ "rc = [%d]\n", __func__, rc);
-+ return rc;
-+ }
-+
-+ if ((1 + 4 + packet_size_length + packet_size) != count) {
-+ printk(KERN_WARNING "%s: Invalid packet size [%zu]\n", __func__,
-+ packet_size);
-+ return -EINVAL;
-+ }
-+
-+memdup:
- data = memdup_user(buf, count);
- if (IS_ERR(data)) {
- printk(KERN_ERR "%s: memdup_user returned error [%ld]\n",
-@@ -435,23 +471,7 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf,
- }
- memcpy(&counter_nbo, &data[i], 4);
- seq = be32_to_cpu(counter_nbo);
-- i += 4;
-- rc = ecryptfs_parse_packet_length(&data[i], &packet_size,
-- &packet_size_length);
-- if (rc) {
-- printk(KERN_WARNING "%s: Error parsing packet length; "
-- "rc = [%d]\n", __func__, rc);
-- goto out_free;
-- }
-- i += packet_size_length;
-- if ((1 + 4 + packet_size_length + packet_size) != count) {
-- printk(KERN_WARNING "%s: (1 + packet_size_length([%zd])"
-- " + packet_size([%zd]))([%zd]) != "
-- "count([%zd]). Invalid packet format.\n",
-- __func__, packet_size_length, packet_size,
-- (1 + packet_size_length + packet_size), count);
-- goto out_free;
-- }
-+ i += 4 + packet_size_length;
- rc = ecryptfs_miscdev_response(&data[i], packet_size,
- euid, current_user_ns(),
- task_pid(current), seq);
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c
-index 3745f7c..7d040a8 100644
+index 54eb14c..e51b453 100644
--- a/fs/ecryptfs/read_write.c
+++ b/fs/ecryptfs/read_write.c
@@ -48,7 +48,7 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
@@ -41698,7 +41382,7 @@ index 3745f7c..7d040a8 100644
set_fs(fs_save);
mark_inode_dirty_sync(ecryptfs_inode);
return rc;
-@@ -130,13 +130,18 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
+@@ -130,7 +130,12 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
pgoff_t ecryptfs_page_idx = (pos >> PAGE_CACHE_SHIFT);
size_t start_offset_in_page = (pos & ~PAGE_CACHE_MASK);
size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page);
@@ -41710,7 +41394,9 @@ index 3745f7c..7d040a8 100644
+ break;
+ }
- if (num_bytes > total_remaining_bytes)
+ if (fatal_signal_pending(current)) {
+ rc = -EINTR;
+@@ -141,7 +146,7 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
num_bytes = total_remaining_bytes;
if (pos < offset) {
/* remaining zeros to write, up to destination offset */
@@ -41719,32 +41405,7 @@ index 3745f7c..7d040a8 100644
if (num_bytes > total_remaining_zeros)
num_bytes = total_remaining_zeros;
-@@ -193,15 +198,19 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
- }
- pos += num_bytes;
- }
-- if ((offset + size) > ecryptfs_file_size) {
-- i_size_write(ecryptfs_inode, (offset + size));
-+ if (pos > ecryptfs_file_size) {
-+ i_size_write(ecryptfs_inode, pos);
- if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) {
-- rc = ecryptfs_write_inode_size_to_metadata(
-+ int rc2;
-+
-+ rc2 = ecryptfs_write_inode_size_to_metadata(
- ecryptfs_inode);
-- if (rc) {
-+ if (rc2) {
- printk(KERN_ERR "Problem with "
- "ecryptfs_write_inode_size_to_metadata; "
-- "rc = [%d]\n", rc);
-+ "rc = [%d]\n", rc2);
-+ if (!rc)
-+ rc = rc2;
- goto out;
- }
- }
-@@ -235,7 +244,7 @@ int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
+@@ -244,7 +249,7 @@ int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
return -EIO;
fs_save = get_fs();
set_fs(get_ds());
@@ -45601,7 +45262,7 @@ index 3a1dafd..d41fc37 100644
+}
+#endif
diff --git a/fs/proc/base.c b/fs/proc/base.c
-index 1fc1dca..813fd0b 100644
+index 1fc1dca..357b933 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -107,6 +107,22 @@ struct pid_entry {
@@ -45627,24 +45288,34 @@ index 1fc1dca..813fd0b 100644
#define NOD(NAME, MODE, IOP, FOP, OP) { \
.name = (NAME), \
.len = sizeof(NAME) - 1, \
-@@ -204,10 +220,12 @@ static struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
- return ERR_PTR(err);
+@@ -194,26 +210,6 @@ static int proc_root_link(struct inode *inode, struct path *path)
+ return result;
+ }
- mm = get_task_mm(task);
+-static struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
+-{
+- struct mm_struct *mm;
+- int err;
+-
+- err = mutex_lock_killable(&task->signal->cred_guard_mutex);
+- if (err)
+- return ERR_PTR(err);
+-
+- mm = get_task_mm(task);
- if (mm && mm != current->mm &&
- !ptrace_may_access(task, mode)) {
- mmput(mm);
- mm = ERR_PTR(-EACCES);
-+ if (mm) {
-+ if ((mm != current->mm && !ptrace_may_access(task, mode)) ||
-+ (mode == PTRACE_MODE_ATTACH && (gr_handle_proc_ptrace(task) || gr_acl_handle_procpidmem(task)))) {
-+ mmput(mm);
-+ mm = ERR_PTR(-EACCES);
-+ }
- }
- mutex_unlock(&task->signal->cred_guard_mutex);
-
-@@ -229,6 +247,9 @@ static int proc_pid_cmdline(struct task_struct *task, char * buffer)
+- }
+- mutex_unlock(&task->signal->cred_guard_mutex);
+-
+- return mm;
+-}
+-
+ struct mm_struct *mm_for_maps(struct task_struct *task)
+ {
+ return mm_access(task, PTRACE_MODE_READ);
+@@ -229,6 +225,9 @@ static int proc_pid_cmdline(struct task_struct *task, char * buffer)
if (!mm->arg_end)
goto out_mm; /* Shh! No looking before we're done */
@@ -45654,7 +45325,7 @@ index 1fc1dca..813fd0b 100644
len = mm->arg_end - mm->arg_start;
if (len > PAGE_SIZE)
-@@ -256,12 +277,28 @@ out:
+@@ -256,12 +255,28 @@ out:
return res;
}
@@ -45683,7 +45354,7 @@ index 1fc1dca..813fd0b 100644
do {
nwords += 2;
} while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */
-@@ -275,7 +312,7 @@ static int proc_pid_auxv(struct task_struct *task, char *buffer)
+@@ -275,7 +290,7 @@ static int proc_pid_auxv(struct task_struct *task, char *buffer)
}
@@ -45692,7 +45363,7 @@ index 1fc1dca..813fd0b 100644
/*
* Provides a wchan file via kallsyms in a proper one-value-per-file format.
* Returns the resolved symbol. If that fails, simply return the address.
-@@ -314,7 +351,7 @@ static void unlock_trace(struct task_struct *task)
+@@ -314,7 +329,7 @@ static void unlock_trace(struct task_struct *task)
mutex_unlock(&task->signal->cred_guard_mutex);
}
@@ -45701,7 +45372,7 @@ index 1fc1dca..813fd0b 100644
#define MAX_STACK_TRACE_DEPTH 64
-@@ -505,7 +542,7 @@ static int proc_pid_limits(struct task_struct *task, char *buffer)
+@@ -505,7 +520,7 @@ static int proc_pid_limits(struct task_struct *task, char *buffer)
return count;
}
@@ -45710,7 +45381,7 @@ index 1fc1dca..813fd0b 100644
static int proc_pid_syscall(struct task_struct *task, char *buffer)
{
long nr;
-@@ -534,7 +571,7 @@ static int proc_pid_syscall(struct task_struct *task, char *buffer)
+@@ -534,7 +549,7 @@ static int proc_pid_syscall(struct task_struct *task, char *buffer)
/************************************************************************/
/* permission checks */
@@ -45719,7 +45390,7 @@ index 1fc1dca..813fd0b 100644
{
struct task_struct *task;
int allowed = 0;
-@@ -544,7 +581,10 @@ static int proc_fd_access_allowed(struct inode *inode)
+@@ -544,7 +559,10 @@ static int proc_fd_access_allowed(struct inode *inode)
*/
task = get_proc_task(inode);
if (task) {
@@ -45731,26 +45402,164 @@ index 1fc1dca..813fd0b 100644
put_task_struct(task);
}
return allowed;
-@@ -826,6 +866,10 @@ static ssize_t mem_read(struct file * file, char __user * buf,
- return ret;
- }
+@@ -775,6 +793,13 @@ static int mem_open(struct inode* inode, struct file* file)
+ if (IS_ERR(mm))
+ return PTR_ERR(mm);
-+#define mem_write NULL
++ if (mm) {
++ /* ensure this mm_struct can't be freed */
++ atomic_inc(&mm->mm_count);
++ /* but do not pin its memory */
++ mmput(mm);
++ }
+
-+#ifndef mem_write
-+/* They were right the first time */
- static ssize_t mem_write(struct file * file, const char __user *buf,
- size_t count, loff_t *ppos)
+ /* OK to pass negative loff_t, we can catch out-of-range */
+ file->f_mode |= FMODE_UNSIGNED_OFFSET;
+ file->private_data = mm;
+@@ -782,57 +807,18 @@ static int mem_open(struct inode* inode, struct file* file)
+ return 0;
+ }
+
+-static ssize_t mem_read(struct file * file, char __user * buf,
+- size_t count, loff_t *ppos)
++static ssize_t mem_rw(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos, int write)
{
-@@ -866,6 +910,7 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
+- int ret;
+- char *page;
+- unsigned long src = *ppos;
+ struct mm_struct *mm = file->private_data;
+-
+- if (!mm)
+- return 0;
+-
+- page = (char *)__get_free_page(GFP_TEMPORARY);
+- if (!page)
+- return -ENOMEM;
+-
+- ret = 0;
+-
+- while (count > 0) {
+- int this_len, retval;
+-
+- this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
+- retval = access_remote_vm(mm, src, page, this_len, 0);
+- if (!retval) {
+- if (!ret)
+- ret = -EIO;
+- break;
+- }
+-
+- if (copy_to_user(buf, page, retval)) {
+- ret = -EFAULT;
+- break;
+- }
+-
+- ret += retval;
+- src += retval;
+- buf += retval;
+- count -= retval;
+- }
+- *ppos = src;
+-
+- free_page((unsigned long) page);
+- return ret;
+-}
+-
+-static ssize_t mem_write(struct file * file, const char __user *buf,
+- size_t count, loff_t *ppos)
+-{
+- int copied;
++ unsigned long addr = *ppos;
++ ssize_t copied;
+ char *page;
+- unsigned long dst = *ppos;
+- struct mm_struct *mm = file->private_data;
++
++#ifdef CONFIG_GRKERNSEC
++ if (write)
++ return -EPERM;
++#endif
+
+ if (!mm)
+ return 0;
+@@ -842,31 +828,54 @@ static ssize_t mem_write(struct file * file, const char __user *buf,
+ return -ENOMEM;
+
+ copied = 0;
++ if (!atomic_inc_not_zero(&mm->mm_users))
++ goto free;
++
+ while (count > 0) {
+- int this_len, retval;
++ int this_len = min_t(int, count, PAGE_SIZE);
+
+- this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
+- if (copy_from_user(page, buf, this_len)) {
++ if (write && copy_from_user(page, buf, this_len)) {
+ copied = -EFAULT;
+ break;
+ }
+- retval = access_remote_vm(mm, dst, page, this_len, 1);
+- if (!retval) {
++
++ this_len = access_remote_vm(mm, addr, page, this_len, write);
++ if (!this_len) {
+ if (!copied)
+ copied = -EIO;
+ break;
+ }
+- copied += retval;
+- buf += retval;
+- dst += retval;
+- count -= retval;
++
++ if (!write && copy_to_user(buf, page, this_len)) {
++ copied = -EFAULT;
++ break;
++ }
++
++ buf += this_len;
++ addr += this_len;
++ copied += this_len;
++ count -= this_len;
+ }
+- *ppos = dst;
++ *ppos = addr;
+
++ mmput(mm);
++free:
free_page((unsigned long) page);
return copied;
}
-+#endif
++static ssize_t mem_read(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ return mem_rw(file, buf, count, ppos, 0);
++}
++
++static ssize_t mem_write(struct file *file, const char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ return mem_rw(file, (char __user*)buf, count, ppos, 1);
++}
++
loff_t mem_lseek(struct file *file, loff_t offset, int orig)
{
-@@ -911,6 +956,9 @@ static ssize_t environ_read(struct file *file, char __user *buf,
+ switch (orig) {
+@@ -886,8 +895,8 @@ loff_t mem_lseek(struct file *file, loff_t offset, int orig)
+ static int mem_release(struct inode *inode, struct file *file)
+ {
+ struct mm_struct *mm = file->private_data;
+-
+- mmput(mm);
++ if (mm)
++ mmdrop(mm);
+ return 0;
+ }
+
+@@ -911,6 +920,9 @@ static ssize_t environ_read(struct file *file, char __user *buf,
if (!task)
goto out_no_task;
@@ -45760,7 +45569,7 @@ index 1fc1dca..813fd0b 100644
ret = -ENOMEM;
page = (char *)__get_free_page(GFP_TEMPORARY);
if (!page)
-@@ -1533,7 +1581,7 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
+@@ -1533,7 +1545,7 @@ static void *proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
path_put(&nd->path);
/* Are we allowed to snoop on the tasks file descriptors? */
@@ -45769,7 +45578,7 @@ index 1fc1dca..813fd0b 100644
goto out;
error = PROC_I(inode)->op.proc_get_link(inode, &nd->path);
-@@ -1572,8 +1620,18 @@ static int proc_pid_readlink(struct dentry * dentry, char __user * buffer, int b
+@@ -1572,8 +1584,18 @@ static int proc_pid_readlink(struct dentry * dentry, char __user * buffer, int b
struct path path;
/* Are we allowed to snoop on the tasks file descriptors? */
@@ -45790,7 +45599,7 @@ index 1fc1dca..813fd0b 100644
error = PROC_I(inode)->op.proc_get_link(inode, &path);
if (error)
-@@ -1638,7 +1696,11 @@ struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *t
+@@ -1638,7 +1660,11 @@ struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *t
rcu_read_lock();
cred = __task_cred(task);
inode->i_uid = cred->euid;
@@ -45802,7 +45611,7 @@ index 1fc1dca..813fd0b 100644
rcu_read_unlock();
}
security_task_to_inode(task, inode);
-@@ -1656,6 +1718,9 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
+@@ -1656,6 +1682,9 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
struct inode *inode = dentry->d_inode;
struct task_struct *task;
const struct cred *cred;
@@ -45812,7 +45621,7 @@ index 1fc1dca..813fd0b 100644
generic_fillattr(inode, stat);
-@@ -1663,13 +1728,41 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
+@@ -1663,13 +1692,41 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
stat->uid = 0;
stat->gid = 0;
task = pid_task(proc_pid(inode), PIDTYPE_PID);
@@ -45855,7 +45664,7 @@ index 1fc1dca..813fd0b 100644
}
rcu_read_unlock();
return 0;
-@@ -1706,11 +1799,20 @@ int pid_revalidate(struct dentry *dentry, struct nameidata *nd)
+@@ -1706,11 +1763,20 @@ int pid_revalidate(struct dentry *dentry, struct nameidata *nd)
if (task) {
if ((inode->i_mode == (S_IFDIR|S_IRUGO|S_IXUGO)) ||
@@ -45876,7 +45685,7 @@ index 1fc1dca..813fd0b 100644
rcu_read_unlock();
} else {
inode->i_uid = 0;
-@@ -1828,7 +1930,8 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info)
+@@ -1828,7 +1894,8 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info)
int fd = proc_fd(inode);
if (task) {
@@ -45886,7 +45695,7 @@ index 1fc1dca..813fd0b 100644
put_task_struct(task);
}
if (files) {
-@@ -2096,11 +2199,21 @@ static const struct file_operations proc_fd_operations = {
+@@ -2096,11 +2163,21 @@ static const struct file_operations proc_fd_operations = {
*/
static int proc_fd_permission(struct inode *inode, int mask)
{
@@ -45910,7 +45719,7 @@ index 1fc1dca..813fd0b 100644
return rv;
}
-@@ -2210,6 +2323,9 @@ static struct dentry *proc_pident_lookup(struct inode *dir,
+@@ -2210,6 +2287,9 @@ static struct dentry *proc_pident_lookup(struct inode *dir,
if (!task)
goto out_no_task;
@@ -45920,7 +45729,7 @@ index 1fc1dca..813fd0b 100644
/*
* Yes, it does not scale. And it should not. Don't add
* new entries into /proc/<tgid>/ without very good reasons.
-@@ -2254,6 +2370,9 @@ static int proc_pident_readdir(struct file *filp,
+@@ -2254,6 +2334,9 @@ static int proc_pident_readdir(struct file *filp,
if (!task)
goto out_no_task;
@@ -45930,7 +45739,7 @@ index 1fc1dca..813fd0b 100644
ret = 0;
i = filp->f_pos;
switch (i) {
-@@ -2524,7 +2643,7 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
+@@ -2524,7 +2607,7 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd,
void *cookie)
{
@@ -45939,7 +45748,7 @@ index 1fc1dca..813fd0b 100644
if (!IS_ERR(s))
__putname(s);
}
-@@ -2722,7 +2841,7 @@ static const struct pid_entry tgid_base_stuff[] = {
+@@ -2722,7 +2805,7 @@ static const struct pid_entry tgid_base_stuff[] = {
REG("autogroup", S_IRUGO|S_IWUSR, proc_pid_sched_autogroup_operations),
#endif
REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations),
@@ -45948,7 +45757,7 @@ index 1fc1dca..813fd0b 100644
INF("syscall", S_IRUGO, proc_pid_syscall),
#endif
INF("cmdline", S_IRUGO, proc_pid_cmdline),
-@@ -2747,10 +2866,10 @@ static const struct pid_entry tgid_base_stuff[] = {
+@@ -2747,10 +2830,10 @@ static const struct pid_entry tgid_base_stuff[] = {
#ifdef CONFIG_SECURITY
DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
#endif
@@ -45961,7 +45770,7 @@ index 1fc1dca..813fd0b 100644
ONE("stack", S_IRUGO, proc_pid_stack),
#endif
#ifdef CONFIG_SCHEDSTATS
-@@ -2784,6 +2903,9 @@ static const struct pid_entry tgid_base_stuff[] = {
+@@ -2784,6 +2867,9 @@ static const struct pid_entry tgid_base_stuff[] = {
#ifdef CONFIG_HARDWALL
INF("hardwall", S_IRUGO, proc_pid_hardwall),
#endif
@@ -45971,7 +45780,7 @@ index 1fc1dca..813fd0b 100644
};
static int proc_tgid_base_readdir(struct file * filp,
-@@ -2909,7 +3031,14 @@ static struct dentry *proc_pid_instantiate(struct inode *dir,
+@@ -2909,7 +2995,14 @@ static struct dentry *proc_pid_instantiate(struct inode *dir,
if (!inode)
goto out;
@@ -45986,7 +45795,7 @@ index 1fc1dca..813fd0b 100644
inode->i_op = &proc_tgid_base_inode_operations;
inode->i_fop = &proc_tgid_base_operations;
inode->i_flags|=S_IMMUTABLE;
-@@ -2951,7 +3080,11 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct
+@@ -2951,7 +3044,11 @@ struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct
if (!task)
goto out;
@@ -45998,7 +45807,7 @@ index 1fc1dca..813fd0b 100644
put_task_struct(task);
out:
return result;
-@@ -3016,6 +3149,11 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
+@@ -3016,6 +3113,11 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
unsigned int nr;
struct task_struct *reaper;
@@ -46010,7 +45819,7 @@ index 1fc1dca..813fd0b 100644
struct tgid_iter iter;
struct pid_namespace *ns;
-@@ -3039,8 +3177,27 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
+@@ -3039,8 +3141,27 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
for (iter = next_tgid(ns, iter);
iter.task;
iter.tgid += 1, iter = next_tgid(ns, iter)) {
@@ -46039,7 +45848,7 @@ index 1fc1dca..813fd0b 100644
put_task_struct(iter.task);
goto out;
}
-@@ -3068,7 +3225,7 @@ static const struct pid_entry tid_base_stuff[] = {
+@@ -3068,7 +3189,7 @@ static const struct pid_entry tid_base_stuff[] = {
REG("sched", S_IRUGO|S_IWUSR, proc_pid_sched_operations),
#endif
REG("comm", S_IRUGO|S_IWUSR, proc_pid_set_comm_operations),
@@ -46048,7 +45857,7 @@ index 1fc1dca..813fd0b 100644
INF("syscall", S_IRUGO, proc_pid_syscall),
#endif
INF("cmdline", S_IRUGO, proc_pid_cmdline),
-@@ -3092,10 +3249,10 @@ static const struct pid_entry tid_base_stuff[] = {
+@@ -3092,10 +3213,10 @@ static const struct pid_entry tid_base_stuff[] = {
#ifdef CONFIG_SECURITY
DIR("attr", S_IRUGO|S_IXUGO, proc_attr_dir_inode_operations, proc_attr_dir_operations),
#endif
@@ -46934,7 +46743,7 @@ index 7fdf6a7..e6cd8ad 100644
sd = sysfs_new_dirent(name, mode, SYSFS_DIR);
if (!sd)
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
-index d4e6080b..0e58b99 100644
+index 779789a..f58193c 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -37,7 +37,7 @@ static DEFINE_SPINLOCK(sysfs_open_dirent_lock);
@@ -47174,20 +46983,6 @@ index 23ce927..e274cc1 100644
if (!IS_ERR(s))
kfree(s);
-diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c
-index ce9268a..ee98d0b 100644
---- a/fs/xfs/xfs_vnodeops.c
-+++ b/fs/xfs/xfs_vnodeops.c
-@@ -131,7 +131,8 @@ xfs_readlink(
- __func__, (unsigned long long) ip->i_ino,
- (long long) pathlen);
- ASSERT(0);
-- return XFS_ERROR(EFSCORRUPTED);
-+ error = XFS_ERROR(EFSCORRUPTED);
-+ goto out;
- }
-
-
diff --git a/grsecurity/Kconfig b/grsecurity/Kconfig
new file mode 100644
index 0000000..dfd3d34
@@ -56975,7 +56770,7 @@ index 0000000..0dc13c3
+EXPORT_SYMBOL(gr_log_timechange);
diff --git a/grsecurity/grsec_tpe.c b/grsecurity/grsec_tpe.c
new file mode 100644
-index 0000000..a35ba33
+index 0000000..07e0dc0
--- /dev/null
+++ b/grsecurity/grsec_tpe.c
@@ -0,0 +1,73 @@
@@ -57026,7 +56821,7 @@ index 0000000..a35ba33
+ msg2 = "file in group-writable directory";
+
+ if (msg && msg2) {
-+ char fullmsg[64] = {0};
++ char fullmsg[70] = {0};
+ snprintf(fullmsg, sizeof(fullmsg)-1, "%s and %s", msg, msg2);
+ gr_log_str_fs(GR_DONT_AUDIT, GR_EXEC_TPE_MSG, fullmsg, file->f_path.dentry, file->f_path.mnt);
+ return 0;
@@ -57650,7 +57445,7 @@ index b5e2e4c..6a5373e 100644
/**
* PERCPU_SECTION - define output section for percpu area, simple version
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
-index 1f9e951..14ef517 100644
+index bf4b2dc..2d0762f 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -72,6 +72,7 @@
@@ -59075,7 +58870,7 @@ index 0000000..da390f1
+#endif
diff --git a/include/linux/grmsg.h b/include/linux/grmsg.h
new file mode 100644
-index 0000000..b3347e2
+index 0000000..7f62b30
--- /dev/null
+++ b/include/linux/grmsg.h
@@ -0,0 +1,109 @@
@@ -59113,7 +58908,7 @@ index 0000000..b3347e2
+#define GR_UNSAFESHARE_EXEC_ACL_MSG "denied exec with cloned fs of %.950s by "
+#define GR_PTRACE_EXEC_ACL_MSG "denied ptrace of %.950s by "
+#define GR_EXEC_ACL_MSG "%s execution of %.950s by "
-+#define GR_EXEC_TPE_MSG "denied untrusted exec (due to %.64s) of %.950s by "
++#define GR_EXEC_TPE_MSG "denied untrusted exec (due to %.70s) of %.950s by "
+#define GR_SEGVSTART_ACL_MSG "possible exploit bruteforcing on " DEFAULTSECMSG " banning uid %u from login for %lu seconds"
+#define GR_SEGVNOSUID_ACL_MSG "possible exploit bruteforcing on " DEFAULTSECMSG " banning execution for %lu seconds"
+#define GR_MOUNT_CHROOT_MSG "denied mount of %.256s as %.930s from chroot by "
@@ -59190,10 +58985,10 @@ index 0000000..b3347e2
+#define GR_INIT_TRANSFER_MSG "persistent special role transferred privilege to init by "
diff --git a/include/linux/grsecurity.h b/include/linux/grsecurity.h
new file mode 100644
-index 0000000..eb4885f
+index 0000000..cb9f1c1
--- /dev/null
+++ b/include/linux/grsecurity.h
-@@ -0,0 +1,233 @@
+@@ -0,0 +1,227 @@
+#ifndef GR_SECURITY_H
+#define GR_SECURITY_H
+#include <linux/fs.h>
@@ -59208,12 +59003,6 @@ index 0000000..eb4885f
+#if defined(CONFIG_PAX_NOEXEC) && !defined(CONFIG_PAX_PAGEEXEC) && !defined(CONFIG_PAX_SEGMEXEC) && !defined(CONFIG_PAX_KERNEXEC)
+#error "CONFIG_PAX_NOEXEC enabled, but PAGEEXEC, SEGMEXEC, and KERNEXEC are disabled."
+#endif
-+#if defined(CONFIG_PAX_NOEXEC) && !defined(CONFIG_PAX_EI_PAX) && !defined(CONFIG_PAX_PT_PAX_FLAGS)
-+#error "CONFIG_PAX_NOEXEC enabled, but neither CONFIG_PAX_EI_PAX nor CONFIG_PAX_PT_PAX_FLAGS are enabled."
-+#endif
-+#if defined(CONFIG_PAX_ASLR) && (defined(CONFIG_PAX_RANDMMAP) || defined(CONFIG_PAX_RANDUSTACK)) && !defined(CONFIG_PAX_EI_PAX) && !defined(CONFIG_PAX_PT_PAX_FLAGS)
-+#error "CONFIG_PAX_ASLR enabled, but neither CONFIG_PAX_EI_PAX nor CONFIG_PAX_PT_PAX_FLAGS are enabled."
-+#endif
+#if defined(CONFIG_PAX_ASLR) && !defined(CONFIG_PAX_RANDKSTACK) && !defined(CONFIG_PAX_RANDUSTACK) && !defined(CONFIG_PAX_RANDMMAP)
+#error "CONFIG_PAX_ASLR enabled, but RANDKSTACK, RANDUSTACK, and RANDMMAP are disabled."
+#endif
@@ -60496,7 +60285,7 @@ index 2148b12..519b820 100644
static inline void anon_vma_merge(struct vm_area_struct *vma,
diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 1c4f3e9..c5b241a 100644
+index 1c4f3e9..f29cbeb 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -101,6 +101,7 @@ struct bio_list;
@@ -60700,7 +60489,20 @@ index 1c4f3e9..c5b241a 100644
extern struct task_struct *find_task_by_pid_ns(pid_t nr,
struct pid_namespace *ns);
-@@ -2251,7 +2343,7 @@ extern void __cleanup_sighand(struct sighand_struct *);
+@@ -2235,6 +2327,12 @@ static inline void mmdrop(struct mm_struct * mm)
+ extern void mmput(struct mm_struct *);
+ /* Grab a reference to a task's mm, if it is not already going away */
+ extern struct mm_struct *get_task_mm(struct task_struct *task);
++/*
++ * Grab a reference to a task's mm, if it is not already going away
++ * and ptrace_may_access with the mode parameter passed to it
++ * succeeds.
++ */
++extern struct mm_struct *mm_access(struct task_struct *task, unsigned int mode);
+ /* Remove the current tasks stale references to the old mm_struct */
+ extern void mm_release(struct task_struct *, struct mm_struct *);
+ /* Allocate a new mm structure and copy contents from tsk->mm */
+@@ -2251,7 +2349,7 @@ extern void __cleanup_sighand(struct sighand_struct *);
extern void exit_itimers(struct signal_struct *);
extern void flush_itimer_signals(void);
@@ -60709,7 +60511,7 @@ index 1c4f3e9..c5b241a 100644
extern void daemonize(const char *, ...);
extern int allow_signal(int);
-@@ -2416,13 +2508,17 @@ static inline unsigned long *end_of_stack(struct task_struct *p)
+@@ -2416,13 +2514,17 @@ static inline unsigned long *end_of_stack(struct task_struct *p)
#endif
@@ -61087,6 +60889,44 @@ index 703cfa3..0b8ca72ac 100644
extern int proc_dointvec(struct ctl_table *, int,
void __user *, size_t *, loff_t *);
extern int proc_dointvec_minmax(struct ctl_table *, int,
+diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
+index a71a292..51bd91d 100644
+--- a/include/linux/tracehook.h
++++ b/include/linux/tracehook.h
+@@ -54,12 +54,12 @@ struct linux_binprm;
+ /*
+ * ptrace report for syscall entry and exit looks identical.
+ */
+-static inline void ptrace_report_syscall(struct pt_regs *regs)
++static inline int ptrace_report_syscall(struct pt_regs *regs)
+ {
+ int ptrace = current->ptrace;
+
+ if (!(ptrace & PT_PTRACED))
+- return;
++ return 0;
+
+ ptrace_notify(SIGTRAP | ((ptrace & PT_TRACESYSGOOD) ? 0x80 : 0));
+
+@@ -72,6 +72,8 @@ static inline void ptrace_report_syscall(struct pt_regs *regs)
+ send_sig(current->exit_code, current, 1);
+ current->exit_code = 0;
+ }
++
++ return fatal_signal_pending(current);
+ }
+
+ /**
+@@ -96,8 +98,7 @@ static inline void ptrace_report_syscall(struct pt_regs *regs)
+ static inline __must_check int tracehook_report_syscall_entry(
+ struct pt_regs *regs)
+ {
+- ptrace_report_syscall(regs);
+- return 0;
++ return ptrace_report_syscall(regs);
+ }
+
+ /**
diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h
index ff7dc08..893e1bd 100644
--- a/include/linux/tty_ldisc.h
@@ -63380,7 +63220,7 @@ index e6e01b9..619f837 100644
if (group_dead)
diff --git a/kernel/fork.c b/kernel/fork.c
-index da4a6a1..c04943c 100644
+index da4a6a1..0973380 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -280,7 +280,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)
@@ -63597,7 +63437,34 @@ index da4a6a1..c04943c 100644
}
static inline int mm_alloc_pgd(struct mm_struct *mm)
-@@ -829,13 +866,14 @@ static int copy_fs(unsigned long clone_flags, struct task_struct *tsk)
+@@ -644,6 +681,26 @@ struct mm_struct *get_task_mm(struct task_struct *task)
+ }
+ EXPORT_SYMBOL_GPL(get_task_mm);
+
++struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
++{
++ struct mm_struct *mm;
++ int err;
++
++ err = mutex_lock_killable(&task->signal->cred_guard_mutex);
++ if (err)
++ return ERR_PTR(err);
++
++ mm = get_task_mm(task);
++ if (mm && ((mm != current->mm && !ptrace_may_access(task, mode)) ||
++ (mode == PTRACE_MODE_ATTACH && (gr_handle_proc_ptrace(task) || gr_acl_handle_procpidmem(task))))) {
++ mmput(mm);
++ mm = ERR_PTR(-EACCES);
++ }
++ mutex_unlock(&task->signal->cred_guard_mutex);
++
++ return mm;
++}
++
+ /* Please note the differences between mmput and mm_release.
+ * mmput is called whenever we stop holding onto a mm_struct,
+ * error success whatever.
+@@ -829,13 +886,14 @@ static int copy_fs(unsigned long clone_flags, struct task_struct *tsk)
spin_unlock(&fs->lock);
return -EAGAIN;
}
@@ -63613,7 +63480,7 @@ index da4a6a1..c04943c 100644
return 0;
}
-@@ -1097,6 +1135,9 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+@@ -1097,6 +1155,9 @@ static struct task_struct *copy_process(unsigned long clone_flags,
DEBUG_LOCKS_WARN_ON(!p->softirqs_enabled);
#endif
retval = -EAGAIN;
@@ -63623,7 +63490,7 @@ index da4a6a1..c04943c 100644
if (atomic_read(&p->real_cred->user->processes) >=
task_rlimit(p, RLIMIT_NPROC)) {
if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
-@@ -1256,6 +1297,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+@@ -1256,6 +1317,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
if (clone_flags & CLONE_THREAD)
p->tgid = current->tgid;
@@ -63632,7 +63499,7 @@ index da4a6a1..c04943c 100644
p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? child_tidptr : NULL;
/*
* Clear TID on mm_release()?
-@@ -1418,6 +1461,8 @@ bad_fork_cleanup_count:
+@@ -1418,6 +1481,8 @@ bad_fork_cleanup_count:
bad_fork_free:
free_task(p);
fork_out:
@@ -63641,7 +63508,7 @@ index da4a6a1..c04943c 100644
return ERR_PTR(retval);
}
-@@ -1518,6 +1563,8 @@ long do_fork(unsigned long clone_flags,
+@@ -1518,6 +1583,8 @@ long do_fork(unsigned long clone_flags,
if (clone_flags & CLONE_PARENT_SETTID)
put_user(nr, parent_tidptr);
@@ -63650,7 +63517,7 @@ index da4a6a1..c04943c 100644
if (clone_flags & CLONE_VFORK) {
p->vfork_done = &vfork;
init_completion(&vfork);
-@@ -1627,7 +1674,7 @@ static int unshare_fs(unsigned long unshare_flags, struct fs_struct **new_fsp)
+@@ -1627,7 +1694,7 @@ static int unshare_fs(unsigned long unshare_flags, struct fs_struct **new_fsp)
return 0;
/* don't need lock here; in the worst case we'll do useless copy */
@@ -63659,7 +63526,7 @@ index da4a6a1..c04943c 100644
return 0;
*new_fsp = copy_fs_struct(fs);
-@@ -1716,7 +1763,8 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
+@@ -1716,7 +1783,8 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
fs = current->fs;
spin_lock(&fs->lock);
current->fs = new_fs;
@@ -66288,7 +66155,7 @@ index 2c71d91..1021f81 100644
struct tasklet_struct *list;
diff --git a/kernel/sys.c b/kernel/sys.c
-index 481611f..0754d86 100644
+index 481611f..4665125 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -158,6 +158,12 @@ static int set_one_prio(struct task_struct *p, int niceval, int error)
@@ -66357,7 +66224,29 @@ index 481611f..0754d86 100644
if (nsown_capable(CAP_SETUID)) {
new->suid = new->uid = uid;
if (uid != old->uid) {
-@@ -786,6 +808,9 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
+@@ -775,9 +797,18 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
+
+ retval = -EPERM;
+ if (!nsown_capable(CAP_SETUID)) {
+- if (ruid != (uid_t) -1 && ruid != old->uid &&
+- ruid != old->euid && ruid != old->suid)
+- goto error;
++ // if RBAC is enabled, require CAP_SETUID to change
++ // uid to euid (from a suid binary, for instance)
++ // this is a hardening of normal permissions, not
++ // weakening
++ if (gr_acl_is_enabled()) {
++ if (ruid != (uid_t) -1 && ruid != old->uid)
++ goto error;
++ } else {
++ if (ruid != (uid_t) -1 && ruid != old->uid &&
++ ruid != old->euid && ruid != old->suid)
++ goto error;
++ }
+ if (euid != (uid_t) -1 && euid != old->uid &&
+ euid != old->euid && euid != old->suid)
+ goto error;
+@@ -786,6 +817,9 @@ SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
goto error;
}
@@ -66367,7 +66256,29 @@ index 481611f..0754d86 100644
if (ruid != (uid_t) -1) {
new->uid = ruid;
if (ruid != old->uid) {
-@@ -850,6 +875,9 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
+@@ -839,9 +873,18 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
+
+ retval = -EPERM;
+ if (!nsown_capable(CAP_SETGID)) {
+- if (rgid != (gid_t) -1 && rgid != old->gid &&
+- rgid != old->egid && rgid != old->sgid)
+- goto error;
++ // if RBAC is enabled, require CAP_SETGID to change
++ // gid to egid (from a sgid binary, for instance)
++ // this is a hardening of normal permissions, not
++ // weakening
++ if (gr_acl_is_enabled()) {
++ if (rgid != (gid_t) -1 && rgid != old->gid)
++ goto error;
++ } else {
++ if (rgid != (gid_t) -1 && rgid != old->gid &&
++ rgid != old->egid && rgid != old->sgid)
++ goto error;
++ }
+ if (egid != (gid_t) -1 && egid != old->gid &&
+ egid != old->egid && egid != old->sgid)
+ goto error;
+@@ -850,6 +893,9 @@ SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
goto error;
}
@@ -66377,7 +66288,7 @@ index 481611f..0754d86 100644
if (rgid != (gid_t) -1)
new->gid = rgid;
if (egid != (gid_t) -1)
-@@ -896,6 +924,9 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid)
+@@ -896,6 +942,9 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid)
old = current_cred();
old_fsuid = old->fsuid;
@@ -66387,7 +66298,7 @@ index 481611f..0754d86 100644
if (uid == old->uid || uid == old->euid ||
uid == old->suid || uid == old->fsuid ||
nsown_capable(CAP_SETUID)) {
-@@ -906,6 +937,7 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid)
+@@ -906,6 +955,7 @@ SYSCALL_DEFINE1(setfsuid, uid_t, uid)
}
}
@@ -66395,7 +66306,7 @@ index 481611f..0754d86 100644
abort_creds(new);
return old_fsuid;
-@@ -932,12 +964,16 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid)
+@@ -932,12 +982,16 @@ SYSCALL_DEFINE1(setfsgid, gid_t, gid)
if (gid == old->gid || gid == old->egid ||
gid == old->sgid || gid == old->fsgid ||
nsown_capable(CAP_SETGID)) {
@@ -66412,7 +66323,7 @@ index 481611f..0754d86 100644
abort_creds(new);
return old_fsgid;
-@@ -1189,7 +1225,10 @@ static int override_release(char __user *release, int len)
+@@ -1189,7 +1243,10 @@ static int override_release(char __user *release, int len)
}
v = ((LINUX_VERSION_CODE >> 8) & 0xff) + 40;
snprintf(buf, len, "2.6.%u%s", v, rest);
@@ -66424,7 +66335,7 @@ index 481611f..0754d86 100644
}
return ret;
}
-@@ -1243,19 +1282,19 @@ SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
+@@ -1243,19 +1300,19 @@ SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
return -EFAULT;
down_read(&uts_sem);
@@ -66449,7 +66360,7 @@ index 481611f..0754d86 100644
__OLD_UTS_LEN);
error |= __put_user(0, name->machine + __OLD_UTS_LEN);
up_read(&uts_sem);
-@@ -1720,7 +1759,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
+@@ -1720,7 +1777,7 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
error = get_dumpable(me->mm);
break;
case PR_SET_DUMPABLE:
@@ -70421,7 +70332,7 @@ index 716eb4a..8d10419 100644
static const int *pcpu_unit_map __read_mostly; /* cpu -> unit */
diff --git a/mm/process_vm_access.c b/mm/process_vm_access.c
-index e920aa3..78fe584 100644
+index e920aa3..137702a 100644
--- a/mm/process_vm_access.c
+++ b/mm/process_vm_access.c
@@ -13,6 +13,7 @@
@@ -70459,21 +70370,40 @@ index e920aa3..78fe584 100644
}
if (nr_pages == 0)
-@@ -298,8 +299,13 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,
+@@ -298,23 +299,23 @@ static ssize_t process_vm_rw_core(pid_t pid, const struct iovec *lvec,
goto free_proc_pages;
}
-+ if (gr_handle_ptrace(task, vm_write ? PTRACE_POKETEXT : PTRACE_ATTACH)) {
-+ rc = -EPERM;
-+ goto put_task_struct;
-+ }
-+
- task_lock(task);
+- task_lock(task);
- if (__ptrace_may_access(task, PTRACE_MODE_ATTACH)) {
-+ if (ptrace_may_access_nolock(task, PTRACE_MODE_ATTACH)) {
- task_unlock(task);
+- task_unlock(task);
++ if (gr_handle_ptrace(task, vm_write ? PTRACE_POKETEXT : PTRACE_ATTACH)) {
rc = -EPERM;
goto put_task_struct;
+ }
+- mm = task->mm;
+
+- if (!mm || (task->flags & PF_KTHREAD)) {
+- task_unlock(task);
+- rc = -EINVAL;
++ mm = mm_access(task, PTRACE_MODE_ATTACH);
++ if (!mm || IS_ERR(mm)) {
++ rc = IS_ERR(mm) ? PTR_ERR(mm) : -ESRCH;
++ /*
++ * Explicitly map EACCES to EPERM as EPERM is a more a
++ * appropriate error code for process_vw_readv/writev
++ */
++ if (rc == -EACCES)
++ rc = -EPERM;
+ goto put_task_struct;
+ }
+
+- atomic_inc(&mm->mm_users);
+- task_unlock(task);
+-
+ for (i = 0; i < riovcnt && iov_l_curr_idx < liovcnt; i++) {
+ rc = process_vm_rw_single_vec(
+ (unsigned long)rvec[i].iov_base, rvec[i].iov_len,
diff --git a/mm/rmap.c b/mm/rmap.c
index a4fd368..e0ffec7 100644
--- a/mm/rmap.c
@@ -73055,7 +72985,7 @@ index 94cdbc5..0cb0063 100644
ts = peer->tcp_ts;
tsage = get_seconds() - peer->tcp_ts_stamp;
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
-index a9db4b1..3c03301 100644
+index c89e354..8bd55c8 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -87,6 +87,9 @@ int sysctl_tcp_tw_reuse __read_mostly;
@@ -73338,7 +73268,7 @@ index 5a65eea..bd913a1 100644
int udp4_seq_show(struct seq_file *seq, void *v)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 36806de..b86f74c 100644
+index 836c4ea..cbb74dc 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -2149,7 +2149,7 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg)
@@ -73386,7 +73316,7 @@ index 26cb08c..8af9877 100644
msg.msg_flags = flags;
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
-index 331af3b..7789844 100644
+index 361ebf3..d5628fb 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -377,7 +377,7 @@ static inline int rawv6_rcv_skb(struct sock *sk, struct sk_buff *skb)
@@ -73476,7 +73406,7 @@ index 331af3b..7789844 100644
static int raw6_seq_show(struct seq_file *seq, void *v)
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
-index 2dea4bb..dca8ac5 100644
+index b859e4a..f9d1589 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -93,6 +93,10 @@ static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,
@@ -74343,7 +74273,7 @@ index d9d4970..d5a6a68 100644
return 0;
}
diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c
-index bf10ea8..aeb4c3e 100644
+index d65f699..05aa6ce 100644
--- a/net/phonet/af_phonet.c
+++ b/net/phonet/af_phonet.c
@@ -41,7 +41,7 @@ static struct phonet_protocol *phonet_proto_get(unsigned int protocol)
@@ -74396,7 +74326,7 @@ index 2ba6e9f..409573f 100644
break;
}
diff --git a/net/phonet/socket.c b/net/phonet/socket.c
-index 3f8d0b1..74635e0 100644
+index 4c7eff3..59c727f 100644
--- a/net/phonet/socket.c
+++ b/net/phonet/socket.c
@@ -613,8 +613,13 @@ static int pn_sock_seq_show(struct seq_file *seq, void *v)
@@ -74856,7 +74786,7 @@ index 54a7cd2..944edae 100644
to += addrlen;
cnt++;
diff --git a/net/socket.c b/net/socket.c
-index 2877647..08e2fde 100644
+index 2dce67a..1e91168 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -88,6 +88,7 @@
@@ -75421,7 +75351,7 @@ index 1983717..4d6102c 100644
sub->evt.event = htohl(event, sub->swap);
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
-index b595a3d..b1cd354 100644
+index d99678a..3514a21 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -767,6 +767,12 @@ static struct sock *unix_find_other(struct net *net,
@@ -75912,10 +75842,10 @@ index 5c11312..72742b5 100644
write_hex_cnt = 0;
for (i = 0; i < logo_clutsize; i++) {
diff --git a/security/Kconfig b/security/Kconfig
-index 51bd5a0..8465ae6 100644
+index 51bd5a0..eeabc9f 100644
--- a/security/Kconfig
+++ b/security/Kconfig
-@@ -4,6 +4,626 @@
+@@ -4,6 +4,627 @@
menu "Security options"
@@ -76425,6 +76355,7 @@ index 51bd5a0..8465ae6 100644
+
+config PAX_MEMORY_SANITIZE
+ bool "Sanitize all freed memory"
++ depends on !HIBERNATION
+ help
+ By saying Y here the kernel will erase memory pages as soon as they
+ are freed. This in turn reduces the lifetime of data stored in the
@@ -76542,7 +76473,7 @@ index 51bd5a0..8465ae6 100644
config KEYS
bool "Enable access key retention support"
help
-@@ -169,7 +789,7 @@ config INTEL_TXT
+@@ -169,7 +790,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