summaryrefslogtreecommitdiff
path: root/sbin/isakmpd/udp.c
diff options
context:
space:
mode:
authorNiklas Hallqvist <niklas@cvs.openbsd.org>2001-07-01 20:29:40 +0000
committerNiklas Hallqvist <niklas@cvs.openbsd.org>2001-07-01 20:29:40 +0000
commit1b1cf9310c1ee499d272e783c7ed479e12387ddd (patch)
tree0eedfe1bc1283a62d42ddc54550d597c08e27e6b /sbin/isakmpd/udp.c
parent8d4068eecedb1a10102cdef134faf337127bce7e (diff)
strtol strictness. Style. Do not use dst end on an unconnected socket.
This should fix the IPv6 work for this round, There has been code by ho@ too in most my recent commits, we did this on Boston Logan airport, on our way home from !c2k1, the OpenBSD hackathon.
Diffstat (limited to 'sbin/isakmpd/udp.c')
-rw-r--r--sbin/isakmpd/udp.c72
1 files changed, 50 insertions, 22 deletions
diff --git a/sbin/isakmpd/udp.c b/sbin/isakmpd/udp.c
index e42e23af62d..eda2fafe560 100644
--- a/sbin/isakmpd/udp.c
+++ b/sbin/isakmpd/udp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: udp.c,v 1.40 2001/07/01 06:00:32 angelos Exp $ */
+/* $OpenBSD: udp.c,v 1.41 2001/07/01 20:29:39 niklas Exp $ */
/* $EOM: udp.c,v 1.57 2001/01/26 10:09:57 niklas Exp $ */
/*
@@ -46,6 +46,7 @@
#include <arpa/inet.h>
#include <ctype.h>
#include <err.h>
+#include <limits.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
@@ -283,8 +284,9 @@ udp_bind_if (struct ifreq *ifrp, void *arg)
struct sockaddr *addr;
struct transport *t;
struct ifreq flags_ifr;
- char *addr_str;
+ char *addr_str, *ep;
int s, error;
+ long lport;
/*
* Well, UDP is an internet protocol after all so drop other ifreqs.
@@ -293,10 +295,10 @@ udp_bind_if (struct ifreq *ifrp, void *arg)
if (if_addr->sa_family != AF_INET && if_addr->sa_family != AF_INET6)
return;
#else
- if ((if_addr->sa_family != AF_INET ||
- if_addr->sa_len != sizeof (struct sockaddr_in)) &&
- (if_addr->sa_family != AF_INET6 ||
- if_addr->sa_len != sizeof (struct sockaddr_in6)))
+ if ((if_addr->sa_family != AF_INET
+ || if_addr->sa_len != sizeof (struct sockaddr_in))
+ && (if_addr->sa_family != AF_INET6
+ || if_addr->sa_len != sizeof (struct sockaddr_in6)))
return;
#endif
@@ -304,10 +306,11 @@ udp_bind_if (struct ifreq *ifrp, void *arg)
* These special addresses are not useable as they have special meaning
* in the IP stack.
*/
- if (if_addr->sa_family == AF_INET &&
- (((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr == INADDR_ANY
- || (((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr
- == INADDR_NONE)) )
+ if (if_addr->sa_family == AF_INET
+ && (((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr
+ == INADDR_ANY
+ || (((struct sockaddr_in *)&ifrp->ifr_addr)->sin_addr.s_addr
+ == INADDR_NONE)) )
return;
/* Don't bother with interfaces that are down. */
@@ -328,16 +331,25 @@ udp_bind_if (struct ifreq *ifrp, void *arg)
if (!(flags_ifr.ifr_flags & IFF_UP))
return;
- /* Set port */
+ /*
+ * Set port.
+ * XXX Use getservbyname too.
+ */
+ lport = strtol (port, &ep, 10);
+ if (*ep != '\0' || lport < 0 || lport > USHRT_MAX)
+ {
+ log_print ("udp_bind_if: "
+ "port string \"%s\" not convertible to in_port_t", port);
+ return;
+ }
+
switch (if_addr->sa_family)
{
case AF_INET:
- ((struct sockaddr_in *)if_addr)->sin_port =
- htons((in_port_t)strtol (port, NULL, 10));
+ ((struct sockaddr_in *)if_addr)->sin_port = htons (lport);
break;
case AF_INET6:
- ((struct sockaddr_in6 *)if_addr)->sin6_port =
- htons((in_port_t)strtol (port, NULL, 10));
+ ((struct sockaddr_in6 *)if_addr)->sin6_port = htons (lport);
break;
default:
log_print ("udp_bind_if: unsupported protocol family %d",
@@ -463,7 +475,7 @@ udp_create (char *name)
udp_default_port);
rv = 0;
goto ret;
- }
+ }
rv = udp_clone (u, dst);
ret:
@@ -490,10 +502,14 @@ udp_report (struct transport *t)
struct udp_transport *u = (struct udp_transport *)t;
char *src, *dst;
- if (sockaddr2text (u->src, &src, 0) || sockaddr2text (u->dst, &dst, 0))
+ if (sockaddr2text (u->src, &src, 0))
goto ret;
- LOG_DBG ((LOG_REPORT, 0, "udp_report: fd %d src %s dst %s", u->s, src, dst));
+ if (!u->dst || sockaddr2text (u->dst, &dst, 0))
+ dst = 0;
+
+ LOG_DBG ((LOG_REPORT, 0, "udp_report: fd %d src %s dst %s", u->s, src,
+ dst ? dst : "<none>"));
ret:
if (dst)
@@ -513,6 +529,8 @@ udp_init ()
struct sockaddr_storage dflt_stor;
struct sockaddr_in *dflt = (struct sockaddr_in *)&dflt_stor;
char *port;
+ long lport;
+ char *ep;
/* Initialize the protocol and port numbers. */
port = udp_default_port ? udp_default_port : "500";
@@ -529,6 +547,18 @@ udp_init ()
return;
/*
+ * Get port.
+ * XXX Use getservbyname too.
+ */
+ lport = strtol (port, &ep, 10);
+ if (*ep != '\0' || lport < 0 || lport > USHRT_MAX)
+ {
+ log_print ("udp_init: port string \"%s\" not convertible to in_port_t",
+ port);
+ return;
+ }
+
+ /*
* If we don't bind to specific addresses via the Listen-on configuration
* option, bind to INADDR_ANY in case of new addresses popping up.
* XXX We should use packets coming in on this socket as a signal
@@ -537,8 +567,7 @@ udp_init ()
memset (&dflt_stor, 0, sizeof dflt_stor);
dflt->sin_family = AF_INET;
((struct sockaddr_in *)dflt)->sin_len = sizeof (struct sockaddr_in);
- ((struct sockaddr_in *)dflt)->sin_port =
- htons ((in_port_t)strtol (port, NULL, 10));
+ ((struct sockaddr_in *)dflt)->sin_port = htons (lport);
default_transport = udp_bind ((struct sockaddr *)&dflt_stor);
if (!default_transport)
@@ -549,8 +578,7 @@ udp_init ()
memset (&dflt_stor, 0, sizeof dflt_stor);
dflt->sin_family = AF_INET6;
((struct sockaddr_in6 *)dflt)->sin6_len = sizeof (struct sockaddr_in6);
- ((struct sockaddr_in6 *)dflt)->sin6_port =
- htons ((in_port_t)strtol (port, NULL, 10));
+ ((struct sockaddr_in6 *)dflt)->sin6_port = htons (lport);
default_transport6 = udp_bind ((struct sockaddr *)&dflt_stor);
if (!default_transport6)