* 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;
 }