Kaydet (Commit) 95b744ce authored tarafından Martin v. Löwis's avatar Martin v. Löwis

Patch #1544279: Improve thread-safety of the socket module by moving

the sock_addr_t storage out of the socket object.
üst 1c305dbf
...@@ -70,6 +70,9 @@ Core and builtins ...@@ -70,6 +70,9 @@ Core and builtins
Extension Modules Extension Modules
----------------- -----------------
- Patch #1544279: Improve thread-safety of the socket module by moving
the sock_addr_t storage out of the socket object.
- Bug #1563807: _ctypes built on AIX fails with ld ffi error. - Bug #1563807: _ctypes built on AIX fails with ld ffi error.
- Bug #1598620: A ctypes Structure cannot contain itself. - Bug #1598620: A ctypes Structure cannot contain itself.
......
...@@ -364,19 +364,16 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); ...@@ -364,19 +364,16 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
#define sockaddr_l2 sockaddr_l2cap #define sockaddr_l2 sockaddr_l2cap
#define sockaddr_rc sockaddr_rfcomm #define sockaddr_rc sockaddr_rfcomm
#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb) #define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb) #define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
#elif defined(__NetBSD__) #elif defined(__NetBSD__)
#define sockaddr_l2 sockaddr_bt #define sockaddr_l2 sockaddr_bt
#define sockaddr_rc sockaddr_bt #define sockaddr_rc sockaddr_bt
#define sockaddr_sco sockaddr_bt #define sockaddr_sco sockaddr_bt
#define _BT_SOCKADDR_MEMB(s, proto) &((s)->sock_addr)
#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb) #define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb) #define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb) #define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
#else #else
#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto)
#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb) #define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb) #define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) #define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
...@@ -388,6 +385,8 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); ...@@ -388,6 +385,8 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
#define SEGMENT_SIZE (32 * 1024 -1) #define SEGMENT_SIZE (32 * 1024 -1)
#endif #endif
#define SAS2SA(x) ((struct sockaddr *)(x))
/* /*
* Constants for getnameinfo() * Constants for getnameinfo()
*/ */
...@@ -1174,7 +1173,7 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto) ...@@ -1174,7 +1173,7 @@ makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)
static int static int
getsockaddrarg(PySocketSockObject *s, PyObject *args, getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr **addr_ret, int *len_ret) struct sockaddr *addr_ret, int *len_ret)
{ {
switch (s->sock_family) { switch (s->sock_family) {
...@@ -1184,9 +1183,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1184,9 +1183,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr_un* addr; struct sockaddr_un* addr;
char *path; char *path;
int len; int len;
addr = (struct sockaddr_un*)&(s->sock_addr).un;
if (!PyArg_Parse(args, "t#", &path, &len)) if (!PyArg_Parse(args, "t#", &path, &len))
return 0; return 0;
addr = (struct sockaddr_un*)addr_ret;
#ifdef linux #ifdef linux
if (len > 0 && path[0] == 0) { if (len > 0 && path[0] == 0) {
/* Linux abstract namespace extension */ /* Linux abstract namespace extension */
...@@ -1209,7 +1209,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1209,7 +1209,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
} }
addr->sun_family = s->sock_family; addr->sun_family = s->sock_family;
memcpy(addr->sun_path, path, len); memcpy(addr->sun_path, path, len);
*addr_ret = (struct sockaddr *) addr;
#if defined(PYOS_OS2) #if defined(PYOS_OS2)
*len_ret = sizeof(*addr); *len_ret = sizeof(*addr);
#else #else
...@@ -1224,7 +1223,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1224,7 +1223,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
{ {
struct sockaddr_nl* addr; struct sockaddr_nl* addr;
int pid, groups; int pid, groups;
addr = (struct sockaddr_nl *)&(s->sock_addr).nl; addr = (struct sockaddr_nl *)addr_ret;
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format( PyErr_Format(
PyExc_TypeError, PyExc_TypeError,
...@@ -1238,7 +1237,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1238,7 +1237,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
addr->nl_family = AF_NETLINK; addr->nl_family = AF_NETLINK;
addr->nl_pid = pid; addr->nl_pid = pid;
addr->nl_groups = groups; addr->nl_groups = groups;
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof(*addr); *len_ret = sizeof(*addr);
return 1; return 1;
} }
...@@ -1249,7 +1247,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1249,7 +1247,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr_in* addr; struct sockaddr_in* addr;
char *host; char *host;
int port, result; int port, result;
addr=(struct sockaddr_in*)&(s->sock_addr).in;
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format( PyErr_Format(
PyExc_TypeError, PyExc_TypeError,
...@@ -1261,6 +1258,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1261,6 +1258,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
if (!PyArg_ParseTuple(args, "eti:getsockaddrarg", if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
"idna", &host, &port)) "idna", &host, &port))
return 0; return 0;
addr=(struct sockaddr_in*)addr_ret;
result = setipaddr(host, (struct sockaddr *)addr, result = setipaddr(host, (struct sockaddr *)addr,
sizeof(*addr), AF_INET); sizeof(*addr), AF_INET);
PyMem_Free(host); PyMem_Free(host);
...@@ -1268,7 +1266,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1268,7 +1266,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
return 0; return 0;
addr->sin_family = AF_INET; addr->sin_family = AF_INET;
addr->sin_port = htons((short)port); addr->sin_port = htons((short)port);
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
} }
...@@ -1279,7 +1276,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1279,7 +1276,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
struct sockaddr_in6* addr; struct sockaddr_in6* addr;
char *host; char *host;
int port, flowinfo, scope_id, result; int port, flowinfo, scope_id, result;
addr = (struct sockaddr_in6*)&(s->sock_addr).in6;
flowinfo = scope_id = 0; flowinfo = scope_id = 0;
if (!PyTuple_Check(args)) { if (!PyTuple_Check(args)) {
PyErr_Format( PyErr_Format(
...@@ -1294,6 +1290,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1294,6 +1290,7 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
&scope_id)) { &scope_id)) {
return 0; return 0;
} }
addr = (struct sockaddr_in6*)addr_ret;
result = setipaddr(host, (struct sockaddr *)addr, result = setipaddr(host, (struct sockaddr *)addr,
sizeof(*addr), AF_INET6); sizeof(*addr), AF_INET6);
PyMem_Free(host); PyMem_Free(host);
...@@ -1303,7 +1300,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1303,7 +1300,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
addr->sin6_port = htons((short)port); addr->sin6_port = htons((short)port);
addr->sin6_flowinfo = flowinfo; addr->sin6_flowinfo = flowinfo;
addr->sin6_scope_id = scope_id; addr->sin6_scope_id = scope_id;
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
} }
...@@ -1315,9 +1311,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1315,9 +1311,10 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
switch (s->sock_proto) { switch (s->sock_proto) {
case BTPROTO_L2CAP: case BTPROTO_L2CAP:
{ {
struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2); struct sockaddr_l2 *addr;
char *straddr; char *straddr;
addr = (struct sockaddr_l2 *)addr_ret;
_BT_L2_MEMB(addr, family) = AF_BLUETOOTH; _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyArg_ParseTuple(args, "si", &straddr, if (!PyArg_ParseTuple(args, "si", &straddr,
&_BT_L2_MEMB(addr, psm))) { &_BT_L2_MEMB(addr, psm))) {
...@@ -1328,15 +1325,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1328,15 +1325,15 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0) if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
return 0; return 0;
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
} }
case BTPROTO_RFCOMM: case BTPROTO_RFCOMM:
{ {
struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc); struct sockaddr_rc *addr;
char *straddr; char *straddr;
addr = (struct sockaddr_rc *)addr_ret;
_BT_RC_MEMB(addr, family) = AF_BLUETOOTH; _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
if (!PyArg_ParseTuple(args, "si", &straddr, if (!PyArg_ParseTuple(args, "si", &straddr,
&_BT_RC_MEMB(addr, channel))) { &_BT_RC_MEMB(addr, channel))) {
...@@ -1347,16 +1344,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1347,16 +1344,16 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0) if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
return 0; return 0;
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
} }
#if !defined(__FreeBSD__) #if !defined(__FreeBSD__)
case BTPROTO_SCO: case BTPROTO_SCO:
{ {
struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco); struct sockaddr_sco *addr;
char *straddr; char *straddr;
addr = (struct sockaddr_sco *)addr_ret;
_BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
straddr = PyString_AsString(args); straddr = PyString_AsString(args);
if (straddr == NULL) { if (straddr == NULL) {
...@@ -1367,7 +1364,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1367,7 +1364,6 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0) if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
return 0; return 0;
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
} }
...@@ -1409,22 +1405,21 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args, ...@@ -1409,22 +1405,21 @@ getsockaddrarg(PySocketSockObject *s, PyObject *args,
s->errorhandler(); s->errorhandler();
return 0; return 0;
} }
addr = &(s->sock_addr.ll);
addr->sll_family = AF_PACKET;
addr->sll_protocol = htons((short)protoNumber);
addr->sll_ifindex = ifr.ifr_ifindex;
addr->sll_pkttype = pkttype;
addr->sll_hatype = hatype;
if (halen > 8) { if (halen > 8) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"Hardware address must be 8 bytes or less"); "Hardware address must be 8 bytes or less");
return 0; return 0;
} }
addr = (struct sockaddr_ll*)addr_ret;
addr->sll_family = AF_PACKET;
addr->sll_protocol = htons((short)protoNumber);
addr->sll_ifindex = ifr.ifr_ifindex;
addr->sll_pkttype = pkttype;
addr->sll_hatype = hatype;
if (halen != 0) { if (halen != 0) {
memcpy(&addr->sll_addr, haddr, halen); memcpy(&addr->sll_addr, haddr, halen);
} }
addr->sll_halen = halen; addr->sll_halen = halen;
*addr_ret = (struct sockaddr *) addr;
*len_ret = sizeof *addr; *len_ret = sizeof *addr;
return 1; return 1;
} }
...@@ -1551,8 +1546,7 @@ sock_accept(PySocketSockObject *s) ...@@ -1551,8 +1546,7 @@ sock_accept(PySocketSockObject *s)
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
timeout = internal_select(s, 0); timeout = internal_select(s, 0);
if (!timeout) if (!timeout)
newfd = accept(s->sock_fd, (struct sockaddr *) &addrbuf, newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
&addrlen);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (timeout == 1) { if (timeout == 1) {
...@@ -1578,7 +1572,7 @@ sock_accept(PySocketSockObject *s) ...@@ -1578,7 +1572,7 @@ sock_accept(PySocketSockObject *s)
SOCKETCLOSE(newfd); SOCKETCLOSE(newfd);
goto finally; goto finally;
} }
addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
addrlen, s->sock_proto); addrlen, s->sock_proto);
if (addr == NULL) if (addr == NULL)
goto finally; goto finally;
...@@ -1819,14 +1813,14 @@ string of that length; otherwise it is an integer."); ...@@ -1819,14 +1813,14 @@ string of that length; otherwise it is an integer.");
static PyObject * static PyObject *
sock_bind(PySocketSockObject *s, PyObject *addro) sock_bind(PySocketSockObject *s, PyObject *addro)
{ {
struct sockaddr *addr; sock_addr_t addrbuf;
int addrlen; int addrlen;
int res; int res;
if (!getsockaddrarg(s, addro, &addr, &addrlen)) if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
res = bind(s->sock_fd, addr, addrlen); res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res < 0) if (res < 0)
return s->errorhandler(); return s->errorhandler();
...@@ -1952,16 +1946,16 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen, ...@@ -1952,16 +1946,16 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
static PyObject * static PyObject *
sock_connect(PySocketSockObject *s, PyObject *addro) sock_connect(PySocketSockObject *s, PyObject *addro)
{ {
struct sockaddr *addr; sock_addr_t addrbuf;
int addrlen; int addrlen;
int res; int res;
int timeout; int timeout;
if (!getsockaddrarg(s, addro, &addr, &addrlen)) if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
res = internal_connect(s, addr, addrlen, &timeout); res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (timeout == 1) { if (timeout == 1) {
...@@ -1986,16 +1980,16 @@ is a pair (host, port)."); ...@@ -1986,16 +1980,16 @@ is a pair (host, port).");
static PyObject * static PyObject *
sock_connect_ex(PySocketSockObject *s, PyObject *addro) sock_connect_ex(PySocketSockObject *s, PyObject *addro)
{ {
struct sockaddr *addr; sock_addr_t addrbuf;
int addrlen; int addrlen;
int res; int res;
int timeout; int timeout;
if (!getsockaddrarg(s, addro, &addr, &addrlen)) if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
res = internal_connect(s, addr, addrlen, &timeout); res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
/* Signals are not errors (though they may raise exceptions). Adapted /* Signals are not errors (though they may raise exceptions). Adapted
...@@ -2075,11 +2069,11 @@ sock_getsockname(PySocketSockObject *s) ...@@ -2075,11 +2069,11 @@ sock_getsockname(PySocketSockObject *s)
return NULL; return NULL;
memset(&addrbuf, 0, addrlen); memset(&addrbuf, 0, addrlen);
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
res = getsockname(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen); res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res < 0) if (res < 0)
return s->errorhandler(); return s->errorhandler();
return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen, return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
s->sock_proto); s->sock_proto);
} }
...@@ -2104,11 +2098,11 @@ sock_getpeername(PySocketSockObject *s) ...@@ -2104,11 +2098,11 @@ sock_getpeername(PySocketSockObject *s)
return NULL; return NULL;
memset(&addrbuf, 0, addrlen); memset(&addrbuf, 0, addrlen);
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
res = getpeername(s->sock_fd, (struct sockaddr *) &addrbuf, &addrlen); res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res < 0) if (res < 0)
return s->errorhandler(); return s->errorhandler();
return makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, addrlen, return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
s->sock_proto); s->sock_proto);
} }
...@@ -2443,14 +2437,14 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags, ...@@ -2443,14 +2437,14 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
#ifndef MS_WINDOWS #ifndef MS_WINDOWS
#if defined(PYOS_OS2) && !defined(PYCC_GCC) #if defined(PYOS_OS2) && !defined(PYCC_GCC)
n = recvfrom(s->sock_fd, cbuf, len, flags, n = recvfrom(s->sock_fd, cbuf, len, flags,
(struct sockaddr *) &addrbuf, &addrlen); SAS2SA(&addrbuf), &addrlen);
#else #else
n = recvfrom(s->sock_fd, cbuf, len, flags, n = recvfrom(s->sock_fd, cbuf, len, flags,
(void *) &addrbuf, &addrlen); (void *) &addrbuf, &addrlen);
#endif #endif
#else #else
n = recvfrom(s->sock_fd, cbuf, len, flags, n = recvfrom(s->sock_fd, cbuf, len, flags,
(struct sockaddr *) &addrbuf, &addrlen); SAS2SA(&addrbuf), &addrlen);
#endif #endif
} }
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
...@@ -2464,7 +2458,7 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags, ...@@ -2464,7 +2458,7 @@ sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,
return -1; return -1;
} }
if (!(*addr = makesockaddr(s->sock_fd, (struct sockaddr *) &addrbuf, if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
addrlen, s->sock_proto))) addrlen, s->sock_proto)))
return -1; return -1;
...@@ -2664,7 +2658,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args) ...@@ -2664,7 +2658,7 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
{ {
PyObject *addro; PyObject *addro;
char *buf; char *buf;
struct sockaddr *addr; sock_addr_t addrbuf;
int addrlen, len, n = -1, flags, timeout; int addrlen, len, n = -1, flags, timeout;
flags = 0; flags = 0;
...@@ -2675,16 +2669,16 @@ sock_sendto(PySocketSockObject *s, PyObject *args) ...@@ -2675,16 +2669,16 @@ sock_sendto(PySocketSockObject *s, PyObject *args)
return NULL; return NULL;
} }
if (!getsockaddrarg(s, addro, &addr, &addrlen))
return NULL;
if (!IS_SELECTABLE(s)) if (!IS_SELECTABLE(s))
return select_error(); return select_error();
if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
timeout = internal_select(s, 1); timeout = internal_select(s, 1);
if (!timeout) if (!timeout)
n = sendto(s->sock_fd, buf, len, flags, addr, addrlen); n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (timeout == 1) { if (timeout == 1) {
...@@ -2973,10 +2967,9 @@ socket_gethostbyname(PyObject *self, PyObject *args) ...@@ -2973,10 +2967,9 @@ socket_gethostbyname(PyObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "s:gethostbyname", &name)) if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))
return NULL; return NULL;
if (setipaddr(name, (struct sockaddr *)&addrbuf, sizeof(addrbuf), AF_INET) < 0) if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
return NULL; return NULL;
return makeipaddr((struct sockaddr *)&addrbuf, return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
sizeof(struct sockaddr_in));
} }
PyDoc_STRVAR(gethostbyname_doc, PyDoc_STRVAR(gethostbyname_doc,
......
...@@ -114,7 +114,6 @@ typedef struct { ...@@ -114,7 +114,6 @@ typedef struct {
int sock_family; /* Address family, e.g., AF_INET */ int sock_family; /* Address family, e.g., AF_INET */
int sock_type; /* Socket type, e.g., SOCK_STREAM */ int sock_type; /* Socket type, e.g., SOCK_STREAM */
int sock_proto; /* Protocol type, usually 0 */ int sock_proto; /* Protocol type, usually 0 */
sock_addr_t sock_addr; /* Socket address */
PyObject *(*errorhandler)(void); /* Error handler; checks PyObject *(*errorhandler)(void); /* Error handler; checks
errno, returns NULL and errno, returns NULL and
sets a Python exception */ sets a Python exception */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment