summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-10-23 14:56:51 +0200
committerThomas Haller <thaller@redhat.com>2017-10-23 14:59:52 +0200
commit5f882e8e8f7795900d4923e8304611b7f9bcd669 (patch)
tree64a0853769691f1a799f39c96cb511a9d717406c
parentb3b9b2bf384710f7fe90bc85a837465c2e47b7c4 (diff)
downloadNetworkManager-5f882e8e8f7795900d4923e8304611b7f9bcd669.tar.gz
libnm: reject colon in nm_utils_is_valid_iface_name()
Since kernel commit a4176a9391868bfa87705bcd2e3b49e9b9dd2996 (net: reject creation of netdev names with colons), kernel rejects any colons in the interface name. Since kernel could get away with tightening up the check, we can too. The user anyway can not choose arbitrary interface names, like "all", "default", "bonding_masters" are all going to fail one way or another.
-rw-r--r--libnm-core/nm-utils.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index 7e96184340..e700b714e7 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -32,6 +32,7 @@
#include <libintl.h>
#include <gmodule.h>
#include <sys/stat.h>
+#include <net/if.h>
#if WITH_JANSSON
#include <jansson.h>
@@ -3675,36 +3676,41 @@ _nm_utils_generate_mac_address_mask_parse (const char *value,
gboolean
nm_utils_is_valid_iface_name (const char *name, GError **error)
{
- g_return_val_if_fail (name != NULL, FALSE);
+ int i;
- if (*name == '\0') {
- g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
- _("interface name is too short"));
- return FALSE;
- }
+ g_return_val_if_fail (name, FALSE);
- if (strlen (name) >= 16) {
+ if (name[0] == '\0') {
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
- _("interface name is longer than 15 characters"));
+ _("interface name is too short"));
return FALSE;
}
- if (!strcmp (name, ".") || !strcmp (name, "..")) {
+ if ( name[0] == '.'
+ && ( name[1] == '\0'
+ || ( name[1] == '.'
+ && name[2] == '\0'))) {
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)) {
+ for (i = 0; i < IFNAMSIZ; i++) {
+ char ch = name[i];
+
+ if (ch == '\0')
+ return TRUE;
+ if ( NM_IN_SET (ch, '/', ':')
+ || g_ascii_isspace (ch)) {
g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
_("interface name contains an invalid character"));
return FALSE;
}
- name++;
}
- return TRUE;
+ g_set_error_literal (error, NM_UTILS_ERROR, NM_UTILS_ERROR_UNKNOWN,
+ _("interface name is longer than 15 characters"));
+ return FALSE;
}
/**