platform: assert against the maximum length of link_get_address()
Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:

committed by
Dan Williams

parent
7f771d0a05
commit
ac4fafe7a4
@@ -129,9 +129,8 @@ gboolean nm_utils_wifi_is_channel_valid (guint32 channel, const char *band);
|
|||||||
/**
|
/**
|
||||||
* NM_UTILS_HWADDR_LEN_MAX:
|
* NM_UTILS_HWADDR_LEN_MAX:
|
||||||
*
|
*
|
||||||
* The maximum length of a hardware address of a type known by
|
* The maximum length of hardware addresses handled by NetworkManager itself,
|
||||||
* nm_utils_hwaddr_len() or nm_utils_hwaddr_aton(). This can be used
|
* nm_utils_hwaddr_len(), and nm_utils_hwaddr_aton().
|
||||||
* as the size of the buffer passed to nm_utils_hwaddr_aton().
|
|
||||||
*/
|
*/
|
||||||
#define NM_UTILS_HWADDR_LEN_MAX 20 /* INFINIBAND_ALEN */
|
#define NM_UTILS_HWADDR_LEN_MAX 20 /* INFINIBAND_ALEN */
|
||||||
|
|
||||||
|
@@ -7376,7 +7376,8 @@ set_property (GObject *object, guint prop_id,
|
|||||||
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object);
|
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (object);
|
||||||
NMPlatformLink *platform_device;
|
NMPlatformLink *platform_device;
|
||||||
const char *hw_addr;
|
const char *hw_addr;
|
||||||
|
guint hw_addr_len;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_PLATFORM_DEVICE:
|
case PROP_PLATFORM_DEVICE:
|
||||||
platform_device = g_value_get_pointer (value);
|
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);
|
priv->is_master = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
case PROP_HW_ADDRESS:
|
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);
|
hw_addr = g_value_get_string (value);
|
||||||
if (!hw_addr)
|
if (!hw_addr)
|
||||||
|
@@ -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);
|
auto_nl_object struct rtnl_link *rtnllink = link_get (platform, ifindex);
|
||||||
struct nl_addr *nladdr;
|
struct nl_addr *nladdr;
|
||||||
|
size_t l = 0;
|
||||||
|
gconstpointer a = NULL;
|
||||||
|
|
||||||
nladdr = rtnllink ? rtnl_link_get_addr (rtnllink) : 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)
|
if (length)
|
||||||
*length = nladdr ? nl_addr_get_len (nladdr) : 0;
|
*length = l;
|
||||||
|
return a;
|
||||||
return nladdr ? nl_addr_get_binary_addr (nladdr) : NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
Reference in New Issue
Block a user