Found by accident. If the pfkey message failed (sadb_msg_errno is set)
then the pfkey code ends in an infinite loop because the erroneous message
is not removed from the queue.

pfkey_read() PEEKS at the message and returns 0 since it is what we
expect. pfkey_reply() realizes it is an error and returns -1 but the
message is still in the buffer. Once we hit the poll loop the fd
immediatly triggers since the message is still in the buffer and we call
pfkey_read() which peeks at the message and returns 0 ...

Fix is simple, need to flush the message out in the error case.
-- 
:wq Claudio

Index: pfkey.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/pfkey.c,v
retrieving revision 1.63
diff -u -p -r1.63 pfkey.c
--- pfkey.c     15 Jun 2022 14:09:30 -0000      1.63
+++ pfkey.c     15 Jun 2022 14:23:39 -0000
@@ -469,6 +469,9 @@ pfkey_reply(int sd, uint32_t *spi)
                        return (0);
                else {
                        log_warn("pfkey");
+                       /* discard error message */
+                       if (read(sd, &hdr, sizeof(hdr)) == -1)
+                               log_warn("pfkey read");
                        return (-1);
                }
        }

Reply via email to