On Thu, Nov 14, 2019 at 09:57:27AM -0700, Theo de Raadt wrote:
> > 
> > The problem here is that log_warn can change errno,
> 
> No, it specifically avoids touching errno.
> 
> log_warn(const char *emsg, ...)
> {
>         char            *nfmt;
>         va_list          ap;
>         int              saved_errno = errno;
> ...
>         errno = saved_errno;
> }
> 

Good to know, thanks! In that case I really prefer Mike's diff.
Here is an update with msg->msg_sa used consistently. We can also do it
the other way around, but I would prefer to use either sa or msg_sa.

Index: ikev2_msg.c
===================================================================
RCS file: /cvs/src/sbin/iked/ikev2_msg.c,v
retrieving revision 1.58
diff -u -p -r1.58 ikev2_msg.c
--- ikev2_msg.c 13 Nov 2019 12:24:40 -0000      1.58
+++ ikev2_msg.c 14 Nov 2019 17:15:42 -0000
@@ -303,7 +303,6 @@ ikev2_msg_valid_ike_sa(struct iked *env,
 int
 ikev2_msg_send(struct iked *env, struct iked_message *msg)
 {
-       struct iked_sa          *sa = msg->msg_sa;
        struct ibuf             *buf = msg->msg_data;
        uint32_t                 natt = 0x00000000;
        int                      isnatt = 0;
@@ -338,7 +337,8 @@ ikev2_msg_send(struct iked *env, struct 
        if (sendtofrom(msg->msg_fd, ibuf_data(buf), ibuf_size(buf), 0,
            (struct sockaddr *)&msg->msg_peer, msg->msg_peerlen,
            (struct sockaddr *)&msg->msg_local, msg->msg_locallen) == -1) {
-               if (errno == EADDRNOTAVAIL) {
+               log_warn("%s: sendtofrom", __func__);
+               if (msg->msg_sa != NULL && errno == EADDRNOTAVAIL) {
                        sa_state(env, msg->msg_sa, IKEV2_STATE_CLOSING);
                        timer_del(env, &msg->msg_sa->sa_timer);
                        timer_set(env, &msg->msg_sa->sa_timer,
@@ -346,11 +346,11 @@ ikev2_msg_send(struct iked *env, struct 
                        timer_add(env, &msg->msg_sa->sa_timer,
                            IKED_IKE_SA_DELETE_TIMEOUT);
                }
-               log_warn("%s: sendtofrom", __func__);
-               return (-1);
+               if (msg->msg_sa != NULL)
+                       return (-1);
        }
 
-       if (!sa)
+       if (msg->msg_sa == NULL)
                return (0);
 
        if ((m = ikev2_msg_copy(env, msg)) == NULL) {
@@ -360,11 +360,11 @@ ikev2_msg_send(struct iked *env, struct 
        m->msg_exchange = exchange;
 
        if (flags & IKEV2_FLAG_RESPONSE) {
-               TAILQ_INSERT_TAIL(&sa->sa_responses, m, msg_entry);
+               TAILQ_INSERT_TAIL(&msg->msg_sa->sa_responses, m, msg_entry);
                timer_set(env, &m->msg_timer, ikev2_msg_response_timeout, m);
                timer_add(env, &m->msg_timer, IKED_RESPONSE_TIMEOUT);
        } else {
-               TAILQ_INSERT_TAIL(&sa->sa_requests, m, msg_entry);
+               TAILQ_INSERT_TAIL(&msg->msg_sa->sa_requests, m, msg_entry);
                timer_set(env, &m->msg_timer, ikev2_msg_retransmit_timeout, m);
                timer_add(env, &m->msg_timer, IKED_RETRANSMIT_TIMEOUT);
        }

Reply via email to