]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add AF to udpfromto_init()
authorAlan T. DeKok <aland@freeradius.org>
Tue, 2 Jan 2024 01:25:53 +0000 (20:25 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 3 Jan 2024 14:18:02 +0000 (09:18 -0500)
to avoid getsockbyname() when it's not necessary

src/lib/util/socket.c
src/lib/util/udpfromto.c
src/lib/util/udpfromto.h

index bd90cf11440088e0f2518f54b1fab9b2eae9dd67..dd680bd02b2b5269c6d7acfeea9af2c22fc2b90a 100644 (file)
@@ -917,7 +917,7 @@ int fr_socket_server_udp(fr_ipaddr_t const *src_ipaddr, uint16_t *src_port, char
        /*
         *      Initialize udpfromto for UDP sockets.
         */
-       if (udpfromto_init(sockfd) != 0) {
+       if (udpfromto_init(sockfd, src_ipaddr->af) != 0) {
                fr_strerror_printf("Failed initializing udpfromto: %s", fr_syserror(errno));
                goto error;
        }
index deebfaa1cfd2329121efd5a182606a1597eb04a0..7f737795728df61c52ffb2673f2df0547d85f528 100644 (file)
@@ -89,27 +89,32 @@ RCSID("$Id$")
 #  endif
 #endif
 
-int udpfromto_init(int s)
+int udpfromto_init(int s, int af)
 {
        int proto = 0, flag = 0, opt = 1;
-       struct sockaddr_storage si;
-       socklen_t si_len = sizeof(si);
 
        errno = ENOSYS;
 
-       /*
-        *      Static analyzer doesn't see that getsockname initialises
-        *      the memory passed to it.
-        */
+       if (af == AF_UNSPEC) {
+               struct sockaddr_storage si;
+               socklen_t si_len = sizeof(si);
+
+               /*
+                *      Static analyzer doesn't see that getsockname initialises
+                *      the memory passed to it.
+                */
 #ifdef STATIC_ANALYZER
-       memset(&si, 0, sizeof(si));
+               memset(&si, 0, sizeof(si));
 #endif
 
-       if (getsockname(s, (struct sockaddr *) &si, &si_len) < 0) {
-               return -1;
+               if (getsockname(s, (struct sockaddr *) &si, &si_len) < 0) {
+                       return -1;
+               }
+
+               af = si.ss_family;
        }
 
-       if (si.ss_family == AF_INET) {
+       if (af == AF_INET) {
 #ifdef HAVE_IP_PKTINFO
                /*
                 *      Linux
@@ -131,7 +136,7 @@ int udpfromto_init(int s)
 #endif
 
 #if defined(AF_INET6) && defined(IPV6_PKTINFO)
-       } else if (si.ss_family == AF_INET6) {
+       } else if (af == AF_INET6) {
                /*
                 *      This should actually be standard IPv6
                 */
@@ -575,7 +580,7 @@ int main(int argc, char **argv)
 
        /* parent: server */
        server_socket = socket(PF_INET, SOCK_DGRAM, 0);
-       if (udpfromto_init(server_socket) != 0) {
+       if (udpfromto_init(server_socket, AF_INET) != 0) {
                perror("udpfromto_init\n");
                waitpid(pid, NULL, WNOHANG);
                return 0;
@@ -617,7 +622,7 @@ int main(int argc, char **argv)
 client:
        close(server_socket);
        client_socket = socket(PF_INET, SOCK_DGRAM, 0);
-       fr_assert_fatal_msg(udpfromto_init(client_socket) != 0, "udpfromto_init - %s", fr_syserror(errno));
+       fr_assert_fatal_msg(udpfromto_init(client_socket, AF_INET) != 0, "udpfromto_init - %s", fr_syserror(errno));
 
        /* bind client on different port */
        in.sin_port = htons(port+1);
index 92514ab0af3f77574a7f813c37070619cea6126b..1862e8c2d178d22732f94c4d9f89a99febc5e4ed 100644 (file)
@@ -37,7 +37,7 @@ extern "C" {
 #include <stddef.h>
 #include <stdlib.h>
 
-int    udpfromto_init(int s);
+int    udpfromto_init(int s, int af);
 
 int    recvfromto(int s, void *buf, size_t len, int flags,
                   int *ifindex,