mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
* 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
This commit is contained in:
parent
995c33a2bb
commit
6f5afc9a73
4 changed files with 37 additions and 29 deletions
|
@ -112,6 +112,7 @@ select_select(self, args)
|
||||||
{
|
{
|
||||||
object *fd2obj[FD_SETSIZE];
|
object *fd2obj[FD_SETSIZE];
|
||||||
object *ifdlist, *ofdlist, *efdlist;
|
object *ifdlist, *ofdlist, *efdlist;
|
||||||
|
object *ret;
|
||||||
fd_set ifdset, ofdset, efdset;
|
fd_set ifdset, ofdset, efdset;
|
||||||
double timeout;
|
double timeout;
|
||||||
struct timeval tv, *tvp;
|
struct timeval tv, *tvp;
|
||||||
|
@ -168,8 +169,11 @@ select_select(self, args)
|
||||||
ifdlist = set2list(&ifdset, imax, fd2obj);
|
ifdlist = set2list(&ifdset, imax, fd2obj);
|
||||||
ofdlist = set2list(&ofdset, omax, fd2obj);
|
ofdlist = set2list(&ofdset, omax, fd2obj);
|
||||||
efdlist = set2list(&efdset, emax, fd2obj);
|
efdlist = set2list(&efdset, emax, fd2obj);
|
||||||
|
ret = mkvalue("OOO", ifdlist, ofdlist, efdlist);
|
||||||
return mkvalue("OOO", ifdlist, ofdlist, efdlist);
|
XDECREF(ifdlist);
|
||||||
|
XDECREF(ofdlist);
|
||||||
|
XDECREF(efdlist);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -223,7 +223,10 @@ makesockaddr(addr, addrlen)
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
{
|
{
|
||||||
struct sockaddr_in *a = (struct sockaddr_in *) addr;
|
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:
|
case AF_UNIX:
|
||||||
|
@ -342,7 +345,7 @@ sock_accept(s, args)
|
||||||
{
|
{
|
||||||
char addrbuf[256];
|
char addrbuf[256];
|
||||||
int addrlen, newfd;
|
int addrlen, newfd;
|
||||||
object *res;
|
object *sock, *addr, *res;
|
||||||
if (!getnoarg(args))
|
if (!getnoarg(args))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!getsockaddrlen(s, &addrlen))
|
if (!getsockaddrlen(s, &addrlen))
|
||||||
|
@ -354,13 +357,16 @@ sock_accept(s, args)
|
||||||
return socket_error();
|
return socket_error();
|
||||||
/* Create the new object with unspecified family,
|
/* Create the new object with unspecified family,
|
||||||
to avoid calls to bind() etc. on it. */
|
to avoid calls to bind() etc. on it. */
|
||||||
res = mkvalue("OO", (object *) newsockobject(newfd,
|
sock = (object *) newsockobject(newfd,
|
||||||
s->sock_family,
|
s->sock_family,
|
||||||
s->sock_type,
|
s->sock_type,
|
||||||
s->sock_proto),
|
s->sock_proto);
|
||||||
makesockaddr((struct sockaddr *) addrbuf, addrlen));
|
if (sock == NULL)
|
||||||
if (res == NULL)
|
|
||||||
close(newfd);
|
close(newfd);
|
||||||
|
addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
|
||||||
|
res = mkvalue("OO", sock, addr);
|
||||||
|
XDECREF(sock);
|
||||||
|
XDECREF(addr);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -693,7 +699,7 @@ sock_recvfrom(s, args)
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
char addrbuf[256];
|
char addrbuf[256];
|
||||||
object *buf;
|
object *buf, *addr, *ret;
|
||||||
int addrlen, len, n;
|
int addrlen, len, n;
|
||||||
if (!getintarg(args, &len))
|
if (!getintarg(args, &len))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -708,8 +714,11 @@ sock_recvfrom(s, args)
|
||||||
return socket_error();
|
return socket_error();
|
||||||
if (resizestring(&buf, n) < 0)
|
if (resizestring(&buf, n) < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
return mkvalue("OO", buf,
|
addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
|
||||||
makesockaddr((struct sockaddr *)addrbuf, addrlen));
|
ret = mkvalue("OO", buf, addr);
|
||||||
|
XDECREF(addr);
|
||||||
|
XDECREF(buf);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -126,7 +126,7 @@ svc_GetFields(self, args)
|
||||||
captureobject *self;
|
captureobject *self;
|
||||||
object *args;
|
object *args;
|
||||||
{
|
{
|
||||||
object *f1, *f2;
|
object *f1, *f2, *ret;
|
||||||
int fieldsize;
|
int fieldsize;
|
||||||
|
|
||||||
if (self->ob_info.format != SV_RGB8_FRAMES) {
|
if (self->ob_info.format != SV_RGB8_FRAMES) {
|
||||||
|
@ -136,14 +136,11 @@ svc_GetFields(self, args)
|
||||||
|
|
||||||
fieldsize = self->ob_info.width * self->ob_info.height / 2;
|
fieldsize = self->ob_info.width * self->ob_info.height / 2;
|
||||||
f1 = newsizedstringobject((char *) self->ob_capture, fieldsize);
|
f1 = newsizedstringobject((char *) self->ob_capture, fieldsize);
|
||||||
if (f1 == NULL)
|
|
||||||
return NULL;
|
|
||||||
f2 = newsizedstringobject((char *) self->ob_capture + fieldsize, fieldsize);
|
f2 = newsizedstringobject((char *) self->ob_capture + fieldsize, fieldsize);
|
||||||
if (f2 == NULL) {
|
ret = mkvalue("(OO)", f1, f2);
|
||||||
DECREF(f1);
|
XDECREF(f1);
|
||||||
return NULL;
|
XDECREF(f2);
|
||||||
}
|
return ret;
|
||||||
return mkvalue("(OO)", f1, f2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static object *
|
static object *
|
||||||
|
|
|
@ -786,13 +786,6 @@ eval_code(co, globals, locals, arg)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UNPACK_ARG:
|
case UNPACK_ARG:
|
||||||
/* Implement various compatibility hacks:
|
|
||||||
(a) f(a,b,...) should accept f((1,2,...))
|
|
||||||
(b) f((a,b,...)) should accept f(1,2,...)
|
|
||||||
(c) f(self,(a,b,...)) should accept f(x,1,2,...)
|
|
||||||
Actually, (c) is dangerous, and (b) seems
|
|
||||||
unnecessary, but (a) can't be missed...
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
if (EMPTY()) {
|
if (EMPTY()) {
|
||||||
|
@ -809,6 +802,12 @@ eval_code(co, globals, locals, arg)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n = gettuplesize(v);
|
n = gettuplesize(v);
|
||||||
|
#ifdef COMPAT_HACKS
|
||||||
|
/* Implement various compatibility hacks (for 0.9.4 or earlier):
|
||||||
|
(a) f(a,b,...) accepts f((1,2,...))
|
||||||
|
(b) f((a,b,...)) accepts f(1,2,...)
|
||||||
|
(c) f(self,(a,b,...)) accepts f(x,1,2,...)
|
||||||
|
*/
|
||||||
if (n == 1 && oparg != 1) {
|
if (n == 1 && oparg != 1) {
|
||||||
/* Rule (a) */
|
/* Rule (a) */
|
||||||
w = gettupleitem(v, 0);
|
w = gettupleitem(v, 0);
|
||||||
|
@ -819,7 +818,6 @@ eval_code(co, globals, locals, arg)
|
||||||
n = gettuplesize(v);
|
n = gettuplesize(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef COMPAT_HACKS /* Compatibility hacks no longer needed (I think) */
|
|
||||||
else if (n != 1 && oparg == 1) {
|
else if (n != 1 && oparg == 1) {
|
||||||
/* Rule (b) */
|
/* Rule (b) */
|
||||||
PUSH(v);
|
PUSH(v);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue