From ac4fafe7a42a522c8b82b5d09802ab40ba504b7d Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Fri, 13 Jun 2014 15:47:29 +0200 Subject: platform: assert against the maximum length of link_get_address() Signed-off-by: Thomas Haller --- libnm-util/nm-utils.h | 5 ++--- src/devices/nm-device.c | 7 +++++-- src/platform/nm-linux-platform.c | 20 +++++++++++++++----- 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 -- cgit v1.2.1