[Python-checkins] cpython: Closes #27710: Disallow fold not in [0, 1] in time and datetime constructors.
alexander.belopolsky
python-checkins at python.org
Mon Aug 8 17:05:42 EDT 2016
https://hg.python.org/cpython/rev/035778fdc641
changeset: 102571:035778fdc641
user: Alexander Belopolsky <alexander.belopolsky at gmail.com>
date: Mon Aug 08 17:05:40 2016 -0400
summary:
Closes #27710: Disallow fold not in [0, 1] in time and datetime constructors.
files:
Lib/datetime.py | 14 +++++++-----
Lib/test/datetimetester.py | 5 ++++
Modules/_datetimemodule.c | 28 +++++++++++++++++++++----
3 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/Lib/datetime.py b/Lib/datetime.py
--- a/Lib/datetime.py
+++ b/Lib/datetime.py
@@ -288,7 +288,7 @@
raise ValueError('day must be in 1..%d' % dim, day)
return year, month, day
-def _check_time_fields(hour, minute, second, microsecond):
+def _check_time_fields(hour, minute, second, microsecond, fold):
hour = _check_int_field(hour)
minute = _check_int_field(minute)
second = _check_int_field(second)
@@ -301,7 +301,9 @@
raise ValueError('second must be in 0..59', second)
if not 0 <= microsecond <= 999999:
raise ValueError('microsecond must be in 0..999999', microsecond)
- return hour, minute, second, microsecond
+ if fold not in (0, 1):
+ raise ValueError('fold must be either 0 or 1', fold)
+ return hour, minute, second, microsecond, fold
def _check_tzinfo_arg(tz):
if tz is not None and not isinstance(tz, tzinfo):
@@ -1059,8 +1061,8 @@
self.__setstate(hour, minute or None)
self._hashcode = -1
return self
- hour, minute, second, microsecond = _check_time_fields(
- hour, minute, second, microsecond)
+ hour, minute, second, microsecond, fold = _check_time_fields(
+ hour, minute, second, microsecond, fold)
_check_tzinfo_arg(tzinfo)
self = object.__new__(cls)
self._hour = hour
@@ -1369,8 +1371,8 @@
self._hashcode = -1
return self
year, month, day = _check_date_fields(year, month, day)
- hour, minute, second, microsecond = _check_time_fields(
- hour, minute, second, microsecond)
+ hour, minute, second, microsecond, fold = _check_time_fields(
+ hour, minute, second, microsecond, fold)
_check_tzinfo_arg(tzinfo)
self = object.__new__(cls)
self._year = year
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -1724,6 +1724,11 @@
self.assertRaises(ValueError, self.theclass,
2000, 1, 31, 23, 59, 59,
1000000)
+ # bad fold
+ self.assertRaises(ValueError, self.theclass,
+ 2000, 1, 31, fold=-1)
+ self.assertRaises(ValueError, self.theclass,
+ 2000, 1, 31, fold=2)
# Positional fold:
self.assertRaises(TypeError, self.theclass,
2000, 1, 31, 23, 59, 59, 0, None, 1)
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -427,7 +427,7 @@
* aren't, raise ValueError and return -1.
*/
static int
-check_time_args(int h, int m, int s, int us)
+check_time_args(int h, int m, int s, int us, int fold)
{
if (h < 0 || h > 23) {
PyErr_SetString(PyExc_ValueError,
@@ -449,6 +449,11 @@
"microsecond must be in 0..999999");
return -1;
}
+ if (fold != 0 && fold != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "fold must be either 0 or 1");
+ return -1;
+ }
return 0;
}
@@ -3598,7 +3603,7 @@
if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO$i", time_kws,
&hour, &minute, &second, &usecond,
&tzinfo, &fold)) {
- if (check_time_args(hour, minute, second, usecond) < 0)
+ if (check_time_args(hour, minute, second, usecond, fold) < 0)
return NULL;
if (check_tzinfo_subclass(tzinfo) < 0)
return NULL;
@@ -3926,8 +3931,14 @@
if (tuple == NULL)
return NULL;
clone = time_new(Py_TYPE(self), tuple, NULL);
- if (clone != NULL)
+ if (clone != NULL) {
+ if (fold != 0 && fold != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "fold must be either 0 or 1");
+ return NULL;
+ }
TIME_SET_FOLD(clone, fold);
+ }
Py_DECREF(tuple);
return clone;
}
@@ -4175,7 +4186,7 @@
&second, &usecond, &tzinfo, &fold)) {
if (check_date_args(year, month, day) < 0)
return NULL;
- if (check_time_args(hour, minute, second, usecond) < 0)
+ if (check_time_args(hour, minute, second, usecond, fold) < 0)
return NULL;
if (check_tzinfo_subclass(tzinfo) < 0)
return NULL;
@@ -5006,8 +5017,15 @@
if (tuple == NULL)
return NULL;
clone = datetime_new(Py_TYPE(self), tuple, NULL);
- if (clone != NULL)
+
+ if (clone != NULL) {
+ if (fold != 0 && fold != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "fold must be either 0 or 1");
+ return NULL;
+ }
DATE_SET_FOLD(clone, fold);
+ }
Py_DECREF(tuple);
return clone;
}
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list