On Sun, Jan 23, 2022 at 08:52:56AM +0100, Anton Lindqvist wrote:
> On Thu, Jan 20, 2022 at 11:06:20AM -0700, Claudio Jeker wrote:
> > CVSROOT:    /cvs
> > Module name:        src
> > Changes by: clau...@cvs.openbsd.org 2022/01/20 11:06:20
> > 
> > Modified files:
> >     usr.sbin/bgpd  : bgpd.c rde.c rtr.c session.c 
> > 
> > Log message:
> > Make sure that all poll loops properly restart the poll loop on EINTR.
> > Also either fail hard or restart after other errors. In anycase do not
> > look at pollfds after an error.
> > OK benno@
> 
> This commit broke the following regress test:
> 
> > usr.sbin/bgpd:
> Exit: 1
> Duration: 00:01:53
> Log: 230-usr.sbin-bgpd.log
> 
> ==== mrt ====
> doas -n ksh /home/src/regress/usr.sbin/bgpd/integrationtests/mrt.sh 
> /usr/sbin/bgpd /home/src/regress/usr.sbin/bgpd/integrationtests 11
> check if rdomains are busy
> + echo setup
> setup
> + ifconfig mpe11 rdomain 11 mplslabel 42
> + ifconfig lo11 inet 127.0.0.1/8
> + route -T 11 exec /usr/sbin/bgpd -v -f 
> /home/src/regress/usr.sbin/bgpd/integrationtests/bgpd.mrt.conf
> + sleep 2
> + pkill -USR1 -T 11 -u 0 bgpd
> + sleep 2
> + echo test table-v2
> test table-v2
> + bgpctl show mrt detail file mrt-table-v2.mrt
> + tee mrt-table-v2.out
> + grep -v Last update:
> + diff -u /home/src/regress/usr.sbin/bgpd/integrationtests/mrt-table-v2.ok 
> mrt-table-v2.out
> --- /home/src/regress/usr.sbin/bgpd/integrationtests/mrt-table-v2.ok  Fri Jun 
> 28 07:48:07 2019
> +++ mrt-table-v2.out  Sun Jan 23 05:51:20 2022

Fun. So the problem is that the signal flags are checked last in the poll
loop. So instead of continue the code needs to jump down to the two signal
checks for the EINTR case.

With this diff the regress test works again.
-- 
:wq Claudio

Index: bgpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/bgpd.c,v
retrieving revision 1.240
diff -u -p -r1.240 bgpd.c
--- bgpd.c      20 Jan 2022 18:06:20 -0000      1.240
+++ bgpd.c      23 Jan 2022 08:25:08 -0000
@@ -350,7 +350,7 @@ BROKEN      if (pledge("stdio rpath wpath cpa
                                log_warn("poll error");
                                quit = 1;
                        }
-                       continue;
+                       goto next_loop;
                }
 
                if (handle_pollfd(&pfd[PFD_PIPE_SESSION], ibuf_se) == -1) {
@@ -403,6 +403,7 @@ BROKEN      if (pledge("stdio rpath wpath cpa
                        if (pfd[i].revents != 0)
                                bgpd_rtr_connect_done(pfd[i].fd, conf);
 
+ next_loop:
                if (reconfig) {
                        u_int   error;
 

Reply via email to