[Python-checkins] python/dist/src/Objects object.c,2.162.6.8,2.162.6.9

nnorwitz@users.sourceforge.net nnorwitz@users.sourceforge.net
Mon, 13 Jan 2003 12:18:18 -0800


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

Modified Files:
      Tag: release22-maint
	object.c 
Log Message:
Backport:

Fix SF bug #667147, Segmentation fault printing str subclass

Fix infinite recursion which occurred when printing an object
whose __str__() returned self.


Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.162.6.8
retrieving revision 2.162.6.9
diff -C2 -d -r2.162.6.8 -r2.162.6.9
*** object.c	16 Dec 2002 22:32:46 -0000	2.162.6.8
--- object.c	13 Jan 2003 20:17:04 -0000	2.162.6.9
***************
*** 147,154 ****
  }
  
! int
! PyObject_Print(PyObject *op, FILE *fp, int flags)
  {
  	int ret = 0;
  	if (PyErr_CheckSignals())
  		return -1;
--- 147,159 ----
  }
  
! /* Implementation of PyObject_Print with recursion checking */
! static int
! internal_print(PyObject *op, FILE *fp, int flags, int nesting)
  {
  	int ret = 0;
+ 	if (nesting > 10) {
+ 		PyErr_SetString(PyExc_RuntimeError, "print recursion");
+ 		return -1;
+ 	}
  	if (PyErr_CheckSignals())
  		return -1;
***************
*** 176,180 ****
  				ret = -1;
  			else {
! 				ret = PyObject_Print(s, fp, Py_PRINT_RAW);
  			}
  			Py_XDECREF(s);
--- 181,186 ----
  				ret = -1;
  			else {
! 				ret = internal_print(s, fp, Py_PRINT_RAW,
! 						     nesting+1);
  			}
  			Py_XDECREF(s);
***************
*** 192,195 ****
--- 198,208 ----
  	return ret;
  }
+ 
+ int
+ PyObject_Print(PyObject *op, FILE *fp, int flags)
+ {
+ 	return internal_print(op, fp, flags, 0);
+ }
+ 
  
  /* For debugging convenience.  See Misc/gdbinit for some useful gdb hooks */