Kaydet (Commit) 4cb4e4e8 authored tarafından Eric Smith's avatar Eric Smith

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

Fix segfault discovered by Ron Adam.  Not checking for terminating right bracket in "'{0[}'.format(())".  Fixed, and tests added.
üst 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