diff options
author | ume <ume@FreeBSD.org> | 2003-02-13 17:08:23 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2003-02-13 17:08:23 +0000 |
commit | 3d252cd8868660cd99a7e0b091136aafa9ccad25 (patch) | |
tree | 542819418d0ec68092232d757906134f3b0c7807 /usr.sbin | |
parent | debc727d4ef44707cae4173ed0d3a03f7057b546 (diff) | |
download | FreeBSD-src-3d252cd8868660cd99a7e0b091136aafa9ccad25.zip FreeBSD-src-3d252cd8868660cd99a7e0b091136aafa9ccad25.tar.gz |
The tcp_wrappers function `fromhost()' can fail. In such
cases, the `struct sockaddr' will not be allocated.
Reported by: nectar
MFC after: 2 days
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/inetd/inetd.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/usr.sbin/inetd/inetd.c b/usr.sbin/inetd/inetd.c index 8390c09..9e66f21 100644 --- a/usr.sbin/inetd/inetd.c +++ b/usr.sbin/inetd/inetd.c @@ -304,6 +304,20 @@ getvalue(const char *arg, int *value, const char *whine) return 0; /* success */ } +static sa_family_t +whichaf(struct request_info *req) +{ + struct sockaddr *sa; + + sa = (struct sockaddr *)req->client->sin; + if (sa == NULL) + return AF_UNSPEC; + if (sa->sa_family == AF_INET6 && + IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)sa)->sin6_addr)) + return AF_INET; + return sa->sa_family; +} + int main(int argc, char **argv) { @@ -744,7 +758,7 @@ main(int argc, char **argv) syslog(deny_severity, "refused connection from %.500s, service %s (%s%s)", eval_client(&req), service, sep->se_proto, - (((struct sockaddr *)req.client->sin)->sa_family == AF_INET6 && !IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)req.client->sin)->sin6_addr)) ? "6" : ""); + (whichaf(&req) == AF_INET6) ? "6" : ""); if (sep->se_socktype != SOCK_STREAM) recv(ctrl, buf, sizeof (buf), 0); if (dofork) { @@ -756,7 +770,7 @@ main(int argc, char **argv) syslog(allow_severity, "connection from %.500s, service %s (%s%s)", eval_client(&req), service, sep->se_proto, - (((struct sockaddr *)req.client->sin)->sa_family == AF_INET6 && !IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)req.client->sin)->sin6_addr)) ? "6" : ""); + (whichaf(&req) == AF_INET6) ? "6" : ""); } } if (sep->se_bi) { |