]> granicus.if.org Git - strace/commitdiff
sockaddr: add support for sockaddr_l2 without l2_bdaddr_type
authorEugene Syromyatnikov <evgsyr@gmail.com>
Tue, 8 May 2018 15:46:33 +0000 (17:46 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 23 May 2018 23:27:43 +0000 (23:27 +0000)
Apparently, struct sockaddr_l2 changed over time: the l2_bdaddr_type
field was added only by commit v3.5-rc1~35^2~3^2~18^2^2~39.

* configure.ac (AC_CHECK_HEADERS): Move bluetooth/bluetooth.h check into
a separate check.
(AC_CHECK_HEADERS([bluetooth/bluetooth.h])): New check, also checks for
struct sockaddr_l2.l2_bdaddr_type member in case of success.
* sockaddr.c (print_sockaddr_data_bt) <case offsetof(struct sockaddr_l2,
l2_bdaddr_type)>: Add to sizeof(struct sockaddr_l2) case. Print
l2_bdaddr_type field only if the provided sockaddr is big enough.
* tests/net-sockaddr.c (check_l2): Put l2_bdaddr_type usage/printing
under HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE ifdef, add a check for the
sockaddr_l2 structure without the l2_bdaddr_type field.

configure.ac
sockaddr.c
tests/net-sockaddr.c

index 720df0b95a6f4b51ce65365ee695404c6bb8523b..231a861b3e3a95037b39658835af4157e84e6f80 100644 (file)
@@ -384,7 +384,6 @@ AC_CHECK_HEADERS(m4_normalize([
        asm/cachectl.h
        asm/guarded_storage.h
        asm/sysmips.h
-       bluetooth/bluetooth.h
        elf.h
        iconv.h
        inttypes.h
@@ -471,6 +470,12 @@ AC_CHECK_HEADERS([linux/bpf.h], [
        st_BPF_ATTR
 ])
 
+AC_CHECK_HEADERS([bluetooth/bluetooth.h], [
+       AC_CHECK_MEMBERS([struct sockaddr_l2.l2_bdaddr_type],,,
+                        [#include <bluetooth/bluetooth.h>
+                        #include <bluetooth/l2cap.h>])
+])
+
 AC_CHECK_TYPES(m4_normalize([
        struct br_mdb_entry,
        struct br_port_msg
index 1e3067c435540383c22b0ce19924886937450b57..0d5975393768b3fffbddcd4df76c8c5076e30094 100644 (file)
@@ -395,15 +395,21 @@ print_sockaddr_data_bt(const void *const buf, const int addrlen)
                        tprintf(", rc_channel=%u", rc->rc_channel);
                        break;
                }
+               case offsetof(struct sockaddr_l2, l2_bdaddr_type):
                case sizeof(struct sockaddr_l2): {
                        const struct sockaddr_l2 *const l2 = buf;
                        print_bluetooth_l2_psm("l2_psm=", l2->l2_psm);
                        print_mac_addr(", l2_bdaddr=", l2->l2_bdaddr.b,
                                       sizeof(l2->l2_bdaddr.b));
                        print_bluetooth_l2_cid(", l2_cid=", l2->l2_cid);
-                       tprints(", l2_bdaddr_type=");
-                       printxval_index(bdaddr_types, l2->l2_bdaddr_type,
-                                       "BDADDR_???");
+
+                       if (addrlen == sizeof(struct sockaddr_l2)) {
+                               tprints(", l2_bdaddr_type=");
+                               printxval_index(bdaddr_types,
+                                               l2->l2_bdaddr_type,
+                                               "BDADDR_???");
+                       }
+
                        break;
                }
                default:
index 149ba2d8a3e74df0087056b6f0e8fcc83136838a..0e2950c12167b7839773aa99b4f156a58b95804e 100644 (file)
@@ -441,7 +441,9 @@ check_l2(void)
                .l2_psm = htobs(h_psm),
                .l2_bdaddr.b = "abcdef",
                .l2_cid = htobs(h_cid),
+#ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
                .l2_bdaddr_type = 0xce,
+#endif
        };
        void *l2 = tail_memdup(&c_l2, sizeof(c_l2));
        unsigned int len = sizeof(c_l2);
@@ -451,8 +453,10 @@ check_l2(void)
               ", l2_psm=htobs(L2CAP_PSM_DYN_START + %hu)"
               ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
               ", l2_cid=htobs(L2CAP_CID_DYN_START + %hu)"
-              ", l2_bdaddr_type=0xce /* BDADDR_??? */}"
-              ", %u) = %d EBADF (%m)\n", h_psm - 0x1001,
+#ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
+              ", l2_bdaddr_type=0xce /* BDADDR_??? */"
+#endif
+              "}, %u) = %d EBADF (%m)\n", h_psm - 0x1001,
               c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
               c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
               c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
@@ -460,14 +464,19 @@ check_l2(void)
 
        c_l2.l2_psm = htobs(1);
        c_l2.l2_cid = htobs(1);
+#ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
        c_l2.l2_bdaddr_type = BDADDR_LE_RANDOM;
+#endif
        memcpy(l2, &c_l2, sizeof(c_l2));
        ret = connect(-1, l2, len);
        printf("connect(-1, {sa_family=AF_BLUETOOTH"
               ", l2_psm=htobs(L2CAP_PSM_SDP)"
               ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
               ", l2_cid=htobs(L2CAP_CID_SIGNALING)"
-              ", l2_bdaddr_type=BDADDR_LE_RANDOM}, %u) = %d EBADF (%m)\n",
+#ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
+              ", l2_bdaddr_type=BDADDR_LE_RANDOM"
+#endif
+              "}, %u) = %d EBADF (%m)\n",
               c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
               c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
               c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
@@ -475,19 +484,37 @@ check_l2(void)
 
        c_l2.l2_psm = htobs(0xbad);
        c_l2.l2_cid = htobs(8);
+#ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
        c_l2.l2_bdaddr_type = 3;
+#endif
        memcpy(l2, &c_l2, sizeof(c_l2));
        ret = connect(-1, l2, len);
        printf("connect(-1, {sa_family=AF_BLUETOOTH"
               ", l2_psm=htobs(0xbad /* L2CAP_PSM_??? */)"
               ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
               ", l2_cid=htobs(0x8 /* L2CAP_CID_??? */)"
-              ", l2_bdaddr_type=0x3 /* BDADDR_??? */}"
-              ", %u) = %d EBADF (%m)\n",
+#ifdef HAVE_STRUCT_SOCKADDR_L2_L2_BDADDR_TYPE
+              ", l2_bdaddr_type=0x3 /* BDADDR_??? */"
+#endif
+              "}, %u) = %d EBADF (%m)\n",
               c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
               c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
               c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
               len, ret);
+
+       c_l2.l2_psm = htobs(0x10ff);
+       c_l2.l2_cid = htobs(0xffff);
+       memcpy(l2, &c_l2, 12);
+       ret = connect(-1, l2, 12);
+       printf("connect(-1, {sa_family=AF_BLUETOOTH"
+              ", l2_psm=htobs(L2CAP_PSM_AUTO_END)"
+              ", l2_bdaddr=%02x:%02x:%02x:%02x:%02x:%02x"
+              ", l2_cid=htobs(L2CAP_CID_DYN_END)"
+              "}, 12) = %d EBADF (%m)\n",
+              c_l2.l2_bdaddr.b[0], c_l2.l2_bdaddr.b[1],
+              c_l2.l2_bdaddr.b[2], c_l2.l2_bdaddr.b[3],
+              c_l2.l2_bdaddr.b[4], c_l2.l2_bdaddr.b[5],
+              ret);
 }
 #endif