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:
parent
3cb31ac704
commit
56423e5762
|
@ -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:
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue