summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pagano <mpagano@gentoo.org>2017-10-12 18:26:35 -0400
committerMike Pagano <mpagano@gentoo.org>2017-10-12 18:26:35 -0400
commit4f4b7dae2c83e4de8afcc68720bf3fdb757a23f1 (patch)
tree94d88a8d25e669f210277d3e6af042776dddaf36
parentLinux patch 4.9.55 (diff)
downloadlinux-patches-4f4b7dae.tar.gz
linux-patches-4f4b7dae.tar.bz2
linux-patches-4f4b7dae.zip
Linux patch 4.9.564.9-58
-rw-r--r--0000_README4
-rw-r--r--1055_linux-4.9.56.patch72
2 files changed, 76 insertions, 0 deletions
diff --git a/0000_README b/0000_README
index 1042b2f3..b4a856b1 100644
--- a/0000_README
+++ b/0000_README
@@ -263,6 +263,10 @@ Patch: 1054_linux-4.9.55.patch
From: http://www.kernel.org
Desc: Linux 4.9.55
+Patch: 1055_linux-4.9.56.patch
+From: http://www.kernel.org
+Desc: Linux 4.9.56
+
Patch: 1500_XATTR_USER_PREFIX.patch
From: https://bugs.gentoo.org/show_bug.cgi?id=470644
Desc: Support for namespace user.pax.* on tmpfs.
diff --git a/1055_linux-4.9.56.patch b/1055_linux-4.9.56.patch
new file mode 100644
index 00000000..46e3ea33
--- /dev/null
+++ b/1055_linux-4.9.56.patch
@@ -0,0 +1,72 @@
+diff --git a/Makefile b/Makefile
+index 2a995675d6bf..feab5f5a507c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 9
+-SUBLEVEL = 55
++SUBLEVEL = 56
+ EXTRAVERSION =
+ NAME = Roaring Lionus
+
+diff --git a/net/core/filter.c b/net/core/filter.c
+index bfeedbbde214..4eb4ce0aeef4 100644
+--- a/net/core/filter.c
++++ b/net/core/filter.c
+@@ -937,31 +937,20 @@ void sk_filter_uncharge(struct sock *sk, struct sk_filter *fp)
+ /* try to charge the socket memory if there is space available
+ * return true on success
+ */
+-static bool __sk_filter_charge(struct sock *sk, struct sk_filter *fp)
++bool sk_filter_charge(struct sock *sk, struct sk_filter *fp)
+ {
+ u32 filter_size = bpf_prog_size(fp->prog->len);
+
+ /* same check as in sock_kmalloc() */
+ if (filter_size <= sysctl_optmem_max &&
+ atomic_read(&sk->sk_omem_alloc) + filter_size < sysctl_optmem_max) {
++ atomic_inc(&fp->refcnt);
+ atomic_add(filter_size, &sk->sk_omem_alloc);
+ return true;
+ }
+ return false;
+ }
+
+-bool sk_filter_charge(struct sock *sk, struct sk_filter *fp)
+-{
+- if (!atomic_inc_not_zero(&fp->refcnt))
+- return false;
+-
+- if (!__sk_filter_charge(sk, fp)) {
+- sk_filter_release(fp);
+- return false;
+- }
+- return true;
+-}
+-
+ static struct bpf_prog *bpf_migrate_filter(struct bpf_prog *fp)
+ {
+ struct sock_filter *old_prog;
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 2a77cc50f021..231c38d91855 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -1528,16 +1528,13 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
+ sock_reset_flag(newsk, SOCK_DONE);
+ skb_queue_head_init(&newsk->sk_error_queue);
+
+- rcu_read_lock();
+- filter = rcu_dereference(sk->sk_filter);
++ filter = rcu_dereference_protected(newsk->sk_filter, 1);
+ if (filter != NULL)
+ /* though it's an empty new sock, the charging may fail
+ * if sysctl_optmem_max was changed between creation of
+ * original socket and cloning
+ */
+ is_charged = sk_filter_charge(newsk, filter);
+- RCU_INIT_POINTER(newsk->sk_filter, filter);
+- rcu_read_unlock();
+
+ if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) {
+ /* We need to make sure that we don't uncharge the new