[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