Commit b8da0a58 authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #17782: Fix undefined behaviour on platforms where ``struct timespec``'s...

Issue #17782: Fix undefined behaviour on platforms where ``struct timespec``'s "tv_nsec" member is not a C long.
parents c1499021 cf8a1e51
...@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #17782: Fix undefined behaviour on platforms where
``struct timespec``'s "tv_nsec" member is not a C long.
- Issue #17722: When looking up __round__, resolve descriptors. - Issue #17722: When looking up __round__, resolve descriptors.
- Issue #16061: Speed up str.replace() for replacing 1-character strings. - Issue #16061: Speed up str.replace() for replacing 1-character strings.
......
...@@ -4507,6 +4507,8 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -4507,6 +4507,8 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
} }
if (times && (times != Py_None)) { if (times && (times != Py_None)) {
time_t a_sec, m_sec;
long a_nsec, m_nsec;
if (!PyTuple_CheckExact(times) || (PyTuple_Size(times) != 2)) { if (!PyTuple_CheckExact(times) || (PyTuple_Size(times) != 2)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"utime: 'times' must be either" "utime: 'times' must be either"
...@@ -4515,11 +4517,15 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs) ...@@ -4515,11 +4517,15 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
} }
utime.now = 0; utime.now = 0;
if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 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), _PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1),
&utime.mtime_s, &utime.mtime_ns) == -1) { &m_sec, &m_nsec) == -1) {
goto exit; 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) { else if (ns) {
if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) { if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) {
......
...@@ -779,14 +779,18 @@ signal_sigtimedwait(PyObject *self, PyObject *args) ...@@ -779,14 +779,18 @@ signal_sigtimedwait(PyObject *self, PyObject *args)
struct timespec buf; struct timespec buf;
sigset_t set; sigset_t set;
siginfo_t si; siginfo_t si;
time_t tv_sec;
long tv_nsec;
int err; int err;
if (!PyArg_ParseTuple(args, "OO:sigtimedwait", if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
&signals, &timeout)) &signals, &timeout))
return NULL; return NULL;
if (_PyTime_ObjectToTimespec(timeout, &buf.tv_sec, &buf.tv_nsec) == -1) if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec) == -1)
return NULL; return NULL;
buf.tv_sec = tv_sec;
buf.tv_nsec = tv_nsec;
if (buf.tv_sec < 0 || buf.tv_nsec < 0) { if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
PyErr_SetString(PyExc_ValueError, "timeout must be non-negative"); PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
......
...@@ -185,14 +185,18 @@ time_clock_settime(PyObject *self, PyObject *args) ...@@ -185,14 +185,18 @@ time_clock_settime(PyObject *self, PyObject *args)
{ {
int clk_id; int clk_id;
PyObject *obj; PyObject *obj;
time_t tv_sec;
long tv_nsec;
struct timespec tp; struct timespec tp;
int ret; int ret;
if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj)) if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
return NULL; return NULL;
if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1) if (_PyTime_ObjectToTimespec(obj, &tv_sec, &tv_nsec) == -1)
return NULL; return NULL;
tp.tv_sec = tv_sec;
tp.tv_nsec = tv_nsec;
ret = clock_settime((clockid_t)clk_id, &tp); ret = clock_settime((clockid_t)clk_id, &tp);
if (ret != 0) { if (ret != 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment