Patch by Tadayoshi Funaba (with some changes) to be smarter about
guessing what happened when strftime() returns 0. Is it buffer
overflow or was the result simply 0 bytes long? (This happens for an
empty format string, or when the format string is a single %Z and the
timezone is unknown.) if the buffer is at least 256 times as long as
the format, assume the latter.
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 50abf00..b65bfbc 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -366,6 +366,7 @@
PyObject *tup;
struct tm buf;
const char *fmt;
+ int fmtlen, buflen;
char *outbuf = 0;
int i;
@@ -373,25 +374,30 @@
if (!PyArg_ParseTuple(args, "sO", &fmt, &tup) || !gettmarg(tup, &buf))
return NULL;
+ fmtlen = strlen(fmt);
+
/* I hate these functions that presume you know how big the output
* will be ahead of time...
*/
- for (i = 1024 ; i <= 8192 ; i += 1024) {
+ for (i = 1024; ; i += i) {
outbuf = malloc(i);
if (outbuf == NULL) {
return PyErr_NoMemory();
}
- if (strftime(outbuf, i-1, fmt, &buf) != 0) {
+ buflen = strftime(outbuf, i, fmt, &buf);
+ if (buflen > 0 || i >= 256 * fmtlen) {
+ /* If the buffer is 256 times as long as the format,
+ it's probably not failing for lack of room!
+ More likely, the format yields an empty result,
+ e.g. an empty format, or %Z when the timezone
+ is unknown. */
PyObject *ret;
- ret = PyString_FromString(outbuf);
+ ret = PyString_FromStringAndSize(outbuf, buflen);
free(outbuf);
return ret;
}
free(outbuf);
}
- PyErr_SetString(PyExc_ValueError,
- "bad strftime format or result too big");
- return NULL;
}
static char strftime_doc[] =