Mailing List Archive

python/dist/src/Doc/api concrete.tex,1.12,1.13
Update of /cvsroot/python/python/dist/src/Doc/api
In directory usw-pr-cvs1:/tmp/cvs-serv7685/python/Doc/api

Modified Files:
concrete.tex
Log Message:
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.


Index: concrete.tex
===================================================================
RCS file: /cvsroot/python/python/dist/src/Doc/api/concrete.tex,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** concrete.tex 12 Apr 2002 19:32:07 -0000 1.12
--- concrete.tex 27 Apr 2002 18:44:29 -0000 1.13
***************
*** 587,591 ****
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}

--- 587,600 ----
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}