summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-09-02 15:00:08 +0200
committerThomas Haller <thaller@redhat.com>2016-09-02 20:09:17 +0200
commit2091e09f867efb480c787785d9f378640c678591 (patch)
tree0e9e530e0f22b1d70a0be2aea082d0ce72be8c47
parentc7cb9319788379d96468c7e93992ab994ce89199 (diff)
downloadNetworkManager-th/empty-cloned-mac-address-rh1372799.tar.gz
libnm: fix regression serializing empty "cloned-mac-address"th/empty-cloned-mac-address-rh1372799
For "cloned-mac-address", the empty string "" is an invalid value that is rejected by verify(). Commit 8eed671 changed how the property is serialized to D-Bus. Before, it was serialized using _nm_utils_hwaddr_to_dbus(). For invalid or empty addresses, this would not serialize the value on D-Bus (or before commit 76aa6f8e0, it would create a bogus value with no array elements). With commit 8eed671, the cloned-mac-address gets also serialized as "assigned-mac-address" via _nm_utils_hwaddr_cloned_data_synth(), which would pass on invalid strings that the server would then reject. That breaks for example nmtui. Try editing a connection with "cloned-mac-address" set to NULL. Note, as long as you don't edit the cloned MAC address in nmtui, you can save the modification. Once you start modifying the entry, you can no longer set an empty MAC address as the server now receiveds the empty string as invalid. Thus, the "OK" button fails with Unable to save connection: 802-3-ethernet.cloned-mac-address: is not a valid MAC address It also means, nmtui cannot modify the "cloned-mac-address" field to become empty. Fix that problem at various places by coercing "" to NULL. Fixes: 8eed67122c58540360b617eb42d5df8328e21b5d https://bugzilla.redhat.com/show_bug.cgi?id=1372799
-rw-r--r--clients/tui/nmt-mac-entry.c3
-rw-r--r--libnm-core/nm-utils.c19
2 files changed, 19 insertions, 3 deletions
diff --git a/clients/tui/nmt-mac-entry.c b/clients/tui/nmt-mac-entry.c
index da7f55fac1..5650f946de 100644
--- a/clients/tui/nmt-mac-entry.c
+++ b/clients/tui/nmt-mac-entry.c
@@ -201,7 +201,8 @@ nmt_mac_entry_get_property (GObject *object,
g_value_set_int (value, priv->mac_length);
break;
case PROP_MAC_ADDRESS:
- g_value_set_string (value, nmt_newt_entry_get_text (NMT_NEWT_ENTRY (object)));
+ g_value_set_string (value,
+ nm_strdup_not_empty (nmt_newt_entry_get_text (NMT_NEWT_ENTRY (object))));
break;
case PROP_ENTRY_TYPE:
g_value_set_int (value, priv->entry_type);
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index a31a91906f..5c2c1299b1 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -3425,7 +3425,22 @@ _nm_utils_hwaddr_cloned_data_synth (NMSetting *setting,
"cloned-mac-address",
&addr,
NULL);
- return addr ? g_variant_new_string (addr) : NULL;
+
+ /* Before introducing the extended "cloned-mac-address" (and its D-Bus
+ * field "assigned-mac-address"), libnm and _nm_utils_hwaddr_to_dbus
+ * would drop invalid values as it was unable to serialize them.
+ *
+ * Now, we would like to send invalid values as "assigned-mac-address"
+ * over D-Bus and let the server reject them.
+ *
+ * However, clients used to set the cloned-mac-address property
+ * to "" and it just worked as the value was not serialized in
+ * an ill form.
+ *
+ * To preserve that behavior, seralize "" as NULL.
+ */
+
+ return addr && addr[0] ? g_variant_new_string (addr) : NULL;
}
gboolean
@@ -3443,7 +3458,7 @@ _nm_utils_hwaddr_cloned_data_set (NMSetting *setting,
g_object_set (setting,
"cloned-mac-address",
- g_variant_get_string (value, NULL),
+ nm_strdup_not_empty (g_variant_get_string (value, NULL)),
NULL);
return TRUE;
}