summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Cristau <jcristau@debian.org>2010-04-26 19:42:16 +0200
committerWilliam Jon McCann <jmccann@redhat.com>2010-06-16 17:13:39 -0400
commit4398357421555b0edae3f7b8b7f7256854e6bcf8 (patch)
tree40204168b3b1560d940fa10eb58c2f2302e6f843
parent64483254bde06c4bec9ea3bd0a01419dba520e36 (diff)
downloadgdm-4398357421555b0edae3f7b8b7f7256854e6bcf8.tar.gz
xdmcp: disable IPV6_V6ONLY for ipv6 listening sockets
This allows ipv4 connections mapped to ipv6, in case the system default is backwards. https://bugzilla.gnome.org/show_bug.cgi?id=544730
-rw-r--r--daemon/gdm-xdmcp-display-factory.c8
-rw-r--r--gui/simple-chooser/gdm-host-chooser-widget.c7
2 files changed, 15 insertions, 0 deletions
diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index 791bba3b..116cc97a 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -411,6 +411,14 @@ create_socket (struct addrinfo *ai)
return sock;
}
+#if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
+ if (ai->ai_family == AF_INET6) {
+ int zero = 0;
+ if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) < 0)
+ g_warning("setsockopt(IPV6_V6ONLY): %s", g_strerror(errno));
+ }
+#endif
+
if (bind (sock, ai->ai_addr, ai->ai_addrlen) < 0) {
g_warning ("bind: %s", g_strerror (errno));
close (sock);
diff --git a/gui/simple-chooser/gdm-host-chooser-widget.c b/gui/simple-chooser/gdm-host-chooser-widget.c
index e6947287..0c8f46c9 100644
--- a/gui/simple-chooser/gdm-host-chooser-widget.c
+++ b/gui/simple-chooser/gdm-host-chooser-widget.c
@@ -544,6 +544,13 @@ xdmcp_init (GdmHostChooserWidget *widget)
widget->priv->socket_fd = socket (AF_INET6, SOCK_DGRAM, 0);
if (widget->priv->socket_fd != -1) {
widget->priv->have_ipv6 = TRUE;
+#ifdef IPV6_V6ONLY
+ {
+ int zero = 0;
+ if (setsockopt(widget->priv->socket_fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) < 0)
+ g_warning("setsockopt(IPV6_V6ONLY): %s", g_strerror(errno));
+ }
+#endif
}
#endif
if (! widget->priv->have_ipv6) {