ntp: set only necessary socket options on client sockets

This commit is contained in:
Miroslav Lichvar 2014-04-03 13:26:17 +02:00
parent 597a37d66e
commit f9d8b6f99e

View file

@ -99,7 +99,7 @@ do_size_checks(void)
/* ================================================== */ /* ================================================== */
static int static int
prepare_socket(int family, int port_number) prepare_socket(int family, int port_number, int client_only)
{ {
union sockaddr_in46 my_addr; union sockaddr_in46 my_addr;
socklen_t my_addr_len; socklen_t my_addr_len;
@ -124,14 +124,16 @@ prepare_socket(int family, int port_number)
/* Close on exec */ /* Close on exec */
UTI_FdSetCloexec(sock_fd); UTI_FdSetCloexec(sock_fd);
/* Make the socket capable of re-using an old address */ /* Make the socket capable of re-using an old address if binding to a specific port */
if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on_off, sizeof(on_off)) < 0) { if (port_number &&
setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on_off, sizeof(on_off)) < 0) {
LOG(LOGS_ERR, LOGF_NtpIO, "Could not set reuseaddr socket options"); LOG(LOGS_ERR, LOGF_NtpIO, "Could not set reuseaddr socket options");
/* Don't quit - we might survive anyway */ /* Don't quit - we might survive anyway */
} }
/* Make the socket capable of sending broadcast pkts - needed for NTP broadcast mode */ /* Make the socket capable of sending broadcast pkts - needed for NTP broadcast mode */
if (setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (char *)&on_off, sizeof(on_off)) < 0) { if (!client_only &&
setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, (char *)&on_off, sizeof(on_off)) < 0) {
LOG(LOGS_ERR, LOGF_NtpIO, "Could not set broadcast socket options"); LOG(LOGS_ERR, LOGF_NtpIO, "Could not set broadcast socket options");
/* Don't quit - we might survive anyway */ /* Don't quit - we might survive anyway */
} }
@ -146,8 +148,9 @@ prepare_socket(int family, int port_number)
if (family == AF_INET) { if (family == AF_INET) {
#ifdef IP_PKTINFO #ifdef IP_PKTINFO
/* We want the local IP info too */ /* We want the local IP info on server sockets */
if (setsockopt(sock_fd, IPPROTO_IP, IP_PKTINFO, (char *)&on_off, sizeof(on_off)) < 0) { if (!client_only &&
setsockopt(sock_fd, IPPROTO_IP, IP_PKTINFO, (char *)&on_off, sizeof(on_off)) < 0) {
LOG(LOGS_ERR, LOGF_NtpIO, "Could not request packet info using socket option"); LOG(LOGS_ERR, LOGF_NtpIO, "Could not request packet info using socket option");
/* Don't quit - we might survive anyway */ /* Don't quit - we might survive anyway */
} }
@ -162,15 +165,17 @@ prepare_socket(int family, int port_number)
} }
#endif #endif
if (!client_only) {
#ifdef IPV6_RECVPKTINFO #ifdef IPV6_RECVPKTINFO
if (setsockopt(sock_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, (char *)&on_off, sizeof(on_off)) < 0) { if (setsockopt(sock_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, (char *)&on_off, sizeof(on_off)) < 0) {
LOG(LOGS_ERR, LOGF_NtpIO, "Could not request IPv6 packet info socket option"); LOG(LOGS_ERR, LOGF_NtpIO, "Could not request IPv6 packet info socket option");
} }
#elif defined(IPV6_PKTINFO) #elif defined(IPV6_PKTINFO)
if (setsockopt(sock_fd, IPPROTO_IPV6, IPV6_PKTINFO, (char *)&on_off, sizeof(on_off)) < 0) { if (setsockopt(sock_fd, IPPROTO_IPV6, IPV6_PKTINFO, (char *)&on_off, sizeof(on_off)) < 0) {
LOG(LOGS_ERR, LOGF_NtpIO, "Could not request IPv6 packet info socket option"); LOG(LOGS_ERR, LOGF_NtpIO, "Could not request IPv6 packet info socket option");
} }
#endif #endif
}
} }
#endif #endif
@ -314,10 +319,10 @@ NIO_Initialise(int family)
if (family == IPADDR_UNSPEC || family == IPADDR_INET4) { if (family == IPADDR_UNSPEC || family == IPADDR_INET4) {
if (server_port) if (server_port)
server_sock_fd4 = prepare_socket(AF_INET, server_port); server_sock_fd4 = prepare_socket(AF_INET, server_port, 0);
if (!separate_client_sockets) { if (!separate_client_sockets) {
if (client_port != server_port || !server_port) if (client_port != server_port || !server_port)
client_sock_fd4 = prepare_socket(AF_INET, client_port); client_sock_fd4 = prepare_socket(AF_INET, client_port, 1);
else else
client_sock_fd4 = server_sock_fd4; client_sock_fd4 = server_sock_fd4;
} }
@ -325,10 +330,10 @@ NIO_Initialise(int family)
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
if (family == IPADDR_UNSPEC || family == IPADDR_INET6) { if (family == IPADDR_UNSPEC || family == IPADDR_INET6) {
if (server_port) if (server_port)
server_sock_fd6 = prepare_socket(AF_INET6, server_port); server_sock_fd6 = prepare_socket(AF_INET6, server_port, 0);
if (!separate_client_sockets) { if (!separate_client_sockets) {
if (client_port != server_port || !server_port) if (client_port != server_port || !server_port)
client_sock_fd6 = prepare_socket(AF_INET6, client_port); client_sock_fd6 = prepare_socket(AF_INET6, client_port, 1);
else else
client_sock_fd6 = server_sock_fd6; client_sock_fd6 = server_sock_fd6;
} }
@ -376,11 +381,11 @@ NIO_GetClientSocket(NTP_Remote_Address *remote_addr)
switch (remote_addr->ip_addr.family) { switch (remote_addr->ip_addr.family) {
case IPADDR_INET4: case IPADDR_INET4:
sock_fd = prepare_socket(AF_INET, 0); sock_fd = prepare_socket(AF_INET, 0, 1);
break; break;
#ifdef HAVE_IPV6 #ifdef HAVE_IPV6
case IPADDR_INET6: case IPADDR_INET6:
sock_fd = prepare_socket(AF_INET6, 0); sock_fd = prepare_socket(AF_INET6, 0, 1);
break; break;
#endif #endif
default: default: