[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [tor/master] Set IPV6_V6ONLY on listener sockets bound to IPv6 addresses.
commit dd68d596cdf68999c0cb4c0caf594d8580eaba40
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Tue Jan 31 16:09:49 2012 -0500
Set IPV6_V6ONLY on listener sockets bound to IPv6 addresses.
If we don't do this, [::] can be interpreted to mean all v4 and all
v6 addresses. Found by dcf. Fixes bug 4760. See RFC 3493 section
5.3 for more info.
---
changes/bug4760 | 4 ++++
src/or/connection.c | 19 +++++++++++++++++++
2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/changes/bug4760 b/changes/bug4760
new file mode 100644
index 0000000..ea8d16e
--- /dev/null
+++ b/changes/bug4760
@@ -0,0 +1,4 @@
+ o Minor bugfixes:
+ - When binding to an IPv6 address, set the IPV6_V6ONLY socket
+ option, so that the IP stack doesn't decide to use it for IPv4
+ too. Fixes bug 4760; bugfix on 0.2.3.9-alpha.
diff --git a/src/or/connection.c b/src/or/connection.c
index bf65e8e..06a7562 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -902,6 +902,25 @@ connection_listener_new(const struct sockaddr *listensockaddr,
make_socket_reuseable(s);
+#ifdef IPV6_V6ONLY
+ if (listensockaddr->sa_family == AF_INET6) {
+#ifdef _WIN32
+ /* In Redmond, this kind of thing passes for standards-conformance. */
+ DWORD one = 1;
+#else
+ int one = 1;
+#endif
+ /* We need to set IPV6_V6ONLY so that this socket can't get used for
+ * IPv4 connections. */
+ if (setsockopt(s,IPPROTO_IPV6, IPV6_V6ONLY, (void*)&one, sizeof(one))<0) {
+ int e = tor_socket_errno(s);
+ log_warn(LD_NET, "Error setting IPV6_V6ONLY flag: %s",
+ tor_socket_strerror(e));
+ /* Keep going; probably not harmful. */
+ }
+ }
+#endif
+
if (bind(s,listensockaddr,socklen) < 0) {
const char *helpfulhint = "";
int e = tor_socket_errno(s);
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits