aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2015-08-17 14:40:27 -0400
committerNick Mathewson <nickm@torproject.org>2015-08-17 14:40:27 -0400
commitf724b2e5aaded4bc471b72f39eb990cc4114cb90 (patch)
tree3e8c8f09cb2d6d7479460fe2020541456fa18a1f
parent5fe18bcf5459d8801fdeaf01e74571cd36ba47da (diff)
parent720a9ccb2f4392ca12e9a473125e54c20c291d4a (diff)
downloadtor-f724b2e5aaded4bc471b72f39eb990cc4114cb90.tar.gz
tor-f724b2e5aaded4bc471b72f39eb990cc4114cb90.zip
Merge remote-tracking branch 'public/bug16741_026'
-rw-r--r--changes/bug167413
-rw-r--r--src/common/compat.h3
-rw-r--r--src/common/compat_threads.c21
-rw-r--r--src/common/workqueue.c3
4 files changed, 24 insertions, 6 deletions
diff --git a/changes/bug16741 b/changes/bug16741
new file mode 100644
index 0000000000..ce3dfdcfc7
--- /dev/null
+++ b/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.
diff --git a/src/common/compat.h b/src/common/compat.h
index d3b18eba92..c7c468c754 100644
--- a/src/common/compat.h
+++ b/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) \
diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c
index 15648d2851..85ad737574 100644
--- a/src/common/compat_threads.c
+++ b/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)
{
diff --git a/src/common/workqueue.c b/src/common/workqueue.c
index cf63634076..b0b004dc25 100644
--- a/src/common/workqueue.c
+++ b/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);