]> granicus.if.org Git - python/commitdiff
- Issue #17782: Fix undefined behaviour on platforms where ``struct timespec``'s...
authorAntoine Pitrou <solipsis@pitrou.net>
Wed, 17 Apr 2013 20:06:44 +0000 (22:06 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Wed, 17 Apr 2013 20:06:44 +0000 (22:06 +0200)
Misc/NEWS
Modules/posixmodule.c
Modules/signalmodule.c
Modules/timemodule.c

index be59be013c43cdb101e45ccf0f200c007b7dd36e..ce27a99505dde6842960b4dd43ee9e920f1575cd 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 3.3.2?
 Core and Builtins
 -----------------
 
+- Issue #17782: Fix undefined behaviour on platforms where
+  ``struct timespec``'s "tv_nsec" member is not a C long.
+
 - Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
   method.
 
index 91352d4d4c488f8dd1d5b95fbfce46c209960643..551af2f5a8c6c3715ce0a55e0c5ceefb089d0c63 100644 (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)) {
index 41acbfa9dab98c42e2b7809f658bd73e4df1ce2c..0cc7237d2eae9b96d9e145bdea15484ae60f9316 100644 (file)
@@ -784,14 +784,18 @@ signal_sigtimedwait(PyObject *self, PyObject *args)
     struct timespec buf;
     sigset_t set;
     siginfo_t si;
+    time_t tv_sec;
+    long tv_nsec;
     int err;
 
     if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
                           &signals, &timeout))
         return NULL;
 
-    if (_PyTime_ObjectToTimespec(timeout, &buf.tv_sec, &buf.tv_nsec) == -1)
+    if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec) == -1)
         return NULL;
+    buf.tv_sec = tv_sec;
+    buf.tv_nsec = tv_nsec;
 
     if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
         PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
index 161407de45946974ee477747d4a4b260cd90f190..5a0f378aed9c74a52c86b711ee162fe93efa8cba 100644 (file)
@@ -195,14 +195,18 @@ time_clock_settime(PyObject *self, PyObject *args)
 {
     int clk_id;
     PyObject *obj;
+    time_t tv_sec;
+    long tv_nsec;
     struct timespec tp;
     int ret;
 
     if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
         return NULL;
 
-    if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1)
+    if (_PyTime_ObjectToTimespec(obj, &tv_sec, &tv_nsec) == -1)
         return NULL;
+    tp.tv_sec = tv_sec;
+    tp.tv_nsec = tv_nsec;
 
     ret = clock_settime((clockid_t)clk_id, &tp);
     if (ret != 0) {