From bfa850db67e150e8d44093a14ef6a9999c5c9968 Mon Sep 17 00:00:00 2001
|
|
From: Oliver Kurth <okurth@vmware.com>
|
|
Date: Wed, 29 Aug 2018 13:29:43 -0700
|
|
Subject: [PATCH] Fix some bad derefs in primary NIC gathering code.
|
|
|
|
Found by user in https://github.com/vmware/open-vm-tools/issues/272
|
|
|
|
Debug code tries to access a struct field that may not have been initialized.
|
|
- Pointer deref'd without a sanity check.
|
|
---
|
|
open-vm-tools/lib/nicInfo/nicInfoPosix.c | 39 +++++++++++++++++++++-----------
|
|
1 file changed, 26 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/lib/nicInfo/nicInfoPosix.c b/lib/nicInfo/nicInfoPosix.c
|
|
index 8a063a0..31c1d1a 100644
|
|
--- a/lib/nicInfo/nicInfoPosix.c
|
|
+++ b/lib/nicInfo/nicInfoPosix.c
|
|
@@ -359,7 +359,7 @@ GuestInfoGetNicInfo(unsigned int maxIPv4Routes,
|
|
|
|
/* Get a handle to read the network interface configuration details. */
|
|
if ((intf = intf_open()) == NULL) {
|
|
- g_debug("Error, failed NULL result from intf_open()\n");
|
|
+ g_warning("%s: intf_open() failed\n", __FUNCTION__);
|
|
return FALSE;
|
|
}
|
|
|
|
@@ -466,7 +466,15 @@ GuestInfoGetPrimaryIP(void)
|
|
* the first non-loopback, internet interface in the interface list.
|
|
*/
|
|
for (curr = ifaces; curr != NULL; curr = curr->ifa_next) {
|
|
- int currFamily = ((struct sockaddr_storage *)curr->ifa_addr)->ss_family;
|
|
+ int currFamily;
|
|
+
|
|
+ /*
|
|
+ * Some interfaces ("tun") have no ifa_addr, so ignore them.
|
|
+ */
|
|
+ if (NULL == curr->ifa_addr) {
|
|
+ continue;
|
|
+ }
|
|
+ currFamily = ((struct sockaddr_storage *)curr->ifa_addr)->ss_family;
|
|
|
|
if (!(curr->ifa_flags & IFF_UP) || curr->ifa_flags & IFF_LOOPBACK) {
|
|
continue;
|
|
@@ -500,6 +508,7 @@ GuestInfoGetPrimaryIP(void)
|
|
}
|
|
|
|
#else
|
|
+
|
|
#ifndef NO_DNET
|
|
|
|
char *
|
|
@@ -508,20 +517,24 @@ GuestInfoGetPrimaryIP(void)
|
|
GuestInfoIpPriority ipp;
|
|
intf_t *intf = intf_open();
|
|
|
|
- if (intf != NULL) {
|
|
- ipp.ipstr = NULL;
|
|
- for (ipp.priority = NICINFO_PRIORITY_PRIMARY;
|
|
- ipp.priority < NICINFO_PRIORITY_MAX;
|
|
- ipp.priority++){
|
|
- intf_loop(intf, GuestInfoGetIntf, &ipp);
|
|
- if (ipp.ipstr != NULL) {
|
|
- break;
|
|
- }
|
|
+ if (NULL == intf) {
|
|
+ g_warning("%s: intf_open() failed\n", __FUNCTION__);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ ipp.ipstr = NULL;
|
|
+ for (ipp.priority = NICINFO_PRIORITY_PRIMARY;
|
|
+ ipp.priority < NICINFO_PRIORITY_MAX;
|
|
+ ipp.priority++){
|
|
+ intf_loop(intf, GuestInfoGetIntf, &ipp);
|
|
+ if (ipp.ipstr != NULL) {
|
|
+ break;
|
|
}
|
|
- intf_close(intf);
|
|
}
|
|
+ intf_close(intf);
|
|
|
|
- g_debug("%s: returning '%s'", __FUNCTION__, ipp.ipstr);
|
|
+ g_debug("%s: returning '%s'",
|
|
+ __FUNCTION__, ipp.ipstr ? ipp.ipstr : "<null>");
|
|
|
|
return ipp.ipstr;
|
|
}
|
|
--
|
|
2.7.4
|
|
|