[Python-checkins] CVS: python/dist/src/Python bltinmodule.c,2.245,2.246 ceval.c,2.296,2.297 compile.c,2.233,2.234

Jeremy Hylton jhylton@users.sourceforge.net
Thu, 13 Dec 2001 11:51:58 -0800


Update of /cvsroot/python/python/dist/src/Python
In directory usw-pr-cvs1:/tmp/cvs-serv1354/Python

Modified Files:
	bltinmodule.c ceval.c compile.c 
Log Message:
Fix for SF bug [ #492403 ] exec() segfaults on closure's func_code

Based on the patch from Danny Yoo.  The fix is in exec_statement() in
ceval.c.

There are also changes to introduce use of PyCode_GetNumFree() in
several places.



Index: bltinmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/bltinmodule.c,v
retrieving revision 2.245
retrieving revision 2.246
diff -C2 -d -r2.245 -r2.246
*** bltinmodule.c	2001/11/28 20:36:42	2.245
--- bltinmodule.c	2001/12/13 19:51:51	2.246
***************
*** 498,502 ****
  
  	if (PyCode_Check(cmd)) {
! 		if (PyTuple_GET_SIZE(((PyCodeObject *)cmd)->co_freevars) > 0) {
  			PyErr_SetString(PyExc_TypeError,
  		"code object passed to eval() may not contain free variables");
--- 498,502 ----
  
  	if (PyCode_Check(cmd)) {
! 		if (PyCode_GetNumFree((PyCodeObject *)cmd) > 0) {
  			PyErr_SetString(PyExc_TypeError,
  		"code object passed to eval() may not contain free variables");

Index: ceval.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/ceval.c,v
retrieving revision 2.296
retrieving revision 2.297
diff -C2 -d -r2.296 -r2.297
*** ceval.c	2001/12/06 21:28:18	2.296
--- ceval.c	2001/12/13 19:51:53	2.297
***************
*** 2095,2099 ****
  			v = POP(); /* code object */
  			x = PyFunction_New(v, f->f_globals);
! 			nfree = PyTuple_GET_SIZE(((PyCodeObject *)v)->co_freevars);
  			Py_DECREF(v);
  			/* XXX Maybe this should be a separate opcode? */
--- 2095,2099 ----
  			v = POP(); /* code object */
  			x = PyFunction_New(v, f->f_globals);
! 			nfree = PyCode_GetNumFree((PyCodeObject *)v);
  			Py_DECREF(v);
  			/* XXX Maybe this should be a separate opcode? */
***************
*** 3632,3635 ****
--- 3632,3640 ----
  		PyDict_SetItemString(globals, "__builtins__", f->f_builtins);
  	if (PyCode_Check(prog)) {
+ 		if (PyCode_GetNumFree((PyCodeObject *)prog) > 0) {
+ 			PyErr_SetString(PyExc_TypeError,
+ 		"code object passed to exec may not contain free variables");
+ 			return -1;
+ 		}
  		v = PyEval_EvalCode((PyCodeObject *) prog, globals, locals);
  	}

Index: compile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v
retrieving revision 2.233
retrieving revision 2.234
diff -C2 -d -r2.233 -r2.234
*** compile.c	2001/12/04 02:41:46	2.233
--- compile.c	2001/12/13 19:51:56	2.234
***************
*** 2274,2278 ****
  com_make_closure(struct compiling *c, PyCodeObject *co)
  {
! 	int i, free = PyTuple_GET_SIZE(co->co_freevars);
  	if (free == 0)
  		return 0;
--- 2274,2278 ----
  com_make_closure(struct compiling *c, PyCodeObject *co)
  {
! 	int i, free = PyCode_GetNumFree(co);
  	if (free == 0)
  		return 0;
***************
*** 2334,2338 ****
  		if (closure) {
  			com_addoparg(c, MAKE_CLOSURE, ndefs);
! 			com_pop(c, PyTuple_GET_SIZE(co->co_freevars));
  		} else
  			com_addoparg(c, MAKE_FUNCTION, ndefs);
--- 2334,2338 ----
  		if (closure) {
  			com_addoparg(c, MAKE_CLOSURE, ndefs);
! 			com_pop(c, PyCode_GetNumFree(co));
  		} else
  			com_addoparg(c, MAKE_FUNCTION, ndefs);
***************
*** 3591,3595 ****
  		if (closure) {
  			com_addoparg(c, MAKE_CLOSURE, 0);
! 			com_pop(c, PyTuple_GET_SIZE(co->co_freevars));
  		} else
  			com_addoparg(c, MAKE_FUNCTION, 0);
--- 3591,3595 ----
  		if (closure) {
  			com_addoparg(c, MAKE_CLOSURE, 0);
! 			com_pop(c, PyCode_GetNumFree(co));
  		} else
  			com_addoparg(c, MAKE_FUNCTION, 0);