summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1999-02-23 00:00:10 (GMT)
committerGuido van Rossum <guido@python.org>1999-02-23 00:00:10 (GMT)
commitc222ec28a54089da3b15da5e06fb7f78ba294866 (patch)
treed0f54443646dc4e38e2d36ffeebb8349f8668952 /Modules
parent1ec71cb5563b8444246559d0935418610546f13b (diff)
downloadcpython-c222ec28a54089da3b15da5e06fb7f78ba294866.zip
cpython-c222ec28a54089da3b15da5e06fb7f78ba294866.tar.gz
cpython-c222ec28a54089da3b15da5e06fb7f78ba294866.tar.bz2
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.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/timemodule.c18
1 files changed, 12 insertions, 6 deletions
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 @@ time_strftime(self, args)
PyObject *tup;
struct tm buf;
const char *fmt;
+ int fmtlen, buflen;
char *outbuf = 0;
int i;
@@ -373,25 +374,30 @@ time_strftime(self, args)
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[] =