From dd0679ad45eebd357ef9e55cbbbedb33df49ea23 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Fri, 3 Jan 2020 09:36:59 +0100 Subject: [PATCH] socket: add function to check supported family Don't log error when an IPv6 socket cannot be opened and chronyd was built without IPv6 support. Reported-by: Lonnie Abelbeck --- cmdmon.c | 2 +- ntp_io.c | 3 +++ socket.c | 17 +++++++++++++++++ socket.h | 3 +++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/cmdmon.c b/cmdmon.c index ce5c719..ba6e985 100644 --- a/cmdmon.c +++ b/cmdmon.c @@ -159,7 +159,7 @@ open_socket(int family) case IPADDR_INET4: case IPADDR_INET6: port = CNF_GetCommandPort(); - if (port == 0) + if (port == 0 || !SCK_IsFamilySupported(family)) return INVALID_SOCK_FD; CNF_GetBindCommandAddress(family, &local_addr.ip_addr); diff --git a/ntp_io.c b/ntp_io.c index 4d9699d..7a70ff4 100644 --- a/ntp_io.c +++ b/ntp_io.c @@ -86,6 +86,9 @@ open_socket(int family, int local_port, int client_only, IPSockAddr *remote_addr int sock_fd, sock_flags, events = SCH_FILE_INPUT; IPSockAddr local_addr; + if (!SCK_IsFamilySupported(family)) + return INVALID_SOCK_FD; + if (!client_only) CNF_GetBindAddress(family, &local_addr.ip_addr); else diff --git a/socket.c b/socket.c index 466727f..677a142 100644 --- a/socket.c +++ b/socket.c @@ -1115,6 +1115,23 @@ SCK_Finalise(void) /* ================================================== */ +int +SCK_IsFamilySupported(int family) +{ + switch (family) { + case IPADDR_INET4: + return 1; + case IPADDR_INET6: +#ifdef FEAT_IPV6 + return 1; +#endif + default: + return 0; + } +} + +/* ================================================== */ + void SCK_GetAnyLocalIPAddress(int family, IPAddr *local_addr) { diff --git a/socket.h b/socket.h index 823dfb6..ee44526 100644 --- a/socket.h +++ b/socket.h @@ -82,6 +82,9 @@ extern void SCK_Initialise(void); /* Finalisation function */ extern void SCK_Finalise(void); +/* Check if support for the IP family was enabled in the build */ +extern int SCK_IsFamilySupported(int family); + /* Get the 0.0.0.0/::0 or 127.0.0.1/::1 address */ extern void SCK_GetAnyLocalIPAddress(int family, IPAddr *local_addr); extern void SCK_GetLoopbackIPAddress(int family, IPAddr *local_addr);