bpo-35066: _dateime.datetime.strftime copies trailing '%' (GH-10692)

Previously, calling the strftime() method on a datetime object with a
trailing '%' in the format string would result in an exception. However,
this only occured when the datetime C module was being used; the python
implementation did not match this behavior. Datetime is now PEP-399
compliant, and will not throw an exception on a trailing '%'.
This commit is contained in:
MichaelSaah 2019-01-14 05:23:39 -05:00 committed by Victor Stinner
parent 5bb146aaea
commit 454b3d4ea2
3 changed files with 24 additions and 5 deletions

View file

@ -1528,10 +1528,13 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
ntoappend = 1;
}
else if ((ch = *pin++) == '\0') {
/* There's a lone trailing %; doesn't make sense. */
PyErr_SetString(PyExc_ValueError, "strftime format "
"ends with raw %");
goto Done;
/* Null byte follows %, copy only '%'.
*
* Back the pin up one char so that we catch the null check
* the next time through the loop.*/
pin--;
ptoappend = pin - 1;
ntoappend = 1;
}
/* A % has been seen and ch is the character after it. */
else if (ch == 'z') {
@ -1616,7 +1619,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
usednew += ntoappend;
assert(usednew <= totalnew);
} /* end while() */
if (_PyBytes_Resize(&newfmt, usednew) < 0)
goto Done;
{