[Python-checkins] python/dist/src/Python bltinmodule.c,2.246.4.3,2.246.4.4

anthonybaxter@sourceforge.net anthonybaxter@sourceforge.net
Mon, 29 Apr 2002 21:05:36 -0700


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

Modified Files:
      Tag: release22-maint
	bltinmodule.c 
Log Message:
backport tim_one's patch:

Repair widespread misuse of _PyString_Resize.  Since it's clear people
don't understand how this function works, also beefed up the docs.  The
most common usage error is of this form (often spread out across gotos):

	if (_PyString_Resize(&s, n) < 0) {
		Py_DECREF(s);
		s = NULL;
		goto outtahere;
	}

The error is that if _PyString_Resize runs out of memory, it automatically
decrefs the input string object s (which also deallocates it, since its
refcount must be 1 upon entry), and sets s to NULL.  So if the "if"
branch ever triggers, it's an error to call Py_DECREF(s):  s is already
NULL!  A correct way to write the above is the simpler (and intended)

	if (_PyString_Resize(&s, n) < 0)
		goto outtahere;

Bugfix candidate.

Original patch(es):
python/dist/src/Python/bltinmodule.c:2.253



Index: bltinmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/bltinmodule.c,v
retrieving revision 2.246.4.3
retrieving revision 2.246.4.4
diff -C2 -d -r2.246.4.3 -r2.246.4.4
*** bltinmodule.c	8 Apr 2002 13:29:00 -0000	2.246.4.3
--- bltinmodule.c	30 Apr 2002 04:05:33 -0000	2.246.4.4
***************
*** 2001,2006 ****
  	}
  
! 	if (j < len && _PyString_Resize(&result, j) < 0)
! 		return NULL;
  
  	return result;
--- 2001,2006 ----
  	}
  
! 	if (j < len)
! 		_PyString_Resize(&result, j);
  
  	return result;