--- Modules/socketmodule.c 2006/04/08 21:02:05 1.2 +++ Modules/socketmodule.c 2006/04/09 00:55:14 @@ -348,11 +348,9 @@ #define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM #define sockaddr_l2 sockaddr_l2cap #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_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb) #else -#define _BT_SOCKADDR_MEMB(s, proto) (&((s)->sock_addr).bt_##proto) #define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb) #define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb) #define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb) @@ -1084,7 +1082,6 @@ struct sockaddr_un* addr; char *path; int len; - addr = (struct sockaddr_un*)&(s->sock_addr).un; if (!PyArg_Parse(args, "t#", &path, &len)) return 0; if (len > sizeof addr->sun_path) { @@ -1092,6 +1089,12 @@ "AF_UNIX path too long"); return 0; } + addr = PyMem_MALLOC(sizeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } addr->sun_family = s->sock_family; memcpy(addr->sun_path, path, len); addr->sun_path[len] = 0; @@ -1110,7 +1113,6 @@ struct sockaddr_in* addr; char *host; int port, result; - addr=(struct sockaddr_in*)&(s->sock_addr).in; if (!PyTuple_Check(args)) { PyErr_Format( PyExc_TypeError, @@ -1122,11 +1124,19 @@ if (!PyArg_ParseTuple(args, "eti:getsockaddrarg", "idna", &host, &port)) return 0; + addr=PyMem_MALLOC(sizeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } result = setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET); PyMem_Free(host); - if (result < 0) + if (result < 0) { + PyMem_Free(addr); return 0; + } addr->sin_family = AF_INET; addr->sin_port = htons((short)port); *addr_ret = (struct sockaddr *) addr; @@ -1140,18 +1150,25 @@ struct sockaddr_in6* addr; char *host; int port, flowinfo, scope_id, result; - addr = (struct sockaddr_in6*)&(s->sock_addr).in6; flowinfo = scope_id = 0; if (!PyArg_ParseTuple(args, "eti|ii", "idna", &host, &port, &flowinfo, &scope_id)) { return 0; } + addr=PyMem_MALLOC(sizeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } result = setipaddr(host, (struct sockaddr *)addr, sizeof(*addr), AF_INET6); PyMem_Free(host); - if (result < 0) + if (result < 0) { + PyMem_Free(addr); return 0; + } addr->sin6_family = s->sock_family; addr->sin6_port = htons((short)port); addr->sin6_flowinfo = flowinfo; @@ -1168,18 +1185,27 @@ switch (s->sock_proto) { case BTPROTO_L2CAP: { - struct sockaddr_l2 *addr = (struct sockaddr_l2 *) _BT_SOCKADDR_MEMB(s, l2); + struct sockaddr_l2 *addr; char *straddr; + addr = PyMem_MALLOC(siezeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } _BT_L2_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, &_BT_L2_MEMB(addr, psm))) { + PyMem_Free(addr); PyErr_SetString(socket_error, "getsockaddrarg: " "wrong format"); return 0; } - if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0) + if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0) { + PyMem_Free(addr); return 0; + } *addr_ret = (struct sockaddr *) addr; *len_ret = sizeof *addr; @@ -1187,18 +1213,27 @@ } case BTPROTO_RFCOMM: { - struct sockaddr_rc *addr = (struct sockaddr_rc *) _BT_SOCKADDR_MEMB(s, rc); + struct sockaddr_rc *addr; char *straddr; + addr = PyMem_MALLOC(sizeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } _BT_RC_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, &_BT_RC_MEMB(addr, channel))) { + PyMem_Free(addr); PyErr_SetString(socket_error, "getsockaddrarg: " "wrong format"); return 0; } - if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0) + if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0) { + PyMem_Free(addr); return 0; + } *addr_ret = (struct sockaddr *) addr; *len_ret = sizeof *addr; @@ -1207,18 +1242,27 @@ #if !defined(__FreeBSD__) case BTPROTO_SCO: { - struct sockaddr_sco *addr = (struct sockaddr_sco *) _BT_SOCKADDR_MEMB(s, sco); + struct sockaddr_sco *addr; char *straddr; + addr = PyMem_MALLOC(sizeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; straddr = PyString_AsString(args); if (straddr == NULL) { + PyMem_Free(addr); PyErr_SetString(socket_error, "getsockaddrarg: " "wrong format"); return 0; } - if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0) + if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0) { + PyMem_Free(addr); return 0; + } *addr_ret = (struct sockaddr *) addr; *len_ret = sizeof *addr; @@ -1254,17 +1298,22 @@ s->errorhandler(); 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) { PyErr_SetString(PyExc_ValueError, "Hardware address must be 8 bytes or less"); return 0; } + addr = PyMem_MALLOC(sizeof(*addr)); + if (addr == NULL) { + PyErr_SetString(socket_error, + "Can't allocate memory"); + return 0; + } + 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) { memcpy(&addr->sll_addr, haddr, halen); } @@ -1664,6 +1713,7 @@ Py_BEGIN_ALLOW_THREADS res = bind(s->sock_fd, addr, addrlen); Py_END_ALLOW_THREADS + PyMem_Free(addr); if (res < 0) return s->errorhandler(); Py_INCREF(Py_None); @@ -1794,6 +1844,7 @@ res = internal_connect(s, addr, addrlen, &timeout); Py_END_ALLOW_THREADS + PyMem_Free(addr); if (timeout) { PyErr_SetString(socket_timeout, "timed out"); return NULL; @@ -1828,6 +1879,7 @@ res = internal_connect(s, addr, addrlen, &timeout); Py_END_ALLOW_THREADS + PyMem_Free(addr); return PyInt_FromLong((long) res); } @@ -2345,18 +2397,19 @@ return NULL; } - if (!getsockaddrarg(s, addro, &addr, &addrlen)) - return NULL; - if (!IS_SELECTABLE(s)) return select_error(); + if (!getsockaddrarg(s, addro, &addr, &addrlen)) + return NULL; + Py_BEGIN_ALLOW_THREADS timeout = internal_select(s, 1); if (!timeout) n = sendto(s->sock_fd, buf, len, flags, addr, addrlen); Py_END_ALLOW_THREADS + PyMem_Free(addr); if (timeout) { PyErr_SetString(socket_timeout, "timed out"); return NULL; --- Modules/socketmodule.h 2006/04/08 22:43:12 1.1 +++ Modules/socketmodule.h 2006/04/08 22:43:21 @@ -102,7 +102,6 @@ int sock_family; /* Address family, e.g., AF_INET */ int sock_type; /* Socket type, e.g., SOCK_STREAM */ int sock_proto; /* Protocol type, usually 0 */ - sock_addr_t sock_addr; /* Socket address */ PyObject *(*errorhandler)(void); /* Error handler; checks errno, returns NULL and sets a Python exception */