1From aa8ee5e5e934908f0357364f6ec90a3ecda62880 Mon Sep 17 00:00:00 2001 2From: Nicolas Schodet <nico@ni.fr.eu.org> 3Date: Mon, 3 Jan 2022 02:37:01 +0100 4Subject: [PATCH] Use Py_ssize_t when parsing buffer length, fix #426 (#427) 5 6From python 3.9 documentation: 7 8> For all # variants of formats (s#, y#, etc.), the macro 9> PY_SSIZE_T_CLEAN must be defined before including Python.h. On Python 10> 3.9 and older, the type of the length argument is Py_ssize_t if the 11> PY_SSIZE_T_CLEAN macro is defined, or int otherwise. 12 13From python 3.8 changes: 14 15> Use of # variants of formats in parsing or building value (e.g. 16> PyArg_ParseTuple(), Py_BuildValue(), PyObject_CallFunction(), etc.) 17> without PY_SSIZE_T_CLEAN defined raises DeprecationWarning now. It 18> will be removed in 3.10 or 4.0. Read Parsing arguments and building 19> values for detail. (Contributed by Inada Naoki in bpo-36381.) 20 21Fixes https://github.com/pybluez/pybluez/issues/426 22 23Upstream-Status: Backport [https://github.com/pybluez/pybluez/pull/427] 24Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl> 25--- 26 bluez/btmodule.c | 23 ++++++++++++++--------- 27 msbt/_msbt.c | 6 ++++-- 28 2 files changed, 18 insertions(+), 11 deletions(-) 29 30diff --git a/bluez/btmodule.c b/bluez/btmodule.c 31index 518b723..912a489 100644 32--- a/bluez/btmodule.c 33+++ b/bluez/btmodule.c 34@@ -16,7 +16,8 @@ Local naming conventions: 35 - names starting with bt_ are module-level functions 36 37 */ 38- 39+#define PY_SSIZE_T_CLEAN 1 40+#include "Python.h" 41 #include "btmodule.h" 42 #include "structmember.h" 43 44@@ -732,7 +733,7 @@ sock_setsockopt(PySocketSockObject *s, PyObject *args) 45 int optname; 46 int res; 47 void *buf; 48- int buflen; 49+ Py_ssize_t buflen; 50 int flag; 51 52 if (PyArg_ParseTuple(args, "iii:setsockopt", &level, &optname, &flag)) { 53@@ -2001,7 +2002,8 @@ static PyObject * 54 bt_hci_send_cmd(PyObject *self, PyObject *args) 55 { 56 PySocketSockObject *socko = NULL; 57- int err, plen = 0; 58+ int err; 59+ Py_ssize_t plen = 0; 60 uint16_t ogf, ocf; 61 char *param = NULL; 62 int dd = 0; 63@@ -2036,6 +2038,7 @@ bt_hci_send_req(PyObject *self, PyObject *args, PyObject *kwds) 64 int err; 65 int to=0; 66 char rparam[256]; 67+ Py_ssize_t req_clen; 68 struct hci_request req = { 0 }; 69 int dd = 0; 70 71@@ -2043,9 +2046,10 @@ bt_hci_send_req(PyObject *self, PyObject *args, PyObject *kwds) 72 "timeout", 0 }; 73 74 if( !PyArg_ParseTupleAndKeywords(args, kwds, "OHHii|s#i", keywords, 75- &socko, &req.ogf, &req.ocf, &req.event, &req.rlen, 76- &req.cparam, &req.clen, &to) ) 77+ &socko, &req.ogf, &req.ocf, &req.event, &req.rlen, 78+ &req.cparam, &req_clen, &to) ) 79 return 0; 80+ req.clen = req_clen; 81 82 req.rparam = rparam; 83 dd = socko->sock_fd; 84@@ -2274,7 +2278,8 @@ Returns the name of the device, or raises an error on failure"); 85 static PyObject * bt_hci_filter_ ## name (PyObject *self, PyObject *args )\ 86 { \ 87 char *param; \ 88- int len, arg; \ 89+ Py_ssize_t len; \ 90+ int arg; \ 91 if( !PyArg_ParseTuple(args,"s#i", ¶m, &len, &arg) ) \ 92 return 0; \ 93 if( len != sizeof(struct hci_filter) ) { \ 94@@ -2303,7 +2308,7 @@ DECL_HCI_FILTER_OP_1(test_opcode, "test opcode!") 95 static PyObject * bt_hci_filter_ ## name (PyObject *self, PyObject *args )\ 96 { \ 97 char *param; \ 98- int len; \ 99+ Py_ssize_t len; \ 100 if( !PyArg_ParseTuple(args,"s#", ¶m, &len) ) \ 101 return 0; \ 102 if( len != sizeof(struct hci_filter) ) { \ 103@@ -2364,7 +2369,7 @@ static PyObject * 104 bt_ba2str(PyObject *self, PyObject *args) 105 { 106 char *data=NULL; 107- int len=0; 108+ Py_ssize_t len=0; 109 char ba_str[19] = {0}; 110 if (!PyArg_ParseTuple(args, "s#", &data, &len)) return 0; 111 ba2str((bdaddr_t*)data, ba_str); 112@@ -2579,7 +2584,7 @@ bt_sdp_advertise_service( PyObject *self, PyObject *args ) 113 *provider = NULL, 114 *description = NULL; 115 PyObject *service_classes, *profiles, *protocols; 116- int namelen = 0, provlen = 0, desclen = 0; 117+ Py_ssize_t namelen = 0, provlen = 0, desclen = 0; 118 uuid_t svc_uuid = { 0 }; 119 int i; 120 char addrbuf[256] = { 0 }; 121diff --git a/msbt/_msbt.c b/msbt/_msbt.c 122index b3d27ff..81f5ee9 100644 123--- a/msbt/_msbt.c 124+++ b/msbt/_msbt.c 125@@ -2,6 +2,8 @@ 126 #define UNICODE 127 #endif 128 129+#define PY_SSIZE_T_CLEAN 1 130+ 131 #include <winsock2.h> 132 #include <ws2bth.h> 133 #include <BluetoothAPIs.h> 134@@ -155,7 +157,7 @@ static PyObject * 135 msbt_bind(PyObject *self, PyObject *args) 136 { 137 wchar_t *addrstr = NULL; 138- int addrstrlen = -1; 139+ Py_ssize_t addrstrlen = -1; 140 int sockfd = -1; 141 int port = -1; 142 char buf[100] = { 0 }; 143@@ -765,7 +767,7 @@ msbt_set_service_raw(PyObject *self, PyObject *args) 144 WSAESETSERVICEOP op; 145 146 char *record = NULL; 147- int reclen = -1; 148+ Py_ssize_t reclen = -1; 149 BTH_SET_SERVICE *si = NULL; 150 int silen = -1; 151 ULONG sdpVersion = BTH_SDP_VERSION; 152-- 1532.34.1 154 155