summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2015-09-06 04:00:33 (GMT)
committerSteve Dower <steve.dower@microsoft.com>2015-09-06 04:00:33 (GMT)
commit74a7b8f027ea1c9cef7176e5a2fcced7655bac4c (patch)
tree5e4f8db879522f8597e94fb35eefc002bb10af78
parent318c5aef0e4c01ed7b5dacd0daa0fa42b76e5b99 (diff)
parentfaa868aeacb5bfaab116e1de3e4fa906912067e9 (diff)
downloadcpython-74a7b8f027ea1c9cef7176e5a2fcced7655bac4c.zip
cpython-74a7b8f027ea1c9cef7176e5a2fcced7655bac4c.tar.gz
cpython-74a7b8f027ea1c9cef7176e5a2fcced7655bac4c.tar.bz2
Issue #24917: time_strftime() Buffer Over-read. Patch by John Leitch.
-rw-r--r--Lib/test/test_time.py6
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/timemodule.c12
3 files changed, 20 insertions, 0 deletions
diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
index 75ab666..8d1930d 100644
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -177,6 +177,12 @@ class TimeTestCase(unittest.TestCase):
def test_strftime_bounding_check(self):
self._bounds_checking(lambda tup: time.strftime('', tup))
+ def test_strftime_format_check(self):
+ for x in [ '', 'A', '%A', '%AA' ]:
+ for y in range(0x0, 0x10):
+ for z in [ '%', 'A%', 'AA%', '%A%', 'A%A%', '%#' ]:
+ self.assertRaises(ValueError, time.strftime, x * y + z)
+
def test_default_values_for_zero(self):
# Make sure that using all zeros uses the proper default
# values. No test for daylight savings since strftime() does
diff --git a/Misc/NEWS b/Misc/NEWS
index e88106a..35792c3 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -179,6 +179,8 @@ Core and Builtins
Library
-------
+- Issue #24917: time_strftime() Buffer Over-read. Patch by John Leitch.
+
- Issue #24635: Fixed a bug in typing.py where isinstance([], typing.Iterable)
would return True once, then False on subsequent calls.
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 197d2c0..55e26fa 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -623,6 +623,12 @@ time_strftime(PyObject *self, PyObject *args)
Py_DECREF(format);
return NULL;
}
+ else if (outbuf[1] == '\0')
+ {
+ PyErr_SetString(PyExc_ValueError, "Incomplete format string");
+ Py_DECREF(format);
+ return NULL;
+ }
}
#elif (defined(_AIX) || defined(sun)) && defined(HAVE_WCSFTIME)
for(outbuf = wcschr(fmt, '%');
@@ -636,6 +642,12 @@ time_strftime(PyObject *self, PyObject *args)
"format %y requires year >= 1900 on AIX");
return NULL;
}
+ else if (outbuf[1] == '\0')
+ {
+ PyErr_SetString(PyExc_ValueError, "Incomplete format string");
+ Py_DECREF(format);
+ return NULL;
+ }
}
#endif