| @@ -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 |
74 | static void io_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 74 | static void io_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
75 | static void timer_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 75 | static void timer_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
76 | static void loop_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 76 | static void loop_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
77 | static void do_conf P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 77 | static void do_conf P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
78 | static void do_unconf P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 78 | static void do_unconf P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
79 | static void set_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 79 | static void set_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
80 | static void clr_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 80 | static void clr_sys_flag P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
81 | static void setclr_flags P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long)); | | 81 | static void setclr_flags P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long)); |
82 | static void list_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 82 | static void list_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
83 | static void do_resaddflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 83 | static void do_resaddflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
84 | static void do_ressubflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 84 | static void do_ressubflags P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
85 | static void do_unrestrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 85 | static void do_unrestrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
86 | static void do_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int)); | | 86 | static void do_restrict P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int)); |
87 | static void mon_getlist_0 P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 87 | static void mon_getlist P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
88 | static void mon_getlist_1 P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | | |
89 | static void reset_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 88 | static void reset_stats P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
90 | static void reset_peer P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 89 | static void reset_peer P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
91 | static void do_key_reread P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 90 | static void do_key_reread P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
92 | static void trust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 91 | static void trust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
93 | static void untrust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 92 | static void untrust_key P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
94 | static void do_trustkey P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long)); | | 93 | static void do_trustkey P((struct sockaddr_storage *, struct interface *, struct req_pkt *, u_long)); |
95 | static void get_auth_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 94 | static void get_auth_info P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
96 | static void reset_auth_stats P((void)); | | 95 | static void reset_auth_stats P((void)); |
97 | static void req_get_traps P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 96 | static void req_get_traps P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
98 | static void req_set_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 97 | static void req_set_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
99 | static void req_clr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 98 | static void req_clr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); |
100 | static void do_setclr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int)); | | 99 | static void do_setclr_trap P((struct sockaddr_storage *, struct interface *, struct req_pkt *, int)); |
101 | static void set_request_keyid P((struct sockaddr_storage *, struct interface *, struct req_pkt *)); | | 100 | static 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 | */ |
818 | static void | | 820 | static void |
819 | peer_info ( | | 821 | peer_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 | */ |
950 | static void | | 959 | static void |
951 | peer_stats ( | | 960 | peer_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 | */ |
1324 | static void | | 1341 | static void |
1325 | do_conf( | | 1342 | do_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 | */ |
1436 | static void | | 1430 | static void |
1437 | dns_a( | | 1431 | dns_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 | */ |
1531 | static void | | 1525 | static void |
1532 | do_unconf( | | 1526 | do_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 | */ |
1627 | static void | | 1626 | static void |
1628 | set_sys_flag( | | 1627 | set_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 | */ |
1810 | static void | | 1809 | static void |
1811 | do_restrict( | | 1810 | do_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 | */ |
1890 | static void | | 1899 | static void |
1891 | mon_getlist_0( | | 1900 | mon_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 | */ | | | |
1939 | static void | | | |
1940 | mon_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 | */ |
1993 | struct reset_entry { | | 1912 | struct 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 | |
1998 | struct reset_entry reset_entries[] = { | | 1917 | struct 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 | */ |
2049 | static void | | 1968 | static void |
2050 | reset_peer( | | 1969 | reset_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 | */ |
2130 | static void | | 2057 | static void |
2131 | do_key_reread( | | 2058 | do_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); |