Mercurial > cpython-lru_cache-weakref
diff Objects/stringlib/string_format.h @ 43206:f4fb74f63806
Fix segfault discovered by Ron Adam. Not checking for terminating right bracket in "'{0[}'.format(())". Fixed, and tests added.
| author | Eric Smith <eric@trueblade.com> |
|---|---|
| date | Mon, 03 Sep 2007 08:40:29 +0000 |
| parents | 0e510aff5e9a |
| children | e946073dee38 |
line wrap: on
line diff
--- a/Objects/stringlib/string_format.h Mon Sep 03 07:43:05 2007 +0000 +++ b/Objects/stringlib/string_format.h Mon Sep 03 08:40:29 2007 +0000 @@ -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:
