[Python-checkins] python/dist/src/Objects object.c,2.194,2.195

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


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

Modified Files:
	object.c 
Log Message:
Fix SF bug #667147, Segmentation fault printing str subclass

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

Will backport


Index: object.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/object.c,v
retrieving revision 2.194
retrieving revision 2.195
diff -C2 -d -r2.194 -r2.195
*** object.c	17 Nov 2002 17:52:44 -0000	2.194
--- object.c	13 Jan 2003 20:13:04 -0000	2.195
***************
*** 159,166 ****
  }
  
! int
! PyObject_Print(PyObject *op, FILE *fp, int flags)
  {
  	int ret = 0;
  	if (PyErr_CheckSignals())
  		return -1;
--- 159,171 ----
  }
  
! /* 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;
***************
*** 188,192 ****
  				ret = -1;
  			else {
! 				ret = PyObject_Print(s, fp, Py_PRINT_RAW);
  			}
  			Py_XDECREF(s);
--- 193,198 ----
  				ret = -1;
  			else {
! 				ret = internal_print(s, fp, Py_PRINT_RAW,
! 						     nesting+1);
  			}
  			Py_XDECREF(s);
***************
*** 204,207 ****
--- 210,220 ----
  	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 */