about summary refs log tree commit diff
path: root/libnm-util/nm-setting-ip4-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-util/nm-setting-ip4-config.c')
-rw-r--r--libnm-util/nm-setting-ip4-config.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c
index c6becefb..90534c12 100644
--- a/libnm-util/nm-setting-ip4-config.c
+++ b/libnm-util/nm-setting-ip4-config.c
@@ -678,6 +678,15 @@ nm_setting_ip4_config_get_may_fail (NMSettingIP4Config *setting)
 	return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->may_fail;
 }
 
+static gint
+find_setting_by_name (gconstpointer a, gconstpointer b)
+{
+	NMSetting *setting = NM_SETTING (a);
+	const char *str = (const char *) b;
+
+	return strcmp (nm_setting_get_name (setting), str);
+}
+
 static gboolean
 verify (NMSetting *setting, GSList *all_settings, GError **error)
 {
@@ -737,6 +746,22 @@ verify (NMSetting *setting, GSList *all_settings, GError **error)
 		return FALSE;
 	}
 
+	/* Disabled method is not allowed when IPv6 is set to 'ignore' */
+	if (!strcmp (priv->method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED)) {
+		GSList *list = g_slist_find_custom (all_settings, NM_SETTING_IP6_CONFIG_SETTING_NAME, find_setting_by_name);
+		if (list) {
+			NMSettingIP6Config *s_ip6 = g_slist_nth_data (list, 0);
+			if (   s_ip6
+			    && !g_strcmp0 (nm_setting_ip6_config_get_method (s_ip6), NM_SETTING_IP6_CONFIG_METHOD_IGNORE)) {
+				g_set_error (error,
+				             NM_SETTING_IP4_CONFIG_ERROR,
+				             NM_SETTING_IP4_CONFIG_ERROR_INVALID_PROPERTY,
+				             NM_SETTING_IP4_CONFIG_METHOD);
+				return FALSE;
+			}
+		}
+	}
+
 	if (priv->dhcp_client_id && !strlen (priv->dhcp_client_id)) {
 		g_set_error (error,
 		             NM_SETTING_IP4_CONFIG_ERROR,
@@ -818,6 +843,8 @@ finalize (GObject *object)
 	NMSettingIP4ConfigPrivate *priv = NM_SETTING_IP4_CONFIG_GET_PRIVATE (self);
 
 	g_free (priv->method);
+	g_free (priv->dhcp_hostname);
+	g_free (priv->dhcp_client_id);
 
 	g_array_free (priv->dns, TRUE);