Skip to content

Commit 0c0ffbe

Browse files
[3.13] gh-132075: Fix possible use of sockaddr structures with uninitialized members (GH-132076) (GH-132086)
Now all structure members are initialized with zeroes by default. (cherry picked from commit 345baa7) Co-authored-by: Serhiy Storchaka <[email protected]>
1 parent d30052a commit 0c0ffbe

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix possible use of :mod:`socket` address structures with uninitialized
2+
members. Now all structure members are initialized with zeroes by default.

Modules/socketmodule.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
17791779
assert(path.len >= 0);
17801780

17811781
struct sockaddr_un* addr = &addrbuf->un;
1782+
memset(addr, 0, sizeof(struct sockaddr_un));
17821783
#ifdef __linux__
17831784
if (path.len == 0 || *(const char *)path.buf == 0) {
17841785
/* Linux abstract namespace extension:
@@ -1822,6 +1823,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18221823
{
18231824
int pid, groups;
18241825
struct sockaddr_nl* addr = &addrbuf->nl;
1826+
memset(addr, 0, sizeof(struct sockaddr_nl));
18251827
if (!PyTuple_Check(args)) {
18261828
PyErr_Format(
18271829
PyExc_TypeError,
@@ -1849,6 +1851,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18491851
{
18501852
unsigned int node, port;
18511853
struct sockaddr_qrtr* addr = &addrbuf->sq;
1854+
memset(addr, 0, sizeof(struct sockaddr_qrtr));
18521855
if (!PyTuple_Check(args)) {
18531856
PyErr_Format(
18541857
PyExc_TypeError,
@@ -1926,6 +1929,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
19261929
return 0;
19271930
}
19281931
struct sockaddr_in* addr = &addrbuf->in;
1932+
memset(addr, 0, sizeof(struct sockaddr_in));
19291933
result = setipaddr(s->state, host.buf, (struct sockaddr *)addr,
19301934
sizeof(*addr), AF_INET);
19311935
idna_cleanup(&host);
@@ -1971,6 +1975,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
19711975
return 0;
19721976
}
19731977
struct sockaddr_in6* addr = &addrbuf->in6;
1978+
memset(addr, 0, sizeof(struct sockaddr_in6));
19741979
result = setipaddr(s->state, host.buf, (struct sockaddr *)addr,
19751980
sizeof(*addr), AF_INET6);
19761981
idna_cleanup(&host);
@@ -2028,6 +2033,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20282033
{
20292034
const char *straddr;
20302035
struct sockaddr_rc *addr = &addrbuf->bt_rc;
2036+
memset(addr, 0, sizeof(struct sockaddr_rc));
20312037
_BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
20322038
#ifdef MS_WINDOWS
20332039
unsigned long channel;
@@ -2054,6 +2060,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20542060
case BTPROTO_HCI:
20552061
{
20562062
struct sockaddr_hci *addr = &addrbuf->bt_hci;
2063+
memset(addr, 0, sizeof(struct sockaddr_hci));
20572064
#if defined(__NetBSD__) || defined(__DragonFly__)
20582065
const char *straddr;
20592066
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
@@ -2105,6 +2112,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21052112
const char *straddr;
21062113

21072114
struct sockaddr_sco *addr = &addrbuf->bt_sco;
2115+
memset(addr, 0, sizeof(struct sockaddr_sco));
21082116
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
21092117
if (!PyBytes_Check(args)) {
21102118
PyErr_Format(PyExc_OSError,
@@ -2182,6 +2190,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21822190
return 0;
21832191
}
21842192
struct sockaddr_ll* addr = &addrbuf->ll;
2193+
memset(addr, 0, sizeof(struct sockaddr_ll));
21852194
addr->sll_family = AF_PACKET;
21862195
addr->sll_protocol = htons((short)protoNumber);
21872196
addr->sll_ifindex = ifr.ifr_ifindex;
@@ -2266,6 +2275,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22662275
struct ifreq ifr;
22672276
Py_ssize_t len;
22682277
struct sockaddr_can *addr = &addrbuf->can;
2278+
memset(addr, 0, sizeof(struct sockaddr_can));
22692279

22702280
if (!PyTuple_Check(args)) {
22712281
PyErr_Format(PyExc_TypeError,
@@ -2318,6 +2328,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
23182328
unsigned long int rx_id, tx_id;
23192329

23202330
struct sockaddr_can *addr = &addrbuf->can;
2331+
memset(addr, 0, sizeof(struct sockaddr_can));
23212332

23222333
if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
23232334
&interfaceName,
@@ -2365,6 +2376,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
23652376
uint8_t j1939_addr;
23662377

23672378
struct sockaddr_can *addr = &addrbuf->can;
2379+
memset(addr, 0, sizeof(struct sockaddr_can));
23682380

23692381
if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter,
23702382
&interfaceName,
@@ -2417,6 +2429,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
24172429
case SYSPROTO_CONTROL:
24182430
{
24192431
struct sockaddr_ctl *addr = &addrbuf->ctl;
2432+
memset(addr, 0, sizeof(struct sockaddr_ctl));
24202433
addr->sc_family = AF_SYSTEM;
24212434
addr->ss_sysaddr = AF_SYS_CONTROL;
24222435

0 commit comments

Comments
 (0)