Author: jogo
Date: 2015-08-26 12:11:41 +0200 (Wed, 26 Aug 2015)
New Revision: 46726

Added:
   
trunk/target/linux/generic/patches-4.1/096-ipv4-off-by-one-in-continuation-handling-in-proc-net.patch
Log:
linux: fix off-by-one in handling in /proc/net/route

Add an upstream fix for /proc/net/route causing missing routes doing
several continued reads from it.

Only 4.1+ is affected.

Closes #20403.

Signed-off-by: Jonas Gorski <[email protected]>

Added: 
trunk/target/linux/generic/patches-4.1/096-ipv4-off-by-one-in-continuation-handling-in-proc-net.patch
===================================================================
--- 
trunk/target/linux/generic/patches-4.1/096-ipv4-off-by-one-in-continuation-handling-in-proc-net.patch
                               (rev 0)
+++ 
trunk/target/linux/generic/patches-4.1/096-ipv4-off-by-one-in-continuation-handling-in-proc-net.patch
       2015-08-26 10:11:41 UTC (rev 46726)
@@ -0,0 +1,46 @@
+From 25b97c016b26039982daaa2c11d83979f93b71ab Mon Sep 17 00:00:00 2001
+From: Andy Whitcroft <[email protected]>
+Date: Thu, 13 Aug 2015 20:49:01 +0100
+Subject: [PATCH] ipv4: off-by-one in continuation handling in /proc/net/route
+
+When generating /proc/net/route we emit a header followed by a line for
+each route.  When a short read is performed we will restart this process
+based on the open file descriptor.  When calculating the start point we
+fail to take into account that the 0th entry is the header.  This leads
+us to skip the first entry when doing a continuation read.
+
+This can be easily seen with the comparison below:
+
+  while read l; do echo "$l"; done </proc/net/route >A
+  cat /proc/net/route >B
+  diff -bu A B | grep '^[+-]'
+
+On my example machine I have approximatly 10KB of route output.  There we
+see the very first non-title element is lost in the while read case,
+and an entry around the 8K mark in the cat case:
+
+  +wlan0 00000000 02021EAC 0003 0 0 400 00000000 0 0 0
+  -tun1  00C0AC0A 00000000 0001 0 0 950 00C0FFFF 0 0 0
+
+Fix up the off-by-one when reaquiring position on continuation.
+
+Fixes: 8be33e955cb9 ("fib_trie: Fib walk rcu should take a tnode and key 
instead of a trie and a leaf")
+BugLink: http://bugs.launchpad.net/bugs/1483440
+Acked-by: Alexander Duyck <[email protected]>
+Signed-off-by: Andy Whitcroft <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
+---
+ net/ipv4/fib_trie.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -2457,7 +2457,7 @@ static struct key_vector *fib_route_get_
+               key = l->key + 1;
+               iter->pos++;
+ 
+-              if (pos-- <= 0)
++              if (--pos <= 0)
+                       break;
+ 
+               l = NULL;
_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to