|
@@ -1061,6 +1061,31 @@ make_socket_reuseable(tor_socket_t sock)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+/** Tell the Windows TCP stack to prevent other applications from receiving
|
|
|
|
+ * traffic from tor's open ports. Return 0 on success, -1 on failure. */
|
|
|
|
+static int
|
|
|
|
+make_win32_socket_exclusive(tor_socket_t sock)
|
|
|
|
+{
|
|
|
|
+#ifdef SO_EXCLUSIVEADDRUSE
|
|
|
|
+ int one=1;
|
|
|
|
+
|
|
|
|
+ /* Any socket that sets REUSEADDR on win32 can bind to a port _even when
|
|
|
|
+ * somebody else already has it bound_, and _even if the original socket
|
|
|
|
+ * didn't set REUSEADDR_. Use EXCLUSIVEADDRUSE to prevent this port-stealing
|
|
|
|
+ * on win32. */
|
|
|
|
+ if (setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (void*) &one,
|
|
|
|
+ (socklen_t)sizeof(one))) {
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+#else
|
|
|
|
+ (void) sock;
|
|
|
|
+ return 0;
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
/** Max backlog to pass to listen. We start at */
|
|
/** Max backlog to pass to listen. We start at */
|
|
static int listen_limit = INT_MAX;
|
|
static int listen_limit = INT_MAX;
|
|
|
|
|
|
@@ -1137,6 +1162,14 @@ connection_listener_new(const struct sockaddr *listensockaddr,
|
|
tor_socket_strerror(errno));
|
|
tor_socket_strerror(errno));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ if (make_win32_socket_exclusive(s) < 0) {
|
|
|
|
+ log_warn(LD_NET, "Error setting SO_EXCLUSIVEADDRUSE flag on %s: %s",
|
|
|
|
+ conn_type_to_string(type),
|
|
|
|
+ tor_socket_strerror(errno));
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
#if defined(USE_TRANSPARENT) && defined(IP_TRANSPARENT)
|
|
#if defined(USE_TRANSPARENT) && defined(IP_TRANSPARENT)
|
|
if (options->TransProxyType_parsed == TPT_TPROXY &&
|
|
if (options->TransProxyType_parsed == TPT_TPROXY &&
|
|
type == CONN_TYPE_AP_TRANS_LISTENER) {
|
|
type == CONN_TYPE_AP_TRANS_LISTENER) {
|