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 <lonnie@abelbeck.com>
This commit is contained in:
Miroslav Lichvar 2020-01-03 09:36:59 +01:00
parent bfcd8ecc56
commit dd0679ad45
4 changed files with 24 additions and 1 deletions

View file

@ -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);

View file

@ -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

View file

@ -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)
{

View file

@ -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);