Betreff: Aw: RE: [Linuxptp-users] NULL pointer in port_delay_request
 
Richard - two days of solid testing have not revealed any problems, so I am happy with this patch.
 
Many thanks
 
 
 

-----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

Reply via email to