summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-05-19 00:54:06 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-05-19 00:54:06 (GMT)
commit93b5513cf1d6ed328bbf2e90377fee7a487b545d (patch)
treeecbc226c399ae3cae5a0d36653bb0fe71f99b5d1
parent386fe71de1d0f35f53f082a88762e90d5b1c66bb (diff)
downloadcpython-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.py14
-rw-r--r--Python/getargs.c15
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);
}
}