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
|