From bcd2367f40dd97d2304cb9e1cc6fd00d588fd80c Mon Sep 17 00:00:00 2001
From: Anjan Chanda <anjan.chanda@iopsys.eu>
Date: Mon, 14 Aug 2023 09:31:27 +0200
Subject: [PATCH] check realpath() and nl_addr_get_len() return values before
 using

---
 src/i1905_netlink.c | 6 +++---
 src/i1905_wifi.c    | 4 +++-
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/i1905_netlink.c b/src/i1905_netlink.c
index e7ac3767..12568558 100644
--- a/src/i1905_netlink.c
+++ b/src/i1905_netlink.c
@@ -646,8 +646,8 @@ int i1905_get_known_neighbors(struct i1905_private *priv, char *ifname)
 
 	for (i = 0; i < num; i++) {
 		if (rtnl_neigh_get_ifindex(neigh) == ifindex) {
-			struct nl_addr *lladdr;
-			struct nl_addr *ipaddr;
+			struct nl_addr *lladdr = NULL;
+			struct nl_addr *ipaddr = NULL;
 			struct ip_address ip = {0};
 			uint8_t hwaddr[6] = {0};
 			uint16_t state;
@@ -657,7 +657,7 @@ int i1905_get_known_neighbors(struct i1905_private *priv, char *ifname)
 
 			state = rtnl_neigh_get_state(neigh);
 			lladdr = rtnl_neigh_get_lladdr(neigh);
-			if (lladdr)
+			if (lladdr && nl_addr_get_len(lladdr) == 6)
 				memcpy(hwaddr, nl_addr_get_binary_addr(lladdr),
 					nl_addr_get_len(lladdr));
 
diff --git a/src/i1905_wifi.c b/src/i1905_wifi.c
index 07440e9d..128ec88f 100644
--- a/src/i1905_wifi.c
+++ b/src/i1905_wifi.c
@@ -62,7 +62,9 @@ int is_wifi_interface(const char *ifname)
 
 	memset(&s, 0, sizeof(struct stat));
 	snprintf(path, 512, "/sys/class/net/%s/phy80211", ifname);
-	realpath(path, rpath);
+	if (!realpath(path, rpath))
+		return 0;
+
 	if (lstat(rpath, &s) != -1) {
 		if (S_ISDIR(s.st_mode)) {
 			return 1;
-- 
GitLab