Re: [PATCH] Fix ospfd segmentation fault on startup

2015-07-20 Thread Sebastian Benoit
commited, thx for your diff.

/Benno

Johan Ymerson(johan.ymer...@transmode.com) on 2015.07.20 21:32:20 +:
> On Mon, 2015-07-20 at 22:58 +0200, Martin Pieuchot wrote:
> > On 20/07/15(Mon) 19:10, Johan Ymerson wrote:
> > > On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> > > > Committed!  Thanks and sorry for the delay.
> > > 
> > > Hi!
> > > 
> > > You missed the previous patch "Fix ospfd segmentation fault on startup"
> > > witch prevent ospfd from segfaulting on startup. Without this first
> > > patch, ospfd will almost always segfault on startup (instead of just
> > > sometime, which it does today).
> > 
> > Could you send a single diff for all these issues?  Apparently ospf
> > hackers are slacking ;)
> 
> Yes, I have it as a single diff. I actually broke it up in two diffs
> because the two issues are not really related. The second patch only
> makes the first problem very obvious.
> It would of course be best if we could make sure we set up event
> handling (iev_ospfe et al.) before scanning interfaces, but it's kind of
> a catch 22 here. The event handlers need the interface info to not
> segfault... So the easy fix was to just check for null pointers in
> main_imsg_compose_*.
> 
> /Johan
> 
> 
> 
> Index: interface.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/interface.c,v
> retrieving revision 1.75
> diff -u -p -r1.75 interface.c
> --- interface.c 14 May 2012 10:17:21 -  1.75
> +++ interface.c 27 May 2015 16:42:51 -
> @@ -338,8 +338,10 @@ if_act_start(struct iface *iface)
> struct in_addr   addr;
> struct timeval   now;
>  
> -   if (!((iface->flags & IFF_UP) &&
> -   LINK_STATE_IS_UP(iface->linkstate)))
> +   if (!(iface->flags & IFF_UP) ||
> +   (!LINK_STATE_IS_UP(iface->linkstate) &&
> +   !(iface->media_type == IFT_CARP &&
> +   iface->linkstate == LINK_STATE_DOWN)))
> return (0);
>  
> if (iface->media_type == IFT_CARP && iface->passive == 0) {
> Index: kroute.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/kroute.c,v
> retrieving revision 1.98
> diff -u -p -r1.98 kroute.c
> --- kroute.c11 Feb 2015 05:57:44 -  1.98
> +++ kroute.c27 May 2015 16:42:51 -
> @@ -1019,6 +1019,9 @@ if_change(u_short ifindex, int flags, st
> return;
> }
>  
> +   /* notify ospfe about interface link state */
> +   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
> +
> reachable = (kif->flags & IFF_UP) &&
> LINK_STATE_IS_UP(kif->link_state);
>  
> @@ -1026,9 +1029,6 @@ if_change(u_short ifindex, int flags, st
> return; /* nothing changed wrt nexthop validity */
>  
> kif->nh_reachable = reachable;
> -
> -   /* notify ospfe about interface link state */
> -   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
>  
> /* update redistribute list */
> RB_FOREACH(kr, kroute_tree, &krt) {
> Index: ospfd.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/ospfd.c,v
> retrieving revision 1.83
> diff -u -p -r1.83 ospfd.c
> --- ospfd.c 10 Feb 2015 05:24:48 -  1.83
> +++ ospfd.c 27 May 2015 16:42:51 -
> @@ -511,13 +511,15 @@ main_dispatch_rde(int fd, short event, v
>  void
>  main_imsg_compose_ospfe(int type, pid_t pid, void *data, u_int16_t datalen)
>  {
> -   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
> +   if (iev_ospfe)
> +   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, 
> datalen);
>  }
>  
>  void
>  main_imsg_compose_rde(int type, pid_t pid, void *data, u_int16_t datalen)
>  {
> -   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
> +   if (iev_rde)
> +   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
>  }
>  
>  void
> 

-- 



Re: [PATCH] Fix ospfd segmentation fault on startup

2015-07-20 Thread Sebastian Benoit
Johan Ymerson(johan.ymer...@transmode.com) on 2015.07.20 21:32:20 +:
> On Mon, 2015-07-20 at 22:58 +0200, Martin Pieuchot wrote:
> > On 20/07/15(Mon) 19:10, Johan Ymerson wrote:
> > > On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> > > > Committed!  Thanks and sorry for the delay.
> > > 
> > > Hi!
> > > 
> > > You missed the previous patch "Fix ospfd segmentation fault on startup"
> > > witch prevent ospfd from segfaulting on startup. Without this first
> > > patch, ospfd will almost always segfault on startup (instead of just
> > > sometime, which it does today).
> > 
> > Could you send a single diff for all these issues?  Apparently ospf
> > hackers are slacking ;)
> 
> Yes, I have it as a single diff. I actually broke it up in two diffs
> because the two issues are not really related. The second patch only
> makes the first problem very obvious.
> It would of course be best if we could make sure we set up event
> handling (iev_ospfe et al.) before scanning interfaces, but it's kind of
> a catch 22 here. The event handlers need the interface info to not
> segfault... So the easy fix was to just check for null pointers in
> main_imsg_compose_*.
> 
> /Johan

fixed it.

ok benno@

> 
> 
> 
> Index: interface.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/interface.c,v
> retrieving revision 1.75
> diff -u -p -r1.75 interface.c
> --- interface.c 14 May 2012 10:17:21 -  1.75
> +++ interface.c 27 May 2015 16:42:51 -
> @@ -338,8 +338,10 @@ if_act_start(struct iface *iface)
> struct in_addr   addr;
> struct timeval   now;
>  
> -   if (!((iface->flags & IFF_UP) &&
> -   LINK_STATE_IS_UP(iface->linkstate)))
> +   if (!(iface->flags & IFF_UP) ||
> +   (!LINK_STATE_IS_UP(iface->linkstate) &&
> +   !(iface->media_type == IFT_CARP &&
> +   iface->linkstate == LINK_STATE_DOWN)))
> return (0);
>  
> if (iface->media_type == IFT_CARP && iface->passive == 0) {
> Index: kroute.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/kroute.c,v
> retrieving revision 1.98
> diff -u -p -r1.98 kroute.c
> --- kroute.c11 Feb 2015 05:57:44 -  1.98
> +++ kroute.c27 May 2015 16:42:51 -
> @@ -1019,6 +1019,9 @@ if_change(u_short ifindex, int flags, st
> return;
> }
>  
> +   /* notify ospfe about interface link state */
> +   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
> +
> reachable = (kif->flags & IFF_UP) &&
> LINK_STATE_IS_UP(kif->link_state);
>  
> @@ -1026,9 +1029,6 @@ if_change(u_short ifindex, int flags, st
> return; /* nothing changed wrt nexthop validity */
>  
> kif->nh_reachable = reachable;
> -
> -   /* notify ospfe about interface link state */
> -   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
>  
> /* update redistribute list */
> RB_FOREACH(kr, kroute_tree, &krt) {
> Index: ospfd.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/ospfd.c,v
> retrieving revision 1.83
> diff -u -p -r1.83 ospfd.c
> --- ospfd.c 10 Feb 2015 05:24:48 -  1.83
> +++ ospfd.c 27 May 2015 16:42:51 -
> @@ -511,13 +511,15 @@ main_dispatch_rde(int fd, short event, v
>  void
>  main_imsg_compose_ospfe(int type, pid_t pid, void *data, u_int16_t datalen)
>  {
> -   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
> +   if (iev_ospfe)
> +   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, 
> datalen);
>  }
>  
>  void
>  main_imsg_compose_rde(int type, pid_t pid, void *data, u_int16_t datalen)
>  {
> -   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
> +   if (iev_rde)
> +   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
>  }
>  
>  void
> 

-- 



Re: [PATCH] Fix ospfd segmentation fault on startup

2015-07-20 Thread Claudio Jeker
On Mon, Jul 20, 2015 at 09:32:20PM +, Johan Ymerson wrote:
> On Mon, 2015-07-20 at 22:58 +0200, Martin Pieuchot wrote:
> > On 20/07/15(Mon) 19:10, Johan Ymerson wrote:
> > > On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> > > > Committed!  Thanks and sorry for the delay.
> > > 
> > > Hi!
> > > 
> > > You missed the previous patch "Fix ospfd segmentation fault on startup"
> > > witch prevent ospfd from segfaulting on startup. Without this first
> > > patch, ospfd will almost always segfault on startup (instead of just
> > > sometime, which it does today).
> > 
> > Could you send a single diff for all these issues?  Apparently ospf
> > hackers are slacking ;)
> 
> Yes, I have it as a single diff. I actually broke it up in two diffs
> because the two issues are not really related. The second patch only
> makes the first problem very obvious.
> It would of course be best if we could make sure we set up event
> handling (iev_ospfe et al.) before scanning interfaces, but it's kind of
> a catch 22 here. The event handlers need the interface info to not
> segfault... So the easy fix was to just check for null pointers in
> main_imsg_compose_*.
> 
> /Johan
> 

Yes, lets go with this version. OK claudio@
 
> 
> Index: interface.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/interface.c,v
> retrieving revision 1.75
> diff -u -p -r1.75 interface.c
> --- interface.c 14 May 2012 10:17:21 -  1.75
> +++ interface.c 27 May 2015 16:42:51 -
> @@ -338,8 +338,10 @@ if_act_start(struct iface *iface)
> struct in_addr   addr;
> struct timeval   now;
>  
> -   if (!((iface->flags & IFF_UP) &&
> -   LINK_STATE_IS_UP(iface->linkstate)))
> +   if (!(iface->flags & IFF_UP) ||
> +   (!LINK_STATE_IS_UP(iface->linkstate) &&
> +   !(iface->media_type == IFT_CARP &&
> +   iface->linkstate == LINK_STATE_DOWN)))
> return (0);
>  
> if (iface->media_type == IFT_CARP && iface->passive == 0) {
> Index: kroute.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/kroute.c,v
> retrieving revision 1.98
> diff -u -p -r1.98 kroute.c
> --- kroute.c11 Feb 2015 05:57:44 -  1.98
> +++ kroute.c27 May 2015 16:42:51 -
> @@ -1019,6 +1019,9 @@ if_change(u_short ifindex, int flags, st
> return;
> }
>  
> +   /* notify ospfe about interface link state */
> +   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
> +
> reachable = (kif->flags & IFF_UP) &&
> LINK_STATE_IS_UP(kif->link_state);
>  
> @@ -1026,9 +1029,6 @@ if_change(u_short ifindex, int flags, st
> return; /* nothing changed wrt nexthop validity */
>  
> kif->nh_reachable = reachable;
> -
> -   /* notify ospfe about interface link state */
> -   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
>  
> /* update redistribute list */
> RB_FOREACH(kr, kroute_tree, &krt) {
> Index: ospfd.c
> ===
> RCS file: /cvs/src/usr.sbin/ospfd/ospfd.c,v
> retrieving revision 1.83
> diff -u -p -r1.83 ospfd.c
> --- ospfd.c 10 Feb 2015 05:24:48 -  1.83
> +++ ospfd.c 27 May 2015 16:42:51 -
> @@ -511,13 +511,15 @@ main_dispatch_rde(int fd, short event, v
>  void
>  main_imsg_compose_ospfe(int type, pid_t pid, void *data, u_int16_t datalen)
>  {
> -   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
> +   if (iev_ospfe)
> +   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, 
> datalen);
>  }
>  
>  void
>  main_imsg_compose_rde(int type, pid_t pid, void *data, u_int16_t datalen)
>  {
> -   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
> +   if (iev_rde)
> +   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
>  }
>  
>  void
> 

-- 
:wq Claudio



Re: [PATCH] Fix ospfd segmentation fault on startup

2015-07-20 Thread Johan Ymerson
On Mon, 2015-07-20 at 22:58 +0200, Martin Pieuchot wrote:
> On 20/07/15(Mon) 19:10, Johan Ymerson wrote:
> > On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> > > Committed!  Thanks and sorry for the delay.
> > 
> > Hi!
> > 
> > You missed the previous patch "Fix ospfd segmentation fault on startup"
> > witch prevent ospfd from segfaulting on startup. Without this first
> > patch, ospfd will almost always segfault on startup (instead of just
> > sometime, which it does today).
> 
> Could you send a single diff for all these issues?  Apparently ospf
> hackers are slacking ;)

Yes, I have it as a single diff. I actually broke it up in two diffs
because the two issues are not really related. The second patch only
makes the first problem very obvious.
It would of course be best if we could make sure we set up event
handling (iev_ospfe et al.) before scanning interfaces, but it's kind of
a catch 22 here. The event handlers need the interface info to not
segfault... So the easy fix was to just check for null pointers in
main_imsg_compose_*.

/Johan



Index: interface.c
===
RCS file: /cvs/src/usr.sbin/ospfd/interface.c,v
retrieving revision 1.75
diff -u -p -r1.75 interface.c
--- interface.c 14 May 2012 10:17:21 -  1.75
+++ interface.c 27 May 2015 16:42:51 -
@@ -338,8 +338,10 @@ if_act_start(struct iface *iface)
struct in_addr   addr;
struct timeval   now;
 
-   if (!((iface->flags & IFF_UP) &&
-   LINK_STATE_IS_UP(iface->linkstate)))
+   if (!(iface->flags & IFF_UP) ||
+   (!LINK_STATE_IS_UP(iface->linkstate) &&
+   !(iface->media_type == IFT_CARP &&
+   iface->linkstate == LINK_STATE_DOWN)))
return (0);
 
if (iface->media_type == IFT_CARP && iface->passive == 0) {
Index: kroute.c
===
RCS file: /cvs/src/usr.sbin/ospfd/kroute.c,v
retrieving revision 1.98
diff -u -p -r1.98 kroute.c
--- kroute.c11 Feb 2015 05:57:44 -  1.98
+++ kroute.c27 May 2015 16:42:51 -
@@ -1019,6 +1019,9 @@ if_change(u_short ifindex, int flags, st
return;
}
 
+   /* notify ospfe about interface link state */
+   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
+
reachable = (kif->flags & IFF_UP) &&
LINK_STATE_IS_UP(kif->link_state);
 
@@ -1026,9 +1029,6 @@ if_change(u_short ifindex, int flags, st
return; /* nothing changed wrt nexthop validity */
 
kif->nh_reachable = reachable;
-
-   /* notify ospfe about interface link state */
-   main_imsg_compose_ospfe(IMSG_IFINFO, 0, kif, sizeof(struct kif));
 
/* update redistribute list */
RB_FOREACH(kr, kroute_tree, &krt) {
Index: ospfd.c
===
RCS file: /cvs/src/usr.sbin/ospfd/ospfd.c,v
retrieving revision 1.83
diff -u -p -r1.83 ospfd.c
--- ospfd.c 10 Feb 2015 05:24:48 -  1.83
+++ ospfd.c 27 May 2015 16:42:51 -
@@ -511,13 +511,15 @@ main_dispatch_rde(int fd, short event, v
 void
 main_imsg_compose_ospfe(int type, pid_t pid, void *data, u_int16_t datalen)
 {
-   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
+   if (iev_ospfe)
+   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
 }
 
 void
 main_imsg_compose_rde(int type, pid_t pid, void *data, u_int16_t datalen)
 {
-   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
+   if (iev_rde)
+   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
 }
 
 void



Re: [PATCH] Fix ospfd segmentation fault on startup

2015-07-20 Thread Martin Pieuchot
On 20/07/15(Mon) 19:10, Johan Ymerson wrote:
> On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> > Committed!  Thanks and sorry for the delay.
> 
> Hi!
> 
> You missed the previous patch "Fix ospfd segmentation fault on startup"
> witch prevent ospfd from segfaulting on startup. Without this first
> patch, ospfd will almost always segfault on startup (instead of just
> sometime, which it does today).

Could you send a single diff for all these issues?  Apparently ospf
hackers are slacking ;)



Re: [PATCH] Fix ospfd segmentation fault on startup

2015-07-20 Thread Johan Ymerson
On 2015-07-18 16:03:00, Martin Pieuchot wrote:
> Committed!  Thanks and sorry for the delay.

Hi!

You missed the previous patch "Fix ospfd segmentation fault on startup"
witch prevent ospfd from segfaulting on startup. Without this first
patch, ospfd will almost always segfault on startup (instead of just
sometime, which it does today).

/Johan




[PATCH] Fix ospfd segmentation fault on startup

2015-05-27 Thread Johan Ymerson
Hi,

When debugging problems with ospfd and carp on startup, I managed to get
ospfd to segfault a couple of times.
I tracked down the issue to if_change() and main_imsg_compose_ospfe().

if_change() is called before imsg_init is called to initialize the
imsgbuf struct. If a link state change to UP occurs during the small
time frame the imsgbuf pointer is uninitialized, we have a null pointer
dereference in main_imsg_compose_ospfe().

Safe-guard against this by simply not calling imsg_compose_event() if
the imsgbuf pointer is null.

Index: ospfd.c
===
RCS file: /cvs/src/usr.sbin/ospfd/ospfd.c,v
retrieving revision 1.83
diff -u -p -r1.83 ospfd.c
--- ospfd.c 10 Feb 2015 05:24:48 -  1.83
+++ ospfd.c 27 May 2015 12:35:08 -
@@ -511,13 +511,15 @@ main_dispatch_rde(int fd, short event, v
 void
 main_imsg_compose_ospfe(int type, pid_t pid, void *data, u_int16_t datalen)
 {
-   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
+   if (iev_ospfe)
+   imsg_compose_event(iev_ospfe, type, 0, pid, -1, data, datalen);
 }
 
 void
 main_imsg_compose_rde(int type, pid_t pid, void *data, u_int16_t datalen)
 {
-   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
+   if (iev_rde)
+   imsg_compose_event(iev_rde, type, 0, pid, -1, data, datalen);
 }
 
 void