[Python-checkins] python/dist/src/Doc/api concrete.tex,1.6.6.2,1.6.6.3

anthonybaxter@sourceforge.net anthonybaxter@sourceforge.net
Mon, 29 Apr 2002 20:24:15 -0700


Update of /cvsroot/python/python/dist/src/Doc/api
In directory usw-pr-cvs1:/tmp/cvs-serv3514/Doc/api

Modified Files:
      Tag: release22-maint
	concrete.tex 
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/Doc/api/concrete.tex:1.13



Index: concrete.tex
===================================================================
RCS file: /cvsroot/python/python/dist/src/Doc/api/concrete.tex,v
retrieving revision 1.6.6.2
retrieving revision 1.6.6.3
diff -C2 -d -r1.6.6.2 -r1.6.6.3
*** concrete.tex	10 Apr 2002 18:00:44 -0000	1.6.6.2
--- concrete.tex	30 Apr 2002 03:24:12 -0000	1.6.6.3
***************
*** 583,587 ****
    A way to resize a string object even though it is ``immutable''.
    Only use this to build up a brand new string object; don't use this
!   if the string may already be known in other parts of the code.
  \end{cfuncdesc}
  
--- 583,596 ----
    A way to resize a string object even though it is ``immutable''.
    Only use this to build up a brand new string object; don't use this
!   if the string may already be known in other parts of the code.  It
!   is an error to call this function if the refcount on the input string
!   object is not one.
!   Pass the address of an existing string object as an lvalue (it may
!   be written into), and the new size desired.  On success, \var{*string}
!   holds the resized string object and 0 is returned; the address in
!   \var{*string} may differ from its input value.  If the
!   reallocation fails, the original string object at \var{*string} is
!   deallocated, \var{*string} is set to \NULL{}, a memory exception is set,
!   and -1 is returned.
  \end{cfuncdesc}