summaryrefslogtreecommitdiff
path: root/debian/patches/63_inetd_ipv6_sockaddrlen.patch
blob: 5dff7fb300e8c0803ccd20f66978c05c39016bfb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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