diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index 17ecafed72..9358b90ebb 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -3737,8 +3737,11 @@ _nm_utils_generate_mac_address_mask_parse (const char *value, /*****************************************************************************/ /** - * nm_utils_iface_valid_name: + * nm_utils_is_valid_iface_name: * @name: Name of interface + * @error: location to store the error occurring, or %NULL to ignore + * + * Validate the network interface name. * * This function is a 1:1 copy of the kernel's interface validation * function in net/core/dev.c. @@ -3746,28 +3749,54 @@ _nm_utils_generate_mac_address_mask_parse (const char *value, * Returns: %TRUE if interface name is valid, otherwise %FALSE is returned. */ gboolean -nm_utils_iface_valid_name (const char *name) +nm_utils_is_valid_iface_name (const char *name, GError **error) { g_return_val_if_fail (name != NULL, FALSE); - if (*name == '\0') + if (*name == '\0') { + g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, + _("interface name is too short")); return FALSE; + } - if (strlen (name) >= 16) + if (strlen (name) >= 16) { + g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, + _("interface name is longer than 15 characters")); return FALSE; + } - if (!strcmp (name, ".") || !strcmp (name, "..")) + if (!strcmp (name, ".") || !strcmp (name, "..")) { + g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, + _("interface name is reserved")); return FALSE; + } while (*name) { - if (*name == '/' || g_ascii_isspace (*name)) + if (*name == '/' || g_ascii_isspace (*name)) { + g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN, + _("interface name contains an invalid character")); return FALSE; + } name++; } return TRUE; } +/** + * nm_utils_iface_valid_name: + * @name: Name of interface + * + * Validate the network interface name. + * + * Returns: %TRUE if interface name is valid, otherwise %FALSE is returned. + */ +gboolean +nm_utils_iface_valid_name (const char *name) +{ + return nm_utils_is_valid_iface_name (name, NULL); +} + /** * nm_utils_is_uuid: * @str: a string that might be a UUID diff --git a/libnm-core/nm-utils.h b/libnm-core/nm-utils.h index dfffb33506..b322dda890 100644 --- a/libnm-core/nm-utils.h +++ b/libnm-core/nm-utils.h @@ -177,7 +177,9 @@ gboolean nm_utils_hwaddr_matches (gconstpointer hwaddr1, char *nm_utils_bin2hexstr (gconstpointer src, gsize len, int final_len); GBytes *nm_utils_hexstr2bin (const char *hex); -gboolean nm_utils_iface_valid_name(const char *name); +gboolean nm_utils_iface_valid_name (const char *name); +NM_AVAILABLE_IN_1_6 +gboolean nm_utils_is_valid_iface_name (const char *name, GError **error); gboolean nm_utils_is_uuid (const char *str); diff --git a/libnm/libnm.ver b/libnm/libnm.ver index aaafe536e3..309c4b82d8 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -1108,4 +1108,5 @@ global: nm_setting_proxy_get_pac_script; nm_utils_is_json_object; nm_utils_version; + nm_utils_is_valid_iface_name; } libnm_1_4_0;