mirror of https://github.com/python/cpython.git
gh-127196: Fix crash in `_interpreters`, when `shared` had invalid encodings (#127220)
This commit is contained in:
parent
8af5781094
commit
087bb48aca
|
@ -557,7 +557,7 @@ def setUp(self):
|
||||||
self.id = _interpreters.create()
|
self.id = _interpreters.create()
|
||||||
|
|
||||||
def test_signatures(self):
|
def test_signatures(self):
|
||||||
# for method in ['exec', 'run_string', 'run_func']:
|
# See https://github.com/python/cpython/issues/126654
|
||||||
msg = "expected 'shared' to be a dict"
|
msg = "expected 'shared' to be a dict"
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
_interpreters.exec(self.id, 'a', 1)
|
_interpreters.exec(self.id, 'a', 1)
|
||||||
|
@ -568,6 +568,17 @@ def test_signatures(self):
|
||||||
with self.assertRaisesRegex(TypeError, msg):
|
with self.assertRaisesRegex(TypeError, msg):
|
||||||
_interpreters.run_func(self.id, lambda: None, shared=1)
|
_interpreters.run_func(self.id, lambda: None, shared=1)
|
||||||
|
|
||||||
|
def test_invalid_shared_encoding(self):
|
||||||
|
# See https://github.com/python/cpython/issues/127196
|
||||||
|
bad_shared = {"\uD82A": 0}
|
||||||
|
msg = 'surrogates not allowed'
|
||||||
|
with self.assertRaisesRegex(UnicodeEncodeError, msg):
|
||||||
|
_interpreters.exec(self.id, 'a', shared=bad_shared)
|
||||||
|
with self.assertRaisesRegex(UnicodeEncodeError, msg):
|
||||||
|
_interpreters.run_string(self.id, 'a', shared=bad_shared)
|
||||||
|
with self.assertRaisesRegex(UnicodeEncodeError, msg):
|
||||||
|
_interpreters.run_func(self.id, lambda: None, shared=bad_shared)
|
||||||
|
|
||||||
|
|
||||||
class RunStringTests(TestBase):
|
class RunStringTests(TestBase):
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix crash when dict with keys in invalid encoding were passed to several
|
||||||
|
functions in ``_interpreters`` module.
|
|
@ -459,7 +459,12 @@ _run_in_interpreter(PyInterpreterState *interp,
|
||||||
|
|
||||||
// Prep and switch interpreters.
|
// Prep and switch interpreters.
|
||||||
if (_PyXI_Enter(&session, interp, shareables) < 0) {
|
if (_PyXI_Enter(&session, interp, shareables) < 0) {
|
||||||
assert(!PyErr_Occurred());
|
if (PyErr_Occurred()) {
|
||||||
|
// If an error occured at this step, it means that interp
|
||||||
|
// was not prepared and switched.
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// Now, apply the error from another interpreter:
|
||||||
PyObject *excinfo = _PyXI_ApplyError(session.error);
|
PyObject *excinfo = _PyXI_ApplyError(session.error);
|
||||||
if (excinfo != NULL) {
|
if (excinfo != NULL) {
|
||||||
*p_excinfo = excinfo;
|
*p_excinfo = excinfo;
|
||||||
|
|
Loading…
Reference in New Issue