diff options
author | Thomas Haller <thaller@redhat.com> | 2015-09-18 13:30:25 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2015-09-18 13:32:31 +0200 |
commit | b6459ace2f30cf935d9ea4b8da0e31e8fff4b9a8 (patch) | |
tree | 5e13ad68f5f2ebd2a787b50b19941180aaf18bbd | |
parent | 3a680392323f314f368807ff279618e69ac49623 (diff) | |
parent | 2733aacd6495f2bdba81ddda617c9a506abd9e73 (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.c | 26 |
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; } |