diff options
| author | Michael Biebl <biebl@debian.org> | 2023-02-10 11:50:34 +0100 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2023-02-10 11:50:34 +0100 |
| commit | 1372848511cb896b80b51ed1a3e9606bd9816631 (patch) | |
| tree | 674792b9385bdef935988894b45f06b2af39f88c /src/libnm-core-impl/nm-setting-ovs-external-ids.c | |
| parent | 40ec077ea305994c1fc2130add6787ca0c73e2c6 (diff) | |
New upstream version 1.42.0 upstream/1.42.0
Diffstat (limited to 'src/libnm-core-impl/nm-setting-ovs-external-ids.c')
| -rw-r--r-- | src/libnm-core-impl/nm-setting-ovs-external-ids.c | 122 |
1 files changed, 68 insertions, 54 deletions
diff --git a/src/libnm-core-impl/nm-setting-ovs-external-ids.c b/src/libnm-core-impl/nm-setting-ovs-external-ids.c index f4e31f81..54684380 100644 --- a/src/libnm-core-impl/nm-setting-ovs-external-ids.c +++ b/src/libnm-core-impl/nm-setting-ovs-external-ids.c @@ -10,6 +10,7 @@ #include "nm-setting-private.h" #include "nm-utils-private.h" #include "nm-connection-private.h" +#include "nm-setting-ovs-other-config.h" #define MAX_NUM_KEYS 256 @@ -53,15 +54,6 @@ G_DEFINE_TYPE(NMSettingOvsExternalIDs, nm_setting_ovs_external_ids, NM_TYPE_SETT /*****************************************************************************/ -static gboolean -_exid_key_char_is_regular(char ch) -{ - /* allow words of printable characters, plus some - * special characters, for example to support base64 encoding. */ - return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') - || NM_IN_SET(ch, '-', '_', '+', '/', '=', '.'); -} - /** * nm_setting_ovs_external_ids_check_key: * @key: (allow-none): the key to check @@ -105,7 +97,7 @@ nm_setting_ovs_external_ids_check_key(const char *key, GError **error) _("key must be UTF8")); return FALSE; } - if (!NM_STRCHAR_ALL(key, ch, _exid_key_char_is_regular(ch))) { + if (!NM_STRCHAR_ALL(key, ch, nm_ascii_is_regular_char(ch))) { /* Probably OVS is more forgiving about what makes a valid key for * an external-id. However, we are strict (at least, for now). */ g_set_error_literal(error, @@ -127,6 +119,56 @@ nm_setting_ovs_external_ids_check_key(const char *key, GError **error) return TRUE; } +gboolean +_nm_setting_ovs_verify_connection_type(GType gtype, NMConnection *connection, GError **error) +{ + NMSettingConnection *s_con; + const char *type; + const char *slave_type; + + nm_assert(!connection || NM_IS_CONNECTION(connection)); + nm_assert(NM_IN_SET(gtype, NM_TYPE_SETTING_OVS_EXTERNAL_IDS, NM_TYPE_SETTING_OVS_OTHER_CONFIG)); + nm_assert(!error || !*error); + + if (!connection) { + /* We don't know. It's valid. */ + return TRUE; + } + + type = nm_connection_get_connection_type(connection); + if (!type) { + NMSetting *s_base; + + s_base = _nm_connection_find_base_type_setting(connection); + if (s_base) + type = nm_setting_get_name(s_base); + } + if (NM_IN_STRSET(type, + NM_SETTING_OVS_BRIDGE_SETTING_NAME, + NM_SETTING_OVS_PORT_SETTING_NAME, + NM_SETTING_OVS_INTERFACE_SETTING_NAME)) + return TRUE; + + if ((s_con = nm_connection_get_setting_connection(connection)) + && _nm_connection_detect_slave_type_full(s_con, + connection, + &slave_type, + NULL, + NULL, + NULL, + NULL) + && nm_streq0(slave_type, NM_SETTING_OVS_PORT_SETTING_NAME)) + return TRUE; + + g_set_error(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("OVS %s can only be added to a profile of type OVS " + "bridge/port/interface or to OVS system interface"), + gtype == NM_TYPE_SETTING_OVS_EXTERNAL_IDS ? "external-ids" : "other-config"); + return FALSE; +} + /** * nm_setting_ovs_external_ids_check_val: * @val: (allow-none): the value to check @@ -204,6 +246,8 @@ nm_setting_ovs_external_ids_get_data_keys(NMSettingOvsExternalIDs *setting, guin NMSettingOvsExternalIDs *self = setting; NMSettingOvsExternalIDsPrivate *priv; + NM_SET_OUT(out_len, 0); + g_return_val_if_fail(NM_IS_SETTING_OVS_EXTERNAL_IDS(self), NULL); priv = NM_SETTING_OVS_EXTERNAL_IDS_GET_PRIVATE(self); @@ -302,12 +346,16 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) if (priv->data) { gs_free_error GError *local = NULL; - GHashTableIter iter; - const char *key; - const char *val; + const char *const *keys; + guint len; + guint i; + + keys = nm_setting_ovs_external_ids_get_data_keys(self, &len); + + for (i = 0; i < len; i++) { + const char *key = keys[i]; + const char *val = g_hash_table_lookup(priv->data, key); - g_hash_table_iter_init(&iter, priv->data); - while (g_hash_table_iter_next(&iter, (gpointer *) &key, (gpointer *) &val)) { if (!nm_setting_ovs_external_ids_check_key(key, &local)) { g_set_error(error, NM_CONNECTION_ERROR, @@ -336,7 +384,7 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) g_set_error(error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("maximum number of user data entries reached (%u instead of %u)"), + _("maximum number of entries reached (%u instead of %u)"), g_hash_table_size(priv->data), (unsigned) MAX_NUM_KEYS); g_prefix_error(error, @@ -346,44 +394,10 @@ verify(NMSetting *setting, NMConnection *connection, GError **error) return FALSE; } - if (connection) { - NMSettingConnection *s_con; - const char *type; - const char *slave_type; - - type = nm_connection_get_connection_type(connection); - if (!type) { - NMSetting *s_base; - - s_base = _nm_connection_find_base_type_setting(connection); - if (s_base) - type = nm_setting_get_name(s_base); - } - if (NM_IN_STRSET(type, - NM_SETTING_OVS_BRIDGE_SETTING_NAME, - NM_SETTING_OVS_PORT_SETTING_NAME, - NM_SETTING_OVS_INTERFACE_SETTING_NAME)) - goto connection_type_is_good; - - if ((s_con = nm_connection_get_setting_connection(connection)) - && _nm_connection_detect_slave_type_full(s_con, - connection, - &slave_type, - NULL, - NULL, - NULL, - NULL) - && nm_streq0(slave_type, NM_SETTING_OVS_PORT_SETTING_NAME)) - goto connection_type_is_good; - - g_set_error_literal(error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _("OVS external IDs can only be added to a profile of type OVS " - "bridge/port/interface or to OVS system interface")); + if (!_nm_setting_ovs_verify_connection_type(NM_TYPE_SETTING_OVS_EXTERNAL_IDS, + connection, + error)) return FALSE; - } -connection_type_is_good: return TRUE; } @@ -519,7 +533,7 @@ nm_setting_ovs_external_ids_class_init(NMSettingOvsExternalIDsClass *klass) /** * NMSettingOvsExternalIDs:data: (type GHashTable(utf8,utf8)) * - * A dictionary of key/value pairs with exernal-ids for OVS. + * A dictionary of key/value pairs with external-ids for OVS. * * Since: 1.30 **/ |