mirror of
https://github.com/python/cpython.git
synced 2025-07-19 17:25:54 +00:00
Issue #6697: Fix a crash if a keyword contains a surrogate
This commit is contained in:
parent
386fe71de1
commit
93b5513cf1
2 changed files with 23 additions and 6 deletions
|
@ -252,24 +252,28 @@ class Keywords_TestCase(unittest.TestCase):
|
|||
getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
|
||||
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||
)
|
||||
|
||||
def test_mixed_args(self):
|
||||
# positional and keyword args
|
||||
self.assertEquals(
|
||||
getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
|
||||
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||
)
|
||||
|
||||
def test_keyword_args(self):
|
||||
# all keywords
|
||||
self.assertEquals(
|
||||
getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
|
||||
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
|
||||
)
|
||||
|
||||
def test_optional_args(self):
|
||||
# missing optional keyword args, skipping tuples
|
||||
self.assertEquals(
|
||||
getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
|
||||
(1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
|
||||
)
|
||||
|
||||
def test_required_args(self):
|
||||
# required arg missing
|
||||
try:
|
||||
|
@ -278,6 +282,7 @@ class Keywords_TestCase(unittest.TestCase):
|
|||
self.assertEquals(str(err), "Required argument 'arg2' (pos 2) not found")
|
||||
else:
|
||||
self.fail('TypeError should have been raised')
|
||||
|
||||
def test_too_many_args(self):
|
||||
try:
|
||||
getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
|
||||
|
@ -285,6 +290,7 @@ class Keywords_TestCase(unittest.TestCase):
|
|||
self.assertEquals(str(err), "function takes at most 5 arguments (6 given)")
|
||||
else:
|
||||
self.fail('TypeError should have been raised')
|
||||
|
||||
def test_invalid_keyword(self):
|
||||
# extraneous keyword arg
|
||||
try:
|
||||
|
@ -294,6 +300,14 @@ class Keywords_TestCase(unittest.TestCase):
|
|||
else:
|
||||
self.fail('TypeError should have been raised')
|
||||
|
||||
def test_surrogate_keyword(self):
|
||||
try:
|
||||
getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
|
||||
except TypeError as err:
|
||||
self.assertEquals(str(err), "'\udc80' is an invalid keyword argument for this function")
|
||||
else:
|
||||
self.fail('TypeError should have been raised')
|
||||
|
||||
def test_main():
|
||||
tests = [Signed_TestCase, Unsigned_TestCase, Tuple_TestCase, Keywords_TestCase]
|
||||
try:
|
||||
|
|
|
@ -1755,18 +1755,21 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
|
|||
"keywords must be strings");
|
||||
return cleanreturn(0, freelist);
|
||||
}
|
||||
/* check that _PyUnicode_AsString() result is not NULL */
|
||||
ks = _PyUnicode_AsString(key);
|
||||
for (i = 0; i < len; i++) {
|
||||
if (!strcmp(ks, kwlist[i])) {
|
||||
match = 1;
|
||||
break;
|
||||
if (ks != NULL) {
|
||||
for (i = 0; i < len; i++) {
|
||||
if (!strcmp(ks, kwlist[i])) {
|
||||
match = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!match) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"'%s' is an invalid keyword "
|
||||
"'%U' is an invalid keyword "
|
||||
"argument for this function",
|
||||
ks);
|
||||
key);
|
||||
return cleanreturn(0, freelist);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue