about summary refs log tree commit diff
path: root/shared/nm-keyfile
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2020-05-08 21:40:53 +0200
committerMichael Biebl <biebl@debian.org>2020-05-08 21:40:53 +0200
commitd460892bbfece74fb6d3cd846bf6ef548290be41 (patch)
tree0474e5be0b5e5fac0d2f3a1e554382e8d1aa6397 /shared/nm-keyfile
parent1e5977b62f896e844b548c3007ace9e1dfa7f9ed (diff)
New upstream version 1.24.0 upstream/1.24.0
Diffstat (limited to 'shared/nm-keyfile')
-rw-r--r--shared/nm-keyfile/nm-keyfile-utils.c1
-rw-r--r--shared/nm-keyfile/nm-keyfile.c86
2 files changed, 32 insertions, 55 deletions
diff --git a/shared/nm-keyfile/nm-keyfile-utils.c b/shared/nm-keyfile/nm-keyfile-utils.c
index e18db20d..041b5eab 100644
--- a/shared/nm-keyfile/nm-keyfile-utils.c
+++ b/shared/nm-keyfile/nm-keyfile-utils.c
@@ -124,7 +124,6 @@ nm_keyfile_plugin_kf_get_##stype##_list (GKeyFile *kf, \
 			list = g_key_file_get_##stype##_list (kf, alias, key, &l, &local); \
 		} \
 	} \
-	nm_assert ((!local) != (!list)); \
 	if (local) \
 		g_propagate_error (error, local); \
 	if (!list) \
diff --git a/shared/nm-keyfile/nm-keyfile.c b/shared/nm-keyfile/nm-keyfile.c
index 15485747..879b1b00 100644
--- a/shared/nm-keyfile/nm-keyfile.c
+++ b/shared/nm-keyfile/nm-keyfile.c
@@ -167,9 +167,10 @@ read_array_of_uint (GKeyFile *file,
 	gsize length;
 	gsize i;
 	gs_free int *tmp = NULL;
+	gs_free_error GError *error = NULL;
 
-	tmp = nm_keyfile_plugin_kf_get_integer_list (file, nm_setting_get_name (setting), key, &length, NULL);
-	if (length > G_MAXUINT)
+	tmp = nm_keyfile_plugin_kf_get_integer_list (file, nm_setting_get_name (setting), key, &length, &error);
+	if (error)
 		return;
 
 	array = g_array_sized_new (FALSE, FALSE, sizeof (guint), length);
@@ -934,13 +935,19 @@ ip6_addr_gen_mode_parser (KeyfileReaderInfo *info, NMSetting *setting, const cha
 }
 
 static void
-mac_address_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key, gsize enforce_length, gboolean cloned_mac_addr)
+mac_address_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key, gsize addr_len, gboolean cloned_mac_addr)
 {
 	const char *setting_name = nm_setting_get_name (setting);
+	char addr_str[NM_UTILS_HWADDR_LEN_MAX * 3];
+	guint8 addr_bin[NM_UTILS_HWADDR_LEN_MAX];
 	gs_free char *tmp_string = NULL;
-	const char *p, *mac_str;
-	gs_free guint8 *buf_arr = NULL;
-	guint buf_len = 0;
+	gs_free int *int_list = NULL;
+	const char *mac_str;
+	gsize int_list_len;
+	gsize i;
+
+	nm_assert (addr_len > 0);
+	nm_assert (addr_len <= NM_UTILS_HWADDR_LEN_MAX);
 
 	tmp_string = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
 
@@ -950,60 +957,31 @@ mac_address_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key
 		goto out;
 	}
 
-	if (tmp_string && tmp_string[0]) {
-		/* Look for enough ':' characters to signify a MAC address */
-		guint i = 0;
-
-		p = tmp_string;
-		while (*p) {
-			if (*p == ':')
-				i++;
-			p++;
-		}
-
-		if (enforce_length == 0 || enforce_length == i+1) {
-			/* If we found enough it's probably a string-format MAC address */
-			buf_len = i + 1;
-			buf_arr = g_new (guint8, buf_len);
-			if (!nm_utils_hwaddr_aton (tmp_string, buf_arr, buf_len))
-				nm_clear_g_free (&buf_arr);
-		}
-	}
-	nm_clear_g_free (&tmp_string);
-
-	if (!buf_arr) {
-		gs_free int *tmp_list = NULL;
-		gsize length;
+	if (   tmp_string
+	    && nm_utils_hwaddr_aton (tmp_string, addr_bin, addr_len))
+		goto good_addr_bin;
 
-		/* Old format; list of ints */
-		tmp_list = nm_keyfile_plugin_kf_get_integer_list (info->keyfile, setting_name, key, &length, NULL);
-		if (length > 0 && (enforce_length == 0 || enforce_length == length)) {
-			gsize i;
+	/* Old format; list of ints */
+	int_list = nm_keyfile_plugin_kf_get_integer_list (info->keyfile, setting_name, key, &int_list_len, NULL);
+	if (int_list_len == addr_len) {
+		for (i = 0; i < addr_len; i++) {
+			const int val = int_list[i];
 
-			buf_len = length;
-			buf_arr = g_new (guint8, buf_len);
-			for (i = 0; i < length; i++) {
-				int val = tmp_list[i];
-
-				if (val < 0 || val > 255) {
-					handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
-					             _("ignoring invalid byte element '%d' (not between 0 and 255 inclusive)"),
-					             val);
-					return;
-				}
-				buf_arr[i] = (guint8) val;
-			}
+			if (val < 0 || val > 255)
+				break;
+			addr_bin[i] = (guint8) val;
 		}
+		if (i == addr_len)
+			goto good_addr_bin;
 	}
 
-	if (!buf_arr) {
-		handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
-		             _("ignoring invalid MAC address"));
-		return;
-	}
+	handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
+	             _("ignoring invalid MAC address"));
+	return;
 
-	tmp_string = nm_utils_hwaddr_ntoa (buf_arr, buf_len);
-	mac_str = tmp_string;
+good_addr_bin:
+	nm_utils_bin2hexstr_full (addr_bin, addr_len, ':', TRUE, addr_str);
+	mac_str = addr_str;
 
 out:
 	g_object_set (setting, key, mac_str, NULL);