summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2015-09-18 13:30:25 +0200
committerThomas Haller <thaller@redhat.com>2015-09-18 13:32:31 +0200
commitb6459ace2f30cf935d9ea4b8da0e31e8fff4b9a8 (patch)
tree5e13ad68f5f2ebd2a787b50b19941180aaf18bbd
parent3a680392323f314f368807ff279618e69ac49623 (diff)
parent2733aacd6495f2bdba81ddda617c9a506abd9e73 (diff)
platform: merge branch 'th/platform-permanent-hwaddr-rh1264024'
https://bugzilla.redhat.com/show_bug.cgi?id=1264024 Related: https://bugzilla.redhat.com/show_bug.cgi?id=1256430
-rw-r--r--src/platform/nm-platform-utils.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/platform/nm-platform-utils.c b/src/platform/nm-platform-utils.c
index 7559b2bdf2..3ebb73bfb9 100644
--- a/src/platform/nm-platform-utils.c
+++ b/src/platform/nm-platform-utils.c
@@ -138,21 +138,31 @@ nmp_utils_ethtool_get_permanent_address (const char *ifname,
guint8 *buf,
size_t *length)
{
- gs_free struct ethtool_perm_addr *epaddr = NULL;
+ struct {
+ struct ethtool_perm_addr e;
+ guint8 _extra_data[NM_UTILS_HWADDR_LEN_MAX + 1];
+ } edata;
+ guint zeros[NM_UTILS_HWADDR_LEN_MAX] = { 0 };
if (!ifname)
return FALSE;
- epaddr = g_malloc0 (sizeof (*epaddr) + NM_UTILS_HWADDR_LEN_MAX);
- epaddr->cmd = ETHTOOL_GPERMADDR;
- epaddr->size = NM_UTILS_HWADDR_LEN_MAX;
+ memset (&edata, 0, sizeof (edata));
+ edata.e.cmd = ETHTOOL_GPERMADDR;
+ edata.e.size = NM_UTILS_HWADDR_LEN_MAX;
- if (!ethtool_get (ifname, epaddr))
+ if (!ethtool_get (ifname, &edata.e))
return FALSE;
- g_assert (epaddr->size <= NM_UTILS_HWADDR_LEN_MAX);
- memcpy (buf, epaddr->data, epaddr->size);
- *length = epaddr->size;
+ g_assert (edata.e.size <= NM_UTILS_HWADDR_LEN_MAX);
+
+ /* Some drivers might return a permanent address of all zeros.
+ * Reject that (rh#1264024) */
+ if (memcmp (edata.e.data, zeros, edata.e.size) == 0)
+ return FALSE;
+
+ memcpy (buf, edata.e.data, edata.e.size);
+ *length = edata.e.size;
return TRUE;
}