The branch, master has been updated
       via  5907b0c sys_poll_intr: fix timeout arithmetic
      from  1dd6434 messaging4: Change irpc_servers_by_name to NTSTATUS

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 5907b0cc1e1ba60ae15b41e04ae4a217ce2815cd
Author: Daniel Kobras <[email protected]>
Date:   Mon Jul 21 10:47:53 2014 +0200

    sys_poll_intr: fix timeout arithmetic
    
    Callers of sys_poll_intr() assume timeout to be in milliseconds like
    poll(2) expects, but implementation used nanosecond units. Also make
    sure timeout doesn't become infinite by mistake during time arithmetic.
    
    Signed-off-by: Daniel Kobras <[email protected]>
    Reviewed-by: Volker Lendecke <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Tue Jul 22 00:12:24 CEST 2014 on sn-devel-104

-----------------------------------------------------------------------

Summary of changes:
 lib/util/select.c |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/select.c b/lib/util/select.c
index 5e66344..99cd772 100644
--- a/lib/util/select.c
+++ b/lib/util/select.c
@@ -42,9 +42,19 @@ int sys_poll_intr(struct pollfd *fds, int num_fds, int 
timeout)
                if (errno != EINTR) {
                        break;
                }
+               /* Infinite timeout, no need to adjust. */
+               if (timeout < 0) {
+                       continue;
+               }
                clock_gettime_mono(&now);
-               elapsed = nsec_time_diff(&now, &start);
-               timeout = (orig_timeout - elapsed) / 1000000;
+               elapsed = nsec_time_diff(&now, &start) / 1000000;
+               timeout = orig_timeout - elapsed;
+               /* Unlikely, but might happen eg. when getting traced.
+                * Make sure we're not hanging in this case.
+                */
+               if (timeout < 0) {
+                       timeout = 0;
+               }
        };
        return ret;
 }


-- 
Samba Shared Repository

Reply via email to