Skip to content

Commit 98fef20

Browse files
bpo-45228: Fix stack buffer overflow in parsing J1939 address (GH-28404)
(cherry picked from commit 7733195) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent 7ad07ee commit 98fef20

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix stack buffer overflow in parsing J1939 network address.

Modules/socketmodule.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,10 +1555,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
15551555
#ifdef CAN_J1939
15561556
case CAN_J1939:
15571557
{
1558-
return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1558+
return Py_BuildValue("O&KIB", PyUnicode_DecodeFSDefault,
15591559
ifname,
1560-
a->can_addr.j1939.name,
1561-
a->can_addr.j1939.pgn,
1560+
(unsigned long long)a->can_addr.j1939.name,
1561+
(unsigned int)a->can_addr.j1939.pgn,
15621562
a->can_addr.j1939.addr);
15631563
}
15641564
#endif /* CAN_J1939 */
@@ -2249,13 +2249,13 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22492249
PyObject *interfaceName;
22502250
struct ifreq ifr;
22512251
Py_ssize_t len;
2252-
uint64_t j1939_name;
2253-
uint32_t j1939_pgn;
2252+
unsigned long long j1939_name; /* at least 64 bits */
2253+
unsigned int j1939_pgn; /* at least 32 bits */
22542254
uint8_t j1939_addr;
22552255

22562256
struct sockaddr_can *addr = &addrbuf->can;
22572257

2258-
if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2258+
if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter,
22592259
&interfaceName,
22602260
&j1939_name,
22612261
&j1939_pgn,
@@ -2283,8 +2283,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22832283

22842284
addr->can_family = AF_CAN;
22852285
addr->can_ifindex = ifr.ifr_ifindex;
2286-
addr->can_addr.j1939.name = j1939_name;
2287-
addr->can_addr.j1939.pgn = j1939_pgn;
2286+
addr->can_addr.j1939.name = (uint64_t)j1939_name;
2287+
addr->can_addr.j1939.pgn = (uint32_t)j1939_pgn;
22882288
addr->can_addr.j1939.addr = j1939_addr;
22892289

22902290
*len_ret = sizeof(*addr);

0 commit comments

Comments
 (0)