Skip to content

Commit 88fc5c2

Browse files
committed
gh-111178: Fix getsockaddrarg() undefined behavior
Don't pass direct references to sockaddr members since their type may not match PyArg_ParseTuple() types. Instead, use temporary 'int' and 'unsigned char' variables, and update sockaddr members afterwards.
1 parent 4596666 commit 88fc5c2

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

Modules/socketmodule.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2045,14 +2045,21 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20452045
memset(addr, 0, sizeof(struct sockaddr_l2));
20462046
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
20472047
_BT_L2_MEMB(addr, bdaddr_type) = BDADDR_BREDR;
2048+
int psm;
2049+
int cid = _BT_L2_MEMB(addr, cid);
2050+
unsigned char bdaddr_type = _BT_L2_MEMB(addr, bdaddr_type);
20482051
if (!PyArg_ParseTuple(args, "si|iB", &straddr,
2049-
&_BT_L2_MEMB(addr, psm),
2050-
&_BT_L2_MEMB(addr, cid),
2051-
&_BT_L2_MEMB(addr, bdaddr_type))) {
2052+
&psm,
2053+
&cid,
2054+
&bdaddr_type)) {
20522055
PyErr_Format(PyExc_OSError,
20532056
"%s(): wrong format", caller);
20542057
return 0;
20552058
}
2059+
_BT_L2_MEMB(addr, psm) = psm;
2060+
_BT_L2_MEMB(addr, cid) = cid;
2061+
_BT_L2_MEMB(addr, bdaddr_type) = bdaddr_type;
2062+
20562063
if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
20572064
return 0;
20582065

0 commit comments

Comments
 (0)