Преглед на файлове

Merge remote-tracking branch 'public/bug16741_026'

Nick Mathewson преди 8 години
родител
ревизия
f724b2e5aa
променени са 4 файла, в които са добавени 24 реда и са изтрити 6 реда
  1. 3 0
      changes/bug16741
  2. 3 0
      src/common/compat.h
  3. 16 5
      src/common/compat_threads.c
  4. 2 1
      src/common/workqueue.c

+ 3 - 0
changes/bug16741

@@ -0,0 +1,3 @@
+  o Minor bugfixes:
+    - Check correctly for windows socket errors in the workqueue backend.
+      Fixes bug 16741; bugfix on 0.2.6.3-alpha.

+ 3 - 0
src/common/compat.h

@@ -563,6 +563,8 @@ int network_init(void);
   ((e) == WSAEMFILE || (e) == WSAENOBUFS)
 /** Return true if e is EADDRINUSE or the local equivalent. */
 #define ERRNO_IS_EADDRINUSE(e)      ((e) == WSAEADDRINUSE)
+/** Return true if e is EINTR  or the local equivalent */
+#define ERRNO_IS_EINTR(e)            ((e) == WSAEINTR || 0)
 int tor_socket_errno(tor_socket_t sock);
 const char *tor_socket_strerror(int e);
 #else
@@ -573,6 +575,7 @@ const char *tor_socket_strerror(int e);
 #else
 #define ERRNO_IS_EAGAIN(e)           ((e) == EAGAIN || (e) == EWOULDBLOCK)
 #endif
+#define ERRNO_IS_EINTR(e)            ((e) == EINTR || 0)
 #define ERRNO_IS_EINPROGRESS(e)      ((e) == EINPROGRESS || 0)
 #define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == EINPROGRESS || 0)
 #define ERRNO_IS_ACCEPT_EAGAIN(e) \

+ 16 - 5
src/common/compat_threads.c

@@ -88,7 +88,7 @@ in_main_thread(void)
 }
 
 #if defined(HAVE_EVENTFD) || defined(HAVE_PIPE)
-/* non-interruptable versions */
+/* As write(), but retry on EINTR */
 static int
 write_ni(int fd, const void *buf, size_t n)
 {
@@ -99,6 +99,7 @@ write_ni(int fd, const void *buf, size_t n)
     goto again;
   return r;
 }
+/* As read(), but retry on EINTR */
 static int
 read_ni(int fd, void *buf, size_t n)
 {
@@ -111,30 +112,32 @@ read_ni(int fd, void *buf, size_t n)
 }
 #endif
 
-/* non-interruptable versions */
+/** As send(), but retry on EINTR. */
 static int
 send_ni(int fd, const void *buf, size_t n, int flags)
 {
   int r;
  again:
   r = (int) send(fd, buf, n, flags);
-  if (r < 0 && errno == EINTR)
+  if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd)))
     goto again;
   return r;
 }
 
+/** As recv(), but retry on EINTR. */
 static int
 recv_ni(int fd, void *buf, size_t n, int flags)
 {
   int r;
  again:
-   r = (int) recv(fd, buf, n, flags);
-  if (r < 0 && errno == EINTR)
+  r = (int) recv(fd, buf, n, flags);
+  if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd)))
     goto again;
   return r;
 }
 
 #ifdef HAVE_EVENTFD
+/* Increment the event count on an eventfd <b>fd</b> */
 static int
 eventfd_alert(int fd)
 {
@@ -145,6 +148,7 @@ eventfd_alert(int fd)
   return 0;
 }
 
+/* Drain all events from an eventfd <b>fd</b>. */
 static int
 eventfd_drain(int fd)
 {
@@ -157,6 +161,7 @@ eventfd_drain(int fd)
 #endif
 
 #ifdef HAVE_PIPE
+/** Send a byte over a pipe. Return 0 on success or EAGAIN; -1 on error */
 static int
 pipe_alert(int fd)
 {
@@ -166,6 +171,8 @@ pipe_alert(int fd)
   return 0;
 }
 
+/** Drain all input from a pipe <b>fd</b> and ignore it.  Return 0 on
+ * success, -1 on error. */
 static int
 pipe_drain(int fd)
 {
@@ -181,6 +188,8 @@ pipe_drain(int fd)
 }
 #endif
 
+/** Send a byte on socket <b>fd</b>t.  Return 0 on success or EAGAIN,
+ * -1 on error. */
 static int
 sock_alert(tor_socket_t fd)
 {
@@ -190,6 +199,8 @@ sock_alert(tor_socket_t fd)
   return 0;
 }
 
+/** Drain all the input from a socket <b>fd</b>, and ignore it.  Return 0 on
+ * success, -1 on error. */
 static int
 sock_drain(tor_socket_t fd)
 {

+ 2 - 1
src/common/workqueue.c

@@ -480,7 +480,8 @@ replyqueue_process(replyqueue_t *queue)
   if (queue->alert.drain_fn(queue->alert.read_fd) < 0) {
     static ratelim_t warn_limit = RATELIM_INIT(7200);
     log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL,
-                   "Failure from drain_fd");
+                 "Failure from drain_fd: %s",
+                 tor_socket_strerror(tor_socket_errno(queue->alert.read_fd)));
   }
 
   tor_mutex_acquire(&queue->lock);