mirror of
https://github.com/python/cpython.git
synced 2025-08-23 18:24:46 +00:00
Fix SF bug #667147, Segmentation fault printing str subclass
Fix infinite recursion which occurred when printing an object whose __str__() returned self. Will backport
This commit is contained in:
parent
a974b3939f
commit
1a9975014f
3 changed files with 43 additions and 4 deletions
|
@ -1,6 +1,6 @@
|
||||||
# Test enhancements related to descriptors and new-style classes
|
# Test enhancements related to descriptors and new-style classes
|
||||||
|
|
||||||
from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
|
from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
|
@ -1821,6 +1821,29 @@ def specials():
|
||||||
unsafecmp(1, 1L)
|
unsafecmp(1, 1L)
|
||||||
unsafecmp(1L, 1)
|
unsafecmp(1L, 1)
|
||||||
|
|
||||||
|
class Letter(str):
|
||||||
|
def __new__(cls, letter):
|
||||||
|
if letter == 'EPS':
|
||||||
|
return str.__new__(cls)
|
||||||
|
return str.__new__(cls, letter)
|
||||||
|
def __str__(self):
|
||||||
|
if not self:
|
||||||
|
return 'EPS'
|
||||||
|
return self
|
||||||
|
|
||||||
|
# sys.stdout needs to be the original to trigger the recursion bug
|
||||||
|
import sys
|
||||||
|
test_stdout = sys.stdout
|
||||||
|
sys.stdout = get_original_stdout()
|
||||||
|
try:
|
||||||
|
# nothing should actually be printed, this should raise an exception
|
||||||
|
print Letter('w')
|
||||||
|
except RuntimeError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
raise TestFailed, "expected a RuntimeError for print recursion"
|
||||||
|
sys.stdout = test_stdout
|
||||||
|
|
||||||
def weakrefs():
|
def weakrefs():
|
||||||
if verbose: print "Testing weak references..."
|
if verbose: print "Testing weak references..."
|
||||||
import weakref
|
import weakref
|
||||||
|
|
|
@ -18,6 +18,9 @@ Core and builtins
|
||||||
Passing None is semantically identical to calling sort() with no
|
Passing None is semantically identical to calling sort() with no
|
||||||
arguments.
|
arguments.
|
||||||
|
|
||||||
|
- Fixed crash when printing a subclass of str and __str__ returned self.
|
||||||
|
See SF bug #667147.
|
||||||
|
|
||||||
Extension modules
|
Extension modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
|
@ -158,10 +158,15 @@ _PyObject_Del(PyObject *op)
|
||||||
PyObject_FREE(op);
|
PyObject_FREE(op);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
/* Implementation of PyObject_Print with recursion checking */
|
||||||
PyObject_Print(PyObject *op, FILE *fp, int flags)
|
static int
|
||||||
|
internal_print(PyObject *op, FILE *fp, int flags, int nesting)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
if (nesting > 10) {
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, "print recursion");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (PyErr_CheckSignals())
|
if (PyErr_CheckSignals())
|
||||||
return -1;
|
return -1;
|
||||||
#ifdef USE_STACKCHECK
|
#ifdef USE_STACKCHECK
|
||||||
|
@ -187,7 +192,8 @@ PyObject_Print(PyObject *op, FILE *fp, int flags)
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
else {
|
else {
|
||||||
ret = PyObject_Print(s, fp, Py_PRINT_RAW);
|
ret = internal_print(s, fp, Py_PRINT_RAW,
|
||||||
|
nesting+1);
|
||||||
}
|
}
|
||||||
Py_XDECREF(s);
|
Py_XDECREF(s);
|
||||||
}
|
}
|
||||||
|
@ -204,6 +210,13 @@ PyObject_Print(PyObject *op, FILE *fp, int flags)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
PyObject_Print(PyObject *op, FILE *fp, int flags)
|
||||||
|
{
|
||||||
|
return internal_print(op, fp, flags, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */
|
/* For debugging convenience. See Misc/gdbinit for some useful gdb hooks */
|
||||||
void _PyObject_Dump(PyObject* op)
|
void _PyObject_Dump(PyObject* op)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue