diff options
author | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2016-08-08 21:05:40 (GMT) |
---|---|---|
committer | Alexander Belopolsky <alexander.belopolsky@gmail.com> | 2016-08-08 21:05:40 (GMT) |
commit | 47649ab1f105760ba9f4d60d540b6ea63f45795a (patch) | |
tree | 52339c890933052f8ba0d5ae1362d3ba4e496b7c /Modules | |
parent | 95e0df8389c8a44c0f6c6b6be8363e602e8e8914 (diff) | |
download | cpython-47649ab1f105760ba9f4d60d540b6ea63f45795a.zip cpython-47649ab1f105760ba9f4d60d540b6ea63f45795a.tar.gz cpython-47649ab1f105760ba9f4d60d540b6ea63f45795a.tar.bz2 |
Closes #27710: Disallow fold not in [0, 1] in time and datetime constructors.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_datetimemodule.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 3048762..a62f592 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -427,7 +427,7 @@ check_date_args(int year, int month, int day) * 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 @@ check_time_args(int h, int m, int s, int us) "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 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) 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 @@ time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw) 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 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) &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 @@ datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw) 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; } |