Commit 7dc46d8c authored by Oren Milman's avatar Oren Milman Committed by Serhiy Storchaka

bpo-31592: Fix an assertion failure in Python parser in case of a bad...

bpo-31592: Fix an assertion failure in Python parser in case of a bad unicodedata.normalize(). (#3767)
parent f4ea642c
...@@ -431,6 +431,16 @@ class AST_Tests(unittest.TestCase): ...@@ -431,6 +431,16 @@ class AST_Tests(unittest.TestCase):
compile(empty_yield_from, "<test>", "exec") compile(empty_yield_from, "<test>", "exec")
self.assertIn("field value is required", str(cm.exception)) self.assertIn("field value is required", str(cm.exception))
@support.cpython_only
def test_issue31592(self):
# There shouldn't be an assertion failure in case of a bad
# unicodedata.normalize().
import unicodedata
def bad_normalize(*args):
return None
with support.swap_attr(unicodedata, 'normalize', bad_normalize):
self.assertRaises(TypeError, ast.parse, '\u03D5')
class ASTHelpers_Test(unittest.TestCase): class ASTHelpers_Test(unittest.TestCase):
......
Fixed an assertion failure in Python parser in case of a bad `unicodedata.normalize()`.
Patch by Oren Milman.
...@@ -594,7 +594,6 @@ struct compiling { ...@@ -594,7 +594,6 @@ struct compiling {
PyArena *c_arena; /* Arena for allocating memory. */ PyArena *c_arena; /* Arena for allocating memory. */
PyObject *c_filename; /* filename */ PyObject *c_filename; /* filename */
PyObject *c_normalize; /* Normalization function from unicodedata. */ PyObject *c_normalize; /* Normalization function from unicodedata. */
PyObject *c_normalize_args; /* Normalization argument tuple. */
}; };
static asdl_seq *seq_for_testlist(struct compiling *, const node *); static asdl_seq *seq_for_testlist(struct compiling *, const node *);
...@@ -631,12 +630,6 @@ init_normalization(struct compiling *c) ...@@ -631,12 +630,6 @@ init_normalization(struct compiling *c)
Py_DECREF(m); Py_DECREF(m);
if (!c->c_normalize) if (!c->c_normalize)
return 0; return 0;
c->c_normalize_args = Py_BuildValue("(sN)", "NFKC", Py_None);
if (!c->c_normalize_args) {
Py_CLEAR(c->c_normalize);
return 0;
}
PyTuple_SET_ITEM(c->c_normalize_args, 1, NULL);
return 1; return 1;
} }
...@@ -652,15 +645,29 @@ new_identifier(const char *n, struct compiling *c) ...@@ -652,15 +645,29 @@ new_identifier(const char *n, struct compiling *c)
identifier; if so, normalize to NFKC. */ identifier; if so, normalize to NFKC. */
if (!PyUnicode_IS_ASCII(id)) { if (!PyUnicode_IS_ASCII(id)) {
PyObject *id2; PyObject *id2;
_Py_IDENTIFIER(NFKC);
if (!c->c_normalize && !init_normalization(c)) { if (!c->c_normalize && !init_normalization(c)) {
Py_DECREF(id); Py_DECREF(id);
return NULL; return NULL;
} }
PyTuple_SET_ITEM(c->c_normalize_args, 1, id); PyObject *form = _PyUnicode_FromId(&PyId_NFKC);
id2 = PyObject_Call(c->c_normalize, c->c_normalize_args, NULL); if (form == NULL) {
Py_DECREF(id);
return NULL;
}
PyObject *args[2] = {form, id};
id2 = _PyObject_FastCall(c->c_normalize, args, 2);
Py_DECREF(id); Py_DECREF(id);
if (!id2) if (!id2)
return NULL; return NULL;
if (!PyUnicode_Check(id2)) {
PyErr_Format(PyExc_TypeError,
"unicodedata.normalize() must return a string, not "
"%.200s",
Py_TYPE(id2)->tp_name);
Py_DECREF(id2);
return NULL;
}
id = id2; id = id2;
} }
PyUnicode_InternInPlace(&id); PyUnicode_InternInPlace(&id);
...@@ -779,7 +786,6 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, ...@@ -779,7 +786,6 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
/* borrowed reference */ /* borrowed reference */
c.c_filename = filename; c.c_filename = filename;
c.c_normalize = NULL; c.c_normalize = NULL;
c.c_normalize_args = NULL;
if (TYPE(n) == encoding_decl) if (TYPE(n) == encoding_decl)
n = CHILD(n, 0); n = CHILD(n, 0);
...@@ -872,8 +878,6 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, ...@@ -872,8 +878,6 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
out: out:
if (c.c_normalize) { if (c.c_normalize) {
Py_DECREF(c.c_normalize); Py_DECREF(c.c_normalize);
PyTuple_SET_ITEM(c.c_normalize_args, 1, NULL);
Py_DECREF(c.c_normalize_args);
} }
return res; return res;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment