Skip to content

Commit 62c74f3

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 ed28b92 commit 62c74f3

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
@@ -1513,10 +1513,10 @@ makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
15131513
#ifdef CAN_J1939
15141514
case CAN_J1939:
15151515
{
1516-
return Py_BuildValue("O&KkB", PyUnicode_DecodeFSDefault,
1516+
return Py_BuildValue("O&KIB", PyUnicode_DecodeFSDefault,
15171517
ifname,
1518-
a->can_addr.j1939.name,
1519-
a->can_addr.j1939.pgn,
1518+
(unsigned long long)a->can_addr.j1939.name,
1519+
(unsigned int)a->can_addr.j1939.pgn,
15201520
a->can_addr.j1939.addr);
15211521
}
15221522
#endif /* CAN_J1939 */
@@ -2207,13 +2207,13 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22072207
PyObject *interfaceName;
22082208
struct ifreq ifr;
22092209
Py_ssize_t len;
2210-
uint64_t j1939_name;
2211-
uint32_t j1939_pgn;
2210+
unsigned long long j1939_name; /* at least 64 bits */
2211+
unsigned int j1939_pgn; /* at least 32 bits */
22122212
uint8_t j1939_addr;
22132213

22142214
struct sockaddr_can *addr = &addrbuf->can;
22152215

2216-
if (!PyArg_ParseTuple(args, "O&KkB", PyUnicode_FSConverter,
2216+
if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter,
22172217
&interfaceName,
22182218
&j1939_name,
22192219
&j1939_pgn,
@@ -2241,8 +2241,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22412241

22422242
addr->can_family = AF_CAN;
22432243
addr->can_ifindex = ifr.ifr_ifindex;
2244-
addr->can_addr.j1939.name = j1939_name;
2245-
addr->can_addr.j1939.pgn = j1939_pgn;
2244+
addr->can_addr.j1939.name = (uint64_t)j1939_name;
2245+
addr->can_addr.j1939.pgn = (uint32_t)j1939_pgn;
22462246
addr->can_addr.j1939.addr = j1939_addr;
22472247

22482248
*len_ret = sizeof(*addr);

0 commit comments

Comments
 (0)