[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 345baa77ba)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-04-04 16:33:57 +02:00 committed by GitHub
parent d30052a4ed
commit 0c0ffbe39f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 0 deletions

View file

@ -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.

View file

@ -1779,6 +1779,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
assert(path.len >= 0); assert(path.len >= 0);
struct sockaddr_un* addr = &addrbuf->un; struct sockaddr_un* addr = &addrbuf->un;
memset(addr, 0, sizeof(struct sockaddr_un));
#ifdef __linux__ #ifdef __linux__
if (path.len == 0 || *(const char *)path.buf == 0) { if (path.len == 0 || *(const char *)path.buf == 0) {
/* Linux abstract namespace extension: /* Linux abstract namespace extension:
@ -1822,6 +1823,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{ {
int pid, groups; int pid, groups;
struct sockaddr_nl* addr = &addrbuf->nl; struct sockaddr_nl* addr = &addrbuf->nl;
memset(addr, 0, sizeof(struct sockaddr_nl));
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format( PyErr_Format(
PyExc_TypeError, PyExc_TypeError,
@ -1849,6 +1851,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{ {
unsigned int node, port; unsigned int node, port;
struct sockaddr_qrtr* addr = &addrbuf->sq; struct sockaddr_qrtr* addr = &addrbuf->sq;
memset(addr, 0, sizeof(struct sockaddr_qrtr));
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format( PyErr_Format(
PyExc_TypeError, PyExc_TypeError,
@ -1926,6 +1929,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0; return 0;
} }
struct sockaddr_in* addr = &addrbuf->in; struct sockaddr_in* addr = &addrbuf->in;
memset(addr, 0, sizeof(struct sockaddr_in));
result = setipaddr(s->state, host.buf, (struct sockaddr *)addr, result = setipaddr(s->state, host.buf, (struct sockaddr *)addr,
sizeof(*addr), AF_INET); sizeof(*addr), AF_INET);
idna_cleanup(&host); idna_cleanup(&host);
@ -1971,6 +1975,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0; return 0;
} }
struct sockaddr_in6* addr = &addrbuf->in6; struct sockaddr_in6* addr = &addrbuf->in6;
memset(addr, 0, sizeof(struct sockaddr_in6));
result = setipaddr(s->state, host.buf, (struct sockaddr *)addr, result = setipaddr(s->state, host.buf, (struct sockaddr *)addr,
sizeof(*addr), AF_INET6); sizeof(*addr), AF_INET6);
idna_cleanup(&host); idna_cleanup(&host);
@ -2028,6 +2033,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{ {
const char *straddr; const char *straddr;
struct sockaddr_rc *addr = &addrbuf->bt_rc; struct sockaddr_rc *addr = &addrbuf->bt_rc;
memset(addr, 0, sizeof(struct sockaddr_rc));
_BT_RC_MEMB(addr, family) = AF_BLUETOOTH; _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
unsigned long channel; unsigned long channel;
@ -2054,6 +2060,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
case BTPROTO_HCI: case BTPROTO_HCI:
{ {
struct sockaddr_hci *addr = &addrbuf->bt_hci; struct sockaddr_hci *addr = &addrbuf->bt_hci;
memset(addr, 0, sizeof(struct sockaddr_hci));
#if defined(__NetBSD__) || defined(__DragonFly__) #if defined(__NetBSD__) || defined(__DragonFly__)
const char *straddr; const char *straddr;
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
@ -2105,6 +2112,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
const char *straddr; const char *straddr;
struct sockaddr_sco *addr = &addrbuf->bt_sco; struct sockaddr_sco *addr = &addrbuf->bt_sco;
memset(addr, 0, sizeof(struct sockaddr_sco));
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyBytes_Check(args)) { if (!PyBytes_Check(args)) {
PyErr_Format(PyExc_OSError, PyErr_Format(PyExc_OSError,
@ -2182,6 +2190,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0; return 0;
} }
struct sockaddr_ll* addr = &addrbuf->ll; struct sockaddr_ll* addr = &addrbuf->ll;
memset(addr, 0, sizeof(struct sockaddr_ll));
addr->sll_family = AF_PACKET; addr->sll_family = AF_PACKET;
addr->sll_protocol = htons((short)protoNumber); addr->sll_protocol = htons((short)protoNumber);
addr->sll_ifindex = ifr.ifr_ifindex; addr->sll_ifindex = ifr.ifr_ifindex;
@ -2266,6 +2275,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct ifreq ifr; struct ifreq ifr;
Py_ssize_t len; Py_ssize_t len;
struct sockaddr_can *addr = &addrbuf->can; struct sockaddr_can *addr = &addrbuf->can;
memset(addr, 0, sizeof(struct sockaddr_can));
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
@ -2318,6 +2328,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
unsigned long int rx_id, tx_id; unsigned long int rx_id, tx_id;
struct sockaddr_can *addr = &addrbuf->can; struct sockaddr_can *addr = &addrbuf->can;
memset(addr, 0, sizeof(struct sockaddr_can));
if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter, if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
&interfaceName, &interfaceName,
@ -2365,6 +2376,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
uint8_t j1939_addr; uint8_t j1939_addr;
struct sockaddr_can *addr = &addrbuf->can; struct sockaddr_can *addr = &addrbuf->can;
memset(addr, 0, sizeof(struct sockaddr_can));
if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter, if (!PyArg_ParseTuple(args, "O&KIB", PyUnicode_FSConverter,
&interfaceName, &interfaceName,
@ -2417,6 +2429,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
case SYSPROTO_CONTROL: case SYSPROTO_CONTROL:
{ {
struct sockaddr_ctl *addr = &addrbuf->ctl; struct sockaddr_ctl *addr = &addrbuf->ctl;
memset(addr, 0, sizeof(struct sockaddr_ctl));
addr->sc_family = AF_SYSTEM; addr->sc_family = AF_SYSTEM;
addr->ss_sysaddr = AF_SYS_CONTROL; addr->ss_sysaddr = AF_SYS_CONTROL;