$OpenBSD: patch-dbus_dbus-connection_c,v 1.5 2010/12/21 14:59:49 ajacoutot Exp $

From FreeBSD:
Linux is more relaxed when it comes to the timeout argument to poll(2).
Linux will accept aby negative number to mean an infinite timeout.  FreeBSD
will only accept -1.  Make sure we do not pass an aribtrary negative number
to poll(2) to avoid an infinite EINVAL loop.

--- dbus/dbus-connection.c.orig	Mon Dec 13 16:16:13 2010
+++ dbus/dbus-connection.c	Tue Dec 21 15:09:50 2010
@@ -233,7 +233,7 @@ struct DBusPreallocatedSend
   DBusList *counter_link;     /**< Preallocated link in the resource counter */
 };
 
-#ifdef HAVE_DECL_MSG_NOSIGNAL
+#if HAVE_DECL_MSG_NOSIGNAL
 static dbus_bool_t _dbus_modify_sigpipe = FALSE;
 #else
 static dbus_bool_t _dbus_modify_sigpipe = TRUE;
@@ -2361,7 +2361,7 @@ _dbus_connection_block_pending_call (DBusPendingCall *
   DBusConnection *connection;
   dbus_uint32_t client_serial;
   DBusTimeout *timeout;
-  int timeout_milliseconds, elapsed_milliseconds;
+  int timeout_milliseconds, elapsed_milliseconds, remain_milliseconds;
 
   _dbus_assert (pending != NULL);
 
@@ -2442,7 +2442,11 @@ _dbus_connection_block_pending_call (DBusPendingCall *
   _dbus_get_current_time (&tv_sec, &tv_usec);
   elapsed_milliseconds = (tv_sec - start_tv_sec) * 1000 +
 	  (tv_usec - start_tv_usec) / 1000;
-  
+  if (timeout_milliseconds != -1)
+    remain_milliseconds = timeout_milliseconds - elapsed_milliseconds;
+  else
+    remain_milliseconds = -1;
+
   if (!_dbus_connection_get_is_connected_unlocked (connection))
     {
       DBusMessage *error_msg;
@@ -2468,7 +2472,7 @@ _dbus_connection_block_pending_call (DBusPendingCall *
            */
           _dbus_verbose ("dbus_connection_send_with_reply_and_block() waiting for more memory\n");
 
-          _dbus_memory_pause_based_on_timeout (timeout_milliseconds - elapsed_milliseconds);
+          _dbus_memory_pause_based_on_timeout (remain_milliseconds);
         }
       else
         {          
@@ -2477,7 +2481,7 @@ _dbus_connection_block_pending_call (DBusPendingCall *
                                                   pending,
                                                   DBUS_ITERATION_DO_READING |
                                                   DBUS_ITERATION_BLOCK,
-                                                  timeout_milliseconds - elapsed_milliseconds);
+                                                  remain_milliseconds);
         }
 
       goto recheck_status;
@@ -2486,7 +2490,7 @@ _dbus_connection_block_pending_call (DBusPendingCall *
     _dbus_verbose ("dbus_connection_send_with_reply_and_block(): clock set backward\n");
   else if (elapsed_milliseconds < timeout_milliseconds)
     {
-      _dbus_verbose ("dbus_connection_send_with_reply_and_block(): %d milliseconds remain\n", timeout_milliseconds - elapsed_milliseconds);
+      _dbus_verbose ("dbus_connection_send_with_reply_and_block(): %d milliseconds remain\n", remain_milliseconds);
       
       if (status == DBUS_DISPATCH_NEED_MEMORY)
         {
@@ -2496,7 +2500,7 @@ _dbus_connection_block_pending_call (DBusPendingCall *
            */
           _dbus_verbose ("dbus_connection_send_with_reply_and_block() waiting for more memory\n");
 
-          _dbus_memory_pause_based_on_timeout (timeout_milliseconds - elapsed_milliseconds);
+          _dbus_memory_pause_based_on_timeout (remain_milliseconds);
         }
       else
         {          
@@ -2505,7 +2509,7 @@ _dbus_connection_block_pending_call (DBusPendingCall *
                                                   NULL,
                                                   DBUS_ITERATION_DO_READING |
                                                   DBUS_ITERATION_BLOCK,
-                                                  timeout_milliseconds - elapsed_milliseconds);
+                                                  remain_milliseconds);
         }
 
       goto recheck_status;
