diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-05-19 00:54:06 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-05-19 00:54:06 (GMT) |
commit | 93b5513cf1d6ed328bbf2e90377fee7a487b545d (patch) | |
tree | ecbc226c399ae3cae5a0d36653bb0fe71f99b5d1 | |
parent | 386fe71de1d0f35f53f082a88762e90d5b1c66bb (diff) | |
download | cpython-93b5513cf1d6ed328bbf2e90377fee7a487b545d.zip cpython-93b5513cf1d6ed328bbf2e90377fee7a487b545d.tar.gz cpython-93b5513cf1d6ed328bbf2e90377fee7a487b545d.tar.bz2 |
Issue #6697: Fix a crash if a keyword contains a surrogate
-rw-r--r-- | Lib/test/test_getargs2.py | 14 | ||||
-rw-r--r-- | Python/getargs.c | 15 |
2 files changed, 23 insertions, 6 deletions
diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py index a407788..7fa5983 100644 --- a/Lib/test/test_getargs2.py +++ b/Lib/test/test_getargs2.py @@ -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: diff --git a/Python/getargs.c b/Python/getargs.c index 4fa2b5b..e8efb3c 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -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); } } |