diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2013-04-17 22:07:51 +0200 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2013-04-17 22:07:51 +0200 |
commit | b8da0a5842c1bdea30520250b3aa34de51a5845b (patch) | |
tree | 648d60851342c2bf7f8531b1e683c99c26c5c8b2 /Modules/posixmodule.c | |
parent | c149902175801a448dea3b8c2fa3f496116ce311 (diff) | |
parent | cf8a1e51ece7cad7096963927993ddfa738627e6 (diff) | |
download | cpython-git-b8da0a5842c1bdea30520250b3aa34de51a5845b.tar.gz |
Issue #17782: Fix undefined behaviour on platforms where ``struct timespec``'s "tv_nsec" member is not a C long.
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r-- | Modules/posixmodule.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 6830684434..1149856e30 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4507,6 +4507,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" @@ -4515,11 +4517,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)) { |