]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 1458] Can not compile NTP on FreeBSD 4.7.
authorDave Hart <hart@ntp.org>
Mon, 20 Dec 2010 07:54:12 +0000 (07:54 +0000)
committerDave Hart <hart@ntp.org>
Mon, 20 Dec 2010 07:54:12 +0000 (07:54 +0000)
  -- applies to prior lineedit cset which overlooked ChangeLog
[Bug 1762] manycastclient solicitation responses interfere.

bk: 4d0f0ba4e-uv_8Ecgn_djbYkRJEAjw

ChangeLog
include/ntp.h
include/ntpd.h
include/recvbuff.h
ntpd/ntp_peer.c
ntpd/ntp_proto.c

index 9a0e917bd976a2bbcb4f13c5e05af4d1636edf0c..55ef60b2dc1af9eba88616dcefc0c11c442b3dc7 100644 (file)
--- 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.
index 2a764147d7bfdd23ecf209242f9392343a0f6ed8..732dff352d6f49e1c7fdbcdec91b244057b0c57b 100644 (file)
@@ -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 */
index 9bc541054323c341cbb76076f3ca7592969665ef..723eb51c51e9ac9f75ad2f20b8449bebe9fbf7e4 100644 (file)
@@ -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);
index 1fdc54a4d7ebd3591524e2697b401b14df7c9a17..3b205452e20649dcd11d7d1b61c09ac62727c4a4 100644 (file)
@@ -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 */
index 22a213cfa805a6455a94fa6e69ae2302f1136aab..d592d0c00e2b48187521f22187bc77c7d6ef37cc 100644 (file)
@@ -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;
index 367cc5eadd254a73acb9ba3975299082ab1e795c..3bea82159c7f825c1f21a62fca85741f6d75192a 100644 (file)
@@ -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);