* 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/selectmodule.c b/Modules/selectmodule.c
index be2b062..99a9213 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -112,6 +112,7 @@
{
object *fd2obj[FD_SETSIZE];
object *ifdlist, *ofdlist, *efdlist;
+ object *ret;
fd_set ifdset, ofdset, efdset;
double timeout;
struct timeval tv, *tvp;
@@ -168,8 +169,11 @@
ifdlist = set2list(&ifdset, imax, fd2obj);
ofdlist = set2list(&ofdset, omax, fd2obj);
efdlist = set2list(&efdset, emax, fd2obj);
-
- return mkvalue("OOO", ifdlist, ofdlist, efdlist);
+ ret = mkvalue("OOO", ifdlist, ofdlist, efdlist);
+ XDECREF(ifdlist);
+ XDECREF(ofdlist);
+ XDECREF(efdlist);
+ return ret;
}
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;
}
diff --git a/Modules/svmodule.c b/Modules/svmodule.c
index 0d14473..bbdbf33 100644
--- a/Modules/svmodule.c
+++ b/Modules/svmodule.c
@@ -126,7 +126,7 @@
captureobject *self;
object *args;
{
- object *f1, *f2;
+ object *f1, *f2, *ret;
int fieldsize;
if (self->ob_info.format != SV_RGB8_FRAMES) {
@@ -136,14 +136,11 @@
fieldsize = self->ob_info.width * self->ob_info.height / 2;
f1 = newsizedstringobject((char *) self->ob_capture, fieldsize);
- if (f1 == NULL)
- return NULL;
f2 = newsizedstringobject((char *) self->ob_capture + fieldsize, fieldsize);
- if (f2 == NULL) {
- DECREF(f1);
- return NULL;
- }
- return mkvalue("(OO)", f1, f2);
+ ret = mkvalue("(OO)", f1, f2);
+ XDECREF(f1);
+ XDECREF(f2);
+ return ret;
}
static object *