batctl: Merge bugfixes from 2020.2
authorSven Eckelmann <sven@narfation.org>
Mon, 6 Jul 2020 18:04:33 +0000 (20:04 +0200)
committerSven Eckelmann <sven@narfation.org>
Mon, 6 Jul 2020 18:04:33 +0000 (20:04 +0200)
* fix endianness when reading radiotap header
* Only remove batadv interface on hardif reduction

Signed-off-by: Sven Eckelmann <sven@narfation.org>
batctl/Makefile
batctl/patches/0007-batctl-fix-endianness-when-reading-radiotap-header.patch [new file with mode: 0644]
batctl/patches/0008-batctl-Only-remove-batadv-interface-on-hardif-reduct.patch [new file with mode: 0644]

index 47d6b7850be22634176954af04161fe366e816cf..fcf05dbda152ae397fdad7f965f559b415c7c934 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 PKG_NAME:=batctl
 
 PKG_VERSION:=2019.2
-PKG_RELEASE:=4
+PKG_RELEASE:=5
 PKG_HASH:=fb656208ff7d4cd8b1b422f60c9e6d8747302a347cbf6c199d7afa9b80f80ea3
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
diff --git a/batctl/patches/0007-batctl-fix-endianness-when-reading-radiotap-header.patch b/batctl/patches/0007-batctl-fix-endianness-when-reading-radiotap-header.patch
new file mode 100644 (file)
index 0000000..bec1b9e
--- /dev/null
@@ -0,0 +1,38 @@
+From: Marek Lindner <mareklindner@neomailbox.ch>
+Date: Wed, 29 Apr 2020 12:09:44 +0200
+Subject: batctl: fix endianness when reading radiotap header
+
+All radiotap header fields are specified in little endian byte-order.
+Header length conversion is necessary on some platforms.
+
+Fixes: c6fcdb6dc9a9 ("batctl: add radiotap wifi packet decapsulation support")
+Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+
+Origin: upstream, https://git.open-mesh.org/batctl.git/commit/440ae55a6ef96eb73ee628f9237915cf9fb26dee
+
+diff --git a/tcpdump.c b/tcpdump.c
+index 8106a6457ac1b000f2f802e4b0a751d783540b69..72c1869eb50d25c1f6b1e1fcae42199b9337cb4e 100644
+--- a/tcpdump.c
++++ b/tcpdump.c
+@@ -15,6 +15,7 @@
+ #include <time.h>
+ #include <sys/time.h>
+ #include <arpa/inet.h>
++#include <endian.h>
+ #include <net/if.h>
+ #include <net/if_arp.h>
+ #include <netinet/in.h>
+@@ -1034,10 +1035,10 @@ static int monitor_header_length(unsigned char *packet_buff, ssize_t buff_len, i
+                       return -1;
+               radiotap_hdr = (struct radiotap_header*)packet_buff;
+-              if (buff_len <= radiotap_hdr->it_len)
++              if (buff_len <= le16toh(radiotap_hdr->it_len))
+                       return -1;
+               else
+-                      return radiotap_hdr->it_len;
++                      return le16toh(radiotap_hdr->it_len);
+       }
+       return -1;
diff --git a/batctl/patches/0008-batctl-Only-remove-batadv-interface-on-hardif-reduct.patch b/batctl/patches/0008-batctl-Only-remove-batadv-interface-on-hardif-reduct.patch
new file mode 100644 (file)
index 0000000..08a87da
--- /dev/null
@@ -0,0 +1,49 @@
+From: Sven Eckelmann <sven@narfation.org>
+Date: Sat, 13 Jun 2020 17:59:34 +0200
+Subject: batctl: Only remove batadv interface on hardif reduction
+
+A deletion of a hardif from a batadv meshif will also get a success reply
+from the kernel when the hardif was never part of the batadv meshif. If the
+batadv meshif had no attached hardifs before the removal was started, then
+users are then not expecting that the batadv meshif is removed at all.
+
+Since the delete operation is not an atomic compare-and-swap operation,
+just check first the number of attached interfaces and only start the
+removal of the batadv meshif when the number attached hardifs was reduced.
+
+Fixes: 25022e0b154d ("batctl: Use rtnl to add/remove interfaces")
+Reported-by: Matthias Schiffer <mschiffer@universe-factory.net>
+Signed-off-by: Sven Eckelmann <sven@narfation.org>
+
+Origin: upstream, https://git.open-mesh.org/batctl.git/commit/6d49a82cf58ee5ebd6235b6ddaca46febd42f876
+
+diff --git a/interface.c b/interface.c
+index 0a694c9f41f71a3dd72ae87b79b28434f7e8918f..138a6cd45744081a04f986fe4be67901b3305b74 100644
+--- a/interface.c
++++ b/interface.c
+@@ -386,6 +386,7 @@ static int interface(struct state *state, int argc, char **argv)
+       int ret;
+       unsigned int ifindex;
+       unsigned int ifmaster;
++      unsigned int pre_cnt;
+       const char *long_op;
+       unsigned int cnt;
+       int rest_argc;
+@@ -502,6 +503,8 @@ static int interface(struct state *state, int argc, char **argv)
+               goto err;
+       }
++      pre_cnt = count_interfaces(state->mesh_iface);
++
+       for (i = 1; i < rest_argc; i++) {
+               ifindex = if_nametoindex(rest_argv[i]);
+@@ -531,7 +534,7 @@ static int interface(struct state *state, int argc, char **argv)
+       /* check if there is no interface left and then destroy mesh_iface */
+       if (!manual_mode && rest_argv[0][0] == 'd') {
+               cnt = count_interfaces(state->mesh_iface);
+-              if (cnt == 0)
++              if (cnt == 0 && pre_cnt > 0)
+                       destroy_interface(state->mesh_iface);
+       }