Blame SOURCES/0042-sockaddr-properly-decode-sockaddr_hci-addresses-with.patch

b484ca
From 5a9b0f1ef83300f853e77ada03515c8542c1cfe0 Mon Sep 17 00:00:00 2001
b484ca
From: Eugene Syromyatnikov <evgsyr@gmail.com>
b484ca
Date: Thu, 29 Aug 2019 19:03:51 +0200
b484ca
Subject: [PATCH] sockaddr: properly decode sockaddr_hci addresses without
b484ca
 hci_channel
b484ca
b484ca
Before Linux commit v2.6.38-rc1~476^2~14^2~3^2~43^2~9,
b484ca
struct sockaddr_hci did not contain hci_channel field.
b484ca
b484ca
* configure.ac (AC_CHECK_HEADERS([bluetooth/bluetooth.h])): Add check
b484ca
for struct sockaddr_hci.hci_channel.
b484ca
* sockaddr.c (print_sockaddr_data_bt): Decode struct sockaddr_hci
b484ca
without hci_channel field.
b484ca
* tests/net-sockaddr.c (check_hci): Add check for struct sockaddr_hci
b484ca
decoding without hci_channel field; guard hci_channel with #ifdef
b484ca
HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL.
b484ca
(check_raw): Remove "len++", as 4-byte AF_BLUETOOTH socket addresses are
b484ca
interpreted as struct sockaddr_hci without hci_channel field.
b484ca
---
b484ca
 configure.ac         |  3 +++
b484ca
 sockaddr.c           | 16 +++++++++++++---
b484ca
 tests/net-sockaddr.c | 18 ++++++++++++++----
b484ca
 3 files changed, 30 insertions(+), 7 deletions(-)
b484ca
b484ca
Index: strace-4.24/configure.ac
b484ca
===================================================================
b484ca
--- strace-4.24.orig/configure.ac	2020-01-26 13:47:02.277446765 +0100
b484ca
+++ strace-4.24/configure.ac	2020-01-26 13:47:08.976575337 +0100
b484ca
@@ -458,6 +458,9 @@
b484ca
 ])
b484ca
 
b484ca
 AC_CHECK_HEADERS([bluetooth/bluetooth.h], [
b484ca
+	AC_CHECK_MEMBERS([struct sockaddr_hci.hci_channel],,,
b484ca
+			 [#include <bluetooth/bluetooth.h>
b484ca
+			 #include <bluetooth/hci.h>])
b484ca
 	AC_CHECK_MEMBERS([struct sockaddr_l2.l2_bdaddr_type],,,
b484ca
 			 [#include <bluetooth/bluetooth.h>
b484ca
 			 #include <bluetooth/l2cap.h>])
b484ca
Index: strace-4.24/sockaddr.c
b484ca
===================================================================
b484ca
--- strace-4.24.orig/sockaddr.c	2020-01-26 13:47:08.977575356 +0100
b484ca
+++ strace-4.24/sockaddr.c	2020-01-27 16:26:32.975222449 +0100
b484ca
@@ -355,12 +355,21 @@
b484ca
 	};
b484ca
 
b484ca
 	switch (addrlen) {
b484ca
+		case offsetofend(struct sockaddr_hci, hci_dev):
b484ca
 		case sizeof(struct sockaddr_hci): {
b484ca
 			const struct sockaddr_hci *const hci = buf;
b484ca
-			tprintf("hci_dev=htobs(%hu), hci_channel=",
b484ca
-				btohs(hci->hci_dev));
b484ca
-			printxval_index(hci_channels, hci->hci_channel,
b484ca
-					"HCI_CHANNEL_???");
b484ca
+			tprintf("hci_dev=htobs(%hu)", btohs(hci->hci_dev));
b484ca
+
b484ca
+			/*
b484ca
+			 * hci_channel field has been introduced
b484ca
+			 * Linux commit in v2.6.38-rc1~476^2~14^2~3^2~43^2~9.
b484ca
+			 */
b484ca
+			if (addrlen == sizeof(struct sockaddr_hci)) {
b484ca
+				tprints(", hci_channel=");
b484ca
+				printxval_index(hci_channels, hci->hci_channel,
b484ca
+						"HCI_CHANNEL_???");
b484ca
+			}
b484ca
+
b484ca
 			break;
b484ca
 		}
b484ca
 		case sizeof(struct sockaddr_sco): {
b484ca
Index: strace-4.24/tests/net-sockaddr.c
b484ca
===================================================================
b484ca
--- strace-4.24.orig/tests/net-sockaddr.c	2020-01-26 13:47:02.279446803 +0100
b484ca
+++ strace-4.24/tests/net-sockaddr.c	2020-01-26 13:47:08.979575395 +0100
b484ca
@@ -364,11 +364,22 @@
b484ca
 	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
b484ca
 	hci->hci_family = AF_BLUETOOTH;
b484ca
 	hci->hci_dev = htobs(h_port);
b484ca
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
 	hci->hci_channel = HCI_CHANNEL_RAW;
b484ca
+# endif
b484ca
 	unsigned int len = sizeof(*hci);
b484ca
-	int ret = connect(-1, (void *) hci, len);
b484ca
+
b484ca
+	int ret = connect(-1, (void *) hci, 4);
b484ca
+	printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
b484ca
+	       "}, 4) = %d EBADF (%m)\n",
b484ca
+	       h_port, ret);
b484ca
+
b484ca
+	ret = connect(-1, (void *) hci, len);
b484ca
 	printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
b484ca
-	       ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
b484ca
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
+	       ", hci_channel=HCI_CHANNEL_RAW"
b484ca
+# endif
b484ca
+	       "}, %u) = %d EBADF (%m)\n",
b484ca
 	       h_port, len, ret);
b484ca
 }
b484ca
 
b484ca
@@ -521,9 +532,8 @@
b484ca
 	       " = %d EBADF (%m)\n", len, ret);
b484ca
 
b484ca
 	u.sa->sa_family = AF_BLUETOOTH;
b484ca
-	++len;
b484ca
 	ret = connect(-1, (void *) u.st, len);
b484ca
-	printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
b484ca
+	printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
b484ca
 	       " = %d EBADF (%m)\n", len, ret);
b484ca
 }
b484ca
 
b484ca
Index: strace-4.24/tests-m32/net-sockaddr.c
b484ca
===================================================================
b484ca
--- strace-4.24.orig/tests-m32/net-sockaddr.c	2020-01-26 13:47:02.282446861 +0100
b484ca
+++ strace-4.24/tests-m32/net-sockaddr.c	2020-01-26 13:47:08.979575395 +0100
b484ca
@@ -384,11 +384,22 @@
b484ca
 	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
b484ca
 	hci->hci_family = AF_BLUETOOTH;
b484ca
 	hci->hci_dev = htobs(h_port);
b484ca
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
 	hci->hci_channel = HCI_CHANNEL_RAW;
b484ca
+# endif
b484ca
 	unsigned int len = sizeof(*hci);
b484ca
-	int ret = connect(-1, (void *) hci, len);
b484ca
+
b484ca
+	int ret = connect(-1, (void *) hci, 4);
b484ca
+	printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
b484ca
+	       "}, 4) = %d EBADF (%m)\n",
b484ca
+	       h_port, ret);
b484ca
+
b484ca
+	ret = connect(-1, (void *) hci, len);
b484ca
 	printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
b484ca
-	       ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
b484ca
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
+	       ", hci_channel=HCI_CHANNEL_RAW"
b484ca
+# endif
b484ca
+	       "}, %u) = %d EBADF (%m)\n",
b484ca
 	       h_port, len, ret);
b484ca
 }
b484ca
 
b484ca
@@ -541,9 +552,8 @@
b484ca
 	       " = %d EBADF (%m)\n", len, ret);
b484ca
 
b484ca
 	u.sa->sa_family = AF_BLUETOOTH;
b484ca
-	++len;
b484ca
 	ret = connect(-1, (void *) u.st, len);
b484ca
-	printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
b484ca
+	printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
b484ca
 	       " = %d EBADF (%m)\n", len, ret);
b484ca
 }
b484ca
 
b484ca
Index: strace-4.24/tests-mx32/net-sockaddr.c
b484ca
===================================================================
b484ca
--- strace-4.24.orig/tests-mx32/net-sockaddr.c	2020-01-26 13:47:02.282446861 +0100
b484ca
+++ strace-4.24/tests-mx32/net-sockaddr.c	2020-01-26 13:47:08.979575395 +0100
b484ca
@@ -384,11 +384,22 @@
b484ca
 	TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
b484ca
 	hci->hci_family = AF_BLUETOOTH;
b484ca
 	hci->hci_dev = htobs(h_port);
b484ca
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
 	hci->hci_channel = HCI_CHANNEL_RAW;
b484ca
+# endif
b484ca
 	unsigned int len = sizeof(*hci);
b484ca
-	int ret = connect(-1, (void *) hci, len);
b484ca
+
b484ca
+	int ret = connect(-1, (void *) hci, 4);
b484ca
+	printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
b484ca
+	       "}, 4) = %d EBADF (%m)\n",
b484ca
+	       h_port, ret);
b484ca
+
b484ca
+	ret = connect(-1, (void *) hci, len);
b484ca
 	printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
b484ca
-	       ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
b484ca
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
+	       ", hci_channel=HCI_CHANNEL_RAW"
b484ca
+# endif
b484ca
+	       "}, %u) = %d EBADF (%m)\n",
b484ca
 	       h_port, len, ret);
b484ca
 }
b484ca
 
b484ca
@@ -541,9 +552,8 @@
b484ca
 	       " = %d EBADF (%m)\n", len, ret);
b484ca
 
b484ca
 	u.sa->sa_family = AF_BLUETOOTH;
b484ca
-	++len;
b484ca
 	ret = connect(-1, (void *) u.st, len);
b484ca
-	printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
b484ca
+	printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
b484ca
 	       " = %d EBADF (%m)\n", len, ret);
b484ca
 }
b484ca
 
b484ca
Index: strace-4.24/configure
b484ca
===================================================================
b484ca
--- strace-4.24.orig/configure	2020-01-26 13:47:02.285446919 +0100
b484ca
+++ strace-4.24/configure	2020-01-26 13:47:08.981575433 +0100
b484ca
@@ -11240,6 +11240,18 @@
b484ca
 #define HAVE_BLUETOOTH_BLUETOOTH_H 1
b484ca
 _ACEOF
b484ca
 
b484ca
+	ac_fn_c_check_member "$LINENO" "struct sockaddr_hci" "hci_channel" "ac_cv_member_struct_sockaddr_hci_hci_channel" "#include <bluetooth/bluetooth.h>
b484ca
+			 #include <bluetooth/hci.h>
b484ca
+"
b484ca
+if test "x$ac_cv_member_struct_sockaddr_hci_hci_channel" = xyes; then :
b484ca
+
b484ca
+cat >>confdefs.h <<_ACEOF
b484ca
+#define HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL 1
b484ca
+_ACEOF
b484ca
+
b484ca
+
b484ca
+fi
b484ca
+
b484ca
 	ac_fn_c_check_member "$LINENO" "struct sockaddr_l2" "l2_bdaddr_type" "ac_cv_member_struct_sockaddr_l2_l2_bdaddr_type" "#include <bluetooth/bluetooth.h>
b484ca
 			 #include <bluetooth/l2cap.h>
b484ca
 "
b484ca
Index: strace-4.24/config.h.in
b484ca
===================================================================
b484ca
--- strace-4.24.orig/config.h.in	2020-01-26 13:47:02.287446957 +0100
b484ca
+++ strace-4.24/config.h.in	2020-01-26 13:47:08.982575452 +0100
b484ca
@@ -1315,6 +1315,9 @@
b484ca
 /* Define to 1 if the system has the type `struct sigcontext'. */
b484ca
 #undef HAVE_STRUCT_SIGCONTEXT
b484ca
 
b484ca
+/* Define to 1 if `hci_channel' is a member of `struct sockaddr_hci'. */
b484ca
+#undef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
b484ca
+
b484ca
 /* Define to 1 if `l2_bdaddr_type' is a member of `struct sockaddr_l2'. */
b484ca
 #undef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
b484ca