summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2013-11-27 01:22:36 (GMT)
committerBenjamin Peterson <benjamin@python.org>2013-11-27 01:22:36 (GMT)
commit0ee22bf7743dc9a6d593c432f787d7bfe70be199 (patch)
tree35c34cd1bd9814b4d0de300cd94c56ee4b33cb7f
parentbb65b5bf1dcc17519e4173ecb64a86228cc5cb58 (diff)
downloadcpython-0ee22bf7743dc9a6d593c432f787d7bfe70be199.zip
cpython-0ee22bf7743dc9a6d593c432f787d7bfe70be199.tar.gz
cpython-0ee22bf7743dc9a6d593c432f787d7bfe70be199.tar.bz2
fix format spec recursive expansion (closes #19729)
-rw-r--r--Lib/test/test_unicode.py1
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/stringlib/unicode_format.h6
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.