From: Eugene Syromyatnikov Date: Tue, 8 May 2018 15:46:33 +0000 (+0200) Subject: sockaddr: add support for sockaddr_l2 without l2_bdaddr_type X-Git-Tag: v4.23~128 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ff51ab3d8f66d68e9d7bd8f817cc67baa570fca;p=strace sockaddr: add support for sockaddr_l2 without l2_bdaddr_type 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) : 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. --- diff --git a/configure.ac b/configure.ac index 720df0b9..231a861b 100644 --- a/configure.ac +++ b/configure.ac @@ -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 + #include ]) +]) + AC_CHECK_TYPES(m4_normalize([ struct br_mdb_entry, struct br_port_msg diff --git a/sockaddr.c b/sockaddr.c index 1e3067c4..0d597539 100644 --- a/sockaddr.c +++ b/sockaddr.c @@ -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: diff --git a/tests/net-sockaddr.c b/tests/net-sockaddr.c index 149ba2d8..0e2950c1 100644 --- a/tests/net-sockaddr.c +++ b/tests/net-sockaddr.c @@ -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