Commit 4cb4e4e8 authored by Eric Smith's avatar Eric Smith

Fix segfault discovered by Ron Adam. Not checking for terminating right...

Fix segfault discovered by Ron Adam.  Not checking for terminating right bracket in "'{0[}'.format(())".  Fixed, and tests added.
parent f82d9b52
...@@ -458,6 +458,7 @@ class UnicodeTest( ...@@ -458,6 +458,7 @@ class UnicodeTest(
# weird field names # 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[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('{foo._x}'.format(foo=C(20)), '20')
self.assertEqual('{1}{0}'.format(D(10), D(20)), '2010') self.assertEqual('{1}{0}'.format(D(10), D(20)), '2010')
...@@ -551,6 +552,7 @@ class UnicodeTest( ...@@ -551,6 +552,7 @@ class UnicodeTest(
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[}".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) self.assertRaises(ValueError, "{0..foo}".format, 0)
......
...@@ -273,6 +273,7 @@ _FieldNameIterator_attr(FieldNameIterator *self, SubString *name) ...@@ -273,6 +273,7 @@ _FieldNameIterator_attr(FieldNameIterator *self, SubString *name)
static int static int
_FieldNameIterator_item(FieldNameIterator *self, SubString *name) _FieldNameIterator_item(FieldNameIterator *self, SubString *name)
{ {
int bracket_seen = 0;
STRINGLIB_CHAR c; STRINGLIB_CHAR c;
name->ptr = self->ptr; name->ptr = self->ptr;
...@@ -281,12 +282,19 @@ _FieldNameIterator_item(FieldNameIterator *self, SubString *name) ...@@ -281,12 +282,19 @@ _FieldNameIterator_item(FieldNameIterator *self, SubString *name)
while (self->ptr < self->str.end) { while (self->ptr < self->str.end) {
switch (c = *self->ptr++) { switch (c = *self->ptr++) {
case ']': case ']':
bracket_seen = 1;
break; break;
default: default:
continue; continue;
} }
break; 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 */ /* end of string is okay */
/* don't include the ']' */ /* don't include the ']' */
name->end = self->ptr-1; name->end = self->ptr-1;
...@@ -305,16 +313,14 @@ FieldNameIterator_next(FieldNameIterator *self, int *is_attribute, ...@@ -305,16 +313,14 @@ FieldNameIterator_next(FieldNameIterator *self, int *is_attribute,
switch (*self->ptr++) { switch (*self->ptr++) {
case '.': case '.':
*is_attribute = 1; *is_attribute = 1;
if (_FieldNameIterator_attr(self, name) == 0) { if (_FieldNameIterator_attr(self, name) == 0)
return 0; return 0;
}
*name_idx = -1; *name_idx = -1;
break; break;
case '[': case '[':
*is_attribute = 0; *is_attribute = 0;
if (_FieldNameIterator_item(self, name) == 0) { if (_FieldNameIterator_item(self, name) == 0)
return 0; return 0;
}
*name_idx = get_integer(name); *name_idx = get_integer(name);
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment