summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2014-06-13 15:47:29 +0200
committerDan Williams <dcbw@redhat.com>2014-07-23 12:42:45 -0500
commitac4fafe7a42a522c8b82b5d09802ab40ba504b7d (patch)
treef659c89027e60abc75615c8010d6b1e4a0c31dcf
parent7f771d0a05fd691b2965bc8ae91a6aa9a6453a53 (diff)
downloadNetworkManager-ac4fafe7a42a522c8b82b5d09802ab40ba504b7d.tar.gz
platform: assert against the maximum length of link_get_address()
Signed-off-by: Thomas Haller <thaller@redhat.com>
-rw-r--r--libnm-util/nm-utils.h5
-rw-r--r--src/devices/nm-device.c7
-rw-r--r--src/platform/nm-linux-platform.c20
3 files changed, 22 insertions, 10 deletions
diff --git a/libnm-util/nm-utils.h b/libnm-util/nm-utils.h
index 23944ad1aa..896b3e92a8 100644
--- a/libnm-util/nm-utils.h
+++ b/libnm-util/nm-utils.h
@@ -129,9 +129,8 @@ gboolean nm_utils_wifi_is_channel_valid (guint32 channel, const char *band);
/**
* NM_UTILS_HWADDR_LEN_MAX:
*
- * The maximum length of a hardware address of a type known by
- * nm_utils_hwaddr_len() or nm_utils_hwaddr_aton(). This can be used
- * as the size of the buffer passed to nm_utils_hwaddr_aton().
+ * The maximum length of hardware addresses handled by NetworkManager itself,
+ * nm_utils_hwaddr_len(), and nm_utils_hwaddr_aton().
*/
#define NM_UTILS_HWADDR_LEN_MAX 20 /* INFINIBAND_ALEN */
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 0558fd47ba..b048571e5a 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7376,7 +7376,8 @@ set_property (GObject *object, guint prop_id,
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object);
NMPlatformLink *platform_device;
const char *hw_addr;
-
+ guint hw_addr_len;
+
switch (prop_id) {
case PROP_PLATFORM_DEVICE:
platform_device = g_value_get_pointer (value);
@@ -7454,7 +7455,9 @@ set_property (GObject *object, guint prop_id,
priv->is_master = g_value_get_boolean (value);
break;
case PROP_HW_ADDRESS:
- priv->hw_addr_len = nm_device_get_hw_address_length (NM_DEVICE (object), NULL);
+ hw_addr_len = nm_device_get_hw_address_length (NM_DEVICE (object), NULL);
+ g_return_if_fail (hw_addr_len <= NM_UTILS_HWADDR_LEN_MAX);
+ priv->hw_addr_len = hw_addr_len;
hw_addr = g_value_get_string (value);
if (!hw_addr)
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 6c8d3fd77d..a920980596 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -2527,13 +2527,23 @@ link_get_address (NMPlatform *platform, int ifindex, size_t *length)
{
auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
struct nl_addr *nladdr;
-
- nladdr = rtnllink ? rtnl_link_get_addr (rtnllink) : NULL;
+ size_t l = 0;
+ gconstpointer a = NULL;
+
+ if (rtnllink &&
+ (nladdr = rtnl_link_get_addr (rtnllink))) {
+ l = nl_addr_get_len (nladdr);
+ if (l > NM_UTILS_HWADDR_LEN_MAX) {
+ if (length)
+ *length = 0;
+ g_return_val_if_reached (NULL);
+ } else if (l > 0)
+ a = nl_addr_get_binary_addr (nladdr);
+ }
if (length)
- *length = nladdr ? nl_addr_get_len (nladdr) : 0;
-
- return nladdr ? nl_addr_get_binary_addr (nladdr) : NULL;
+ *length = l;
+ return a;
}
static gboolean