Blame SOURCES/0006-team-validate-json-config.patch

a85faa
From 91ed0449e96051cde51625c8cacecfd5760abd31 Mon Sep 17 00:00:00 2001
a85faa
From: Beniamino Galvani <bgalvani@redhat.com>
a85faa
Date: Tue, 30 Aug 2016 15:22:04 +0200
a85faa
Subject: [PATCH 1/3] Revert "libnm-core/team: normalize invalid config to
a85faa
 NULL"
a85faa
a85faa
It's better to fail the validation of any invalid configuration
a85faa
instead of silently ignoring it.
a85faa
a85faa
This reverts commit 476810c29016d569ac3885542a6c91e7af8a7f6d.
a85faa
a85faa
(cherry picked from commit 39ad134b0ca1918084b2b1fc5856cc0b7a6becfc)
a85faa
(cherry picked from commit 4f5059306be98748d2bede9cb5f011e889c81805)
a85faa
---
a85faa
 libnm-core/nm-connection.c        |  5 ++---
a85faa
 libnm-core/nm-setting-team-port.c | 12 ++----------
a85faa
 libnm-core/nm-setting-team.c      | 12 ++----------
a85faa
 3 files changed, 6 insertions(+), 23 deletions(-)
a85faa
a85faa
diff --git a/libnm-core/nm-connection.c b/libnm-core/nm-connection.c
a85faa
index f39d41c..57f9640 100644
a85faa
--- a/libnm-core/nm-connection.c
a85faa
+++ b/libnm-core/nm-connection.c
a85faa
@@ -28,7 +28,6 @@
a85faa
 #include "nm-connection.h"
a85faa
 #include "nm-connection-private.h"
a85faa
 #include "nm-utils.h"
a85faa
-#include "nm-utils-private.h"
a85faa
 #include "nm-setting-private.h"
a85faa
 #include "nm-core-internal.h"
a85faa
 
a85faa
@@ -916,7 +915,7 @@ _normalize_team_config (NMConnection *self, GHashTable *parameters)
a85faa
 	if (s_team) {
a85faa
 		const char *config = nm_setting_team_get_config (s_team);
a85faa
 
a85faa
-		if (config && !_nm_utils_check_valid_json (config, NULL)) {
a85faa
+		if (config && !*config) {
a85faa
 			g_object_set (s_team, NM_SETTING_TEAM_CONFIG, NULL, NULL);
a85faa
 			return TRUE;
a85faa
 		}
a85faa
@@ -932,7 +931,7 @@ _normalize_team_port_config (NMConnection *self, GHashTable *parameters)
a85faa
 	if (s_team_port) {
a85faa
 		const char *config = nm_setting_team_port_get_config (s_team_port);
a85faa
 
a85faa
-		if (config && !_nm_utils_check_valid_json (config, NULL)) {
a85faa
+		if (config && !*config) {
a85faa
 			g_object_set (s_team_port, NM_SETTING_TEAM_PORT_CONFIG, NULL, NULL);
a85faa
 			return TRUE;
a85faa
 		}
a85faa
diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c
a85faa
index 0d175d5..123304f 100644
a85faa
--- a/libnm-core/nm-setting-team-port.c
a85faa
+++ b/libnm-core/nm-setting-team-port.c
a85faa
@@ -122,19 +122,11 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
a85faa
 			                "%s.%s: ",
a85faa
 			                NM_SETTING_TEAM_PORT_SETTING_NAME,
a85faa
 			                NM_SETTING_TEAM_PORT_CONFIG);
a85faa
-			/* for backward compatibility, we accept invalid json and normalize it */
a85faa
-			if (!priv->config[0]) {
a85faa
-				/* be more forgiving to "" and let it verify() as valid because
a85faa
-				 * at least anaconda used to write such configs */
a85faa
-				return NM_SETTING_VERIFY_NORMALIZABLE;
a85faa
-			}
a85faa
-			return NM_SETTING_VERIFY_NORMALIZABLE_ERROR;
a85faa
+			/* We treat an empty string as no config for compatibility. */
a85faa
+			return *priv->config ? FALSE : NM_SETTING_VERIFY_NORMALIZABLE;
a85faa
 		}
a85faa
 	}
a85faa
 
a85faa
-	/* NOTE: normalizable/normalizable-errors must appear at the end with decreasing severity.
a85faa
-	 * Take care to properly order statements with priv->config above. */
a85faa
-
a85faa
 	return TRUE;
a85faa
 }
a85faa
 
a85faa
diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c
a85faa
index a559e0d..df89694 100644
a85faa
--- a/libnm-core/nm-setting-team.c
a85faa
+++ b/libnm-core/nm-setting-team.c
a85faa
@@ -94,19 +94,11 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
a85faa
 			                "%s.%s: ",
a85faa
 			                NM_SETTING_TEAM_SETTING_NAME,
a85faa
 			                NM_SETTING_TEAM_CONFIG);
a85faa
-			/* for backward compatibility, we accept invalid json and normalize it */
a85faa
-			if (!priv->config[0]) {
a85faa
-				/* be more forgiving to "" and let it verify() as valid because
a85faa
-				 * at least anaconda used to write such configs */
a85faa
-				return NM_SETTING_VERIFY_NORMALIZABLE;
a85faa
-			}
a85faa
-			return NM_SETTING_VERIFY_NORMALIZABLE_ERROR;
a85faa
+			/* We treat an empty string as no config for compatibility. */
a85faa
+			return *priv->config ? FALSE : NM_SETTING_VERIFY_NORMALIZABLE;
a85faa
 		}
a85faa
 	}
a85faa
 
a85faa
-	/* NOTE: normalizable/normalizable-errors must appear at the end with decreasing severity.
a85faa
-	 * Take care to properly order statements with priv->config above. */
a85faa
-
a85faa
 	return TRUE;
a85faa
 }
a85faa
 
a85faa
-- 
a85faa
2.5.5
a85faa
a85faa
From f1e9f50ebe20b32a3f5903b6b07c437c23bd5ac1 Mon Sep 17 00:00:00 2001
a85faa
From: Beniamino Galvani <bgalvani@redhat.com>
a85faa
Date: Tue, 30 Aug 2016 15:21:16 +0200
a85faa
Subject: [PATCH 2/3] team: normalize invalid configuration during load
a85faa
a85faa
Now that we validate the JSON syntax of a team/team-port
a85faa
configuration, any existing connection with invalid JSON configuration
a85faa
would fail to load and disappear upon upgrade. Instead, modify the
a85faa
setting plugins to emit a warning but still load the connection with
a85faa
empty configuration.
a85faa
a85faa
(cherry picked from commit d6ec009afd7dadf925d5bb8e5dd855c493dd0104)
a85faa
(cherry picked from commit 67f064f11ba3858ea9429f0989b81feeaaa9d8bb)
a85faa
---
a85faa
 libnm-core/nm-core-internal.h                      |  5 +++
a85faa
 libnm-core/nm-keyfile-reader.c                     | 26 ++++++++++++
a85faa
 libnm-core/nm-utils-private.h                      |  3 --
a85faa
 libnm-core/tests/test-keyfile.c                    | 49 ++++++++++++++++++++++
a85faa
 src/settings/plugins/ifcfg-rh/reader.c             |  7 ++++
a85faa
 .../ifcfg-rh/tests/network-scripts/Makefile.am     |  1 +
a85faa
 .../network-scripts/ifcfg-test-team-master-invalid |  4 ++
a85faa
 .../plugins/ifcfg-rh/tests/test-ifcfg-rh.c         | 26 ++++++++++++
a85faa
 8 files changed, 118 insertions(+), 3 deletions(-)
a85faa
 create mode 100644 src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-invalid
a85faa
a85faa
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
a85faa
index 94e473d..e491bce 100644
a85faa
--- a/libnm-core/nm-core-internal.h
a85faa
+++ b/libnm-core/nm-core-internal.h
a85faa
@@ -326,4 +326,9 @@ gboolean _nm_setting_bond_option_supported (const char *option, NMBondMode mode)
a85faa
 
a85faa
 gboolean _nm_utils_inet6_is_token (const struct in6_addr *in6addr);
a85faa
 
a85faa
+/***********************************************************/
a85faa
+
a85faa
+gboolean    _nm_utils_check_valid_json  (const char *json, GError **error);
a85faa
+gboolean    _nm_utils_team_config_equal (const char *conf1, const char *conf2, gboolean port);
a85faa
+
a85faa
 #endif
a85faa
diff --git a/libnm-core/nm-keyfile-reader.c b/libnm-core/nm-keyfile-reader.c
a85faa
index 54a694e..16f0c22 100644
a85faa
--- a/libnm-core/nm-keyfile-reader.c
a85faa
+++ b/libnm-core/nm-keyfile-reader.c
a85faa
@@ -1167,6 +1167,24 @@ parity_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
a85faa
 	g_object_set (setting, key, parity, NULL);
a85faa
 }
a85faa
 
a85faa
+static void
a85faa
+team_config_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
a85faa
+{
a85faa
+	const char *setting_name = nm_setting_get_name (setting);
a85faa
+	gs_free char *conf = NULL;
a85faa
+	gs_free_error GError *error = NULL;
a85faa
+
a85faa
+	conf = nm_keyfile_plugin_kf_get_string (info->keyfile, setting_name, key, NULL);
a85faa
+	if (conf && conf[0] && !_nm_utils_check_valid_json (conf, &error)) {
a85faa
+		handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
a85faa
+		             _("ignoring invalid team configuration: %s"),
a85faa
+		             error->message);
a85faa
+		g_clear_pointer (&conf, g_free);
a85faa
+	}
a85faa
+
a85faa
+	g_object_set (G_OBJECT (setting), key, conf, NULL);
a85faa
+}
a85faa
+
a85faa
 typedef struct {
a85faa
 	const char *setting_name;
a85faa
 	const char *key;
a85faa
@@ -1285,6 +1303,14 @@ static KeyParser key_parsers[] = {
a85faa
 	  NM_SETTING_SERIAL_PARITY,
a85faa
 	  TRUE,
a85faa
 	  parity_parser },
a85faa
+	{ NM_SETTING_TEAM_SETTING_NAME,
a85faa
+	  NM_SETTING_TEAM_CONFIG,
a85faa
+	  TRUE,
a85faa
+	  team_config_parser },
a85faa
+	{ NM_SETTING_TEAM_PORT_SETTING_NAME,
a85faa
+	  NM_SETTING_TEAM_CONFIG,
a85faa
+	  TRUE,
a85faa
+	  team_config_parser },
a85faa
 	{ NULL, NULL, FALSE }
a85faa
 };
a85faa
 
a85faa
diff --git a/libnm-core/nm-utils-private.h b/libnm-core/nm-utils-private.h
a85faa
index bd54756..fab3803 100644
a85faa
--- a/libnm-core/nm-utils-private.h
a85faa
+++ b/libnm-core/nm-utils-private.h
a85faa
@@ -31,9 +31,6 @@
a85faa
 gboolean    _nm_utils_string_slist_validate (GSList *list,
a85faa
                                              const char **valid_values);
a85faa
 
a85faa
-gboolean    _nm_utils_check_valid_json  (const char *json, GError **error);
a85faa
-gboolean    _nm_utils_team_config_equal (const char *conf1, const char *conf2, gboolean port);
a85faa
-
a85faa
 /* D-Bus transform funcs */
a85faa
 
a85faa
 GVariant   *_nm_utils_hwaddr_cloned_get (NMSetting     *setting,
a85faa
diff --git a/libnm-core/tests/test-keyfile.c b/libnm-core/tests/test-keyfile.c
a85faa
index ecb7cd5..4ec6b80 100644
a85faa
--- a/libnm-core/tests/test-keyfile.c
a85faa
+++ b/libnm-core/tests/test-keyfile.c
a85faa
@@ -27,6 +27,7 @@
a85faa
 #include "nm-setting-connection.h"
a85faa
 #include "nm-setting-wired.h"
a85faa
 #include "nm-setting-8021x.h"
a85faa
+#include "nm-setting-team.h"
a85faa
 
a85faa
 #include "nm-utils/nm-test-utils.h"
a85faa
 
a85faa
@@ -518,6 +519,52 @@ test_8021x_cert_read (void)
a85faa
 	CLEAR (&con, &keyfile);
a85faa
 }
a85faa
 
a85faa
+static void
a85faa
+test_team_conf_read_valid (void)
a85faa
+{
a85faa
+	GKeyFile *keyfile = NULL;
a85faa
+	gs_unref_object NMConnection *con = NULL;
a85faa
+	NMSettingTeam *s_team;
a85faa
+
a85faa
+	con = nmtst_create_connection_from_keyfile (
a85faa
+	      "[connection]\n"
a85faa
+	      "type=team\n"
a85faa
+	      "interface-name=nm-team1\n"
a85faa
+	      "[team]\n"
a85faa
+	      "config={\"foo\":\"bar\"}",
a85faa
+	      "/test_team_conf_read/valid", NULL);
a85faa
+
a85faa
+	g_assert (con);
a85faa
+	s_team = nm_connection_get_setting_team (con);
a85faa
+	g_assert (s_team);
a85faa
+	g_assert_cmpstr (nm_setting_team_get_config (s_team), ==, "{\"foo\":\"bar\"}");
a85faa
+
a85faa
+	CLEAR (&con, &keyfile);
a85faa
+}
a85faa
+
a85faa
+static void
a85faa
+test_team_conf_read_invalid (void)
a85faa
+{
a85faa
+	GKeyFile *keyfile = NULL;
a85faa
+	gs_unref_object NMConnection *con = NULL;
a85faa
+	NMSettingTeam *s_team;
a85faa
+
a85faa
+	con = nmtst_create_connection_from_keyfile (
a85faa
+	      "[connection]\n"
a85faa
+	      "type=team\n"
a85faa
+	      "interface-name=nm-team1\n"
a85faa
+	      "[team]\n"
a85faa
+	      "config={foobar}",
a85faa
+	      "/test_team_conf_read/invalid", NULL);
a85faa
+
a85faa
+	g_assert (con);
a85faa
+	s_team = nm_connection_get_setting_team (con);
a85faa
+	g_assert (s_team);
a85faa
+	g_assert (nm_setting_team_get_config (s_team) == NULL);
a85faa
+
a85faa
+	CLEAR (&con, &keyfile);
a85faa
+}
a85faa
+
a85faa
 /******************************************************************************/
a85faa
 
a85faa
 NMTST_DEFINE ();
a85faa
@@ -528,6 +575,8 @@ int main (int argc, char **argv)
a85faa
 
a85faa
 	g_test_add_func ("/core/keyfile/test_8021x_cert", test_8021x_cert);
a85faa
 	g_test_add_func ("/core/keyfile/test_8021x_cert_read", test_8021x_cert_read);
a85faa
+	g_test_add_func ("/core/keyfile/test_team_conf_read/valid", test_team_conf_read_valid);
a85faa
+	g_test_add_func ("/core/keyfile/test_team_conf_read/invalid", test_team_conf_read_invalid);
a85faa
 
a85faa
 	return g_test_run ();
a85faa
 }
a85faa
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c
a85faa
index d1ea597..afc9238 100644
a85faa
--- a/src/settings/plugins/ifcfg-rh/reader.c
a85faa
+++ b/src/settings/plugins/ifcfg-rh/reader.c
a85faa
@@ -4238,6 +4238,7 @@ bond_connection_from_ifcfg (const char *file,
a85faa
 static char *
a85faa
 read_team_config (shvarFile *ifcfg, const char *key, GError **error)
a85faa
 {
a85faa
+	gs_free_error GError *local_error = NULL;
a85faa
 	char *value;
a85faa
 	size_t l;
a85faa
 
a85faa
@@ -4258,6 +4259,12 @@ read_team_config (shvarFile *ifcfg, const char *key, GError **error)
a85faa
 		return NULL;
a85faa
 	}
a85faa
 	svUnescape (value);
a85faa
+
a85faa
+	if (value && value[0] && !_nm_utils_check_valid_json (value, &local_error)) {
a85faa
+		PARSE_WARNING ("ignoring invalid team configuration: %s", local_error->message);
a85faa
+		g_clear_pointer (&value, g_free);
a85faa
+	}
a85faa
+
a85faa
 	return value;
a85faa
 }
a85faa
 
a85faa
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am b/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am
a85faa
index 7531ec0..de9c1ed 100644
a85faa
--- a/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am
a85faa
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/Makefile.am
a85faa
@@ -134,6 +134,7 @@ EXTRA_DIST = \
a85faa
 	ifcfg-test-fcoe-vn2vn \
a85faa
 	ifcfg-test-team-master-1 \
a85faa
 	ifcfg-test-team-master-2 \
a85faa
+	ifcfg-test-team-master-invalid \
a85faa
 	ifcfg-test-team-port-1 \
a85faa
 	ifcfg-test-team-port-2 \
a85faa
 	ifcfg-test-team-port-empty-config \
a85faa
diff --git a/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-invalid b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-invalid
a85faa
new file mode 100644
a85faa
index 0000000..4534882
a85faa
--- /dev/null
a85faa
+++ b/src/settings/plugins/ifcfg-rh/tests/network-scripts/ifcfg-test-team-master-invalid
a85faa
@@ -0,0 +1,4 @@
a85faa
+DEVICE=team0
a85faa
+ONBOOT=no
a85faa
+BOOTPROTO=dhcp
a85faa
+TEAM_CONFIG="{ foobar }"
a85faa
diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
a85faa
index 3e3f7ca..9ed48be 100644
a85faa
--- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
a85faa
+++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c
a85faa
@@ -8454,6 +8454,31 @@ test_read_team_master (gconstpointer user_data)
a85faa
 }
a85faa
 
a85faa
 static void
a85faa
+test_read_team_master_invalid (gconstpointer user_data)
a85faa
+{
a85faa
+	const char *const PATH_NAME = user_data;
a85faa
+	NMConnection *connection;
a85faa
+	NMSettingConnection *s_con;
a85faa
+	NMSettingTeam *s_team;
a85faa
+
a85faa
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*ignoring invalid team configuration*");
a85faa
+	connection = _connection_from_file (PATH_NAME, NULL, TYPE_ETHERNET, NULL);
a85faa
+	g_test_assert_expected_messages ();
a85faa
+
a85faa
+	g_assert_cmpstr (nm_connection_get_interface_name (connection), ==, "team0");
a85faa
+
a85faa
+	s_con = nm_connection_get_setting_connection (connection);
a85faa
+	g_assert (s_con);
a85faa
+	g_assert_cmpstr (nm_setting_connection_get_connection_type (s_con), ==, NM_SETTING_TEAM_SETTING_NAME);
a85faa
+
a85faa
+	s_team = nm_connection_get_setting_team (connection);
a85faa
+	g_assert (s_team);
a85faa
+	g_assert (nm_setting_team_get_config (s_team) == NULL);
a85faa
+
a85faa
+	g_object_unref (connection);
a85faa
+}
a85faa
+
a85faa
+static void
a85faa
 test_write_team_master (void)
a85faa
 {
a85faa
 	NMConnection *connection, *reread;
a85faa
@@ -9050,6 +9075,7 @@ int main (int argc, char **argv)
a85faa
 
a85faa
 	g_test_add_data_func (TPATH "team/read-master-1", TEST_IFCFG_DIR"/network-scripts/ifcfg-test-team-master-1", test_read_team_master);
a85faa
 	g_test_add_data_func (TPATH "team/read-master-2", TEST_IFCFG_DIR"/network-scripts/ifcfg-test-team-master-2", test_read_team_master);
a85faa
+	g_test_add_data_func (TPATH "team/read-master-invalid", TEST_IFCFG_DIR"/network-scripts/ifcfg-test-team-master-invalid", test_read_team_master_invalid);
a85faa
 	g_test_add_func (TPATH "team/write-master", test_write_team_master);
a85faa
 	g_test_add_data_func (TPATH "team/read-port-1", TEST_IFCFG_DIR"/network-scripts/ifcfg-test-team-port-1", test_read_team_port);
a85faa
 	g_test_add_data_func (TPATH "team/read-port-2", TEST_IFCFG_DIR"/network-scripts/ifcfg-test-team-port-2", test_read_team_port);
a85faa
-- 
a85faa
2.5.5
a85faa
a85faa
From 875d750a9329e4478f3dec107d77041d51a12742 Mon Sep 17 00:00:00 2001
a85faa
From: Beniamino Galvani <bgalvani@redhat.com>
a85faa
Date: Tue, 30 Aug 2016 16:37:54 +0200
a85faa
Subject: [PATCH 3/3] libnm: restore verify() comments in team/team-port
a85faa
 settings
a85faa
a85faa
Restore the comments removed in commit
a85faa
a524091966afb884cdb8db48067d5599a685a8eb.
a85faa
a85faa
(cherry picked from commit d06279f3db794f5c7177d85b4dd5e732d6a90364)
a85faa
(cherry picked from commit bf422e972abe9c14b385401ad72b01f3fcef8d40)
a85faa
---
a85faa
 libnm-core/nm-setting-team-port.c | 3 +++
a85faa
 libnm-core/nm-setting-team.c      | 3 +++
a85faa
 2 files changed, 6 insertions(+)
a85faa
a85faa
diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c
a85faa
index 123304f..e3ddbda 100644
a85faa
--- a/libnm-core/nm-setting-team-port.c
a85faa
+++ b/libnm-core/nm-setting-team-port.c
a85faa
@@ -127,6 +127,9 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
a85faa
 		}
a85faa
 	}
a85faa
 
a85faa
+	/* NOTE: normalizable/normalizable-errors must appear at the end with decreasing severity.
a85faa
+	 * Take care to properly order statements with priv->config above. */
a85faa
+
a85faa
 	return TRUE;
a85faa
 }
a85faa
 
a85faa
diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c
a85faa
index df89694..5bf11ed 100644
a85faa
--- a/libnm-core/nm-setting-team.c
a85faa
+++ b/libnm-core/nm-setting-team.c
a85faa
@@ -99,6 +99,9 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
a85faa
 		}
a85faa
 	}
a85faa
 
a85faa
+	/* NOTE: normalizable/normalizable-errors must appear at the end with decreasing severity.
a85faa
+	 * Take care to properly order statements with priv->config above. */
a85faa
+
a85faa
 	return TRUE;
a85faa
 }
a85faa
 
a85faa
-- 
a85faa
2.5.5
a85faa