[PATCH] Fix some problems found on FreeBSD 6.4

FreeBSD is apparently a lot stricter about the length of the socket structure matching the address family. Also add #include <sys/socket.h> to include/struct.h to get AF_INET and AF_INET6 defined. --- include/struct.h | 1 + src/s_auth.c | 9 +++++++-- src/s_bsd.c | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/struct.h b/include/struct.h index 10074df..f83de0a 100644 --- a/include/struct.h +++ b/include/struct.h @@ -32,6 +32,7 @@ #include <stdio.h> #include <sys/types.h> +#include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #if defined( HAVE_STDDEF_H ) diff --git a/src/s_auth.c b/src/s_auth.c index de8469a..6cf4d81 100644 --- a/src/s_auth.c +++ b/src/s_auth.c @@ -99,12 +99,17 @@ void start_auth(aClient *cptr) memset(&localaddr, '\0', sizeof(localaddr)); getsockname(cptr->fd, &localaddr.sa, &locallen); if (localaddr.sa.sa_family == AF_INET) + { localaddr.addr4.sin_port = htons(0); + locallen = sizeof(localaddr.addr4); + } else if (localaddr.sa.sa_family == AF_INET6) + { localaddr.addr6.sin6_port = htons(0); + locallen = sizeof(localaddr.addr6); + } - if (bind(cptr->authfd, &localaddr.sa, - sizeof(localaddr)) == -1) + if (bind(cptr->authfd, &localaddr.sa, locallen) == -1) { report_error("binding auth stream socket %s:%s", cptr); close(cptr->authfd); diff --git a/src/s_bsd.c b/src/s_bsd.c index 65585e6..6b62a0a 100644 --- a/src/s_bsd.c +++ b/src/s_bsd.c @@ -295,12 +295,14 @@ int add_listener(aPort *aport) { server.addr6.sin6_family = AF_INET6; server.addr6.sin6_port = htons(lstn.port); + len = sizeof(server.addr6); } else { server.addr4.sin_family = AF_INET; server.addr4.sin_addr.s_addr = inet_addr(aport->address); server.addr4.sin_port = htons(lstn.port); + len = sizeof(server.addr4); } } else @@ -308,6 +310,7 @@ int add_listener(aPort *aport) server.addr4.sin_family = AF_INET; server.addr4.sin_addr.s_addr = INADDR_ANY; server.addr4.sin_port = htons(lstn.port); + len = sizeof(server.addr4); } if(!BadPtr(aport->allow) && server.sa.sa_family == AF_INET) @@ -336,7 +339,7 @@ int add_listener(aPort *aport) set_listener_sock_opts(lstn.fd, &lstn, server.sa.sa_family); - if (bind(lstn.fd, &server.sa, sizeof(server))) + if (bind(lstn.fd, &server.sa, len)) { report_listener_error("binding stream socket %s:%s", &lstn); close(lstn.fd); -- 1.7.2.3
participants (1)
-
Ned T. Crigler