[Python-checkins] r81320 - in python/branches/py3k: Lib/test/test_getargs2.py Python/getargs.c

victor.stinner python-checkins at python.org
Wed May 19 02:54:06 CEST 2010


Author: victor.stinner
Date: Wed May 19 02:54:06 2010
New Revision: 81320

Log:
Issue #6697: Fix a crash if a keyword contains a surrogate


Modified:
   python/branches/py3k/Lib/test/test_getargs2.py
   python/branches/py3k/Python/getargs.c

Modified: python/branches/py3k/Lib/test/test_getargs2.py
==============================================================================
--- python/branches/py3k/Lib/test/test_getargs2.py	(original)
+++ python/branches/py3k/Lib/test/test_getargs2.py	Wed May 19 02:54:06 2010
@@ -252,24 +252,28 @@
             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 @@
             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 @@
             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 @@
         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:

Modified: python/branches/py3k/Python/getargs.c
==============================================================================
--- python/branches/py3k/Python/getargs.c	(original)
+++ python/branches/py3k/Python/getargs.c	Wed May 19 02:54:06 2010
@@ -1755,18 +1755,21 @@
                                 "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);
             }
         }


More information about the Python-checkins mailing list