]> git.proxmox.com Git - mirror_frr.git/blobdiff - ldpd/pfkey.c
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / ldpd / pfkey.c
index a1a79dabfd359291611a7c776494da86c14af4b0..4bea2e1904376104786b485902673587948ae0d5 100644 (file)
@@ -1,22 +1,15 @@
+// SPDX-License-Identifier: ISC
 /*     $OpenBSD$ */
 
 /*
  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
  * Copyright (c) 2003, 2004 Markus Friedl <markus@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #ifdef __OpenBSD__
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -64,17 +57,17 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
        ssize_t                 n;
        int                     len = 0;
        int                     iov_cnt;
-       struct sockaddr_storage ssrc, sdst, smask, dmask;
-       struct sockaddr         *saptr;
+       struct sockaddr_storage smask, dmask;
+       union sockunion         su_src, su_dst;
 
        if (!pid)
                pid = getpid();
 
        /* we need clean sockaddr... no ports set */
-       memset(&ssrc, 0, sizeof(ssrc));
        memset(&smask, 0, sizeof(smask));
-       if ((saptr = addr2sa(af, src, 0)))
-               memcpy(&ssrc, saptr, sizeof(ssrc));
+
+       addr2sa(af, src, 0, &su_src);
+
        switch (af) {
        case AF_INET:
                memset(&((struct sockaddr_in *)&smask)->sin_addr, 0xff, 32/8);
@@ -86,13 +79,13 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
        default:
                return (-1);
        }
-       smask.ss_family = ssrc.ss_family;
-       smask.ss_len = ssrc.ss_len;
+       smask.ss_family = su_src.sa.sa_family;
+       smask.ss_len = sockaddr_len(&su_src.sa);
 
-       memset(&sdst, 0, sizeof(sdst));
        memset(&dmask, 0, sizeof(dmask));
-       if ((saptr = addr2sa(af, dst, 0)))
-               memcpy(&sdst, saptr, sizeof(sdst));
+
+       addr2sa(af, dst, 0, &su_dst);
+
        switch (af) {
        case AF_INET:
                memset(&((struct sockaddr_in *)&dmask)->sin_addr, 0xff, 32/8);
@@ -104,8 +97,8 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
        default:
                return (-1);
        }
-       dmask.ss_family = sdst.ss_family;
-       dmask.ss_len = sdst.ss_len;
+       dmask.ss_family = su_dst.sa.sa_family;
+       dmask.ss_len = sockaddr_len(&su_dst.sa);
 
        memset(&smsg, 0, sizeof(smsg));
        smsg.sadb_msg_version = PF_KEY_V2;
@@ -138,11 +131,13 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
 
        memset(&sa_src, 0, sizeof(sa_src));
        sa_src.sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
-       sa_src.sadb_address_len = (sizeof(sa_src) + ROUNDUP(ssrc.ss_len)) / 8;
+       sa_src.sadb_address_len =
+               (sizeof(sa_src) + ROUNDUP(sockaddr_len(&su_src.sa))) / 8;
 
        memset(&sa_dst, 0, sizeof(sa_dst));
        sa_dst.sadb_address_exttype = SADB_EXT_ADDRESS_DST;
-       sa_dst.sadb_address_len = (sizeof(sa_dst) + ROUNDUP(sdst.ss_len)) / 8;
+       sa_dst.sadb_address_len =
+               (sizeof(sa_dst) + ROUNDUP(sockaddr_len(&su_dst.sa))) / 8;
 
        sa.sadb_sa_auth = aalg;
        sa.sadb_sa_encrypt = SADB_X_EALG_AES; /* XXX */
@@ -195,8 +190,8 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
        iov[iov_cnt].iov_base = &sa_dst;
        iov[iov_cnt].iov_len = sizeof(sa_dst);
        iov_cnt++;
-       iov[iov_cnt].iov_base = &sdst;
-       iov[iov_cnt].iov_len = ROUNDUP(sdst.ss_len);
+       iov[iov_cnt].iov_base = &su_dst;
+       iov[iov_cnt].iov_len = ROUNDUP(sockaddr_len(&su_dst.sa));
        smsg.sadb_msg_len += sa_dst.sadb_address_len;
        iov_cnt++;
 
@@ -204,8 +199,8 @@ pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
        iov[iov_cnt].iov_base = &sa_src;
        iov[iov_cnt].iov_len = sizeof(sa_src);
        iov_cnt++;
-       iov[iov_cnt].iov_base = &ssrc;
-       iov[iov_cnt].iov_len = ROUNDUP(ssrc.ss_len);
+       iov[iov_cnt].iov_base = &su_src;
+       iov[iov_cnt].iov_len = ROUNDUP(sockaddr_len(&su_src.sa));
        smsg.sadb_msg_len += sa_src.sadb_address_len;
        iov_cnt++;
 
@@ -415,35 +410,33 @@ pfkey_md5sig_remove(struct nbr *nbr)
 int
 pfkey_establish(struct nbr *nbr, struct nbr_params *nbrp)
 {
-       if (nbrp->auth.method == AUTH_NONE)
-               return (0);
-
        switch (nbr->auth.method) {
        case AUTH_MD5SIG:
                strlcpy(nbr->auth.md5key, nbrp->auth.md5key,
                    sizeof(nbr->auth.md5key));
-               return (pfkey_md5sig_establish(nbr, nbrp));
-       default:
-               break;
+               return pfkey_md5sig_establish(nbr, nbrp);
+       case AUTH_NONE:
+               return 0;
        }
 
-       return (0);
+       assert(!"Reached end of function where we are not expecting to");
 }
 
 int
 pfkey_remove(struct nbr *nbr)
 {
-       if (nbr->auth.method == AUTH_NONE || !nbr->auth.established)
-               return (0);
+       if (!nbr->auth.established)
+               return 0;
 
        switch (nbr->auth.method) {
        case AUTH_MD5SIG:
-               return (pfkey_md5sig_remove(nbr));
-       default:
+               return pfkey_md5sig_remove(nbr);
+       case AUTH_NONE:
+               return 0;
                break;
        }
 
-       return (0);
+       assert(!"Reached end of function where we are not expecting to");
 }
 
 int