- Issue #17782: Fix undefined behaviour on platforms where `struct timespec`'s "tv_nsec" member is not a C long.

This commit is contained in:
Antoine Pitrou 2013-04-17 22:06:44 +02:00
parent b38897fc91
commit cf8a1e51ec
4 changed files with 21 additions and 4 deletions

View file

@ -4775,6 +4775,8 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
}
if (times && (times != Py_None)) {
time_t a_sec, m_sec;
long a_nsec, m_nsec;
if (!PyTuple_CheckExact(times) || (PyTuple_Size(times) != 2)) {
PyErr_SetString(PyExc_TypeError,
"utime: 'times' must be either"
@ -4783,11 +4785,15 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
}
utime.now = 0;
if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 0),
&utime.atime_s, &utime.atime_ns) == -1 ||
&a_sec, &a_nsec) == -1 ||
_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1),
&utime.mtime_s, &utime.mtime_ns) == -1) {
&m_sec, &m_nsec) == -1) {
goto exit;
}
utime.atime_s = a_sec;
utime.atime_ns = a_nsec;
utime.mtime_s = m_sec;
utime.mtime_ns = m_nsec;
}
else if (ns) {
if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) {