mirror of
https://github.com/python/cpython.git
synced 2025-11-01 14:11:41 +00:00
[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:
parent
d30052a4ed
commit
0c0ffbe39f
2 changed files with 15 additions and 0 deletions
|
|
@ -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.
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue