From 877ffb227080fbf4a83c03c267f23535391ff918 Mon Sep 17 00:00:00 2001 From: xtreak Date: Sat, 22 Dec 2018 22:18:38 +0530 Subject: [PATCH 1/5] Remove incorrect assert and add tests --- Lib/test/test_float.py | 6 ++++++ Objects/unicodeobject.c | 1 - 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 06ea90c207f56c..9264568f3c5eb0 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -701,6 +701,12 @@ def test_issue5864(self): self.assertEqual(format(1234.56, '.4'), '1.235e+03') self.assertEqual(format(12345.6, '.4'), '1.235e+04') + def test_issue35560(self): + self.assertEqual(format(123.0, '00'), '123.0') + self.assertEqual(format(float(123), '00'), '123.0') + self.assertEqual("{0:00f}".format(float(123)), '123.000000') + self.assertEqual(f"{123:00f}", '123.000000') + class ReprTestCase(unittest.TestCase): def test_repr(self): floats_file = open(os.path.join(os.path.split(__file__)[0], diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 06338fac2b287e..3167e32cd12388 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9391,7 +9391,6 @@ _PyUnicode_InsertThousandsGrouping( } assert(0 <= d_pos); assert(0 <= n_digits); - assert(0 <= min_width); assert(grouping != NULL); if (digits != NULL) { From d930f32fdc2ebc40db54a78611a7c81be339a0e7 Mon Sep 17 00:00:00 2001 From: xtreak Date: Sat, 22 Dec 2018 22:20:42 +0530 Subject: [PATCH 2/5] Add news entry --- .../Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst new file mode 100644 index 00000000000000..6272cadcc0f4d3 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst @@ -0,0 +1,2 @@ +Removed incorrect assert statement that caused segfault in debug builds. +Patch by Karthikeyan Singaravelan. From 583759248cd3205aa4cf4f5fab3d762eda8a49f9 Mon Sep 17 00:00:00 2001 From: xtreak Date: Sun, 23 Dec 2018 00:48:57 +0530 Subject: [PATCH 3/5] Default to 0 when min_width is negative. Add more tests and fix news entry. --- Lib/test/test_float.py | 15 ++++++++++++--- .../2018-12-22-22-19-51.bpo-35560.9vMWSP.rst | 5 +++-- Objects/unicodeobject.c | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 9264568f3c5eb0..23ed7eea3221dc 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -703,9 +703,18 @@ def test_issue5864(self): def test_issue35560(self): self.assertEqual(format(123.0, '00'), '123.0') - self.assertEqual(format(float(123), '00'), '123.0') - self.assertEqual("{0:00f}".format(float(123)), '123.000000') - self.assertEqual(f"{123:00f}", '123.000000') + self.assertEqual(format(123.34, '00f'), '123.340000') + self.assertEqual(format(123.34, '00e'), '1.233400e+02') + self.assertEqual(format(123.340, '00g'), '123.34') + self.assertEqual(format(123.340, '00.10f'), '123.3400000000') + self.assertEqual(format(123.340, '0010f'), '123.340000') + + self.assertEqual(format(-123.0, '00'), '-123.0') + self.assertEqual(format(-123.34, '00f'), '-123.340000') + self.assertEqual(format(-123.34, '00e'), '-1.233400e+02') + self.assertEqual(format(-123.340, '00g'), '-123.34') + self.assertEqual(format(-123.340, '00.10f'), '-123.3400000000') + self.assertEqual(format(-123.340, '0010f'), '-123.340000') class ReprTestCase(unittest.TestCase): def test_repr(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst index 6272cadcc0f4d3..02cac90536a9d5 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst @@ -1,2 +1,3 @@ -Removed incorrect assert statement that caused segfault in debug builds. -Patch by Karthikeyan Singaravelan. +Removed an incorrect assert statement expecting `min_width` >= 0 in +`_PyUnicode_InsertThousandsGrouping` that caused segfault in :func:`format` +in debug builds for certain cases. Patch by Karthikeyan Singaravelan. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 3167e32cd12388..bd3153fd90f07b 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9381,6 +9381,7 @@ _PyUnicode_InsertThousandsGrouping( PyObject *thousands_sep, Py_UCS4 *maxchar) { + min_width = Py_MAX(0, min_width); if (writer) { assert(digits != NULL); assert(maxchar == NULL); From 3405406065074df9eb8b59257d2a2f068b8760a8 Mon Sep 17 00:00:00 2001 From: xtreak Date: Sun, 23 Dec 2018 01:55:08 +0530 Subject: [PATCH 4/5] More tests and note segfault scenario in news entry --- Lib/test/test_float.py | 16 ++++++++++------ .../2018-12-22-22-19-51.bpo-35560.9vMWSP.rst | 6 +++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py index 23ed7eea3221dc..49c1fbcd4ef8d3 100644 --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -705,16 +705,20 @@ def test_issue35560(self): self.assertEqual(format(123.0, '00'), '123.0') self.assertEqual(format(123.34, '00f'), '123.340000') self.assertEqual(format(123.34, '00e'), '1.233400e+02') - self.assertEqual(format(123.340, '00g'), '123.34') - self.assertEqual(format(123.340, '00.10f'), '123.3400000000') - self.assertEqual(format(123.340, '0010f'), '123.340000') + self.assertEqual(format(123.34, '00g'), '123.34') + self.assertEqual(format(123.34, '00.10f'), '123.3400000000') + self.assertEqual(format(123.34, '00.10e'), '1.2334000000e+02') + self.assertEqual(format(123.34, '00.10g'), '123.34') + self.assertEqual(format(123.34, '01f'), '123.340000') self.assertEqual(format(-123.0, '00'), '-123.0') self.assertEqual(format(-123.34, '00f'), '-123.340000') self.assertEqual(format(-123.34, '00e'), '-1.233400e+02') - self.assertEqual(format(-123.340, '00g'), '-123.34') - self.assertEqual(format(-123.340, '00.10f'), '-123.3400000000') - self.assertEqual(format(-123.340, '0010f'), '-123.340000') + self.assertEqual(format(-123.34, '00g'), '-123.34') + self.assertEqual(format(-123.34, '00.10f'), '-123.3400000000') + self.assertEqual(format(-123.34, '00.10f'), '-123.3400000000') + self.assertEqual(format(-123.34, '00.10e'), '-1.2334000000e+02') + self.assertEqual(format(-123.34, '00.10g'), '-123.34') class ReprTestCase(unittest.TestCase): def test_repr(self): diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst index 02cac90536a9d5..b5ea32351c9675 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst @@ -1,3 +1,3 @@ -Removed an incorrect assert statement expecting `min_width` >= 0 in -`_PyUnicode_InsertThousandsGrouping` that caused segfault in :func:`format` -in debug builds for certain cases. Patch by Karthikeyan Singaravelan. +Removed an incorrect assert statement that caused segfault in :func:`format` +in debug builds for floating point formatting with zero padding and small width. +Patch by Karthikeyan Singaravelan. From eceb18ee20aded005defa5c432a4c42174728a33 Mon Sep 17 00:00:00 2001 From: xtreak Date: Mon, 7 Jan 2019 19:57:50 +0530 Subject: [PATCH 5/5] Reword NEWS entry --- .../2018-12-22-22-19-51.bpo-35560.9vMWSP.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst index b5ea32351c9675..01458f11088e3b 100644 --- a/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst +++ b/Misc/NEWS.d/next/Core and Builtins/2018-12-22-22-19-51.bpo-35560.9vMWSP.rst @@ -1,3 +1,3 @@ -Removed an incorrect assert statement that caused segfault in :func:`format` -in debug builds for floating point formatting with zero padding and small width. -Patch by Karthikeyan Singaravelan. +Fix an assertion error in :func:`format` in debug build for floating point +formatting with "n" format, zero padding and small width. Release build is +not impacted. Patch by Karthikeyan Singaravelan.