gh-132099: Harmonize Bluetooth address handling (GH-132486)

Now all protocols always accept the Bluetooth address as string and
getsockname() always returns the Bluetooth address as string.

* BTPROTO_SCO now accepts not only bytes, but str.
* BTPROTO_SCO now checks address for embedded null.
* On *BSD, BTPROTO_HCI now accepts str instead of bytes.
* On FreeBSD, getsockname() for BTPROTO_HCI now returns str instead of bytes.
* On NetBSD and DragonFly BDS, BTPROTO_HCI now checks address for embedded null.
This commit is contained in:
Serhiy Storchaka 2025-04-14 08:58:56 +03:00 committed by GitHub
parent ccad61e35d
commit 1fc1df8dcc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 57 additions and 37 deletions

View file

@ -1546,7 +1546,7 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
#elif defined(__FreeBSD__)
const char *node = _BT_HCI_MEMB(a, node);
size_t len = strnlen(node, sizeof(_BT_HCI_MEMB(a, node)));
return PyBytes_FromStringAndSize(node, (Py_ssize_t)len);
return PyUnicode_FromStringAndSize(node, (Py_ssize_t)len);
#else
return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
#endif
@ -2145,36 +2145,25 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0;
}
_BT_HCI_MEMB(addr, dev) = dev;
#elif defined(__FreeBSD__)
if (!PyBytes_Check(args)) {
#else
const char *straddr;
if (!PyArg_Parse(args, "s", &straddr)) {
PyErr_Format(PyExc_OSError, "%s: "
"wrong node format", caller);
"wrong format", caller);
return 0;
}
const char *straddr = PyBytes_AS_STRING(args);
size_t len = PyBytes_GET_SIZE(args);
if (strlen(straddr) != len) {
PyErr_Format(PyExc_ValueError, "%s: "
"node contains embedded null character", caller);
return 0;
}
if (len > sizeof(_BT_HCI_MEMB(addr, node))) {
# if defined(__FreeBSD__)
if (strlen(straddr) > sizeof(_BT_HCI_MEMB(addr, node))) {
PyErr_Format(PyExc_ValueError, "%s: "
"node too long", caller);
return 0;
}
strncpy(_BT_HCI_MEMB(addr, node), straddr,
sizeof(_BT_HCI_MEMB(addr, node)));
#else
const char *straddr;
if (!PyBytes_Check(args)) {
PyErr_Format(PyExc_OSError, "%s: "
"wrong format", caller);
return 0;
}
straddr = PyBytes_AS_STRING(args);
# else
if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
return 0;
# endif
#endif
*len_ret = sizeof *addr;
return 1;
@ -2188,12 +2177,22 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr_sco *addr = &addrbuf->bt_sco;
memset(addr, 0, sizeof(struct sockaddr_sco));
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyBytes_Check(args)) {
if (PyBytes_Check(args)) {
if (!PyArg_Parse(args, "y", &straddr)) {
return 0;
}
}
else if (PyUnicode_Check(args)) {
if (!PyArg_Parse(args, "s", &straddr)) {
return 0;
}
}
else {
PyErr_Format(PyExc_OSError,
"%s(): wrong format", caller);
return 0;
}
straddr = PyBytes_AS_STRING(args);
if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
return 0;