* ceval.c: ifdef out the last argument passing compat hack.
* Fixed memory leaks in socket, select and sv modules: mkvalue("O", v)
does INCREF(v) so if v is brand new it should be XDECREF'd
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index c72c9fd..2a0e291 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -223,7 +223,10 @@
case AF_INET:
{
struct sockaddr_in *a = (struct sockaddr_in *) addr;
- return mkvalue("Oi", makeipaddr(a), ntohs(a->sin_port));
+ object *addr = makeipaddr(a);
+ object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
+ XDECREF(addr);
+ return ret;
}
case AF_UNIX:
@@ -342,7 +345,7 @@
{
char addrbuf[256];
int addrlen, newfd;
- object *res;
+ object *sock, *addr, *res;
if (!getnoarg(args))
return NULL;
if (!getsockaddrlen(s, &addrlen))
@@ -354,13 +357,16 @@
return socket_error();
/* Create the new object with unspecified family,
to avoid calls to bind() etc. on it. */
- res = mkvalue("OO", (object *) newsockobject(newfd,
- s->sock_family,
- s->sock_type,
- s->sock_proto),
- makesockaddr((struct sockaddr *) addrbuf, addrlen));
- if (res == NULL)
+ sock = (object *) newsockobject(newfd,
+ s->sock_family,
+ s->sock_type,
+ s->sock_proto);
+ if (sock == NULL)
close(newfd);
+ addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
+ res = mkvalue("OO", sock, addr);
+ XDECREF(sock);
+ XDECREF(addr);
return res;
}
@@ -693,7 +699,7 @@
object *args;
{
char addrbuf[256];
- object *buf;
+ object *buf, *addr, *ret;
int addrlen, len, n;
if (!getintarg(args, &len))
return NULL;
@@ -708,8 +714,11 @@
return socket_error();
if (resizestring(&buf, n) < 0)
return NULL;
- return mkvalue("OO", buf,
- makesockaddr((struct sockaddr *)addrbuf, addrlen));
+ addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
+ ret = mkvalue("OO", buf, addr);
+ XDECREF(addr);
+ XDECREF(buf);
+ return ret;
}