mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
bpo-31592: Fix an assertion failure in Python parser in case of a bad unicodedata.normalize(). (#3767)
This commit is contained in:
parent
f4ea642cb6
commit
7dc46d8cf5
3 changed files with 28 additions and 12 deletions
|
@ -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):
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fixed an assertion failure in Python parser in case of a bad `unicodedata.normalize()`.
|
||||||
|
Patch by Oren Milman.
|
28
Python/ast.c
28
Python/ast.c
|
@ -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)
|
||||||
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)
|
||||||
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,
|
||||||
/* 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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue