Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6f5afc9

Browse files
committed
* 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
1 parent 995c33a commit 6f5afc9

4 files changed

Lines changed: 37 additions & 29 deletions

File tree

Modules/selectmodule.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ select_select(self, args)
112112
{
113113
object *fd2obj[FD_SETSIZE];
114114
object *ifdlist, *ofdlist, *efdlist;
115+
object *ret;
115116
fd_set ifdset, ofdset, efdset;
116117
double timeout;
117118
struct timeval tv, *tvp;
@@ -168,8 +169,11 @@ select_select(self, args)
168169
ifdlist = set2list(&ifdset, imax, fd2obj);
169170
ofdlist = set2list(&ofdset, omax, fd2obj);
170171
efdlist = set2list(&efdset, emax, fd2obj);
171-
172-
return mkvalue("OOO", ifdlist, ofdlist, efdlist);
172+
ret = mkvalue("OOO", ifdlist, ofdlist, efdlist);
173+
XDECREF(ifdlist);
174+
XDECREF(ofdlist);
175+
XDECREF(efdlist);
176+
return ret;
173177
}
174178

175179

Modules/socketmodule.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,10 @@ makesockaddr(addr, addrlen)
223223
case AF_INET:
224224
{
225225
struct sockaddr_in *a = (struct sockaddr_in *) addr;
226-
return mkvalue("Oi", makeipaddr(a), ntohs(a->sin_port));
226+
object *addr = makeipaddr(a);
227+
object *ret = mkvalue("Oi", addr, ntohs(a->sin_port));
228+
XDECREF(addr);
229+
return ret;
227230
}
228231

229232
case AF_UNIX:
@@ -342,7 +345,7 @@ sock_accept(s, args)
342345
{
343346
char addrbuf[256];
344347
int addrlen, newfd;
345-
object *res;
348+
object *sock, *addr, *res;
346349
if (!getnoarg(args))
347350
return NULL;
348351
if (!getsockaddrlen(s, &addrlen))
@@ -354,13 +357,16 @@ sock_accept(s, args)
354357
return socket_error();
355358
/* Create the new object with unspecified family,
356359
to avoid calls to bind() etc. on it. */
357-
res = mkvalue("OO", (object *) newsockobject(newfd,
358-
s->sock_family,
359-
s->sock_type,
360-
s->sock_proto),
361-
makesockaddr((struct sockaddr *) addrbuf, addrlen));
362-
if (res == NULL)
360+
sock = (object *) newsockobject(newfd,
361+
s->sock_family,
362+
s->sock_type,
363+
s->sock_proto);
364+
if (sock == NULL)
363365
close(newfd);
366+
addr = makesockaddr((struct sockaddr *) addrbuf, addrlen);
367+
res = mkvalue("OO", sock, addr);
368+
XDECREF(sock);
369+
XDECREF(addr);
364370
return res;
365371
}
366372

@@ -693,7 +699,7 @@ sock_recvfrom(s, args)
693699
object *args;
694700
{
695701
char addrbuf[256];
696-
object *buf;
702+
object *buf, *addr, *ret;
697703
int addrlen, len, n;
698704
if (!getintarg(args, &len))
699705
return NULL;
@@ -708,8 +714,11 @@ sock_recvfrom(s, args)
708714
return socket_error();
709715
if (resizestring(&buf, n) < 0)
710716
return NULL;
711-
return mkvalue("OO", buf,
712-
makesockaddr((struct sockaddr *)addrbuf, addrlen));
717+
addr = makesockaddr((struct sockaddr *)addrbuf, addrlen);
718+
ret = mkvalue("OO", buf, addr);
719+
XDECREF(addr);
720+
XDECREF(buf);
721+
return ret;
713722
}
714723

715724

Modules/svmodule.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ svc_GetFields(self, args)
126126
captureobject *self;
127127
object *args;
128128
{
129-
object *f1, *f2;
129+
object *f1, *f2, *ret;
130130
int fieldsize;
131131

132132
if (self->ob_info.format != SV_RGB8_FRAMES) {
@@ -136,14 +136,11 @@ svc_GetFields(self, args)
136136

137137
fieldsize = self->ob_info.width * self->ob_info.height / 2;
138138
f1 = newsizedstringobject((char *) self->ob_capture, fieldsize);
139-
if (f1 == NULL)
140-
return NULL;
141139
f2 = newsizedstringobject((char *) self->ob_capture + fieldsize, fieldsize);
142-
if (f2 == NULL) {
143-
DECREF(f1);
144-
return NULL;
145-
}
146-
return mkvalue("(OO)", f1, f2);
140+
ret = mkvalue("(OO)", f1, f2);
141+
XDECREF(f1);
142+
XDECREF(f2);
143+
return ret;
147144
}
148145

149146
static object *

Python/ceval.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -786,13 +786,6 @@ eval_code(co, globals, locals, arg)
786786
break;
787787

788788
case UNPACK_ARG:
789-
/* Implement various compatibility hacks:
790-
(a) f(a,b,...) should accept f((1,2,...))
791-
(b) f((a,b,...)) should accept f(1,2,...)
792-
(c) f(self,(a,b,...)) should accept f(x,1,2,...)
793-
Actually, (c) is dangerous, and (b) seems
794-
unnecessary, but (a) can't be missed...
795-
*/
796789
{
797790
int n;
798791
if (EMPTY()) {
@@ -809,6 +802,12 @@ eval_code(co, globals, locals, arg)
809802
break;
810803
}
811804
n = gettuplesize(v);
805+
#ifdef COMPAT_HACKS
806+
/* Implement various compatibility hacks (for 0.9.4 or earlier):
807+
(a) f(a,b,...) accepts f((1,2,...))
808+
(b) f((a,b,...)) accepts f(1,2,...)
809+
(c) f(self,(a,b,...)) accepts f(x,1,2,...)
810+
*/
812811
if (n == 1 && oparg != 1) {
813812
/* Rule (a) */
814813
w = gettupleitem(v, 0);
@@ -819,7 +818,6 @@ eval_code(co, globals, locals, arg)
819818
n = gettuplesize(v);
820819
}
821820
}
822-
#ifdef COMPAT_HACKS /* Compatibility hacks no longer needed (I think) */
823821
else if (n != 1 && oparg == 1) {
824822
/* Rule (b) */
825823
PUSH(v);

0 commit comments

Comments
 (0)