Explorar o código

Check for null pointer when traversing list of interfaces

ifa_addr field of stuct ifaddrs may containt NULL (see getifaddrs(3)),
causing a crash. Since such list entries are of no use to us anyway,
we just skip them.
Vit Herman %!s(int64=6) %!d(string=hai) anos
pai
achega
26bb912f0a
Modificáronse 1 ficheiros con 8 adicións e 2 borrados
  1. 8 2
      plugins/check_radius.c

+ 8 - 2
plugins/check_radius.c

@@ -441,22 +441,28 @@ char *get_ether_addr(uint32_t client_id)
 
 	getifaddrs(&ifap);
 
-	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next)
+	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+		if (ifa->ifa_addr == NULL)
+			continue;
 		if (ifa->ifa_addr->sa_family == AF_INET) {
 			sain = (struct sockaddr_in *)ifa->ifa_addr;
 			if (client_id == ntohl(sain->sin_addr.s_addr))
 				break;
 		}
+	}
 	if (ifa == NULL) {
 		freeifaddrs(ifap);
 		return NULL;
 	}
 
 	ifb = ifa;
-	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next)
+	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
+		if (ifa->ifa_addr == NULL)
+			continue;
 		if (ifa->ifa_addr->sa_family == AF_LINK
 		    && strcmp(ifa->ifa_name, ifb->ifa_name) == 0)
 			break;
+	}
 	if (ifa == NULL) {
 		freeifaddrs(ifap);
 		return NULL;