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 : 36822 : get_addr_str(struct sockaddr *sa, char *host, size_t hlen)
7 : : {
8 : 36822 : const char *result = NULL;
9 : :
10 [ + - - + ]: 36822 : if (sa == NULL || host == NULL) {
11 : 0 : return -1;
12 : : }
13 : :
14 [ + - + - : 36822 : switch (sa->sa_family) {
- + - ]
15 : 30576 : case AF_INET:
16 [ - + ]: 36822 : result = inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),
17 : 6246 : host, hlen);
18 : 36822 : break;
19 : 0 : case AF_INET6:
20 [ # # ]: 0 : result = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),
21 : 0 : host, hlen);
22 : 0 : break;
23 : 0 : default:
24 : 0 : break;
25 : : }
26 : :
27 [ + - ]: 36822 : if (result != NULL) {
28 : 36822 : return 0;
29 : : } else {
30 : 0 : return -1;
31 : : }
32 : 6246 : }
33 : :
34 : : static bool
35 : 4094 : sock_is_loopback(int fd)
36 : : {
37 : 144 : struct ifaddrs *addrs, *tmp;
38 : 4094 : struct sockaddr_storage sa = {};
39 : 144 : socklen_t salen;
40 : 4094 : struct ifreq ifr = {};
41 : 144 : char ip_addr[256], ip_addr_tmp[256];
42 : 14 : int rc;
43 : 4094 : bool is_loopback = false;
44 : :
45 : 4094 : salen = sizeof(sa);
46 : 4094 : rc = getsockname(fd, (struct sockaddr *)&sa, &salen);
47 [ - + ]: 4094 : if (rc != 0) {
48 [ # # ]: 0 : return is_loopback;
49 : : }
50 : :
51 [ + - ]: 4094 : memset(ip_addr, 0, sizeof(ip_addr));
52 : 4094 : rc = get_addr_str((struct sockaddr *)&sa, ip_addr, sizeof(ip_addr));
53 [ - + ]: 4094 : if (rc != 0) {
54 [ # # ]: 0 : return is_loopback;
55 : : }
56 : :
57 : 4094 : getifaddrs(&addrs);
58 [ + + + - : 33537 : for (tmp = addrs; tmp != NULL; tmp = tmp->ifa_next) {
+ - ]
59 [ + - + + : 40944 : if (tmp->ifa_addr && (tmp->ifa_flags & IFF_UP) &&
+ - + - +
- + + +
+ ]
60 [ + + + - : 31005 : (tmp->ifa_addr->sa_family == sa.ss_family)) {
+ - + - ]
61 [ + - ]: 10976 : memset(ip_addr_tmp, 0, sizeof(ip_addr_tmp));
62 [ + - + - ]: 10976 : rc = get_addr_str(tmp->ifa_addr, ip_addr_tmp, sizeof(ip_addr_tmp));
63 [ - + ]: 10976 : if (rc != 0) {
64 : 0 : continue;
65 : : }
66 : :
67 [ + + + - : 10976 : if (strncmp(ip_addr, ip_addr_tmp, sizeof(ip_addr)) == 0) {
- + ]
68 [ - + - + : 4088 : memcpy(ifr.ifr_name, tmp->ifa_name, sizeof(ifr.ifr_name));
- + - + ]
69 : 4088 : ioctl(fd, SIOCGIFFLAGS, &ifr);
70 [ + + - + : 4088 : if (ifr.ifr_flags & IFF_LOOPBACK) {
- + ]
71 : 1223 : is_loopback = true;
72 : 1067 : }
73 : 4088 : goto end;
74 : : }
75 : 0 : }
76 : 7399 : }
77 : :
78 : 136 : end:
79 : 4094 : freeifaddrs(addrs);
80 [ + - ]: 4094 : return is_loopback;
81 : 1067 : }
|