[Python-checkins] python/dist/src/Python compile.c,2.234.4.6,2.234.4.7

loewis@users.sourceforge.net loewis@users.sourceforge.net
Sat, 03 May 2003 03:53:54 -0700


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

Modified Files:
      Tag: release22-maint
	compile.c 
Log Message:
Patch #708604: Check more function results.


Index: compile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/compile.c,v
retrieving revision 2.234.4.6
retrieving revision 2.234.4.7
diff -C2 -d -r2.234.4.6 -r2.234.4.7
*** compile.c	12 Feb 2003 19:09:41 -0000	2.234.4.6
--- compile.c	3 May 2003 10:53:51 -0000	2.234.4.7
***************
*** 4382,4395 ****
  				PyList_SET_ITEM(list, 0, v);
  				Py_INCREF(v);
! 			} else
! 				PyList_Insert(list, 0, v);
  		}
  	}
! 	if (list == NULL || PyList_GET_SIZE(list) == 0)
! 		return 0;
  	/* There are cellvars that are also arguments.  Create a dict
  	   to replace cellvars and put the args at the front.
  	*/
  	d = PyDict_New();
  	for (i = PyList_GET_SIZE(list); --i >= 0; ) {
  		v = PyInt_FromLong(i);
--- 4382,4402 ----
  				PyList_SET_ITEM(list, 0, v);
  				Py_INCREF(v);
! 			} else {
! 				if (PyList_Insert(list, 0, v) < 0) {
! 					Py_DECREF(list);
! 					return -1;
! 				}
! 			}
  		}
  	}
! 	if (list == NULL)	/* There used to be a check here for the size of */
! 		return 0;		/* the list being 0, which would have leaked the */
! 						/* list if that condition was ever possible. JRH */
  	/* There are cellvars that are also arguments.  Create a dict
  	   to replace cellvars and put the args at the front.
  	*/
  	d = PyDict_New();
+ 	if (d == NULL)
+ 		return -1;
  	for (i = PyList_GET_SIZE(list); --i >= 0; ) {
  		v = PyInt_FromLong(i);
***************
*** 4406,4409 ****
--- 4413,4418 ----
  	while (PyDict_Next(*cellvars, &pos, &v, &w)) {
  		w = PyInt_FromLong(i++);  /* don't care about the old key */
+ 		if (w == NULL)
+ 			goto fail;
  		if (PyDict_SetItem(d, v, w) < 0) {
  			Py_DECREF(w);
***************
*** 4560,4563 ****
--- 4569,4574 ----
  	for (i = 0; i < si.si_nlocals; ++i) {
  		v = PyInt_FromLong(i);
+ 		if (v == NULL)
+ 			goto fail;
  		if (PyDict_SetItem(c->c_locals, 
  				   PyList_GET_ITEM(varnames, i), v) < 0)
***************
*** 4632,4635 ****
--- 4643,4648 ----
   				if (st->st_nscopes != 1) {
   					v = PyInt_FromLong(flags);
+ 					if (v == NULL)
+ 						goto fail;
   					if (PyDict_SetItem(st->st_global, 
   							   name, v)) 
***************
*** 4668,4671 ****
--- 4681,4685 ----
  
  	st->st_filename = NULL;
+ 	st->st_symbols = NULL;
  	if ((st->st_stack = PyList_New(0)) == NULL)
  		goto fail;
***************
*** 4720,4725 ****
  
  		if (list)
! 			PyList_SetSlice(list, 0, 
! 					((PyVarObject*)list)->ob_size, 0);
  		child = (PySymtableEntryObject *)
  			PyList_GET_ITEM(ste->ste_children, i);
--- 4734,4745 ----
  
  		if (list)
! 			if (PyList_SetSlice(list, 0, 
! 					((PyVarObject*)list)->ob_size, 0) < 0)
! 				return -1;
! 			/* Yes, the above call CAN fail, even though it's reducing
! 			   the size of the list.  The current implementation will
! 			   allocate temp memory equal to the size of the list: this
! 			   is avoidable in this specific case, but probably not
! 			   worth the effort of special-casing it. - JRH */
  		child = (PySymtableEntryObject *)
  			PyList_GET_ITEM(ste->ste_children, i);
***************
*** 4871,4875 ****
  		prev = st->st_cur;
  		if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
! 			Py_DECREF(st->st_cur);
  			st->st_errors++;
  			return;
--- 4891,4897 ----
  		prev = st->st_cur;
  		if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
! 			/* Py_DECREF(st->st_cur); */
! 			/* I believe the previous line would lead to a
! 			   double-DECREF when st is disposed - JRH */
  			st->st_errors++;
  			return;
***************
*** 4878,4881 ****
--- 4900,4907 ----
  	st->st_cur = (PySymtableEntryObject *)
  		PySymtableEntry_New(st, name, type, lineno);
+ 	if (st->st_cur == NULL) {
+ 		st->st_errors++;
+ 		return;
+ 	}
  	if (strcmp(name, TOP) == 0)
  		st->st_global = st->st_cur->ste_symbols;
***************
*** 4946,4949 ****
--- 4972,4977 ----
  	    val = flag;
  	o = PyInt_FromLong(val);
+ 	if (o == NULL)
+ 		return -1;
  	if (PyDict_SetItem(dict, name, o) < 0) {
  		Py_DECREF(o);
***************
*** 4964,4967 ****
--- 4992,4997 ----
  			val = flag;
  		o = PyInt_FromLong(val);
+ 		if (o == NULL)
+ 			return -1;
  		if (PyDict_SetItem(st->st_global, name, o) < 0) {
  			Py_DECREF(o);