On Thu, Apr 11, 2019 at 04:32:28PM +0200, Tobias Heider wrote:
> Hi,
> 
> this patch fixes a bug that appears after simultaneous
> rekeying of the ikesa. Currently the initiator does not set it's
> IKED_REQ_INFORMATIONAL flag when sending the delete request and thus rejects
> the response to the DELETE INFORMATIONAL request in ikev2_recv.
> The request is not removed from the initiators request queue and is
> retransmitted over and over.
> 
> The bug can best be reproduced by configuring two iked peers with a short
> ikelifetime (e.g. 10) and looking for INFORMATIONAL receives on the
> responder side.
> 
> 
> Index: sbin/iked//ikev2.c
> ===================================================================
> RCS file: /mount/openbsd/cvs/src/sbin/iked/ikev2.c,v
> retrieving revision 1.168
> diff -u -p -u -r1.168 ikev2.c
> --- sbin/iked//ikev2.c        27 Feb 2019 06:33:56 -0000      1.168
> +++ sbin/iked//ikev2.c        11 Apr 2019 14:09:35 -0000
> @@ -3539,6 +3539,9 @@ ikev2_ikesa_delete(struct iked *env, str
>       struct ikev2_delete             *del;
>  
>       if (initiator) {
> +             /* XXX: Can not have simultaneous INFORMATIONAL exchanges */
> +             if (sa->sa_stateflags & IKED_REQ_INF)
> +                     goto done;
>               /* Send PAYLOAD_DELETE */
>               if ((buf = ibuf_static()) == NULL)
>                       goto done;
> @@ -3550,6 +3553,7 @@ ikev2_ikesa_delete(struct iked *env, str
>               if (ikev2_send_ike_e(env, sa, buf, IKEV2_PAYLOAD_DELETE,
>                   IKEV2_EXCHANGE_INFORMATIONAL, 0) == -1)
>                       goto done;
> +             sa->sa_stateflags |= IKED_REQ_INF;
>               log_debug("%s: sent delete, closing SA", __func__);
>  done:
>               ibuf_release(buf);
>

This makes my iked connections much more stable.

- David

Reply via email to