]> granicus.if.org Git - python/commitdiff
Close #20656: Fix select.select() on OpenBSD 64-bit
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 18 Feb 2014 00:35:40 +0000 (01:35 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 18 Feb 2014 00:35:40 +0000 (01:35 +0100)
Modules/selectmodule.c

index 8f8f6064ea986c9450e00460270e112f8ba4d9f0..c92bd0f806f884e9a1ab271a188ce117ca2c19d9 100644 (file)
@@ -212,11 +212,18 @@ select_select(PyObject *self, PyObject *args)
         return NULL;
     }
     else {
-#ifdef MS_WINDOWS
+        /* On OpenBSD 5.4, timeval.tv_sec is a long.
+         * Example: long is 64-bit, whereas time_t is 32-bit. */
         time_t sec;
-        if (_PyTime_ObjectToTimeval(tout, &sec, &tv.tv_usec,
+        /* On OS X 64-bit, timeval.tv_usec is an int (and thus still 4
+           bytes as required), but no longer defined by a long. */
+        long usec;
+        if (_PyTime_ObjectToTimeval(tout, &sec, &usec,
                                     _PyTime_ROUND_UP) == -1)
             return NULL;
+#ifdef MS_WINDOWS
+        /* On Windows, timeval.tv_sec is a long (32 bit),
+         * whereas time_t can be 64-bit. */
         assert(sizeof(tv.tv_sec) == sizeof(long));
 #if SIZEOF_TIME_T > SIZEOF_LONG
         if (sec > LONG_MAX) {
@@ -225,16 +232,11 @@ select_select(PyObject *self, PyObject *args)
             return NULL;
         }
 #endif
-        tv.tv_sec = (long)sec;
 #else
-        /* 64-bit OS X has struct timeval.tv_usec as an int (and thus still 4
-           bytes as required), but no longer defined by a long. */
-        long tv_usec;
-        if (_PyTime_ObjectToTimeval(tout, &tv.tv_sec, &tv_usec,
-                                    _PyTime_ROUND_UP) == -1)
-            return NULL;
-        tv.tv_usec = tv_usec;
+        assert(sizeof(tv.tv_sec) >= sizeof(sec));
 #endif
+        tv.tv_sec = sec;
+        tv.tv_usec = usec;
         if (tv.tv_sec < 0) {
             PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
             return NULL;