Control startup of PROC_CERT and PROC_IKEV2.
authortobhe <tobhe@openbsd.org>
Tue, 13 Feb 2024 12:25:11 +0000 (12:25 +0000)
committertobhe <tobhe@openbsd.org>
Tue, 13 Feb 2024 12:25:11 +0000 (12:25 +0000)
commit3fdfc9aa3693fe0bba0ca38cfb9b5641650cc214
tree2ee5476989d3a06cda853e7a6f869b0c3ab37454
parent94c0e2bd60f346b99cc50d840aac5f7019b7b57b
Control startup of PROC_CERT and PROC_IKEV2.
Currenly PROC_PARENT sends the configuration to both PROC_CERT and
PROC_IKEV2 and finishes by sending IMSG_CTL_ACTIVE to PROC_IKEV2.

However, when PROC_IKEV2 receives IMSG_CTL_ACTIVE it does not know
the state of PROC_CERT: PROC_CERT might not have processed the
initial configuration while PROC_IKEV2 already sends requests to
PROC_CERT, causing failed requests, or even crashes (NULL deref of
ca_certs).

In order to make sure that PROC_CERT is ready before
IMSG_CTL_ACTIVE is sent to PROC_IKEV2 that startup protocol
is changed as follows:

(1) PROC_PARENT sends configuration to both PROC_CERT and PROC_IKEV2
(2) PROC_PARENT sends IMSG_CTL_ACTIVE to PROC_CERT
(3) PROC_CERT acks IMSG_CTL_ACTIVE by sending it back to PROC_PARENT
(4) PROC_PARENT now knows that PROC_CERT is ready and has processed
    all messages from step (1)
(5) PROC_PARENT sends IMSG_CTL_ACTIVE to PROC_IKEV2 and knows that
    IMSG_CTL_ACTIVE will be processed by PROC_IKEV2 after all
    messages from step (1)
(6) PROC_IKEV2 can now assume that PROC_CERT is ready because it has
    already processed IMSG_CTL_ACTIVE

from markus@
sbin/iked/ca.c
sbin/iked/config.c
sbin/iked/iked.c