summaryrefslogtreecommitdiff
path: root/debian/patches/63_inetd_ipv6_sockaddrlen.patch
diff options
context:
space:
mode:
authorGuillem Jover <guillem@hadrons.org>2010-11-18 05:52:10 +0100
committerGuillem Jover <guillem@hadrons.org>2010-11-18 05:53:44 +0100
commitf923df53fa4af38ceded4d8b1600a1a3cf803689 (patch)
treeecc8dd303f0051b1c989b3cda58694cb70552c98 /debian/patches/63_inetd_ipv6_sockaddrlen.patch
parent83f785971876acdcba41f062e633b23e87c070da (diff)
downloadinetutils-f923df53fa4af38ceded4d8b1600a1a3cf803689.tar.gz
Fix IPv6 support in inetd and telnetd on GNU/kFreeBSD
By passing the correct struct sockaddr length to socket functions depending on the address family, instead of always passing the size of struct sockaddr_storage. Thanks-to: Mats Erik Andersson <gnu@gisladisker.se> Thanks-to: Simon Josefsson <simon@josefsson.org>
Diffstat (limited to 'debian/patches/63_inetd_ipv6_sockaddrlen.patch')
-rw-r--r--debian/patches/63_inetd_ipv6_sockaddrlen.patch49
1 files changed, 49 insertions, 0 deletions
diff --git a/debian/patches/63_inetd_ipv6_sockaddrlen.patch b/debian/patches/63_inetd_ipv6_sockaddrlen.patch
new file mode 100644
index 0000000..5dff7fb
--- /dev/null
+++ b/debian/patches/63_inetd_ipv6_sockaddrlen.patch
@@ -0,0 +1,49 @@
+From 71a5c6478ea29872b95db9c3c8d1595b0920ff27 Mon Sep 17 00:00:00 2001
+From: Mats Erik Andersson <gnu@gisladisker.se>
+Date: Sun, 31 Oct 2010 04:29:21 +0100
+Subject: [PATCH 2/2] src/inetd.c: Use exact length of address structure.
+
+Bind socket using knowledge of exact sockaddr length.
+
+* src/inetd.c: New element `se_addrlen' in `struct servtab'.
+(expand_enter): Record in SE_ADDRLEN the actual length of each
+established control address.
+(setup): Use the exact address length in call to bind(3).
+---
+ src/inetd.c | 5 ++++-
+ 2 files changed, 13 insertions(+), 1 deletions(-)
+
+diff --git a/src/inetd.c b/src/inetd.c
+index 272e874..2a30acf 100644
+--- a/src/inetd.c
++++ b/src/inetd.c
+@@ -254,6 +254,7 @@ struct servtab
+ sa_family_t se_family; /* address family of the socket */
+ char se_v4mapped; /* 1 = accept v4mapped connection, 0 = don't */
+ struct sockaddr_storage se_ctrladdr; /* bound address */
++ socklen_t se_addrlen; /* exact address length in use */
+ unsigned se_refcnt;
+ int se_count; /* number started since se_time */
+ struct timeval se_time; /* start of se_count */
+@@ -585,7 +586,7 @@ setup (struct servtab *sep)
+ syslog (LOG_ERR, "setsockopt (SO_REUSEADDR): %m");
+
+ err = bind (sep->se_fd, (struct sockaddr *) &sep->se_ctrladdr,
+- sizeof (sep->se_ctrladdr));
++ sep->se_addrlen);
+ if (err < 0)
+ {
+ /* If we can't bind with AF_INET6 try again with AF_INET. */
+@@ -800,7 +801,9 @@ expand_enter (struct servtab *sep)
+
+ for (rp = result; rp != NULL; rp = rp->ai_next)
+ {
++ memset (&sep->se_ctrladdr, 0, sizeof (sep->se_ctrladdr));
+ memcpy (&sep->se_ctrladdr, rp->ai_addr, rp->ai_addrlen);
++ sep->se_addrlen = rp->ai_addrlen;
+ cp = enter (sep);
+ servent_setup (cp);
+ }
+--
+1.7.1
+