Merge pull request #413 from ecsv/batadv-17.01
[feed/routing.git] / batman-adv / patches / 0047-batman-adv-Fix-segfault-when-writing-to-throughput_o.patch
diff --git a/batman-adv/patches/0047-batman-adv-Fix-segfault-when-writing-to-throughput_o.patch b/batman-adv/patches/0047-batman-adv-Fix-segfault-when-writing-to-throughput_o.patch
new file mode 100644 (file)
index 0000000..8594895
--- /dev/null
@@ -0,0 +1,45 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Fri, 31 Aug 2018 16:46:47 +0200
+Subject: [PATCH] batman-adv: Fix segfault when writing to throughput_override
+
+The per hardif sysfs file "batman_adv/throughput_override" prints the
+resulting change as info text when the users writes to this file. It uses
+the helper function batadv_info to add it at the same time to the kernel
+ring buffer and to the batman-adv debug log (when CONFIG_BATMAN_ADV_DEBUG
+is enabled).
+
+The function batadv_info requires as first parameter the batman-adv softif
+net_device. This parameter is then used to find the private buffer which
+contains the debug log for this batman-adv interface. But
+batadv_store_throughput_override used as first argument the slave
+net_device. This slave device doesn't have the batadv_priv private data
+which is access by batadv_info.
+
+Writing to this file with CONFIG_BATMAN_ADV_DEBUG enabled can either lead
+to a segfault or to memory corruption.
+
+Fixes: c513176e4b7a ("batman-adv: add throughput override attribute to hard_ifaces")
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+Acked-by: Marek Lindner <mareklindner@neomailbox.ch>
+
+Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/ddf99b78e255530cbadc0f67656a549e19520280
+---
+ net/batman-adv/sysfs.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
+index 17c844196eb26c9faf9fd543b88cd86cc1c2c029..ae22db3d6637dde2fcc238826a624ef2d6dbd8f5 100644
+--- a/net/batman-adv/sysfs.c
++++ b/net/batman-adv/sysfs.c
+@@ -1078,8 +1078,9 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
+       if (old_tp_override == tp_override)
+               goto out;
+-      batadv_info(net_dev, "%s: Changing from: %u.%u MBit to: %u.%u MBit\n",
+-                  "throughput_override",
++      batadv_info(hard_iface->soft_iface,
++                  "%s: %s: Changing from: %u.%u MBit to: %u.%u MBit\n",
++                  "throughput_override", net_dev->name,
+                   old_tp_override / 10, old_tp_override % 10,
+                   tp_override / 10, tp_override % 10);