[Python-3000-checkins] r57929 - in python/branches/py3k: Lib/test/test_unicode.py Objects/stringlib/string_format.h

eric.smith python-3000-checkins at python.org
Mon Sep 3 10:40:49 CEST 2007


Author: eric.smith
Date: Mon Sep  3 10:40:29 2007
New Revision: 57929

Modified:
   python/branches/py3k/Lib/test/test_unicode.py
   python/branches/py3k/Objects/stringlib/string_format.h
Log:
Fix segfault discovered by Ron Adam.  Not checking for terminating right bracket in "'{0[}'.format(())".  Fixed, and tests added.

Modified: python/branches/py3k/Lib/test/test_unicode.py
==============================================================================
--- python/branches/py3k/Lib/test/test_unicode.py	(original)
+++ python/branches/py3k/Lib/test/test_unicode.py	Mon Sep  3 10:40:29 2007
@@ -458,6 +458,7 @@
         # weird field names
         self.assertEqual("{0[foo-bar]}".format({'foo-bar':'baz'}), 'baz')
         self.assertEqual("{0[foo bar]}".format({'foo bar':'baz'}), 'baz')
+        self.assertEqual("{0[ ]}".format({' ':3}), '3')
 
         self.assertEqual('{foo._x}'.format(foo=C(20)), '20')
         self.assertEqual('{1}{0}'.format(D(10), D(20)), '2010')
@@ -551,6 +552,7 @@
         self.assertRaises(ValueError, "{0".format)
         self.assertRaises(ValueError, "{0.}".format)
         self.assertRaises(ValueError, "{0[}".format)
+        self.assertRaises(ValueError, "{0[}".format, [])
         self.assertRaises(ValueError, "{0]}".format)
         self.assertRaises(ValueError, "{0.[]}".format)
         self.assertRaises(ValueError, "{0..foo}".format, 0)

Modified: python/branches/py3k/Objects/stringlib/string_format.h
==============================================================================
--- python/branches/py3k/Objects/stringlib/string_format.h	(original)
+++ python/branches/py3k/Objects/stringlib/string_format.h	Mon Sep  3 10:40:29 2007
@@ -273,6 +273,7 @@
 static int
 _FieldNameIterator_item(FieldNameIterator *self, SubString *name)
 {
+    int bracket_seen = 0;
     STRINGLIB_CHAR c;
 
     name->ptr = self->ptr;
@@ -281,12 +282,19 @@
     while (self->ptr < self->str.end) {
         switch (c = *self->ptr++) {
         case ']':
+            bracket_seen = 1;
             break;
         default:
             continue;
         }
         break;
     }
+    /* make sure we ended with a ']' */
+    if (!bracket_seen) {
+        PyErr_SetString(PyExc_ValueError, "Missing ']' in format string");
+        return 0;
+    }
+
     /* end of string is okay */
     /* don't include the ']' */
     name->end = self->ptr-1;
@@ -305,16 +313,14 @@
     switch (*self->ptr++) {
     case '.':
         *is_attribute = 1;
-        if (_FieldNameIterator_attr(self, name) == 0) {
+        if (_FieldNameIterator_attr(self, name) == 0)
             return 0;
-        }
         *name_idx = -1;
         break;
     case '[':
         *is_attribute = 0;
-        if (_FieldNameIterator_item(self, name) == 0) {
+        if (_FieldNameIterator_item(self, name) == 0)
             return 0;
-        }
         *name_idx = get_integer(name);
         break;
     default:


More information about the Python-3000-checkins mailing list