Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright (C) 2021 Intel Corporation. All rights reserved. 3 : : */ 4 : : 5 : : static int 6 : 27358 : get_addr_str(struct sockaddr *sa, char *host, size_t hlen) 7 : : { 8 : 27358 : const char *result = NULL; 9 : : 10 [ + - - + ]: 27358 : if (sa == NULL || host == NULL) { 11 : 0 : return -1; 12 : : } 13 : : 14 [ + - - ]: 27358 : switch (sa->sa_family) { 15 : 27358 : case AF_INET: 16 : 27358 : result = inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), 17 : : host, hlen); 18 : 27358 : break; 19 : 0 : case AF_INET6: 20 : 0 : result = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), 21 : : host, hlen); 22 : 0 : break; 23 : 0 : default: 24 : 0 : break; 25 : : } 26 : : 27 [ + - ]: 27358 : if (result != NULL) { 28 : 27358 : return 0; 29 : : } else { 30 : 0 : return -1; 31 : : } 32 : : } 33 : : 34 : : static bool 35 : 2915 : sock_is_loopback(int fd) 36 : : { 37 : 130 : struct ifaddrs *addrs, *tmp; 38 : 2915 : struct sockaddr_storage sa = {}; 39 : 130 : socklen_t salen; 40 : 2915 : struct ifreq ifr = {}; 41 : 130 : char ip_addr[256], ip_addr_tmp[256]; 42 : : int rc; 43 : 2915 : bool is_loopback = false; 44 : : 45 : 2915 : salen = sizeof(sa); 46 : 2915 : rc = getsockname(fd, (struct sockaddr *)&sa, &salen); 47 [ - + ]: 2915 : if (rc != 0) { 48 : 0 : return is_loopback; 49 : : } 50 : : 51 : 2915 : memset(ip_addr, 0, sizeof(ip_addr)); 52 : 2915 : rc = get_addr_str((struct sockaddr *)&sa, ip_addr, sizeof(ip_addr)); 53 [ - + ]: 2915 : if (rc != 0) { 54 : 0 : return is_loopback; 55 : : } 56 : : 57 : 2915 : getifaddrs(&addrs); 58 [ + + ]: 32220 : for (tmp = addrs; tmp != NULL; tmp = tmp->ifa_next) { 59 [ + - + + ]: 32214 : if (tmp->ifa_addr && (tmp->ifa_flags & IFF_UP) && 60 [ + + ]: 25600 : (tmp->ifa_addr->sa_family == sa.ss_family)) { 61 : 9525 : memset(ip_addr_tmp, 0, sizeof(ip_addr_tmp)); 62 : 9525 : rc = get_addr_str(tmp->ifa_addr, ip_addr_tmp, sizeof(ip_addr_tmp)); 63 [ - + ]: 9525 : if (rc != 0) { 64 : 0 : continue; 65 : : } 66 : : 67 [ + + ]: 9525 : if (strncmp(ip_addr, ip_addr_tmp, sizeof(ip_addr)) == 0) { 68 : 2909 : memcpy(ifr.ifr_name, tmp->ifa_name, sizeof(ifr.ifr_name)); 69 : 2909 : ioctl(fd, SIOCGIFFLAGS, &ifr); 70 [ + + ]: 2909 : if (ifr.ifr_flags & IFF_LOOPBACK) { 71 : 142 : is_loopback = true; 72 : : } 73 : 2909 : goto end; 74 : : } 75 : : } 76 : : } 77 : : 78 : 136 : end: 79 : 2915 : freeifaddrs(addrs); 80 : 2915 : return is_loopback; 81 : : }