From: Raymond Hettinger Date: Fri, 27 Jun 2003 08:14:17 +0000 (+0000) Subject: SF bug #761337: datetime.strftime fails on trivial format string X-Git-Tag: v2.3c1~319 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f69d9f6818225fc2613230c5dc11c181085db383;p=thirdparty%2FPython%2Fcpython.git SF bug #761337: datetime.strftime fails on trivial format string The interning of short strings violates the refcnt==1 assumption for _PyString_Resize(). A simple fix is to boost the initial value of "totalnew" by 1. Combined with an NULL argument to PyString_FromStringAndSize(), this assures that resulting format string is not interned. This will remain true even if the implementation of PyString_FromStringAndSize() changes because only the uninitialized strings that can be interned are those of zero length. Added a test case. --- diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index cca0c9d9c59f..c6dbb4895624 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -831,6 +831,7 @@ class TestDate(HarmlessMixedComparison): def test_strftime(self): t = self.theclass(2005, 3, 2) self.assertEqual(t.strftime("m:%m d:%d y:%y"), "m:03 d:02 y:05") + self.assertEqual(t.strftime(""), "") # SF bug #761337 self.assertRaises(TypeError, t.strftime) # needs an arg self.assertRaises(TypeError, t.strftime, "one", "two") # too many args diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index 164492e3b271..d8aed17f32e9 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -1175,7 +1175,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple, * a new format. Since computing the replacements for those codes * is expensive, don't unless they're actually used. */ - totalnew = PyString_Size(format); /* realistic if no %z/%Z */ + totalnew = PyString_Size(format) + 1; /* realistic if no %z/%Z */ newfmt = PyString_FromStringAndSize(NULL, totalnew); if (newfmt == NULL) goto Done; pnew = PyString_AsString(newfmt);