Mon Jan 6 19:24:39 2014 UTC ()
etc/ntp.conf					1.16, 1.17, 1.18 via patch
external/bsd/ntp/dist/ntpd/ntp_request.c	patch

	Patch from ntp 4.2.7p404 to prevent an amplifier and DoS attack.
	Add several "restrict" lines to the default ntp.conf and
	improve comments
	[spz, ticket #1895]


(bouyer)
diff -r1.8.4.1 -r1.8.4.1.2.1 src/dist/ntp/ntpd/ntp_request.c
diff -r1.9 -r1.9.28.1 src/etc/ntp.conf

cvs diff -r1.8.4.1 -r1.8.4.1.2.1 src/dist/ntp/ntpd/Attic/ntp_request.c (expand / switch to unified diff)

--- src/dist/ntp/ntpd/Attic/ntp_request.c 2009/12/09 04:48:24 1.8.4.1
+++ src/dist/ntp/ntpd/Attic/ntp_request.c 2014/01/06 19:24:39 1.8.4.1.2.1
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: ntp_request.c,v 1.8.4.1 2009/12/09 04:48:24 snj Exp $ */ 1/* $NetBSD: ntp_request.c,v 1.8.4.1.2.1 2014/01/06 19:24:39 bouyer Exp $ */
2 2
3/* 3/*
4 * ntp_request.c - respond to information requests 4 * ntp_request.c - respond to information requests
5 */ 5 */
6 6
7#ifdef HAVE_CONFIG_H 7#ifdef HAVE_CONFIG_H
8# include <config.h> 8# include <config.h>
9#endif 9#endif
10 10
11#include "ntpd.h" 11#include "ntpd.h"
12#include "ntp_io.h" 12#include "ntp_io.h"
13#include "ntp_request.h" 13#include "ntp_request.h"
14#include "ntp_control.h" 14#include "ntp_control.h"
@@ -74,28 +74,27 @@ static void mem_stats P((struct sockaddr @@ -74,28 +74,27 @@ static void mem_stats P((struct sockaddr
74static void io_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 74static void io_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
75static void timer_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 75static void timer_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
76static void loop_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 76static void loop_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
77static void do_conf P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 77static void do_conf P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
78static void do_unconf P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 78static void do_unconf P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
79static void set_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 79static void set_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
80static void clr_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 80static void clr_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
81static void setclr_flags P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long)); 81static void setclr_flags P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long));
82static void list_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 82static void list_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
83static void do_resaddflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 83static void do_resaddflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
84static void do_ressubflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 84static void do_ressubflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
85static void do_unrestrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 85static void do_unrestrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
86static void do_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int)); 86static void do_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int));
87static void mon_getlist_0 P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 87static void mon_getlist P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
88static void mon_getlist_1 P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 
89static void reset_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 88static void reset_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
90static void reset_peer P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 89static void reset_peer P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
91static void do_key_reread P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 90static void do_key_reread P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
92static void trust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 91static void trust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
93static void untrust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 92static void untrust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
94static void do_trustkey P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long)); 93static void do_trustkey P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long));
95static void get_auth_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 94static void get_auth_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
96static void reset_auth_stats P((void)); 95static void reset_auth_stats P((void));
97static void req_get_traps P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 96static void req_get_traps P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
98static void req_set_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 97static void req_set_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
99static void req_clr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 98static void req_clr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
100static void do_setclr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int)); 99static void do_setclr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int));
101static void set_request_keyid P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); 100static void set_request_keyid P((struct sockaddr_storage *, struct interface *, struct req_pkt *));
@@ -135,28 +134,28 @@ static struct req_proc ntp_codes[] = { @@ -135,28 +134,28 @@ static struct req_proc ntp_codes[] = {
135 { REQ_UNCONFIG, AUTH, v4sizeof(struct conf_unpeer), 134 { REQ_UNCONFIG, AUTH, v4sizeof(struct conf_unpeer),
136 sizeof(struct conf_unpeer), do_unconf }, 135 sizeof(struct conf_unpeer), do_unconf },
137 { REQ_SET_SYS_FLAG, AUTH, sizeof(struct conf_sys_flags), 136 { REQ_SET_SYS_FLAG, AUTH, sizeof(struct conf_sys_flags),
138 sizeof(struct conf_sys_flags), set_sys_flag }, 137 sizeof(struct conf_sys_flags), set_sys_flag },
139 { REQ_CLR_SYS_FLAG, AUTH, sizeof(struct conf_sys_flags),  138 { REQ_CLR_SYS_FLAG, AUTH, sizeof(struct conf_sys_flags),
140 sizeof(struct conf_sys_flags), clr_sys_flag }, 139 sizeof(struct conf_sys_flags), clr_sys_flag },
141 { REQ_GET_RESTRICT, NOAUTH, 0, 0, list_restrict }, 140 { REQ_GET_RESTRICT, NOAUTH, 0, 0, list_restrict },
142 { REQ_RESADDFLAGS, AUTH, v4sizeof(struct conf_restrict), 141 { REQ_RESADDFLAGS, AUTH, v4sizeof(struct conf_restrict),
143 sizeof(struct conf_restrict), do_resaddflags }, 142 sizeof(struct conf_restrict), do_resaddflags },
144 { REQ_RESSUBFLAGS, AUTH, v4sizeof(struct conf_restrict), 143 { REQ_RESSUBFLAGS, AUTH, v4sizeof(struct conf_restrict),
145 sizeof(struct conf_restrict), do_ressubflags }, 144 sizeof(struct conf_restrict), do_ressubflags },
146 { REQ_UNRESTRICT, AUTH, v4sizeof(struct conf_restrict), 145 { REQ_UNRESTRICT, AUTH, v4sizeof(struct conf_restrict),
147 sizeof(struct conf_restrict), do_unrestrict }, 146 sizeof(struct conf_restrict), do_unrestrict },
148 { REQ_MON_GETLIST, NOAUTH, 0, 0, mon_getlist_0 }, 147 { REQ_MON_GETLIST, NOAUTH, 0, 0, mon_getlist },
149 { REQ_MON_GETLIST_1, NOAUTH, 0, 0, mon_getlist_1 }, 148 { REQ_MON_GETLIST_1, NOAUTH, 0, 0, mon_getlist },
150 { REQ_RESET_STATS, AUTH, sizeof(struct reset_flags), 0, reset_stats }, 149 { REQ_RESET_STATS, AUTH, sizeof(struct reset_flags), 0, reset_stats },
151 { REQ_RESET_PEER, AUTH, v4sizeof(struct conf_unpeer), 150 { REQ_RESET_PEER, AUTH, v4sizeof(struct conf_unpeer),
152 sizeof(struct conf_unpeer), reset_peer }, 151 sizeof(struct conf_unpeer), reset_peer },
153 { REQ_REREAD_KEYS, AUTH, 0, 0, do_key_reread }, 152 { REQ_REREAD_KEYS, AUTH, 0, 0, do_key_reread },
154 { REQ_TRUSTKEY, AUTH, sizeof(u_long), sizeof(u_long), trust_key }, 153 { REQ_TRUSTKEY, AUTH, sizeof(u_long), sizeof(u_long), trust_key },
155 { REQ_UNTRUSTKEY, AUTH, sizeof(u_long), sizeof(u_long), untrust_key }, 154 { REQ_UNTRUSTKEY, AUTH, sizeof(u_long), sizeof(u_long), untrust_key },
156 { REQ_AUTHINFO, NOAUTH, 0, 0, get_auth_info }, 155 { REQ_AUTHINFO, NOAUTH, 0, 0, get_auth_info },
157 { REQ_TRAPS, NOAUTH, 0, 0, req_get_traps }, 156 { REQ_TRAPS, NOAUTH, 0, 0, req_get_traps },
158 { REQ_ADD_TRAP, AUTH, v4sizeof(struct conf_trap), 157 { REQ_ADD_TRAP, AUTH, v4sizeof(struct conf_trap),
159 sizeof(struct conf_trap), req_set_trap }, 158 sizeof(struct conf_trap), req_set_trap },
160 { REQ_CLR_TRAP, AUTH, v4sizeof(struct conf_trap), 159 { REQ_CLR_TRAP, AUTH, v4sizeof(struct conf_trap),
161 sizeof(struct conf_trap), req_clr_trap }, 160 sizeof(struct conf_trap), req_clr_trap },
162 { REQ_REQUEST_KEY, AUTH, sizeof(u_long), sizeof(u_long),  161 { REQ_REQUEST_KEY, AUTH, sizeof(u_long), sizeof(u_long),
@@ -591,26 +590,29 @@ process_private( @@ -591,26 +590,29 @@ process_private(
591 msyslog(LOG_ERR, "process_private: bad pkt length %d", 590 msyslog(LOG_ERR, "process_private: bad pkt length %d",
592 rbufp->recv_length); 591 rbufp->recv_length);
593 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); 592 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
594 return; 593 return;
595 } 594 }
596 if (!mod_okay || !authhavekey(info_auth_keyid)) { 595 if (!mod_okay || !authhavekey(info_auth_keyid)) {
597#ifdef DEBUG 596#ifdef DEBUG
598 if (debug > 4) 597 if (debug > 4)
599 printf("failed auth mod_okay %d\n", mod_okay); 598 printf("failed auth mod_okay %d\n", mod_okay);
600 msyslog(LOG_DEBUG, 599 msyslog(LOG_DEBUG,
601 "process_private: failed auth mod_okay %d\n", 600 "process_private: failed auth mod_okay %d\n",
602 mod_okay); 601 mod_okay);
603#endif 602#endif
 603 if (!mod_okay) {
 604 sys_restricted++;
 605 }
604 req_ack(srcadr, inter, inpkt, INFO_ERR_AUTH); 606 req_ack(srcadr, inter, inpkt, INFO_ERR_AUTH);
605 return; 607 return;
606 } 608 }
607 609
608 /* 610 /*
609 * calculate absolute time difference between xmit time stamp 611 * calculate absolute time difference between xmit time stamp
610 * and receive time stamp. If too large, too bad. 612 * and receive time stamp. If too large, too bad.
611 */ 613 */
612 NTOHL_FP(&tailinpkt->tstamp, &ftmp); 614 NTOHL_FP(&tailinpkt->tstamp, &ftmp);
613 L_SUB(&ftmp, &rbufp->recv_time); 615 L_SUB(&ftmp, &rbufp->recv_time);
614 LFPTOD(&ftmp, dtemp); 616 LFPTOD(&ftmp, dtemp);
615 if (fabs(dtemp) >= INFO_TS_MAXSKEW) { 617 if (fabs(dtemp) >= INFO_TS_MAXSKEW) {
616 /* 618 /*
@@ -812,55 +814,62 @@ peer_list_sum( @@ -812,55 +814,62 @@ peer_list_sum(
812} 814}
813 815
814 816
815/* 817/*
816 * peer_info - send information for one or more peers 818 * peer_info - send information for one or more peers
817 */ 819 */
818static void 820static void
819peer_info ( 821peer_info (
820 struct sockaddr_storage *srcadr, 822 struct sockaddr_storage *srcadr,
821 struct interface *inter, 823 struct interface *inter,
822 struct req_pkt *inpkt 824 struct req_pkt *inpkt
823 ) 825 )
824{ 826{
825 register struct info_peer_list *ipl; 827 struct info_peer_list ipl;
826 register struct peer *pp; 828 register struct peer *pp;
827 register struct info_peer *ip; 829 register struct info_peer *ip;
828 register int items; 830 register int items;
 831 size_t item_sz;
 832 char * datap;
829 register int i, j; 833 register int i, j;
830 struct sockaddr_storage addr; 834 struct sockaddr_storage addr;
831 extern struct peer *sys_peer; 835 extern struct peer *sys_peer;
832 l_fp ltmp; 836 l_fp ltmp;
833 837
834 memset((char *)&addr, 0, sizeof addr); 
835 items = INFO_NITEMS(inpkt->err_nitems); 838 items = INFO_NITEMS(inpkt->err_nitems);
836 ipl = (struct info_peer_list *) inpkt->data; 839 item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize);
837 840 datap = inpkt->data;
 841 if (item_sz != sizeof(ipl)) {
 842 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
 843 return;
 844 }
838 ip = (struct info_peer *)prepare_pkt(srcadr, inter, inpkt, 845 ip = (struct info_peer *)prepare_pkt(srcadr, inter, inpkt,
839 v6sizeof(struct info_peer)); 846 v6sizeof(struct info_peer));
840 while (items-- > 0 && ip != 0) { 847 while (items-- > 0 && ip != 0) {
 848 memset(&ipl,0,sizeof(ipl));
 849 memcpy(&ipl, datap, item_sz);
841 memset((char *)&addr, 0, sizeof(addr)); 850 memset((char *)&addr, 0, sizeof(addr));
842 NSRCPORT(&addr) = ipl->port; 851 NSRCPORT(&addr) = ipl.port;
843 if (client_v6_capable && ipl->v6_flag != 0) { 852 if (client_v6_capable && ipl.v6_flag != 0) {
844 addr.ss_family = AF_INET6; 853 addr.ss_family = AF_INET6;
845 GET_INADDR6(addr) = ipl->addr6; 854 GET_INADDR6(addr) = ipl.addr6;
846 } else { 855 } else {
847 addr.ss_family = AF_INET; 856 addr.ss_family = AF_INET;
848 GET_INADDR(addr) = ipl->addr; 857 GET_INADDR(addr) = ipl.addr;
849 } 858 }
850#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 859#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
851 addr.ss_len = SOCKLEN(&addr); 860 addr.ss_len = SOCKLEN(&addr);
852#endif 861#endif
853 ipl++; 862 datap += item_sz;
854 if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0) 863 if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0)
855 continue; 864 continue;
856 if (pp->srcadr.ss_family == AF_INET6) { 865 if (pp->srcadr.ss_family == AF_INET6) {
857 if (pp->dstadr) 866 if (pp->dstadr)
858 ip->dstadr6 = pp->cast_flags == MDF_BCAST ? 867 ip->dstadr6 = pp->cast_flags == MDF_BCAST ?
859 GET_INADDR6(pp->dstadr->bcast) : 868 GET_INADDR6(pp->dstadr->bcast) :
860 GET_INADDR6(pp->dstadr->sin); 869 GET_INADDR6(pp->dstadr->sin);
861 else 870 else
862 memset(&ip->dstadr6, 0, sizeof(ip->dstadr6)); 871 memset(&ip->dstadr6, 0, sizeof(ip->dstadr6));
863 872
864 ip->srcadr6 = GET_INADDR6(pp->srcadr); 873 ip->srcadr6 = GET_INADDR6(pp->srcadr);
865 ip->v6_flag = 1; 874 ip->v6_flag = 1;
866 } else { 875 } else {
@@ -944,61 +953,69 @@ peer_info ( @@ -944,61 +953,69 @@ peer_info (
944} 953}
945 954
946 955
947/* 956/*
948 * peer_stats - send statistics for one or more peers 957 * peer_stats - send statistics for one or more peers
949 */ 958 */
950static void 959static void
951peer_stats ( 960peer_stats (
952 struct sockaddr_storage *srcadr, 961 struct sockaddr_storage *srcadr,
953 struct interface *inter, 962 struct interface *inter,
954 struct req_pkt *inpkt 963 struct req_pkt *inpkt
955 ) 964 )
956{ 965{
957 register struct info_peer_list *ipl; 966 struct info_peer_list ipl;
958 register struct peer *pp; 967 register struct peer *pp;
959 register struct info_peer_stats *ip; 968 register struct info_peer_stats *ip;
960 register int items; 969 register int items;
 970 size_t item_sz;
 971 char * datap;
961 struct sockaddr_storage addr; 972 struct sockaddr_storage addr;
962 extern struct peer *sys_peer; 973 extern struct peer *sys_peer;
963 974
964#ifdef DEBUG 975#ifdef DEBUG
965 if (debug) 976 if (debug)
966 printf("peer_stats: called\n"); 977 printf("peer_stats: called\n");
967#endif 978#endif
968 items = INFO_NITEMS(inpkt->err_nitems); 979 items = INFO_NITEMS(inpkt->err_nitems);
969 ipl = (struct info_peer_list *) inpkt->data; 980 item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize);
 981 datap = inpkt->data;
 982 if (item_sz > sizeof(ipl)) {
 983 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
 984 return;
 985 }
970 ip = (struct info_peer_stats *)prepare_pkt(srcadr, inter, inpkt, 986 ip = (struct info_peer_stats *)prepare_pkt(srcadr, inter, inpkt,
971 v6sizeof(struct info_peer_stats)); 987 v6sizeof(struct info_peer_stats));
972 while (items-- > 0 && ip != 0) { 988 while (items-- > 0 && ip != 0) {
 989 memset(&ipl,0,sizeof(ipl));
 990 memcpy(&ipl, datap, item_sz);
973 memset((char *)&addr, 0, sizeof(addr)); 991 memset((char *)&addr, 0, sizeof(addr));
974 NSRCPORT(&addr) = ipl->port; 992 NSRCPORT(&addr) = ipl.port;
975 if (client_v6_capable && ipl->v6_flag) { 993 if (client_v6_capable && ipl.v6_flag) {
976 addr.ss_family = AF_INET6; 994 addr.ss_family = AF_INET6;
977 GET_INADDR6(addr) = ipl->addr6; 995 GET_INADDR6(addr) = ipl.addr6;
978 } else { 996 } else {
979 addr.ss_family = AF_INET; 997 addr.ss_family = AF_INET;
980 GET_INADDR(addr) = ipl->addr; 998 GET_INADDR(addr) = ipl.addr;
981 }  999 }
982#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 1000#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
983 addr.ss_len = SOCKLEN(&addr); 1001 addr.ss_len = SOCKLEN(&addr);
984#endif 1002#endif
985#ifdef DEBUG 1003#ifdef DEBUG
986 if (debug) 1004 if (debug)
987 printf("peer_stats: looking for %s, %d, %d\n", stoa(&addr), 1005 printf("peer_stats: looking for %s, %d, %d\n", stoa(&addr),
988 ipl->port, ((struct sockaddr_in6 *)&addr)->sin6_port); 1006 ipl.port, ((struct sockaddr_in6 *)&addr)->sin6_port);
989#endif 1007#endif
990 ipl = (struct info_peer_list *)((char *)ipl + 1008 datap += item_sz;
991 INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
992 1009
993 if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0) 1010 if ((pp = findexistingpeer(&addr, (struct peer *)0, -1)) == 0)
994 continue; 1011 continue;
995#ifdef DEBUG 1012#ifdef DEBUG
996 if (debug) 1013 if (debug)
997 printf("peer_stats: found %s\n", stoa(&addr)); 1014 printf("peer_stats: found %s\n", stoa(&addr));
998#endif 1015#endif
999 if (pp->srcadr.ss_family == AF_INET) { 1016 if (pp->srcadr.ss_family == AF_INET) {
1000 if (pp->dstadr) 1017 if (pp->dstadr)
1001 ip->dstadr = (pp->processed) ? 1018 ip->dstadr = (pp->processed) ?
1002 pp->cast_flags == MDF_BCAST ? 1019 pp->cast_flags == MDF_BCAST ?
1003 GET_INADDR(pp->dstadr->bcast): 1020 GET_INADDR(pp->dstadr->bcast):
1004 pp->cast_flags ? 1021 pp->cast_flags ?
@@ -1319,71 +1336,49 @@ loop_info( @@ -1319,71 +1336,49 @@ loop_info(
1319 1336
1320 1337
1321/* 1338/*
1322 * do_conf - add a peer to the configuration list 1339 * do_conf - add a peer to the configuration list
1323 */ 1340 */
1324static void 1341static void
1325do_conf( 1342do_conf(
1326 struct sockaddr_storage *srcadr, 1343 struct sockaddr_storage *srcadr,
1327 struct interface *inter, 1344 struct interface *inter,
1328 struct req_pkt *inpkt 1345 struct req_pkt *inpkt
1329 ) 1346 )
1330{ 1347{
1331 int items; 1348 int items;
 1349 size_t item_sz;
 1350 char * datap;
1332 u_int fl; 1351 u_int fl;
1333 struct conf_peer *cp;  
1334 struct conf_peer temp_cp; 1352 struct conf_peer temp_cp;
1335 struct sockaddr_storage peeraddr; 1353 struct sockaddr_storage peeraddr;
1336 struct sockaddr_in tmp_clock; 1354 struct sockaddr_in tmp_clock;
1337 1355
1338 /* 1356 /*
1339 * Do a check of everything to see that it looks 1357 * Do a check of everything to see that it looks
1340 * okay. If not, complain about it. Note we are 1358 * okay. If not, complain about it. Note we are
1341 * very picky here. 1359 * very picky here.
1342 */ 1360 */
1343 items = INFO_NITEMS(inpkt->err_nitems); 1361 items = INFO_NITEMS(inpkt->err_nitems);
1344 cp = (struct conf_peer *)inpkt->data; 1362 item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize);
1345 memset(&temp_cp, 0, sizeof(struct conf_peer)); 1363 datap = inpkt->data;
1346 memcpy(&temp_cp, (char *)cp, INFO_ITEMSIZE(inpkt->mbz_itemsize)); 1364 if (item_sz > sizeof(temp_cp)) {
1347 fl = 0; 
1348 while (items-- > 0 && !fl) { 
1349 if (((temp_cp.version) > NTP_VERSION) 
1350 || ((temp_cp.version) < NTP_OLDVERSION)) 
1351 fl = 1; 
1352 if (temp_cp.hmode != MODE_ACTIVE 
1353 && temp_cp.hmode != MODE_CLIENT 
1354 && temp_cp.hmode != MODE_BROADCAST) 
1355 fl = 1; 
1356 if (temp_cp.flags & ~(CONF_FLAG_AUTHENABLE | CONF_FLAG_PREFER 
1357 | CONF_FLAG_BURST | CONF_FLAG_IBURST | CONF_FLAG_SKEY)) 
1358 fl = 1; 
1359 cp = (struct conf_peer *) 
1360 ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1361 } 
1362 
1363 if (fl) { 
1364 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); 1365 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
1365 return; 1366 return;
1366 } 1367 }
1367 1368
1368 /* 
1369 * Looks okay, try it out 
1370 */ 
1371 items = INFO_NITEMS(inpkt->err_nitems); 
1372 cp = (struct conf_peer *)inpkt->data;  
1373 
1374 while (items-- > 0) { 1369 while (items-- > 0) {
1375 memset(&temp_cp, 0, sizeof(struct conf_peer)); 1370 memset(&temp_cp, 0, sizeof(struct conf_peer));
1376 memcpy(&temp_cp, (char *)cp, INFO_ITEMSIZE(inpkt->mbz_itemsize)); 1371 memcpy(&temp_cp, datap, item_sz);
1377 memset((char *)&peeraddr, 0, sizeof(struct sockaddr_storage)); 1372 memset((char *)&peeraddr, 0, sizeof(struct sockaddr_storage));
1378 1373
1379 fl = 0; 1374 fl = 0;
1380 if (temp_cp.flags & CONF_FLAG_AUTHENABLE) 1375 if (temp_cp.flags & CONF_FLAG_AUTHENABLE)
1381 fl |= FLAG_AUTHENABLE; 1376 fl |= FLAG_AUTHENABLE;
1382 if (temp_cp.flags & CONF_FLAG_PREFER) 1377 if (temp_cp.flags & CONF_FLAG_PREFER)
1383 fl |= FLAG_PREFER; 1378 fl |= FLAG_PREFER;
1384 if (temp_cp.flags & CONF_FLAG_BURST) 1379 if (temp_cp.flags & CONF_FLAG_BURST)
1385 fl |= FLAG_BURST; 1380 fl |= FLAG_BURST;
1386 if (temp_cp.flags & CONF_FLAG_IBURST) 1381 if (temp_cp.flags & CONF_FLAG_IBURST)
1387 fl |= FLAG_IBURST; 1382 fl |= FLAG_IBURST;
1388 if (temp_cp.flags & CONF_FLAG_SKEY) 1383 if (temp_cp.flags & CONF_FLAG_SKEY)
1389 fl |= FLAG_SKEY; 1384 fl |= FLAG_SKEY;
@@ -1411,28 +1406,27 @@ do_conf( @@ -1411,28 +1406,27 @@ do_conf(
1411 NSRCPORT(&peeraddr) = htons(NTP_PORT); 1406 NSRCPORT(&peeraddr) = htons(NTP_PORT);
1412#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 1407#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
1413 peeraddr.ss_len = SOCKLEN(&peeraddr); 1408 peeraddr.ss_len = SOCKLEN(&peeraddr);
1414#endif 1409#endif
1415 1410
1416 /* XXX W2DO? minpoll/maxpoll arguments ??? */ 1411 /* XXX W2DO? minpoll/maxpoll arguments ??? */
1417 if (peer_config(&peeraddr, (struct interface *)0, 1412 if (peer_config(&peeraddr, (struct interface *)0,
1418 temp_cp.hmode, temp_cp.version, temp_cp.minpoll,  1413 temp_cp.hmode, temp_cp.version, temp_cp.minpoll,
1419 temp_cp.maxpoll, fl, temp_cp.ttl, temp_cp.keyid, 1414 temp_cp.maxpoll, fl, temp_cp.ttl, temp_cp.keyid,
1420 NULL) == 0) { 1415 NULL) == 0) {
1421 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); 1416 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
1422 return; 1417 return;
1423 } 1418 }
1424 cp = (struct conf_peer *) 1419 datap += item_sz;
1425 ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1426 } 1420 }
1427 1421
1428 req_ack(srcadr, inter, inpkt, INFO_OKAY); 1422 req_ack(srcadr, inter, inpkt, INFO_OKAY);
1429} 1423}
1430 1424
1431#if 0 1425#if 0
1432/* XXX */ 1426/* XXX */
1433/* 1427/*
1434 * dns_a - Snarf DNS info for an association ID 1428 * dns_a - Snarf DNS info for an association ID
1435 */ 1429 */
1436static void 1430static void
1437dns_a( 1431dns_a(
1438 struct sockaddr_storage *srcadr, 1432 struct sockaddr_storage *srcadr,
@@ -1525,106 +1519,111 @@ dns_a( @@ -1525,106 +1519,111 @@ dns_a(
1525} 1519}
1526#endif /* 0 */ 1520#endif /* 0 */
1527 1521
1528/* 1522/*
1529 * do_unconf - remove a peer from the configuration list 1523 * do_unconf - remove a peer from the configuration list
1530 */ 1524 */
1531static void 1525static void
1532do_unconf( 1526do_unconf(
1533 struct sockaddr_storage *srcadr, 1527 struct sockaddr_storage *srcadr,
1534 struct interface *inter, 1528 struct interface *inter,
1535 struct req_pkt *inpkt 1529 struct req_pkt *inpkt
1536 ) 1530 )
1537{ 1531{
1538 register struct conf_unpeer *cp; 
1539 struct conf_unpeer temp_cp; 1532 struct conf_unpeer temp_cp;
1540 register int items; 1533 register int items;
 1534 size_t item_sz;
 1535 char * datap;
1541 register struct peer *peer; 1536 register struct peer *peer;
1542 struct sockaddr_storage peeraddr; 1537 struct sockaddr_storage peeraddr;
1543 int bad, found; 1538 int bad, found;
1544 1539
1545 /* 1540 /*
1546 * This is a bit unstructured, but I like to be careful. 1541 * This is a bit unstructured, but I like to be careful.
1547 * We check to see that every peer exists and is actually 1542 * We check to see that every peer exists and is actually
1548 * configured. If so, we remove them. If not, we return 1543 * configured. If so, we remove them. If not, we return
1549 * an error. 1544 * an error.
1550 */ 1545 */
1551 items = INFO_NITEMS(inpkt->err_nitems); 1546 items = INFO_NITEMS(inpkt->err_nitems);
1552 cp = (struct conf_unpeer *)inpkt->data; 1547 item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize);
 1548 datap = inpkt->data;
 1549 if (item_sz > sizeof(temp_cp)) {
 1550 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
 1551 return;
 1552 }
1553 1553
1554 bad = 0; 1554 bad = 0;
1555 while (items-- > 0 && !bad) { 1555 while (items-- > 0 && !bad) {
1556 memset(&temp_cp, 0, sizeof(temp_cp)); 1556 memset(&temp_cp, 0, sizeof(temp_cp));
 1557 memcpy(&temp_cp, datap, item_sz);
1557 memset(&peeraddr, 0, sizeof(peeraddr)); 1558 memset(&peeraddr, 0, sizeof(peeraddr));
1558 memcpy(&temp_cp, cp, INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1559 if (client_v6_capable && temp_cp.v6_flag != 0) { 1559 if (client_v6_capable && temp_cp.v6_flag != 0) {
1560 peeraddr.ss_family = AF_INET6; 1560 peeraddr.ss_family = AF_INET6;
1561 GET_INADDR6(peeraddr) = temp_cp.peeraddr6; 1561 GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
1562 } else { 1562 } else {
1563 peeraddr.ss_family = AF_INET; 1563 peeraddr.ss_family = AF_INET;
1564 GET_INADDR(peeraddr) = temp_cp.peeraddr; 1564 GET_INADDR(peeraddr) = temp_cp.peeraddr;
1565 } 1565 }
1566 NSRCPORT(&peeraddr) = htons(NTP_PORT); 1566 NSRCPORT(&peeraddr) = htons(NTP_PORT);
1567#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 1567#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
1568 peeraddr.ss_len = SOCKLEN(&peeraddr); 1568 peeraddr.ss_len = SOCKLEN(&peeraddr);
1569#endif 1569#endif
1570 found = 0; 1570 found = 0;
1571 peer = (struct peer *)0; 1571 peer = (struct peer *)0;
1572#ifdef DEBUG 1572#ifdef DEBUG
1573 if (debug) 1573 if (debug)
1574 printf("searching for %s\n", stoa(&peeraddr)); 1574 printf("searching for %s\n", stoa(&peeraddr));
1575#endif 1575#endif
1576 while (!found) { 1576 while (!found) {
1577 peer = findexistingpeer(&peeraddr, peer, -1); 1577 peer = findexistingpeer(&peeraddr, peer, -1);
1578 if (peer == (struct peer *)0) 1578 if (peer == (struct peer *)0)
1579 break; 1579 break;
1580 if (peer->flags & FLAG_CONFIG) 1580 if (peer->flags & FLAG_CONFIG)
1581 found = 1; 1581 found = 1;
1582 } 1582 }
1583 if (!found) 1583 if (!found)
1584 bad = 1; 1584 bad = 1;
1585 cp = (struct conf_unpeer *) 1585 datap = inpkt->data;
1586 ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1587 } 1586 }
1588 1587
1589 if (bad) { 1588 if (bad) {
1590 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); 1589 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
1591 return; 1590 return;
1592 } 1591 }
1593 1592
1594 /* 1593 /*
1595 * Now do it in earnest. 1594 * Now do it in earnest.
1596 */ 1595 */
1597 1596
1598 items = INFO_NITEMS(inpkt->err_nitems); 1597 items = INFO_NITEMS(inpkt->err_nitems);
1599 cp = (struct conf_unpeer *)inpkt->data; 1598 datap = inpkt->data;
 1599
1600 while (items-- > 0) { 1600 while (items-- > 0) {
1601 memset(&temp_cp, 0, sizeof(temp_cp)); 1601 memset(&temp_cp, 0, sizeof(temp_cp));
 1602 memcpy(&temp_cp, datap, item_sz);
1602 memset(&peeraddr, 0, sizeof(peeraddr)); 1603 memset(&peeraddr, 0, sizeof(peeraddr));
1603 memcpy(&temp_cp, cp, INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1604 if (client_v6_capable && temp_cp.v6_flag != 0) { 1604 if (client_v6_capable && temp_cp.v6_flag != 0) {
1605 peeraddr.ss_family = AF_INET6; 1605 peeraddr.ss_family = AF_INET6;
1606 GET_INADDR6(peeraddr) = temp_cp.peeraddr6; 1606 GET_INADDR6(peeraddr) = temp_cp.peeraddr6;
1607 } else { 1607 } else {
1608 peeraddr.ss_family = AF_INET; 1608 peeraddr.ss_family = AF_INET;
1609 GET_INADDR(peeraddr) = temp_cp.peeraddr; 1609 GET_INADDR(peeraddr) = temp_cp.peeraddr;
1610 } 1610 }
1611 NSRCPORT(&peeraddr) = htons(NTP_PORT); 1611 NSRCPORT(&peeraddr) = htons(NTP_PORT);
1612#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 1612#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
1613 peeraddr.ss_len = SOCKLEN(&peeraddr); 1613 peeraddr.ss_len = SOCKLEN(&peeraddr);
1614#endif 1614#endif
1615 peer_unconfig(&peeraddr, (struct interface *)0, -1); 1615 peer_unconfig(&peeraddr, (struct interface *)0, -1);
1616 cp = (struct conf_unpeer *) 1616 datap += item_sz;
1617 ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1618 } 1617 }
1619 1618
1620 req_ack(srcadr, inter, inpkt, INFO_OKAY); 1619 req_ack(srcadr, inter, inpkt, INFO_OKAY);
1621} 1620}
1622 1621
1623 1622
1624/* 1623/*
1625 * set_sys_flag - set system flags 1624 * set_sys_flag - set system flags
1626 */ 1625 */
1627static void 1626static void
1628set_sys_flag( 1627set_sys_flag(
1629 struct sockaddr_storage *srcadr, 1628 struct sockaddr_storage *srcadr,
1630 struct interface *inter, 1629 struct interface *inter,
@@ -1805,196 +1804,116 @@ do_unrestrict( @@ -1805,196 +1804,116 @@ do_unrestrict(
1805 1804
1806 1805
1807/* 1806/*
1808 * do_restrict - do the dirty stuff of dealing with restrictions 1807 * do_restrict - do the dirty stuff of dealing with restrictions
1809 */ 1808 */
1810static void 1809static void
1811do_restrict( 1810do_restrict(
1812 struct sockaddr_storage *srcadr, 1811 struct sockaddr_storage *srcadr,
1813 struct interface *inter, 1812 struct interface *inter,
1814 struct req_pkt *inpkt, 1813 struct req_pkt *inpkt,
1815 int op 1814 int op
1816 ) 1815 )
1817{ 1816{
1818 register struct conf_restrict *cr; 1817 struct conf_restrict cr;
1819 register int items; 1818 register int items;
 1819 size_t item_sz;
 1820 char * datap;
1820 struct sockaddr_storage matchaddr; 1821 struct sockaddr_storage matchaddr;
1821 struct sockaddr_storage matchmask; 1822 struct sockaddr_storage matchmask;
1822 int bad; 1823 int bad;
1823 1824
1824 /* 1825 /*
1825 * Do a check of the flags to make sure that only 1826 * Do a check of the flags to make sure that only
1826 * the NTPPORT flag is set, if any. If not, complain 1827 * the NTPPORT flag is set, if any. If not, complain
1827 * about it. Note we are very picky here. 1828 * about it. Note we are very picky here.
1828 */ 1829 */
1829 items = INFO_NITEMS(inpkt->err_nitems); 1830 items = INFO_NITEMS(inpkt->err_nitems);
1830 cr = (struct conf_restrict *)inpkt->data; 1831 item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize);
 1832 datap = inpkt->data;
 1833 if (item_sz > sizeof(cr)) {
 1834 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
 1835 return;
 1836 }
1831 1837
1832 bad = 0; 1838 bad = 0;
1833 cr->flags = ntohs(cr->flags); 
1834 cr->mflags = ntohs(cr->mflags); 
1835 while (items-- > 0 && !bad) { 1839 while (items-- > 0 && !bad) {
1836 if (cr->mflags & ~(RESM_NTPONLY)) 1840 memcpy(&cr, datap, item_sz);
 1841 cr.flags = ntohs(cr.flags);
 1842 cr.mflags = ntohs(cr.mflags);
 1843 if (cr.mflags & ~(RESM_NTPONLY))
1837 bad |= 1; 1844 bad |= 1;
1838 if (cr->flags & ~(RES_ALLFLAGS)) 1845 if (cr.flags & ~(RES_ALLFLAGS))
1839 bad |= 2; 1846 bad |= 2;
1840 if (cr->mask != htonl(INADDR_ANY)) { 1847 if (cr.mask != htonl(INADDR_ANY)) {
1841 if (client_v6_capable && cr->v6_flag != 0) { 1848 if (client_v6_capable && cr.v6_flag != 0) {
1842 if (IN6_IS_ADDR_UNSPECIFIED(&cr->addr6)) 1849 if (IN6_IS_ADDR_UNSPECIFIED(&cr.addr6))
1843 bad |= 4; 1850 bad |= 4;
1844 } else 1851 } else
1845 if (cr->addr == htonl(INADDR_ANY)) 1852 if (cr.addr == htonl(INADDR_ANY))
1846 bad |= 8; 1853 bad |= 8;
1847 } 1854 }
1848 cr = (struct conf_restrict *)((char *)cr + 1855 datap += item_sz;
1849 INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
1850 } 1856 }
1851 1857
1852 if (bad) { 1858 if (bad) {
1853 msyslog(LOG_ERR, "do_restrict: bad = %#x", bad); 1859 msyslog(LOG_ERR, "do_restrict: bad = %#x", bad);
1854 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); 1860 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
1855 return; 1861 return;
1856 } 1862 }
1857 1863
1858 /* 1864 /*
1859 * Looks okay, try it out 1865 * Looks okay, try it out
1860 */ 1866 */
1861 items = INFO_NITEMS(inpkt->err_nitems); 1867 items = INFO_NITEMS(inpkt->err_nitems);
1862 cr = (struct conf_restrict *)inpkt->data; 
1863 memset((char *)&matchaddr, 0, sizeof(struct sockaddr_storage)); 1868 memset((char *)&matchaddr, 0, sizeof(struct sockaddr_storage));
1864 memset((char *)&matchmask, 0, sizeof(struct sockaddr_storage)); 1869 memset((char *)&matchmask, 0, sizeof(struct sockaddr_storage));
 1870 datap = inpkt->data;
1865 1871
1866 while (items-- > 0) { 1872 while (items-- > 0) {
1867 if (client_v6_capable && cr->v6_flag != 0) { 1873 memcpy(&cr, datap, item_sz);
1868 GET_INADDR6(matchaddr) = cr->addr6; 1874 cr.flags = ntohs(cr.flags);
1869 GET_INADDR6(matchmask) = cr->mask6; 1875 cr.mflags = ntohs(cr.mflags);
 1876 if (client_v6_capable && cr.v6_flag != 0) {
 1877 GET_INADDR6(matchaddr) = cr.addr6;
 1878 GET_INADDR6(matchmask) = cr.mask6;
1870 matchaddr.ss_family = AF_INET6; 1879 matchaddr.ss_family = AF_INET6;
1871 matchmask.ss_family = AF_INET6; 1880 matchmask.ss_family = AF_INET6;
1872 } else { 1881 } else {
1873 GET_INADDR(matchaddr) = cr->addr; 1882 GET_INADDR(matchaddr) = cr.addr;
1874 GET_INADDR(matchmask) = cr->mask; 1883 GET_INADDR(matchmask) = cr.mask;
1875 matchaddr.ss_family = AF_INET; 1884 matchaddr.ss_family = AF_INET;
1876 matchmask.ss_family = AF_INET; 1885 matchmask.ss_family = AF_INET;
1877 } 1886 }
1878 hack_restrict(op, &matchaddr, &matchmask, cr->mflags, 1887 hack_restrict(op, &matchaddr, &matchmask, cr.mflags,
1879 cr->flags); 1888 cr.flags);
1880 cr++; 1889 datap += item_sz;
1881 } 1890 }
1882 1891
1883 req_ack(srcadr, inter, inpkt, INFO_OKAY); 1892 req_ack(srcadr, inter, inpkt, INFO_OKAY);
1884} 1893}
1885 1894
1886 1895
1887/* 1896/*
1888 * mon_getlist - return monitor data 1897 * mon_getlist - return monitor data
1889 */ 1898 */
1890static void 1899static void
1891mon_getlist_0( 1900mon_getlist(
1892 struct sockaddr_storage *srcadr, 1901 struct sockaddr_storage *srcadr,
1893 struct interface *inter, 1902 struct interface *inter,
1894 struct req_pkt *inpkt 1903 struct req_pkt *inpkt
1895 ) 1904 )
1896{ 1905{
1897 register struct info_monitor *im; 1906 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
1898 register struct mon_data *md; 
1899 extern struct mon_data mon_mru_list; 
1900 extern int mon_enabled; 
1901 
1902#ifdef DEBUG 
1903 if (debug > 2) 
1904 printf("wants monitor 0 list\n"); 
1905#endif 
1906 if (!mon_enabled) { 
1907 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); 
1908 return; 
1909 } 
1910 im = (struct info_monitor *)prepare_pkt(srcadr, inter, inpkt, 
1911 v6sizeof(struct info_monitor)); 
1912 for (md = mon_mru_list.mru_next; md != &mon_mru_list && im != 0; 
1913 md = md->mru_next) { 
1914 im->lasttime = htonl((u_int32)md->avg_interval); 
1915 im->firsttime = htonl((u_int32)(current_time - md->lasttime)); 
1916 im->lastdrop = htonl((u_int32)md->drop_count); 
1917 im->count = htonl((u_int32)(md->count)); 
1918 if (md->rmtadr.ss_family == AF_INET6) { 
1919 if (!client_v6_capable) 
1920 continue; 
1921 im->addr6 = GET_INADDR6(md->rmtadr); 
1922 im->v6_flag = 1; 
1923 } else { 
1924 im->addr = GET_INADDR(md->rmtadr); 
1925 if (client_v6_capable) 
1926 im->v6_flag = 0; 
1927 } 
1928 im->port = md->rmtport; 
1929 im->mode = md->mode; 
1930 im->version = md->version; 
1931 im = (struct info_monitor *)more_pkt(); 
1932 } 
1933 flush_pkt(); 
1934} 
1935 
1936/* 
1937 * mon_getlist - return monitor data 
1938 */ 
1939static void 
1940mon_getlist_1( 
1941 struct sockaddr_storage *srcadr, 
1942 struct interface *inter, 
1943 struct req_pkt *inpkt 
1944 ) 
1945{ 
1946 register struct info_monitor_1 *im; 
1947 register struct mon_data *md; 
1948 extern struct mon_data mon_mru_list; 
1949 extern int mon_enabled; 
1950 
1951 if (!mon_enabled) { 
1952 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); 
1953 return; 
1954 } 
1955 im = (struct info_monitor_1 *)prepare_pkt(srcadr, inter, inpkt, 
1956 v6sizeof(struct info_monitor_1)); 
1957 for (md = mon_mru_list.mru_next; md != &mon_mru_list && im != 0; 
1958 md = md->mru_next) { 
1959 im->lasttime = htonl((u_int32)md->avg_interval); 
1960 im->firsttime = htonl((u_int32)(current_time - md->lasttime)); 
1961 im->lastdrop = htonl((u_int32)md->drop_count); 
1962 im->count = htonl((u_int32)md->count); 
1963 if (md->rmtadr.ss_family == AF_INET6) { 
1964 if (!client_v6_capable) 
1965 continue; 
1966 im->addr6 = GET_INADDR6(md->rmtadr); 
1967 im->v6_flag = 1; 
1968 im->daddr6 = GET_INADDR6(md->interface->sin); 
1969 } else { 
1970 im->addr = GET_INADDR(md->rmtadr); 
1971 if (client_v6_capable) 
1972 im->v6_flag = 0; 
1973 im->daddr = (md->cast_flags == MDF_BCAST)  
1974 ? GET_INADDR(md->interface->bcast)  
1975 : (md->cast_flags  
1976 ? (GET_INADDR(md->interface->sin) 
1977 ? GET_INADDR(md->interface->sin) 
1978 : GET_INADDR(md->interface->bcast)) 
1979 : 4); 
1980 } 
1981 im->flags = htonl(md->cast_flags); 
1982 im->port = md->rmtport; 
1983 im->mode = md->mode; 
1984 im->version = md->version; 
1985 im = (struct info_monitor_1 *)more_pkt(); 
1986 } 
1987 flush_pkt(); 
1988} 1907}
1989 1908
1990/* 1909/*
1991 * Module entry points and the flags they correspond with 1910 * Module entry points and the flags they correspond with
1992 */ 1911 */
1993struct reset_entry { 1912struct reset_entry {
1994 int flag; /* flag this corresponds to */ 1913 int flag; /* flag this corresponds to */
1995 void (*handler) P((void)); /* routine to handle request */ 1914 void (*handler) P((void)); /* routine to handle request */
1996}; 1915};
1997 1916
1998struct reset_entry reset_entries[] = { 1917struct reset_entry reset_entries[] = {
1999 { RESET_FLAG_ALLPEERS, peer_all_reset }, 1918 { RESET_FLAG_ALLPEERS, peer_all_reset },
2000 { RESET_FLAG_IO, io_clr_stats }, 1919 { RESET_FLAG_IO, io_clr_stats },
@@ -2043,91 +1962,99 @@ reset_stats( @@ -2043,91 +1962,99 @@ reset_stats(
2043} 1962}
2044 1963
2045 1964
2046/* 1965/*
2047 * reset_peer - clear a peer's statistics 1966 * reset_peer - clear a peer's statistics
2048 */ 1967 */
2049static void 1968static void
2050reset_peer( 1969reset_peer(
2051 struct sockaddr_storage *srcadr, 1970 struct sockaddr_storage *srcadr,
2052 struct interface *inter, 1971 struct interface *inter,
2053 struct req_pkt *inpkt 1972 struct req_pkt *inpkt
2054 ) 1973 )
2055{ 1974{
2056 register struct conf_unpeer *cp; 1975 struct conf_unpeer cp;
2057 register int items; 1976 register int items;
 1977 size_t item_sz;
 1978 char * datap;
2058 register struct peer *peer; 1979 register struct peer *peer;
2059 struct sockaddr_storage peeraddr; 1980 struct sockaddr_storage peeraddr;
2060 int bad; 1981 int bad;
2061 1982
2062 /* 1983 /*
2063 * We check first to see that every peer exists. If not, 1984 * We check first to see that every peer exists. If not,
2064 * we return an error. 1985 * we return an error.
2065 */ 1986 */
2066 1987
2067 items = INFO_NITEMS(inpkt->err_nitems); 1988 items = INFO_NITEMS(inpkt->err_nitems);
2068 cp = (struct conf_unpeer *)inpkt->data; 1989 item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize);
 1990 datap = inpkt->data;
 1991 if (item_sz > sizeof(cp)) {
 1992 req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
 1993 return;
 1994 }
2069 1995
2070 bad = 0; 1996 bad = 0;
2071 while (items-- > 0 && !bad) { 1997 while (items-- > 0 && !bad) {
 1998 memset(&cp,0,sizeof(cp));
 1999 memcpy(&cp, datap, item_sz);
2072 memset((char *)&peeraddr, 0, sizeof(peeraddr)); 2000 memset((char *)&peeraddr, 0, sizeof(peeraddr));
2073 if (client_v6_capable && cp->v6_flag != 0) { 2001 if (client_v6_capable && cp.v6_flag != 0) {
2074 GET_INADDR6(peeraddr) = cp->peeraddr6; 2002 GET_INADDR6(peeraddr) = cp.peeraddr6;
2075 peeraddr.ss_family = AF_INET6; 2003 peeraddr.ss_family = AF_INET6;
2076 } else { 2004 } else {
2077 GET_INADDR(peeraddr) = cp->peeraddr; 2005 GET_INADDR(peeraddr) = cp.peeraddr;
2078 peeraddr.ss_family = AF_INET; 2006 peeraddr.ss_family = AF_INET;
2079 } 2007 }
2080 NSRCPORT(&peeraddr) = htons(NTP_PORT); 2008 NSRCPORT(&peeraddr) = htons(NTP_PORT);
2081#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 2009#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
2082 peeraddr.ss_len = SOCKLEN(&peeraddr); 2010 peeraddr.ss_len = SOCKLEN(&peeraddr);
2083#endif 2011#endif
2084 peer = findexistingpeer(&peeraddr, (struct peer *)0, -1); 2012 peer = findexistingpeer(&peeraddr, (struct peer *)0, -1);
2085 if (peer == (struct peer *)0) 2013 if (peer == (struct peer *)0)
2086 bad++; 2014 bad++;
2087 cp = (struct conf_unpeer *)((char *)cp + 2015 datap += item_sz;
2088 INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
2089 } 2016 }
2090 2017
2091 if (bad) { 2018 if (bad) {
2092 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); 2019 req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA);
2093 return; 2020 return;
2094 } 2021 }
2095 2022
2096 /* 2023 /*
2097 * Now do it in earnest. 2024 * Now do it in earnest.
2098 */ 2025 */
2099 2026
2100 items = INFO_NITEMS(inpkt->err_nitems); 2027 datap = inpkt->data;
2101 cp = (struct conf_unpeer *)inpkt->data; 
2102 while (items-- > 0) { 2028 while (items-- > 0) {
 2029 memset(&cp,0,sizeof(cp));
 2030 memcpy(&cp, datap, item_sz);
2103 memset((char *)&peeraddr, 0, sizeof(peeraddr)); 2031 memset((char *)&peeraddr, 0, sizeof(peeraddr));
2104 if (client_v6_capable && cp->v6_flag != 0) { 2032 if (client_v6_capable && cp.v6_flag != 0) {
2105 GET_INADDR6(peeraddr) = cp->peeraddr6; 2033 GET_INADDR6(peeraddr) = cp.peeraddr6;
2106 peeraddr.ss_family = AF_INET6; 2034 peeraddr.ss_family = AF_INET6;
2107 } else { 2035 } else {
2108 GET_INADDR(peeraddr) = cp->peeraddr; 2036 GET_INADDR(peeraddr) = cp.peeraddr;
2109 peeraddr.ss_family = AF_INET; 2037 peeraddr.ss_family = AF_INET;
2110 } 2038 }
2111#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR 2039#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR
2112 peeraddr.ss_len = SOCKLEN(&peeraddr); 2040 peeraddr.ss_len = SOCKLEN(&peeraddr);
2113#endif 2041#endif
2114 peer = findexistingpeer(&peeraddr, (struct peer *)0, -1); 2042 peer = findexistingpeer(&peeraddr, (struct peer *)0, -1);
2115 while (peer != 0) { 2043 while (peer != 0) {
2116 peer_reset(peer); 2044 peer_reset(peer);
2117 peer = findexistingpeer(&peeraddr, (struct peer *)peer, -1); 2045 peer = findexistingpeer(&peeraddr, (struct peer *)peer, -1);
2118 } 2046 }
2119 cp = (struct conf_unpeer *)((char *)cp + 2047 datap += item_sz;
2120 INFO_ITEMSIZE(inpkt->mbz_itemsize)); 
2121 } 2048 }
2122 2049
2123 req_ack(srcadr, inter, inpkt, INFO_OKAY); 2050 req_ack(srcadr, inter, inpkt, INFO_OKAY);
2124} 2051}
2125 2052
2126 2053
2127/* 2054/*
2128 * do_key_reread - reread the encryption key file 2055 * do_key_reread - reread the encryption key file
2129 */ 2056 */
2130static void 2057static void
2131do_key_reread( 2058do_key_reread(
2132 struct sockaddr_storage *srcadr, 2059 struct sockaddr_storage *srcadr,
2133 struct interface *inter, 2060 struct interface *inter,
@@ -2826,27 +2753,27 @@ fill_info_if_stats(void *data, interface @@ -2826,27 +2753,27 @@ fill_info_if_stats(void *data, interface
2826 return; 2753 return;
2827 } 2754 }
2828 ifs->v6_flag = 1; 2755 ifs->v6_flag = 1;
2829 memcpy((char *)&ifs->unaddr.addr6, (char *)&CAST_V6(interface->sin)->sin6_addr, sizeof(struct in6_addr)); 2756 memcpy((char *)&ifs->unaddr.addr6, (char *)&CAST_V6(interface->sin)->sin6_addr, sizeof(struct in6_addr));
2830 memcpy((char *)&ifs->unbcast.addr6, (char *)&CAST_V6(interface->bcast)->sin6_addr, sizeof(struct in6_addr)); 2757 memcpy((char *)&ifs->unbcast.addr6, (char *)&CAST_V6(interface->bcast)->sin6_addr, sizeof(struct in6_addr));
2831 memcpy((char *)&ifs->unmask.addr6, (char *)&CAST_V6(interface->mask)->sin6_addr, sizeof(struct in6_addr)); 2758 memcpy((char *)&ifs->unmask.addr6, (char *)&CAST_V6(interface->mask)->sin6_addr, sizeof(struct in6_addr));
2832 } else { 2759 } else {
2833 ifs->v6_flag = 0; 2760 ifs->v6_flag = 0;
2834 memcpy((char *)&ifs->unaddr.addr, (char *)&CAST_V4(interface->sin)->sin_addr, sizeof(struct in_addr)); 2761 memcpy((char *)&ifs->unaddr.addr, (char *)&CAST_V4(interface->sin)->sin_addr, sizeof(struct in_addr));
2835 memcpy((char *)&ifs->unbcast.addr, (char *)&CAST_V4(interface->bcast)->sin_addr, sizeof(struct in_addr)); 2762 memcpy((char *)&ifs->unbcast.addr, (char *)&CAST_V4(interface->bcast)->sin_addr, sizeof(struct in_addr));
2836 memcpy((char *)&ifs->unmask.addr, (char *)&CAST_V4(interface->mask)->sin_addr, sizeof(struct in_addr)); 2763 memcpy((char *)&ifs->unmask.addr, (char *)&CAST_V4(interface->mask)->sin_addr, sizeof(struct in_addr));
2837 } 2764 }
2838 ifs->v6_flag = htonl(ifs->v6_flag); 2765 ifs->v6_flag = htonl(ifs->v6_flag);
2839 strcpy(ifs->name, interface->name); 2766 strlcpy(ifs->name, interface->name, sizeof(ifs->name));
2840 ifs->family = htons(interface->family); 2767 ifs->family = htons(interface->family);
2841 ifs->flags = htonl(interface->flags); 2768 ifs->flags = htonl(interface->flags);
2842 ifs->last_ttl = htonl(interface->last_ttl); 2769 ifs->last_ttl = htonl(interface->last_ttl);
2843 ifs->num_mcast = htonl(interface->num_mcast); 2770 ifs->num_mcast = htonl(interface->num_mcast);
2844 ifs->received = htonl(interface->received); 2771 ifs->received = htonl(interface->received);
2845 ifs->sent = htonl(interface->sent); 2772 ifs->sent = htonl(interface->sent);
2846 ifs->notsent = htonl(interface->notsent); 2773 ifs->notsent = htonl(interface->notsent);
2847 ifs->scopeid = htonl(interface->scopeid); 2774 ifs->scopeid = htonl(interface->scopeid);
2848 ifs->ifindex = htonl(interface->ifindex); 2775 ifs->ifindex = htonl(interface->ifindex);
2849 ifs->ifnum = htonl(interface->ifnum); 2776 ifs->ifnum = htonl(interface->ifnum);
2850 ifs->uptime = htonl(current_time - interface->starttime); 2777 ifs->uptime = htonl(current_time - interface->starttime);
2851 ifs->ignore_packets = interface->ignore_packets; 2778 ifs->ignore_packets = interface->ignore_packets;
2852 ifs->peercnt = htonl(interface->peercnt); 2779 ifs->peercnt = htonl(interface->peercnt);

cvs diff -r1.9 -r1.9.28.1 src/etc/ntp.conf (expand / switch to unified diff)

--- src/etc/ntp.conf 2007/02/10 19:36:56 1.9
+++ src/etc/ntp.conf 2014/01/06 19:24:39 1.9.28.1
@@ -1,83 +1,118 @@ @@ -1,83 +1,118 @@
1# $NetBSD: ntp.conf,v 1.9 2007/02/10 19:36:56 reed Exp $ 1# $NetBSD: ntp.conf,v 1.9.28.1 2014/01/06 19:24:39 bouyer Exp $
2# 2#
3# NetBSD default Network Time Protocol (NTP) configuration file for ntpd 3# NetBSD default Network Time Protocol (NTP) configuration file for ntpd
4 4
5# This file is intended to be both a usable default, and a Quick-Start 5# This file is intended to be both a usable default, and a Quick-Start
6# Guide. The directives and options listed here are not at all complete. 6# Guide. The directives and options listed here are not at all complete.
7# A great deal of additional documentation, including links to FAQS and 7# A great deal of additional documentation, including links to FAQS and
8# other guides, may be found on the official NTP web site, in particular 8# other guides, may be found on the official NTP web site, in particular
9# 9#
10# http://www.ntp.org/documentation.html 10# http://www.ntp.org/documentation.html
11# 11#
12 12
13# Process ID file, so that the daemon can be signalled from scripts 13# Process ID file, so that the daemon can be signalled from scripts
14 14
15pidfile /var/run/ntpd.pid 15pidfile /var/run/ntpd.pid
16 16
17# The correction calculated by ntpd(8) for the local system clock's 17# The correction calculated by ntpd(8) for the local system clock's
18# drift is stored here. 18# drift is stored here.
19 19
20driftfile /var/db/ntp.drift 20driftfile /var/db/ntp.drift
21 21
22# Suppress the syslog(3) message for each peer synchronization change. 22# Suppress the syslog(3) message for each peer synchronization change.
23 23
24logconfig -syncstatus 24logconfig -syncstatus
25 25
26# This will help minimize disruptions due to network congestion. Don't 26# Refuse to set the local clock if there are too few good peers or servers.
 27# This may help minimize disruptions due to network congestion. Don't
27# do this if you configure only one server! 28# do this if you configure only one server!
28 29
29tos minsane 2 30tos minsane 2
30 31
 32# Access control restrictions.
 33# See /usr/share/doc/html/ntp/accopt.html for syntax.
 34# See <http://support.ntp.org/bin/view/Support/AccessRestrictions> for advice.
 35# Last match wins.
 36#
 37# Some of the more common keywords are:
 38# ignore Deny packets of all kinds.
 39# kod Send "kiss-o'-death" packets if clients exceed rate
 40# limits.
 41# nomodify Deny attempts to modify the state of the server via
 42# ntpq or ntpdc queries.
 43# noquery Deny all ntpq and ntpdc queries. Does not affect time
 44# synchronisation.
 45# nopeer Prevent establishing an new peer association.
 46# Does not affect preconfigured peer associations.
 47# Does not affect client/server time synchronisation.
 48# noserve Deny all time synchronisation. Does not affect ntpq or
 49# ntpdc queries.
 50# notrap Deny the trap subset of the ntpdc control message protocol.
 51# notrust Deny packets that are not cryptographically authenticated.
 52#
 53# By default, either deny everything, or allow client/server time exchange
 54# but deny configuration changes, queries, and peer associations that were not
 55# explicitly configured.
 56# (Uncomment one of the following "restrict default" lines.)
 57#
 58#restrict default ignore
 59restrict default kod nopeer noquery
 60
 61# Fewer restrictions for the local subnet.
 62# (Uncomment and adjust as appropriate.)
 63#
 64#restrict 192.0.2.0 mask 255.255.255.0 kod nomodify notrap nopeer
 65#restrict 2001:db8:: mask ffff:ffff:: kod nomodify notrap nopeer
 66
 67# No restrictions for localhost.
 68#
 69restrict 127.0.0.1
 70restrict ::1
 71
31# Hereafter should be "server" or "peer" statements to configure other 72# Hereafter should be "server" or "peer" statements to configure other
32# hosts to exchange NTP packets with. Peers should be selected in such 73# hosts to exchange NTP packets with.
33# a way that the network path to them is symmetric (that is, the series 74#
34# of links and routers used to get to the peer is the same one that the 75# See <http://support.ntp.org/bin/view/Support/DesigningYourNTPNetwork>
35# peer uses to get back. NTP assumes such symmetry in its network delay 76# and <http://support.ntp.org/bin/view/Support/SelectingOffsiteNTPServers>
36# calculation. NTP will apply an incorrect adjustment to timestamps 77# for advice.
37# received from the peer if the path is not symmetric. This can result 78#
38# in clock skew (your system clock being maintained consistently wrong 79# Peers should be selected in such a way that the network path to them
39# by a certain amount). 80# is short, uncongested, and symmetric (that is, the series of links
40# 81# and routers used to get to the peer is the same one that the peer
41# The best way to select symmetric peers is to make sure that the 82# uses to get back). The best place to start looking for NTP peers for
42# network path to them is as short as possible (this reduces the chance 83# your system is within your own network, or at your Internet Service
43# that there is more than one network path between you and your peer). 84# Provider (ISP).
44# You can measure these distances with the traceroute(8) program. The 
45# best place to start looking for NTP peers for your system is within 
46# your own network, or at your Internet Service Provider (ISP). 
47# 85#
48# Ideally, you should select at least three other systems to talk NTP 86# Ideally, you should select at least three other systems to talk NTP
49# with, for an "what I tell you three times is true" effect. 87# with, for an "what I tell you three times is true" effect.
50# 88#
 89# A "restrict" line for each configured peer or server might be necessary,
 90# if the "restrict default" settings are very restrictive. As a courtesy
 91# to configured peers and servers, consider allowing them to query.
51 92
52#peer an.ntp.peer.goes.here 93#peer an.ntp.peer.goes.here
53#server an.ntp.server.goes.here 94#server an.ntp.server.goes.here
 95#restrict an.ntp.server.goes.here nomodify notrap
54 96
55# Public servers from the pool.ntp.org project. Volunteer's servers 97# The pool.ntp.org project coordinates public time servers provided by
56# are dynamically assigned to the CNAMES below via DNS round-robin. 98# volunteers. See <http://www.pool.ntp.org>. The *.netbsd.pool.ntp.org
 99# servers are intended to be used by default on NetBSD hosts, but
 100# servers that are closer to you are likely to be better. Consider
 101# using servers specific to your country, a nearby country, or your
 102# continent.
 103#
57# The pool.ntp.org project needs more volunteers! The only criteria to 104# The pool.ntp.org project needs more volunteers! The only criteria to
58# join are a nailed-up connection and a static IP address. For details, 105# join are a nailed-up connection and a static IP address. For details,
59# see the web page: 106# see the web page:
60# 107#
61# http://www.pool.ntp.org/  108# http://www.pool.ntp.org/join.html
62# 109#
63 110
64# The country codes can help you find servers that are net-wise close. 111server 0.netbsd.pool.ntp.org
65# As explained above, closer is better... 112restrict 0.netbsd.pool.ntp.org nomodify notrap
66 113server 1.netbsd.pool.ntp.org
67# Northern U.S.A 114restrict 1.netbsd.pool.ntp.org nomodify notrap
68#server ca.pool.ntp.org 115server 2.netbsd.pool.ntp.org
69#server us.pool.ntp.org 116restrict 2.netbsd.pool.ntp.org nomodify notrap
70#server us.pool.ntp.org 117server 3.netbsd.pool.ntp.org
71 118restrict 3.netbsd.pool.ntp.org nomodify notrap
72# Northern Europe 
73#server de.pool.ntp.org 
74#server de.pool.ntp.org 
75#server dk.pool.ntp.org 
76 
77# Depending on the vagaries of DNS can occasionally pull in the same 
78# server twice. The following CNAMES are guaranteed to be disjoint, at 
79# least over some short interval. 
80 
81server 0.pool.ntp.org 
82server 1.pool.ntp.org 
83server 2.pool.ntp.org