Claudio Jeker([email protected]) on 2022.01.23 09:27:39 +0100:
> 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: [email protected] 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.
yes, ok benno@
its a bit sad that this is so non obvious, including the fix :/
> --
> :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;
>
>