From 0ee22bf7743dc9a6d593c432f787d7bfe70be199 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 26 Nov 2013 19:22:36 -0600 Subject: fix format spec recursive expansion (closes #19729) --- Lib/test/test_unicode.py | 1 + Misc/NEWS | 2 ++ Objects/stringlib/unicode_format.h | 6 ++++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py index 9dc3438..502d393 100644 --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -955,6 +955,7 @@ class UnicodeTest(string_tests.CommonTest, '') self.assertEqual("{[{}]}".format({"{}": 5}), "5") + self.assertEqual("0x{:0{:d}X}".format(0x0,16), "0x0000000000000000") def test_format_map(self): self.assertEqual(''.format_map({}), '') diff --git a/Misc/NEWS b/Misc/NEWS index 59db14f..defbf25 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.3.4 release candidate 1? Core and Builtins ----------------- +- Issue #19729: In str.format(), fix recursive expansion in format spec. + - Issue #19638: Fix possible crash / undefined behaviour from huge (more than 2 billion characters) input strings in _Py_dg_strtod. diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h index c1c2cf3..d4719a5 100644 --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -727,8 +727,10 @@ MarkupIterator_next(MarkupIterator *self, SubString *literal, while (self->str.start < self->str.end) { switch (c = PyUnicode_READ_CHAR(self->str.str, self->str.start++)) { case ':': - hit_format_spec = 1; - count = 1; + if (!hit_format_spec) { + count = 1; + hit_format_spec = 1; + } break; case '{': /* the format spec needs to be recursively expanded. -- cgit v0.12