https://github.com/python/cpython/commit/10f73f75c5696c7179cad2a1384e15f32ee56ecb commit: 10f73f75c5696c7179cad2a1384e15f32ee56ecb branch: 3.12 author: Miss Islington (bot) <31488909+miss-isling...@users.noreply.github.com> committer: serhiy-storchaka <storch...@gmail.com> date: 2025-04-04T14:29:12Z summary:
[3.12] gh-132075: Fix possible use of sockaddr structures with uninitialized members (GH-132076) (GH-132087) Now all structure members are initialized with zeroes by default. (cherry picked from commit 345baa77ba2ce3b8ea8f2fad84754e5cc0b10938) Co-authored-by: Serhiy Storchaka <storch...@gmail.com> files: A Misc/NEWS.d/next/Library/2025-04-04-16-22-03.gh-issue-132075.qMM5np.rst M Modules/socketmodule.c diff --git a/Misc/NEWS.d/next/Library/2025-04-04-16-22-03.gh-issue-132075.qMM5np.rst b/Misc/NEWS.d/next/Library/2025-04-04-16-22-03.gh-issue-132075.qMM5np.rst new file mode 100644 index 00000000000000..691ea5897ae156 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-04-04-16-22-03.gh-issue-132075.qMM5np.rst @@ -0,0 +1,2 @@ +Fix possible use of :mod:`socket` address structures with uninitialized +members. Now all structure members are initialized with zeroes by default. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index f8943a942d4c8f..27afd73d9704db 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1788,6 +1788,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, assert(path.len >= 0); struct sockaddr_un* addr = &addrbuf->un; + memset(addr, 0, sizeof(struct sockaddr_un)); #ifdef __linux__ if (path.len == 0 || *(const char *)path.buf == 0) { /* Linux abstract namespace extension: @@ -1831,6 +1832,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { int pid, groups; struct sockaddr_nl* addr = &addrbuf->nl; + memset(addr, 0, sizeof(struct sockaddr_nl)); if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1858,6 +1860,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { unsigned int node, port; struct sockaddr_qrtr* addr = &addrbuf->sq; + memset(addr, 0, sizeof(struct sockaddr_qrtr)); if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1935,6 +1938,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } struct sockaddr_in* addr = &addrbuf->in; + memset(addr, 0, sizeof(struct sockaddr_in)); result = setipaddr(s->state, host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET); idna_cleanup(&host); @@ -1980,6 +1984,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } struct sockaddr_in6* addr = &addrbuf->in6; + memset(addr, 0, sizeof(struct sockaddr_in6)); result = setipaddr(s->state, host.buf, (struct sockaddr *)addr, sizeof(*addr), AF_INET6); idna_cleanup(&host); @@ -2037,6 +2042,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, { const char *straddr; struct sockaddr_rc *addr = &addrbuf->bt_rc; + memset(addr, 0, sizeof(struct sockaddr_rc)); _BT_RC_MEMB(addr, family) = AF_BLUETOOTH; #ifdef MS_WINDOWS unsigned long channel; @@ -2063,6 +2069,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, case BTPROTO_HCI: { struct sockaddr_hci *addr = &addrbuf->bt_hci; + memset(addr, 0, sizeof(struct sockaddr_hci)); #if defined(__NetBSD__) || defined(__DragonFly__) const char *straddr; _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; @@ -2114,6 +2121,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, const char *straddr; struct sockaddr_sco *addr = &addrbuf->bt_sco; + memset(addr, 0, sizeof(struct sockaddr_sco)); _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; if (!PyBytes_Check(args)) { PyErr_Format(PyExc_OSError, @@ -2191,6 +2199,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, return 0; } struct sockaddr_ll* addr = &addrbuf->ll; + memset(addr, 0, sizeof(struct sockaddr_ll)); addr->sll_family = AF_PACKET; addr->sll_protocol = htons((short)protoNumber); addr->sll_ifindex = ifr.ifr_ifindex; @@ -2275,6 +2284,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, struct ifreq ifr; Py_ssize_t len; struct sockaddr_can *addr = &addrbuf->can; + memset(addr, 0, sizeof(struct sockaddr_can)); if (!PyTuple_Check(args)) { PyErr_Format(PyExc_TypeError, @@ -2327,6 +2337,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, unsigned long int rx_id, tx_id; struct sockaddr_can *addr = &addrbuf->can; + memset(addr, 0, sizeof(struct sockaddr_can)); if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter, &interfaceName, @@ -2374,6 +2385,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, uint8_t j1939_addr; struct sockaddr_can *addr = &addrbuf->can; + memset(addr, 0, sizeof(struct sockaddr_can)); if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter, &interfaceName, @@ -2426,6 +2438,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, case SYSPROTO_CONTROL: { struct sockaddr_ctl *addr = &addrbuf->ctl; + memset(addr, 0, sizeof(struct sockaddr_ctl)); addr->sc_family = AF_SYSTEM; addr->ss_sysaddr = AF_SYS_CONTROL; _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com