Fix segfault when doing string formatting on subclasses of long if

__oct__, __hex__ don't return a string.

Klocwork 308
This commit is contained in:
Neal Norwitz 2006-08-13 18:11:08 +00:00
parent 3cb31ac704
commit 56423e5762
3 changed files with 14 additions and 1 deletions

View File

@ -230,6 +230,14 @@ test_exc(u'no format', '1', TypeError,
test_exc(u'no format', u'1', TypeError, test_exc(u'no format', u'1', TypeError,
"not all arguments converted during string formatting") "not all arguments converted during string formatting")
class Foobar(long):
def __oct__(self):
# Returning a non-string should not blow up.
return self + 1
test_exc('%o', Foobar(), TypeError,
"expected string or Unicode object, long found")
if sys.maxint == 2**31-1: if sys.maxint == 2**31-1:
# crashes 2.2.1 and earlier: # crashes 2.2.1 and earlier:
try: try:

View File

@ -12,6 +12,8 @@ What's New in Python 2.5 release candidate 1?
Core and builtins Core and builtins
----------------- -----------------
- Fix segfault when doing string formatting on subclasses of long.
- Fix bug related to __len__ functions using values > 2**32 on 64-bit machines - Fix bug related to __len__ functions using values > 2**32 on 64-bit machines
with new-style classes. with new-style classes.

View File

@ -4225,12 +4225,15 @@ _PyString_FormatLong(PyObject *val, int flags, int prec, int type,
if (!result) if (!result)
return NULL; return NULL;
buf = PyString_AsString(result);
if (!buf)
return NULL;
/* To modify the string in-place, there can only be one reference. */ /* To modify the string in-place, there can only be one reference. */
if (result->ob_refcnt != 1) { if (result->ob_refcnt != 1) {
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return NULL; return NULL;
} }
buf = PyString_AsString(result);
llen = PyString_Size(result); llen = PyString_Size(result);
if (llen > PY_SSIZE_T_MAX) { if (llen > PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong"); PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong");