linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiri Slaby <jslaby@suse.cz>
To: stable@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Florian Westphal <fw@strlen.de>,
	Pablo Neira Ayuso <pablo@netfilter.org>,
	Jiri Slaby <jslaby@suse.cz>
Subject: [PATCH 3.12 009/101] netfilter: x_tables: speed up jump target validation
Date: Fri, 19 Aug 2016 09:54:51 +0200	[thread overview]
Message-ID: <26bb96ed3ac0386b54507e1bfcb9a90c534affbe.1471593228.git.jslaby@suse.cz> (raw)
In-Reply-To: <cover.1471589700.git.jslaby@suse.cz>

From: Florian Westphal <fw@strlen.de>

3.12-stable review patch.  If anyone has any objections, please let me know.

===============

commit f4dc77713f8016d2e8a3295e1c9c53a21f296def upstream.

The dummy ruleset I used to test the original validation change was broken,
most rules were unreachable and were not tested by mark_source_chains().

In some cases rulesets that used to load in a few seconds now require
several minutes.

sample ruleset that shows the behaviour:

echo "*filter"
for i in $(seq 0 100000);do
        printf ":chain_%06x - [0:0]\n" $i
done
for i in $(seq 0 100000);do
   printf -- "-A INPUT -j chain_%06x\n" $i
   printf -- "-A INPUT -j chain_%06x\n" $i
   printf -- "-A INPUT -j chain_%06x\n" $i
done
echo COMMIT

[ pipe result into iptables-restore ]

This ruleset will be about 74mbyte in size, with ~500k searches
though all 500k[1] rule entries. iptables-restore will take forever
(gave up after 10 minutes)

Instead of always searching the entire blob for a match, fill an
array with the start offsets of every single ipt_entry struct,
then do a binary search to check if the jump target is present or not.

After this change ruleset restore times get again close to what one
gets when reverting 36472341017529e (~3 seconds on my workstation).

[1] every user-defined rule gets an implicit RETURN, so we get
300k jumps + 100k userchains + 100k returns -> 500k rule entries

Fixes: 36472341017529e ("netfilter: x_tables: validate targets of jumps")
Reported-by: Jeff Wu <wujiafu@gmail.com>
Tested-by: Jeff Wu <wujiafu@gmail.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
---
 include/linux/netfilter/x_tables.h |  4 +++
 net/ipv4/netfilter/arp_tables.c    | 48 ++++++++++++++++++------------------
 net/ipv4/netfilter/ip_tables.c     | 46 ++++++++++++++++++-----------------
 net/ipv6/netfilter/ip6_tables.c    | 46 ++++++++++++++++++-----------------
 net/netfilter/x_tables.c           | 50 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 127 insertions(+), 67 deletions(-)

diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
index 1d24aa71f773..07d6b440aff1 100644
--- a/include/linux/netfilter/x_tables.h
+++ b/include/linux/netfilter/x_tables.h
@@ -243,6 +243,10 @@ int xt_check_entry_offsets(const void *base, const char *elems,
 			   unsigned int target_offset,
 			   unsigned int next_offset);
 
+unsigned int *xt_alloc_entry_offsets(unsigned int size);
+bool xt_find_jump_offset(const unsigned int *offsets,
+			 unsigned int target, unsigned int size);
+
 extern int xt_check_match(struct xt_mtchk_param *,
 			  unsigned int size, u_int8_t proto, bool inv_proto);
 extern int xt_check_target(struct xt_tgchk_param *,
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index 3f58cf8e2fd2..ab16b5c195da 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -358,24 +358,12 @@ static inline bool unconditional(const struct arpt_entry *e)
 	       memcmp(&e->arp, &uncond, sizeof(uncond)) == 0;
 }
 
-static bool find_jump_target(const struct xt_table_info *t,
-			     const void *entry0,
-			     const struct arpt_entry *target)
-{
-	struct arpt_entry *iter;
-
-	xt_entry_foreach(iter, entry0, t->size) {
-		 if (iter == target)
-			return true;
-	}
-	return false;
-}
-
 /* Figures out from what hook each rule can be called: returns 0 if
  * there are loops.  Puts hook bitmask in comefrom.
  */
 static int mark_source_chains(const struct xt_table_info *newinfo,
-			      unsigned int valid_hooks, void *entry0)
+			      unsigned int valid_hooks, void *entry0,
+			      unsigned int *offsets)
 {
 	unsigned int hook;
 
@@ -464,10 +452,11 @@ static int mark_source_chains(const struct xt_table_info *newinfo,
 					/* This a jump; chase it. */
 					duprintf("Jump rule %u -> %u\n",
 						 pos, newpos);
+					if (!xt_find_jump_offset(offsets, newpos,
+								 newinfo->number))
+						return 0;
 					e = (struct arpt_entry *)
 						(entry0 + newpos);
-					if (!find_jump_target(newinfo, entry0, e))
-						return 0;
 				} else {
 					/* ... this is a fallthru */
 					newpos = pos + e->next_offset;
@@ -627,6 +616,7 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
                            const struct arpt_replace *repl)
 {
 	struct arpt_entry *iter;
+	unsigned int *offsets;
 	unsigned int i;
 	int ret = 0;
 
@@ -640,6 +630,9 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
 	}
 
 	duprintf("translate_table: size %u\n", newinfo->size);
+	offsets = xt_alloc_entry_offsets(newinfo->number);
+	if (!offsets)
+		return -ENOMEM;
 	i = 0;
 
 	/* Walk through entries, checking offsets. */
@@ -650,7 +643,9 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
 						 repl->underflow,
 						 repl->valid_hooks);
 		if (ret != 0)
-			break;
+			goto out_free;
+		if (i < repl->num_entries)
+			offsets[i] = (void *)iter - entry0;
 		++i;
 		if (strcmp(arpt_get_target(iter)->u.user.name,
 		    XT_ERROR_TARGET) == 0)
@@ -658,12 +653,13 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
 	}
 	duprintf("translate_table: ARPT_ENTRY_ITERATE gives %d\n", ret);
 	if (ret != 0)
-		return ret;
+		goto out_free;
 
+	ret = -EINVAL;
 	if (i != repl->num_entries) {
 		duprintf("translate_table: %u not %u entries\n",
 			 i, repl->num_entries);
-		return -EINVAL;
+		goto out_free;
 	}
 
 	/* Check hooks all assigned */
@@ -674,17 +670,20 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
 		if (newinfo->hook_entry[i] == 0xFFFFFFFF) {
 			duprintf("Invalid hook entry %u %u\n",
 				 i, repl->hook_entry[i]);
-			return -EINVAL;
+			goto out_free;
 		}
 		if (newinfo->underflow[i] == 0xFFFFFFFF) {
 			duprintf("Invalid underflow %u %u\n",
 				 i, repl->underflow[i]);
-			return -EINVAL;
+			goto out_free;
 		}
 	}
 
-	if (!mark_source_chains(newinfo, repl->valid_hooks, entry0))
-		return -ELOOP;
+	if (!mark_source_chains(newinfo, repl->valid_hooks, entry0, offsets)) {
+		ret = -ELOOP;
+		goto out_free;
+	}
+	kvfree(offsets);
 
 	/* Finally, each sanity check must pass */
 	i = 0;
@@ -711,6 +710,9 @@ static int translate_table(struct xt_table_info *newinfo, void *entry0,
 	}
 
 	return ret;
+ out_free:
+	kvfree(offsets);
+	return ret;
 }
 
 static void get_counters(const struct xt_table_info *t,
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
index 9363a37729a8..e5500275ecf0 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -434,24 +434,12 @@ ipt_do_table(struct sk_buff *skb,
 #endif
 }
 
-static bool find_jump_target(const struct xt_table_info *t,
-			     const void *entry0,
-			     const struct ipt_entry *target)
-{
-	struct ipt_entry *iter;
-
-	xt_entry_foreach(iter, entry0, t->size) {
-		 if (iter == target)
-			return true;
-	}
-	return false;
-}
-
 /* Figures out from what hook each rule can be called: returns 0 if
    there are loops.  Puts hook bitmask in comefrom. */
 static int
 mark_source_chains(const struct xt_table_info *newinfo,
-		   unsigned int valid_hooks, void *entry0)
+		   unsigned int valid_hooks, void *entry0,
+		   unsigned int *offsets)
 {
 	unsigned int hook;
 
@@ -544,10 +532,11 @@ mark_source_chains(const struct xt_table_info *newinfo,
 					/* This a jump; chase it. */
 					duprintf("Jump rule %u -> %u\n",
 						 pos, newpos);
+					if (!xt_find_jump_offset(offsets, newpos,
+								 newinfo->number))
+						return 0;
 					e = (struct ipt_entry *)
 						(entry0 + newpos);
-					if (!find_jump_target(newinfo, entry0, e))
-						return 0;
 				} else {
 					/* ... this is a fallthru */
 					newpos = pos + e->next_offset;
@@ -794,6 +783,7 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
                 const struct ipt_replace *repl)
 {
 	struct ipt_entry *iter;
+	unsigned int *offsets;
 	unsigned int i;
 	int ret = 0;
 
@@ -807,6 +797,9 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 	}
 
 	duprintf("translate_table: size %u\n", newinfo->size);
+	offsets = xt_alloc_entry_offsets(newinfo->number);
+	if (!offsets)
+		return -ENOMEM;
 	i = 0;
 	/* Walk through entries, checking offsets. */
 	xt_entry_foreach(iter, entry0, newinfo->size) {
@@ -816,17 +809,20 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 						 repl->underflow,
 						 repl->valid_hooks);
 		if (ret != 0)
-			return ret;
+			goto out_free;
+		if (i < repl->num_entries)
+			offsets[i] = (void *)iter - entry0;
 		++i;
 		if (strcmp(ipt_get_target(iter)->u.user.name,
 		    XT_ERROR_TARGET) == 0)
 			++newinfo->stacksize;
 	}
 
+	ret = -EINVAL;
 	if (i != repl->num_entries) {
 		duprintf("translate_table: %u not %u entries\n",
 			 i, repl->num_entries);
-		return -EINVAL;
+		goto out_free;
 	}
 
 	/* Check hooks all assigned */
@@ -837,17 +833,20 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 		if (newinfo->hook_entry[i] == 0xFFFFFFFF) {
 			duprintf("Invalid hook entry %u %u\n",
 				 i, repl->hook_entry[i]);
-			return -EINVAL;
+			goto out_free;
 		}
 		if (newinfo->underflow[i] == 0xFFFFFFFF) {
 			duprintf("Invalid underflow %u %u\n",
 				 i, repl->underflow[i]);
-			return -EINVAL;
+			goto out_free;
 		}
 	}
 
-	if (!mark_source_chains(newinfo, repl->valid_hooks, entry0))
-		return -ELOOP;
+	if (!mark_source_chains(newinfo, repl->valid_hooks, entry0, offsets)) {
+		ret = -ELOOP;
+		goto out_free;
+	}
+	kvfree(offsets);
 
 	/* Finally, each sanity check must pass */
 	i = 0;
@@ -874,6 +873,9 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 	}
 
 	return ret;
+ out_free:
+	kvfree(offsets);
+	return ret;
 }
 
 static void
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index a7d644e62a3e..d24ff5ddd6b5 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -444,24 +444,12 @@ ip6t_do_table(struct sk_buff *skb,
 #endif
 }
 
-static bool find_jump_target(const struct xt_table_info *t,
-			     const void *entry0,
-			     const struct ip6t_entry *target)
-{
-	struct ip6t_entry *iter;
-
-	xt_entry_foreach(iter, entry0, t->size) {
-		 if (iter == target)
-			return true;
-	}
-	return false;
-}
-
 /* Figures out from what hook each rule can be called: returns 0 if
    there are loops.  Puts hook bitmask in comefrom. */
 static int
 mark_source_chains(const struct xt_table_info *newinfo,
-		   unsigned int valid_hooks, void *entry0)
+		   unsigned int valid_hooks, void *entry0,
+		   unsigned int *offsets)
 {
 	unsigned int hook;
 
@@ -554,10 +542,11 @@ mark_source_chains(const struct xt_table_info *newinfo,
 					/* This a jump; chase it. */
 					duprintf("Jump rule %u -> %u\n",
 						 pos, newpos);
+					if (!xt_find_jump_offset(offsets, newpos,
+								 newinfo->number))
+						return 0;
 					e = (struct ip6t_entry *)
 						(entry0 + newpos);
-					if (!find_jump_target(newinfo, entry0, e))
-						return 0;
 				} else {
 					/* ... this is a fallthru */
 					newpos = pos + e->next_offset;
@@ -804,6 +793,7 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
                 const struct ip6t_replace *repl)
 {
 	struct ip6t_entry *iter;
+	unsigned int *offsets;
 	unsigned int i;
 	int ret = 0;
 
@@ -817,6 +807,9 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 	}
 
 	duprintf("translate_table: size %u\n", newinfo->size);
+	offsets = xt_alloc_entry_offsets(newinfo->number);
+	if (!offsets)
+		return -ENOMEM;
 	i = 0;
 	/* Walk through entries, checking offsets. */
 	xt_entry_foreach(iter, entry0, newinfo->size) {
@@ -826,17 +819,20 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 						 repl->underflow,
 						 repl->valid_hooks);
 		if (ret != 0)
-			return ret;
+			goto out_free;
+		if (i < repl->num_entries)
+			offsets[i] = (void *)iter - entry0;
 		++i;
 		if (strcmp(ip6t_get_target(iter)->u.user.name,
 		    XT_ERROR_TARGET) == 0)
 			++newinfo->stacksize;
 	}
 
+	ret = -EINVAL;
 	if (i != repl->num_entries) {
 		duprintf("translate_table: %u not %u entries\n",
 			 i, repl->num_entries);
-		return -EINVAL;
+		goto out_free;
 	}
 
 	/* Check hooks all assigned */
@@ -847,17 +843,20 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 		if (newinfo->hook_entry[i] == 0xFFFFFFFF) {
 			duprintf("Invalid hook entry %u %u\n",
 				 i, repl->hook_entry[i]);
-			return -EINVAL;
+			goto out_free;
 		}
 		if (newinfo->underflow[i] == 0xFFFFFFFF) {
 			duprintf("Invalid underflow %u %u\n",
 				 i, repl->underflow[i]);
-			return -EINVAL;
+			goto out_free;
 		}
 	}
 
-	if (!mark_source_chains(newinfo, repl->valid_hooks, entry0))
-		return -ELOOP;
+	if (!mark_source_chains(newinfo, repl->valid_hooks, entry0, offsets)) {
+		ret = -ELOOP;
+		goto out_free;
+	}
+	kvfree(offsets);
 
 	/* Finally, each sanity check must pass */
 	i = 0;
@@ -884,6 +883,9 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
 	}
 
 	return ret;
+ out_free:
+	kvfree(offsets);
+	return ret;
 }
 
 static void
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 51c141b09dba..94ce5ff8e338 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -721,6 +721,56 @@ int xt_check_entry_offsets(const void *base,
 }
 EXPORT_SYMBOL(xt_check_entry_offsets);
 
+/**
+ * xt_alloc_entry_offsets - allocate array to store rule head offsets
+ *
+ * @size: number of entries
+ *
+ * Return: NULL or kmalloc'd or vmalloc'd array
+ */
+unsigned int *xt_alloc_entry_offsets(unsigned int size)
+{
+	unsigned int *off;
+
+	off = kcalloc(size, sizeof(unsigned int), GFP_KERNEL | __GFP_NOWARN);
+
+	if (off)
+		return off;
+
+	if (size < (SIZE_MAX / sizeof(unsigned int)))
+		off = vmalloc(size * sizeof(unsigned int));
+
+	return off;
+}
+EXPORT_SYMBOL(xt_alloc_entry_offsets);
+
+/**
+ * xt_find_jump_offset - check if target is a valid jump offset
+ *
+ * @offsets: array containing all valid rule start offsets of a rule blob
+ * @target: the jump target to search for
+ * @size: entries in @offset
+ */
+bool xt_find_jump_offset(const unsigned int *offsets,
+			 unsigned int target, unsigned int size)
+{
+	int m, low = 0, hi = size;
+
+	while (hi > low) {
+		m = (low + hi) / 2u;
+
+		if (offsets[m] > target)
+			hi = m;
+		else if (offsets[m] < target)
+			low = m + 1;
+		else
+			return true;
+	}
+
+	return false;
+}
+EXPORT_SYMBOL(xt_find_jump_offset);
+
 int xt_check_target(struct xt_tgchk_param *par,
 		    unsigned int size, u_int8_t proto, bool inv_proto)
 {
-- 
2.9.3

  parent reply	other threads:[~2016-08-19  7:56 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-19  7:09 [PATCH 3.12 000/100] 3.12.63-stable review Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 001/100] x86/mm: Add barriers and document switch_mm()-vs-flush synchronization Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 002/100] mm: migrate dirty page without clear_page_dirty_for_io etc Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 003/100] panic: release stale console lock to always get the logbuf printed out Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 004/100] printk: do cond_resched() between lines while outputting to consoles Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 005/100] um: Stop abusing __KERNEL__ Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 006/100] um: Fix out-of-tree build Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 007/100] um: Remove copy&paste code from init.h Jiri Slaby
2016-08-19  7:08 ` [PATCH 3.12 008/100] netfilter: x_tables: validate targets of jumps Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 009/100] libceph: set 'exists' flag for newly up osd Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 010/100] libceph: apply new_state before new_up_client on incrementals Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 011/100] kvm: Fix irq route entries exceeding KVM_MAX_IRQ_ROUTES Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 012/100] tracing: Handle NULL formats in hold_module_trace_bprintk_format() Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 013/100] drm/radeon: fix asic initialization for virtualized environments Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 014/100] drm/i915/ilk: Don't disable SSC source if it's in use Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 015/100] iio: Fix error handling in iio_trigger_attach_poll_func Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 016/100] staging: iio: accel: fix error check Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 017/100] iio: accel: kxsd9: fix the usage of spi_w8r8() Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 018/100] iio:ad7266: Fix broken regulator error handling Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 019/100] iio:ad7266: Fix support for optional regulators Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 020/100] iio:ad7266: Fix probe deferral for vref Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 021/100] tty/vt/keyboard: fix OOB access in do_compute_shiftstate() Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 022/100] ALSA: dummy: Fix a use-after-free at closing Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 023/100] ALSA: au88x0: Fix calculation in vortex_wtdma_bufshift() Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 024/100] ALSA: ctl: Stop notification after disconnection Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 025/100] scsi: fix race between simultaneous decrements of ->host_failed Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 026/100] Fix reconnect to not defer smb3 session reconnect long after socket reconnect Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 027/100] xen/acpi: allow xen-acpi-processor driver to load on Xen 4.7 Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 028/100] tmpfs: don't undo fallocate past its last page Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 029/100] tmpfs: fix regression hang in fallocate undo Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 030/100] s390/seccomp: fix error return for filtered system calls Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 031/100] fs/nilfs2: fix potential underflow in call to crc32_le Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 032/100] arc: unwind: warn only once if DW2_UNWIND is disabled Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 033/100] xen/pciback: Fix conf_space read/write overlap check Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 034/100] Input: wacom_w8001 - w8001_MAX_LENGTH should be 13 Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 035/100] Input: xpad - validate USB endpoint count during probe Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 036/100] ext4: verify extent header depth Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 037/100] qeth: delete napi struct when removing a qeth device Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 038/100] mmc: block: fix packed command header endianness Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 039/100] mm: thp: fix SMP race condition between THP page fault and MADV_DONTNEED Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 040/100] x86, asmlinkage, lguest: Pass in globals into assembler statement Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 041/100] can: at91_can: RX queue could get stuck at high bus load Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 042/100] can: fix handling of unmodifiable configuration options fix Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 043/100] can: fix oops caused by wrong rtnl dellink usage Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 044/100] ipr: Clear interrupt on croc/crocodile when running with LSI Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 045/100] net: mvneta: set real interrupt per packet for tx_done Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 046/100] random32: add prandom_u32_max and convert open coded users Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 047/100] tcp: make challenge acks less predictable Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 048/100] net/irda: fix NULL pointer dereference on memory allocation failure Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 049/100] tcp: consider recv buf for the initial window scale Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 050/100] MIPS: KVM: Fix mapped fault broken commpage handling Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 051/100] MIPS: KVM: Add missing gfn range check Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 052/100] MIPS: KVM: Fix gfn range check in kseg0 tlb faults Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 053/100] MIPS: KVM: Propagate kseg0/mapped tlb fault errors Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 054/100] HID: i2c-hid: set power sleep before shutdown Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 055/100] HID: multitouch: Add MT_QUIRK_NOT_SEEN_MEANS_UP to Surface Pro 3 Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 056/100] x86/mm: Improve switch_mm() barrier comments Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 057/100] arm: oabi compat: add missing access checks Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 058/100] KEYS: 64-bit MIPS needs to use compat_sys_keyctl for 32-bit userspace Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 059/100] apparmor: fix ref count leak when profile sha1 hash is read Jiri Slaby
2016-08-19  7:10 ` [PATCH 3.12 060/100] block: fix use-after-free in seq file Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 061/100] sysv, ipc: fix security-layer leaking Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 062/100] fuse: fix wrong assignment of ->flags in fuse_send_init() Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 063/100] crypto: gcm - Filter out async ghash if necessary Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 064/100] crypto: scatterwalk - Fix test in scatterwalk_done Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 065/100] ext4: check for extents that wrap around Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 066/100] ext4: fix deadlock during page writeback Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 067/100] ext4: don't call ext4_should_journal_data() on the journal inode Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 068/100] ext4: short-cut orphan cleanup on error Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 069/100] ext4: fix reference counting bug on block allocation error Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 070/100] usb: renesas_usbhs: protect the CFIFOSEL setting in usbhsg_ep_enable() Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 071/100] USB: serial: option: add support for Telit LE910 PID 0x1206 Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 072/100] gpio: pca953x: Fix NBANK calculation for PCA9536 Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 073/100] s5p-mfc: Set device name for reserved memory region devs Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 074/100] s5p-mfc: Add release callback for " Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 075/100] Bluetooth: Fix l2cap_sock_setsockopt() with optname BT_RCVMTU Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 076/100] cifs: Check for existing directory when opening file with O_CREAT Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 077/100] cifs: fix crash due to race in hmac(md5) handling Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 078/100] CIFS: Fix a possible invalid memory access in smb2_query_symlink() Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 079/100] random: properly align get_random_int_hash Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 080/100] nfs: don't create zero-length requests Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 081/100] ARM: 8579/1: mm: Fix definition of pmd_mknotpresent Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 082/100] netlabel: add address family checks to netlbl_{sock,req}_delattr() Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 083/100] drm/radeon: add a delay after ATPX dGPU power off Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 084/100] drm/radeon: Poll for both connect/disconnect on analog connectors Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 085/100] drm/radeon: fix firmware info version checks Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 086/100] drm/radeon: support backlight control for UNIPHY3 Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 087/100] drm/i915/dp: Revert "drm/i915/dp: fall back to 18 bpp when sink capability is unknown" Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 088/100] balloon: check the number of available pages in leak balloon Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 089/100] ftrace/recordmcount: Work around for addition of metag magic but not relocations Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 090/100] metag: Fix __cmpxchg_u32 asm constraint for CMP Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 091/100] IB/mlx5: Fix MODIFY_QP command input structure Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 092/100] IB/mlx5: Fix returned values of query QP Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 093/100] IB/mlx5: Fix post send fence logic Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 094/100] IB/IPoIB: Don't update neigh validity for unresolved entries Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 095/100] IB/mlx4: Fix the SQ size of an RC QP Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 096/100] ubi: Make volume resize power cut aware Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 097/100] ubi: Fix race condition between ubi device creation and udev Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 098/100] Input: i8042 - break load dependency between atkbd/psmouse and i8042 Jiri Slaby
2016-08-19 10:06   ` Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 099/100] dm flakey: error READ bios during the down_interval Jiri Slaby
2016-08-19  7:11 ` [PATCH 3.12 100/100] module: Invalidate signatures on force-loaded modules Jiri Slaby
2016-08-19  7:54 ` Jiri Slaby [this message]
2016-08-19 19:03 ` [PATCH 3.12 000/100] 3.12.63-stable review Guenter Roeck
2016-09-06 13:47   ` Jiri Slaby

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=26bb96ed3ac0386b54507e1bfcb9a90c534affbe.1471593228.git.jslaby@suse.cz \
    --to=jslaby@suse.cz \
    --cc=fw@strlen.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pablo@netfilter.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).