From: Dave Hart Date: Mon, 20 Dec 2010 07:54:12 +0000 (+0000) Subject: [Bug 1458] Can not compile NTP on FreeBSD 4.7. X-Git-Tag: NTP_4_2_7P98~4^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=80fd2458127ef7d3c2625bae330ef75ae91bb7f6;p=thirdparty%2Fntp.git [Bug 1458] Can not compile NTP on FreeBSD 4.7. -- applies to prior lineedit cset which overlooked ChangeLog [Bug 1762] manycastclient solicitation responses interfere. bk: 4d0f0ba4e-uv_8Ecgn_djbYkRJEAjw --- diff --git a/ChangeLog b/ChangeLog index 9a0e917bd..55ef60b2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ --- +* [Bug 1458] Can not compile NTP on FreeBSD 4.7. * [Bug 1510] Add modes 20/21 for driver 8 to support RAWDCF @ 75 baud. * [Bug 1618] Unreachable code in jjy_start(). (backport from ntp-dev) * [Bug 1719] ntp-keygen -V crash. (backport) @@ -12,6 +13,7 @@ * [Bug 1754] --version output should be more verbose. * [Bug 1758] setsockopt IPV6_MULTICAST_IF with wrong ifindex. * [Bug 1760] ntpd Windows interpolation cannot be disabled. +* [Bug 1762] manycastclient solicitation responses interfere. * Upgrade to libopts 34.0.9 from AutoGen 5.11.6pre5. * Suppress ntp-keygen OpenSSL version display for --help, --version, display both build and runtime OpenSSL versions when they differ. diff --git a/include/ntp.h b/include/ntp.h index 2a764147d..732dff352 100644 --- a/include/ntp.h +++ b/include/ntp.h @@ -258,7 +258,7 @@ struct peer { struct peer *ass_next; /* link pointer in associd hash */ struct peer *ilink; /* list of peers for interface */ sockaddr_u srcadr; /* address of remote host */ - struct interface *dstadr; /* local address (interface) */ + endpt * dstadr; /* local address */ associd_t associd; /* association ID */ u_char version; /* version number */ u_char hmode; /* local association mode */ diff --git a/include/ntpd.h b/include/ntpd.h index 9bc541054..723eb51c5 100644 --- a/include/ntpd.h +++ b/include/ntpd.h @@ -128,7 +128,7 @@ extern void ntp_monclearinterface (struct interface *interface); /* ntp_peer.c */ extern void init_peer (void); extern struct peer *findexistingpeer (sockaddr_u *, struct peer *, int); -extern struct peer *findpeer (sockaddr_u *, struct interface *, int, int *); +extern struct peer *findpeer (struct recvbuf *, int, int *); extern struct peer *findpeerbyassoc (u_int); extern void set_peerdstadr (struct peer *peer, struct interface *interface); extern struct peer *newpeer (sockaddr_u *, struct interface *, int, int, int, int, u_int, u_char, int, keyid_t); diff --git a/include/recvbuff.h b/include/recvbuff.h index 1fdc54a4d..3b205452e 100644 --- a/include/recvbuff.h +++ b/include/recvbuff.h @@ -65,7 +65,7 @@ struct recvbuf { #else int recv_srcadr_len; /* filled in on completion */ #endif - struct interface *dstadr; /* interface datagram arrived thru */ + endpt * dstadr; /* address pkt arrived on */ SOCKET fd; /* fd on which it was received */ int msg_flags; /* Flags received about the packet */ l_fp recv_time; /* time of arrival */ diff --git a/ntpd/ntp_peer.c b/ntpd/ntp_peer.c index 22a213cfa..d592d0c00 100644 --- a/ntpd/ntp_peer.c +++ b/ntpd/ntp_peer.c @@ -215,16 +215,19 @@ findexistingpeer( */ struct peer * findpeer( - sockaddr_u * srcadr, - endpt * dstadr, + struct recvbuf *rbufp, int pkt_mode, int * action ) { - struct peer *p; - u_int hash; + struct peer * p; + sockaddr_u * srcadr; + u_int hash; + struct pkt * pkt; + l_fp pkt_org; findpeer_calls++; + srcadr = &rbufp->recv_srcadr; hash = NTP_HASH_ADDR(srcadr); for (p = peer_hash[hash]; p != NULL; p = p->next) { if (SOCK_EQ(srcadr, &p->srcadr) && @@ -237,6 +240,24 @@ findpeer( */ *action = MATCH_ASSOC(p->hmode, pkt_mode); + /* + * A response to our manycastclient solicitation + * might be misassociated with an ephemeral peer + * already spun for the server. If the packet's + * org timestamp doesn't match the peer's, check + * if it matches the ACST prototype peer's. If + * so it is a redundant solicitation response, + * return AM_ERR to discard it. [Bug 1762] + */ + if (MODE_SERVER == pkt_mode && + AM_PROCPKT == *action) { + pkt = &rbufp->recv_pkt; + NTOHL_FP(&pkt->org, &pkt_org); + if (!L_ISEQU(&p->aorg, &pkt_org) && + findmanycastpeer(rbufp)) + *action = AM_ERR; + } + /* * if an error was returned, exit back right * here. @@ -257,8 +278,8 @@ findpeer( */ if (NULL == p) { *action = MATCH_ASSOC(NO_PEER, pkt_mode); - } else if (p->dstadr != dstadr) { - set_peerdstadr(p, dstadr); + } else if (p->dstadr != rbufp->dstadr) { + set_peerdstadr(p, rbufp->dstadr); DPRINTF(1, ("changed %s local address to match response", stoa(&p->srcadr))); } @@ -273,18 +294,17 @@ findpeerbyassoc( u_int assoc ) { - register struct peer *peer; + struct peer *p; u_int hash; assocpeer_calls++; hash = assoc & NTP_HASH_MASK; - for (peer = assoc_hash[hash]; peer != 0; peer = - peer->ass_next) { - if (assoc == peer->associd) - return (peer); + for (p = assoc_hash[hash]; p != NULL; p = p->ass_next) { + if (assoc == p->associd) + return p; } - return (NULL); + return NULL; } @@ -914,7 +934,7 @@ peer_reset( ) { if (peer == NULL) - return; + return; peer->timereset = current_time; peer->sent = 0; diff --git a/ntpd/ntp_proto.c b/ntpd/ntp_proto.c index 367cc5ead..3bea82159 100644 --- a/ntpd/ntp_proto.c +++ b/ntpd/ntp_proto.c @@ -501,8 +501,7 @@ receive( * multicaster, the broadcast address is null, so we use the * unicast address anyway. Don't ask. */ - peer = findpeer(&rbufp->recv_srcadr, rbufp->dstadr, hismode, - &retcode); + peer = findpeer(rbufp, hismode, &retcode); dstadr_sin = &rbufp->dstadr->sin; NTOHL_FP(&pkt->org, &p_org); NTOHL_FP(&pkt->rec, &p_rec);