Skip to content

Commit d565fb9

Browse files
authored
bpo-38282: Rewrite getsockaddrarg() helper function (GH-16698)
Rewrite getsockaddrarg() helper function of socketmodule.c (_socket module) to prevent a false alarm when compiling codde using GCC with _FORTIFY_SOURCE=2. Pass a pointer of the sock_addr_t union, rather than passing a pointer to a sockaddr structure. Add "struct sockaddr_tipc tipc;" to the sock_addr_t union.
1 parent 1dbe537 commit d565fb9

File tree

2 files changed

+25
-39
lines changed

2 files changed

+25
-39
lines changed

Modules/socketmodule.c

Lines changed: 22 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,14 +1688,13 @@ idna_converter(PyObject *obj, struct maybe_idna *data)
16881688

16891689
static int
16901690
getsockaddrarg(PySocketSockObject *s, PyObject *args,
1691-
struct sockaddr *addr_ret, int *len_ret, const char *caller)
1691+
sock_addr_t *addrbuf, int *len_ret, const char *caller)
16921692
{
16931693
switch (s->sock_family) {
16941694

16951695
#if defined(AF_UNIX)
16961696
case AF_UNIX:
16971697
{
1698-
struct sockaddr_un* addr;
16991698
Py_buffer path;
17001699
int retval = 0;
17011700

@@ -1713,7 +1712,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
17131712
}
17141713
assert(path.len >= 0);
17151714

1716-
addr = (struct sockaddr_un*)addr_ret;
1715+
struct sockaddr_un* addr = &addrbuf->un;
17171716
#ifdef __linux__
17181717
if (path.len > 0 && *(const char *)path.buf == 0) {
17191718
/* Linux abstract namespace extension */
@@ -1748,9 +1747,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
17481747
#if defined(AF_NETLINK)
17491748
case AF_NETLINK:
17501749
{
1751-
struct sockaddr_nl* addr;
17521750
int pid, groups;
1753-
addr = (struct sockaddr_nl *)addr_ret;
1751+
struct sockaddr_nl* addr = &addrbuf->nl;
17541752
if (!PyTuple_Check(args)) {
17551753
PyErr_Format(
17561754
PyExc_TypeError,
@@ -1776,9 +1774,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
17761774
#if defined(AF_QIPCRTR)
17771775
case AF_QIPCRTR:
17781776
{
1779-
struct sockaddr_qrtr* addr;
17801777
unsigned int node, port;
1781-
addr = (struct sockaddr_qrtr *)addr_ret;
1778+
struct sockaddr_qrtr* addr = &addrbuf->sq;
17821779
if (!PyTuple_Check(args)) {
17831780
PyErr_Format(
17841781
PyExc_TypeError,
@@ -1800,9 +1797,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18001797
#if defined(AF_VSOCK)
18011798
case AF_VSOCK:
18021799
{
1803-
struct sockaddr_vm* addr;
1800+
struct sockaddr_vm* addr = &addrbuf->vm;
18041801
int port, cid;
1805-
addr = (struct sockaddr_vm *)addr_ret;
18061802
memset(addr, 0, sizeof(struct sockaddr_vm));
18071803
if (!PyTuple_Check(args)) {
18081804
PyErr_Format(
@@ -1830,7 +1826,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18301826

18311827
case AF_INET:
18321828
{
1833-
struct sockaddr_in* addr;
18341829
struct maybe_idna host = {NULL, NULL};
18351830
int port, result;
18361831
if (!PyTuple_Check(args)) {
@@ -1852,7 +1847,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18521847
}
18531848
return 0;
18541849
}
1855-
addr=(struct sockaddr_in*)addr_ret;
1850+
struct sockaddr_in* addr = &addrbuf->in;
18561851
result = setipaddr(host.buf, (struct sockaddr *)addr,
18571852
sizeof(*addr), AF_INET);
18581853
idna_cleanup(&host);
@@ -1873,7 +1868,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18731868
#ifdef ENABLE_IPV6
18741869
case AF_INET6:
18751870
{
1876-
struct sockaddr_in6* addr;
18771871
struct maybe_idna host = {NULL, NULL};
18781872
int port, result;
18791873
unsigned int flowinfo, scope_id;
@@ -1898,7 +1892,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
18981892
}
18991893
return 0;
19001894
}
1901-
addr = (struct sockaddr_in6*)addr_ret;
1895+
struct sockaddr_in6* addr = &addrbuf->in6;
19021896
result = setipaddr(host.buf, (struct sockaddr *)addr,
19031897
sizeof(*addr), AF_INET6);
19041898
idna_cleanup(&host);
@@ -1932,10 +1926,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
19321926
#ifdef BTPROTO_L2CAP
19331927
case BTPROTO_L2CAP:
19341928
{
1935-
struct sockaddr_l2 *addr;
19361929
const char *straddr;
19371930

1938-
addr = (struct sockaddr_l2 *)addr_ret;
1931+
struct sockaddr_l2 *addr = &addrbuf->bt_l2;
19391932
memset(addr, 0, sizeof(struct sockaddr_l2));
19401933
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
19411934
if (!PyArg_ParseTuple(args, "si", &straddr,
@@ -1953,10 +1946,8 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
19531946
#endif /* BTPROTO_L2CAP */
19541947
case BTPROTO_RFCOMM:
19551948
{
1956-
struct sockaddr_rc *addr;
19571949
const char *straddr;
1958-
1959-
addr = (struct sockaddr_rc *)addr_ret;
1950+
struct sockaddr_rc *addr = &addrbuf->bt_rc;
19601951
_BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
19611952
if (!PyArg_ParseTuple(args, "si", &straddr,
19621953
&_BT_RC_MEMB(addr, channel))) {
@@ -1973,7 +1964,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
19731964
#ifdef BTPROTO_HCI
19741965
case BTPROTO_HCI:
19751966
{
1976-
struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
1967+
struct sockaddr_hci *addr = &addrbuf->bt_hci;
19771968
#if defined(__NetBSD__) || defined(__DragonFly__)
19781969
const char *straddr;
19791970
_BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
@@ -1999,10 +1990,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
19991990
#if !defined(__FreeBSD__)
20001991
case BTPROTO_SCO:
20011992
{
2002-
struct sockaddr_sco *addr;
20031993
const char *straddr;
20041994

2005-
addr = (struct sockaddr_sco *)addr_ret;
1995+
struct sockaddr_sco *addr = &addrbuf->bt_sco;
20061996
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
20071997
if (!PyBytes_Check(args)) {
20081998
PyErr_Format(PyExc_OSError,
@@ -2029,7 +2019,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20292019
#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
20302020
case AF_PACKET:
20312021
{
2032-
struct sockaddr_ll* addr;
20332022
struct ifreq ifr;
20342023
const char *interfaceName;
20352024
int protoNumber;
@@ -2080,7 +2069,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
20802069
PyBuffer_Release(&haddr);
20812070
return 0;
20822071
}
2083-
addr = (struct sockaddr_ll*)addr_ret;
2072+
struct sockaddr_ll* addr = &addrbuf->ll;
20842073
addr->sll_family = AF_PACKET;
20852074
addr->sll_protocol = htons((short)protoNumber);
20862075
addr->sll_ifindex = ifr.ifr_ifindex;
@@ -2103,7 +2092,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21032092
{
21042093
unsigned int atype, v1, v2, v3;
21052094
unsigned int scope = TIPC_CLUSTER_SCOPE;
2106-
struct sockaddr_tipc *addr;
21072095

21082096
if (!PyTuple_Check(args)) {
21092097
PyErr_Format(
@@ -2121,7 +2109,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21212109
return 0;
21222110
}
21232111

2124-
addr = (struct sockaddr_tipc *) addr_ret;
2112+
struct sockaddr_tipc *addr = &addrbuf->tipc;
21252113
memset(addr, 0, sizeof(struct sockaddr_tipc));
21262114

21272115
addr->family = AF_TIPC;
@@ -2162,11 +2150,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
21622150
#endif
21632151
#if defined(CAN_RAW) || defined(CAN_BCM)
21642152
{
2165-
struct sockaddr_can *addr;
21662153
PyObject *interfaceName;
21672154
struct ifreq ifr;
21682155
Py_ssize_t len;
2169-
addr = (struct sockaddr_can *)addr_ret;
2156+
struct sockaddr_can *addr = &addrbuf->can;
21702157

21712158
if (!PyTuple_Check(args)) {
21722159
PyErr_Format(PyExc_TypeError,
@@ -2213,13 +2200,12 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22132200
#ifdef CAN_ISOTP
22142201
case CAN_ISOTP:
22152202
{
2216-
struct sockaddr_can *addr;
22172203
PyObject *interfaceName;
22182204
struct ifreq ifr;
22192205
Py_ssize_t len;
22202206
unsigned long int rx_id, tx_id;
22212207

2222-
addr = (struct sockaddr_can *)addr_ret;
2208+
struct sockaddr_can *addr = &addrbuf->can;
22232209

22242210
if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
22252211
&interfaceName,
@@ -2269,9 +2255,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
22692255
#ifdef SYSPROTO_CONTROL
22702256
case SYSPROTO_CONTROL:
22712257
{
2272-
struct sockaddr_ctl *addr;
2273-
2274-
addr = (struct sockaddr_ctl *)addr_ret;
2258+
struct sockaddr_ctl *addr = &addrbuf->ctl;
22752259
addr->sc_family = AF_SYSTEM;
22762260
addr->ss_sysaddr = AF_SYS_CONTROL;
22772261

@@ -2323,10 +2307,9 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
23232307
#ifdef HAVE_SOCKADDR_ALG
23242308
case AF_ALG:
23252309
{
2326-
struct sockaddr_alg *sa;
23272310
const char *type;
23282311
const char *name;
2329-
sa = (struct sockaddr_alg *)addr_ret;
2312+
struct sockaddr_alg *sa = &addrbuf->alg;
23302313

23312314
memset(sa, 0, sizeof(*sa));
23322315
sa->salg_family = AF_ALG;
@@ -3110,7 +3093,7 @@ sock_bind(PySocketSockObject *s, PyObject *addro)
31103093
int addrlen;
31113094
int res;
31123095

3113-
if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "bind")) {
3096+
if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "bind")) {
31143097
return NULL;
31153098
}
31163099

@@ -3280,7 +3263,7 @@ sock_connect(PySocketSockObject *s, PyObject *addro)
32803263
int addrlen;
32813264
int res;
32823265

3283-
if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect")) {
3266+
if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect")) {
32843267
return NULL;
32853268
}
32863269

@@ -3311,7 +3294,7 @@ sock_connect_ex(PySocketSockObject *s, PyObject *addro)
33113294
int addrlen;
33123295
int res;
33133296

3314-
if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "connect_ex")) {
3297+
if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "connect_ex")) {
33153298
return NULL;
33163299
}
33173300

@@ -4316,7 +4299,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
43164299
return select_error();
43174300
}
43184301

4319-
if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen, "sendto")) {
4302+
if (!getsockaddrarg(s, addro, &addrbuf, &addrlen, "sendto")) {
43204303
PyBuffer_Release(&pbuf);
43214304
return NULL;
43224305
}
@@ -4451,7 +4434,7 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args)
44514434

44524435
/* Parse destination address. */
44534436
if (addr_arg != NULL && addr_arg != Py_None) {
4454-
if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen,
4437+
if (!getsockaddrarg(s, addr_arg, &addrbuf, &addrlen,
44554438
"sendmsg"))
44564439
{
44574440
goto finally;

Modules/socketmodule.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,9 @@ typedef union sock_addr {
261261
#ifdef AF_VSOCK
262262
struct sockaddr_vm vm;
263263
#endif
264+
#ifdef HAVE_LINUX_TIPC_H
265+
struct sockaddr_tipc tipc;
266+
#endif
264267
} sock_addr_t;
265268

266269
/* The object holding a socket. It holds some extra information,

0 commit comments

Comments
 (0)