-----Original Message-----
From: Richard Cochran [mailto:richardcoch...@gmail.com]
Sent: Freitag, 27. April 2018 20:19
To: Richard Hill
Cc: linuxptp-users@lists.sourceforge.net
Subject: Re: [Linuxptp-users] NULL pointer in port_delay_request
On Tue, Apr 24, 2018 at 05:13:11PM +0100, Richard Hill wrote:
> > Or should the list never be empty at this point ?
>
> The list can't be empty. Here is why.
I am so wrong. The list *can* be empty if the FD_ANNOUNCE_TIMER and the FD_DELAY_TIMER expire at the same time. In this case, the poll() call indicates events on both file descriptors. The announce timeout is handled like this:
case FD_SYNC_RX_TIMER:
if (p->best)
fc_clear(p->best);
So then the port_delay_request() call de-references the null TAILQ_FIRST message pointer.
> Version is unmodified 1.8
>
> What might be relevant is the type of testing I was doing. This was
> operating slaveOnly. Other Masters were appearing and disappearing
> quite often. I had this NULL pointer twice over a full day.
Can you apply this patch to v1.8 and see if that fixes the problem?
Thanks,
Richard
---
diff --git a/fd.h b/fd.h
index e328e98..56023a3 100644
--- a/fd.h
+++ b/fd.h
@@ -25,15 +25,17 @@
enum {
FD_EVENT,
FD_GENERAL,
+ FD_DELAY_TIMER,
FD_ANNOUNCE_TIMER,
FD_SYNC_RX_TIMER,
- FD_DELAY_TIMER,
FD_QUALIFICATION_TIMER,
FD_MANNO_TIMER,
FD_SYNC_TX_TIMER,
N_POLLFD,
};
+#define FD_FIRST_TIMER FD_DELAY_TIMER
+
struct fdarray {
int fd[N_POLLFD];
};
diff --git a/port.c b/port.c
index a1ad6f6..e6e7c20 100644
--- a/port.c
+++ b/port.c
@@ -1446,7 +1446,7 @@ static void port_disable(struct port *p)
transport_close(p->trp, &p->fda);
for (i = 0; i < N_TIMER_FDS; i++) {
- close(p->fda.fd[FD_ANNOUNCE_TIMER + i]);
+ close(p->fda.fd[FD_FIRST_TIMER + i]);
}
port_clear_fda(p, N_POLLFD);
clock_fda_changed(p->clock);
@@ -1486,7 +1486,7 @@ static int port_initialize(struct port *p)
goto no_tropen;
for (i = 0; i < N_TIMER_FDS; i++) {
- p->fda.fd[FD_ANNOUNCE_TIMER + i] = fd[i];
+ p->fda.fd[FD_FIRST_TIMER + i] = fd[i];
}
if (port_set_announce_tmo(p))
@@ -1516,7 +1516,7 @@ static int port_renew_transport(struct port *p)
return 0;
}
transport_close(p->trp, &p->fda);
- port_clear_fda(p, FD_ANNOUNCE_TIMER);
+ port_clear_fda(p, FD_FIRST_TIMER);
res = transport_open(p->trp, p->name, &p->fda, p->timestamping);
/* Need to call clock_fda_changed even if transport_open failed in
* order to update clock to the now closed descriptors. */
------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________ Linuxptp-users mailing list Linuxptp-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-users