From 81bfce7c47fd85979152c52b8e142eb44e04b1a7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 9 Jan 2024 10:18:57 +0100 Subject: [PATCH 1/7] glib-aux: convert nmtst_assert_setting_verifies() to a macro The macro has the advantage, that it preserves the file and line number from the caller. --- src/libnm-glib-aux/nm-test-utils.h | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/libnm-glib-aux/nm-test-utils.h b/src/libnm-glib-aux/nm-test-utils.h index 34b83beeef..2a6a5d3a5a 100644 --- a/src/libnm-glib-aux/nm-test-utils.h +++ b/src/libnm-glib-aux/nm-test-utils.h @@ -2566,20 +2566,21 @@ nmtst_assert_connection_unnormalizable(NMConnection *con, g_clear_error(&error); } -static inline void -nmtst_assert_setting_verifies(NMSetting *setting) -{ - /* assert that the setting verifies without an error */ - - GError *error = NULL; - gboolean success; - - g_assert(NM_IS_SETTING(setting)); - - success = nm_setting_verify(setting, NULL, &error); - g_assert_no_error(error); - g_assert(success); -} +#define nmtst_assert_setting_verifies(setting) \ + G_STMT_START \ + { \ + NMSetting *_setting = NM_SETTING(setting); \ + GError *_error = NULL; \ + gboolean _success; \ + \ + /* assert that the setting verifies without an error */ \ + \ + g_assert(NM_IS_SETTING(_setting)); \ + \ + _success = nm_setting_verify(_setting, NULL, &_error); \ + nmtst_assert_success(_success, _error); \ + } \ + G_STMT_END #if defined(__NM_SIMPLE_CONNECTION_H__) && NM_CHECK_VERSION(1, 10, 0) \ && (!defined(NM_VERSION_MAX_ALLOWED) || NM_VERSION_MAX_ALLOWED >= NM_VERSION_1_10) From b025bd92d9a62fef1c397f5281622db7d380e19a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 9 Jan 2024 10:20:04 +0100 Subject: [PATCH 2/7] libnm/tests: use nmtst_assert_setting_verifies() in test_setting_gsm_apn_bad_chars() test This shows the GError in case of failure, which is useful for debugging the test. --- src/libnm-core-impl/tests/test-general.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libnm-core-impl/tests/test-general.c b/src/libnm-core-impl/tests/test-general.c index a29ccec8ac..4acf33e0a4 100644 --- a/src/libnm-core-impl/tests/test-general.c +++ b/src/libnm-core-impl/tests/test-general.c @@ -2643,7 +2643,7 @@ test_setting_gsm_apn_bad_chars(void) /* Make sure a valid APN works */ g_object_set(s_gsm, NM_SETTING_GSM_APN, "foobar123.-baz", NULL); - g_assert(nm_setting_verify(NM_SETTING(s_gsm), NULL, NULL)); + nmtst_assert_setting_verifies(s_gsm); /* Random invalid chars */ g_object_set(s_gsm, NM_SETTING_GSM_APN, "@#%$@#%@#%", NULL); @@ -2655,7 +2655,7 @@ test_setting_gsm_apn_bad_chars(void) /* 0 characters long */ g_object_set(s_gsm, NM_SETTING_GSM_APN, "", NULL); - g_assert(nm_setting_verify(NM_SETTING(s_gsm), NULL, NULL)); + nmtst_assert_setting_verifies(s_gsm); /* 65-character long */ g_object_set(s_gsm, From e6abcb4d6706e48c154d7129ee0b026f8868875b Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 8 Jan 2024 11:32:56 +0100 Subject: [PATCH 3/7] libnm: add generic code for verifying properties in NMSetting Current verifications happens by implementing NMSetting's verify(). Add code for a second step of validation, that can operate based on the known type. The use case will be to reject empty strings. --- src/libnm-core-impl/nm-setting.c | 57 ++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/libnm-core-impl/nm-setting.c b/src/libnm-core-impl/nm-setting.c index 224361fdfd..ed0df70028 100644 --- a/src/libnm-core-impl/nm-setting.c +++ b/src/libnm-core-impl/nm-setting.c @@ -2405,17 +2405,68 @@ nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error) return result == NM_SETTING_VERIFY_SUCCESS || result == NM_SETTING_VERIFY_NORMALIZABLE; } +static gboolean +_verify_properties(NMSetting *setting, GError **error) +{ + NMSettingClass *klass = NM_SETTING_GET_CLASS(setting); + const NMSettInfoSetting *sett_info = _nm_setting_class_get_sett_info(klass); + guint16 i; + + if (!sett_info) + return TRUE; + + for (i = 0; i < sett_info->property_infos_len; i++) { + const NMSettInfoProperty *property_info = &sett_info->property_infos[i]; + + switch (property_info->property_type->direct_type) { + case NM_VALUE_TYPE_BOOL: + case NM_VALUE_TYPE_BYTES: + case NM_VALUE_TYPE_STRV: + case NM_VALUE_TYPE_ENUM: + case NM_VALUE_TYPE_FLAGS: + case NM_VALUE_TYPE_INT32: + case NM_VALUE_TYPE_INT64: + case NM_VALUE_TYPE_NONE: + case NM_VALUE_TYPE_UINT32: + case NM_VALUE_TYPE_UINT64: + case NM_VALUE_TYPE_STRING: + break; + default: + nm_assert_not_reached(); + } + } + + return TRUE; +} + NMSettingVerifyResult _nm_setting_verify(NMSetting *setting, NMConnection *connection, GError **error) { + NMSettingClass *klass; + NMSettingVerifyResult r; + g_return_val_if_fail(NM_IS_SETTING(setting), NM_SETTING_VERIFY_ERROR); g_return_val_if_fail(!connection || NM_IS_CONNECTION(connection), NM_SETTING_VERIFY_ERROR); g_return_val_if_fail(!error || *error == NULL, NM_SETTING_VERIFY_ERROR); - if (NM_SETTING_GET_CLASS(setting)->verify) - return NM_SETTING_GET_CLASS(setting)->verify(setting, connection, error); + klass = NM_SETTING_GET_CLASS(setting); - return NM_SETTING_VERIFY_SUCCESS; + if (!klass->verify) + return NM_SETTING_VERIFY_SUCCESS; + + r = klass->verify(setting, connection, error); + + if (r != NM_SETTING_VERIFY_ERROR) { + gs_free_error GError *local = NULL; + + if (!_verify_properties(setting, &local)) { + g_clear_error(error); + g_propagate_error(error, g_steal_pointer(&local)); + r = NM_SETTING_VERIFY_ERROR; + } + } + + return r; } /** From d8e51faee7b39414d8c70952cd4768a1e677529a Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 8 Jan 2024 11:46:53 +0100 Subject: [PATCH 4/7] libnm: add direct_string_allow_empty meta data for NMSetting property Most string properties should not accept empty strings. Add a generic way to reject them during verify. Add a new flag NMSettInfoProperty.direct_string_allow_empty. Note that properties must opt-in to allow empty values. Since all existing properties didn't have this check (but hopefully re-implemented it in verify()), all existing properties get this flag set to TRUE. The main point here it that new properties get the strict check by default. We should also review existing uses of direct_string_allow_empty, whether the flag can be cleared. This can be done if verify() already enforces a non-empty string, or if we accept to break behavior by tightening up the check. --- src/libnm-core-impl/nm-setting-6lowpan.c | 3 +- src/libnm-core-impl/nm-setting-8021x.c | 72 ++++++++++++------- src/libnm-core-impl/nm-setting-adsl.c | 12 ++-- src/libnm-core-impl/nm-setting-bluetooth.c | 3 +- src/libnm-core-impl/nm-setting-bridge.c | 6 +- src/libnm-core-impl/nm-setting-cdma.c | 9 ++- src/libnm-core-impl/nm-setting-connection.c | 33 ++++++--- src/libnm-core-impl/nm-setting-dcb.c | 3 +- src/libnm-core-impl/nm-setting-gsm.c | 30 +++++--- src/libnm-core-impl/nm-setting-hsr.c | 6 +- src/libnm-core-impl/nm-setting-infiniband.c | 6 +- src/libnm-core-impl/nm-setting-ip-config.c | 12 ++-- src/libnm-core-impl/nm-setting-ip-tunnel.c | 15 ++-- src/libnm-core-impl/nm-setting-ip4-config.c | 9 ++- src/libnm-core-impl/nm-setting-ip6-config.c | 9 ++- src/libnm-core-impl/nm-setting-macsec.c | 9 ++- src/libnm-core-impl/nm-setting-macvlan.c | 3 +- src/libnm-core-impl/nm-setting-ovs-bridge.c | 6 +- src/libnm-core-impl/nm-setting-ovs-dpdk.c | 3 +- .../nm-setting-ovs-interface.c | 3 +- src/libnm-core-impl/nm-setting-ovs-patch.c | 3 +- src/libnm-core-impl/nm-setting-ovs-port.c | 9 ++- src/libnm-core-impl/nm-setting-pppoe.c | 12 ++-- src/libnm-core-impl/nm-setting-private.h | 1 + src/libnm-core-impl/nm-setting-proxy.c | 6 +- src/libnm-core-impl/nm-setting-tun.c | 6 +- src/libnm-core-impl/nm-setting-veth.c | 3 +- src/libnm-core-impl/nm-setting-vlan.c | 6 +- src/libnm-core-impl/nm-setting-vpn.c | 6 +- src/libnm-core-impl/nm-setting-vxlan.c | 9 ++- src/libnm-core-impl/nm-setting-wifi-p2p.c | 3 +- src/libnm-core-impl/nm-setting-wimax.c | 3 +- src/libnm-core-impl/nm-setting-wired.c | 15 ++-- src/libnm-core-impl/nm-setting-wireguard.c | 3 +- .../nm-setting-wireless-security.c | 27 ++++--- src/libnm-core-impl/nm-setting-wireless.c | 9 ++- src/libnm-core-impl/nm-setting-wpan.c | 3 +- src/libnm-core-impl/nm-setting.c | 21 +++++- src/libnm-core-impl/tests/test-setting.c | 9 +++ src/libnm-core-intern/nm-core-internal.h | 17 +++++ 40 files changed, 297 insertions(+), 126 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-6lowpan.c b/src/libnm-core-impl/nm-setting-6lowpan.c index eafc580b0e..7066c3e6bb 100644 --- a/src/libnm-core-impl/nm-setting-6lowpan.c +++ b/src/libnm-core-impl/nm-setting-6lowpan.c @@ -176,7 +176,8 @@ nm_setting_6lowpan_class_init(NMSetting6LowpanClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSetting6LowpanPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-8021x.c b/src/libnm-core-impl/nm-setting-8021x.c index 36934184ef..945fd6d3ff 100644 --- a/src/libnm-core-impl/nm-setting-8021x.c +++ b/src/libnm-core-impl/nm-setting-8021x.c @@ -3248,7 +3248,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_IDENTITY, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - identity); + identity, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:anonymous-identity: @@ -3269,7 +3270,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_ANONYMOUS_IDENTITY, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - anonymous_identity); + anonymous_identity, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:pac-file: @@ -3289,7 +3291,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PAC_FILE, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - pac_file); + pac_file, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:ca-cert: @@ -3342,7 +3345,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_CA_CERT_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - ca_cert_password); + ca_cert_password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:ca-cert-password-flags: @@ -3380,7 +3384,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_CA_PATH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - ca_path); + ca_path, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:subject-match: @@ -3406,7 +3411,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, subject_match, - .is_deprecated = TRUE, ); + .is_deprecated = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:altsubject-matches: @@ -3453,7 +3459,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_DOMAIN_SUFFIX_MATCH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - domain_suffix_match); + domain_suffix_match, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:domain-match: @@ -3479,7 +3486,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_DOMAIN_MATCH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - domain_match); + domain_match, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:client-cert: @@ -3527,7 +3535,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_CLIENT_CERT_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - client_cert_password); + client_cert_password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:client-cert-password-flags: @@ -3566,7 +3575,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE1_PEAPVER, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase1_peapver); + phase1_peapver, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase1-peaplabel: @@ -3590,7 +3600,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE1_PEAPLABEL, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase1_peaplabel); + phase1_peaplabel, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase1-fast-provisioning: @@ -3616,7 +3627,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE1_FAST_PROVISIONING, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase1_fast_provisioning); + phase1_fast_provisioning, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase1-auth-flags: @@ -3680,7 +3692,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_AUTH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase2_auth); + phase2_auth, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-autheap: @@ -3707,7 +3720,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_AUTHEAP, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase2_autheap); + phase2_autheap, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-ca-cert: @@ -3754,7 +3768,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_CA_CERT_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - phase2_ca_cert_password); + phase2_ca_cert_password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-ca-cert-password-flags: @@ -3792,7 +3807,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_CA_PATH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase2_ca_path); + phase2_ca_path, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-subject-match: @@ -3819,7 +3835,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, phase2_subject_match, - .is_deprecated = TRUE, ); + .is_deprecated = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-altsubject-matches: @@ -3866,7 +3883,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_DOMAIN_SUFFIX_MATCH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase2_domain_suffix_match); + phase2_domain_suffix_match, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-domain-match: @@ -3893,7 +3911,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_DOMAIN_MATCH, NM_SETTING_PARAM_NONE, NMSetting8021xPrivate, - phase2_domain_match); + phase2_domain_match, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-client-cert: @@ -3944,7 +3963,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_CLIENT_CERT_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - phase2_client_cert_password); + phase2_client_cert_password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-client-cert-password-flags: @@ -3981,7 +4001,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - password); + password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:password-flags: @@ -4113,7 +4134,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PRIVATE_KEY_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - private_key_password); + private_key_password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:private-key-password-flags: @@ -4199,7 +4221,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PHASE2_PRIVATE_KEY_PASSWORD, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - phase2_private_key_password); + phase2_private_key_password, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:phase2-private-key-password-flags: @@ -4239,7 +4262,8 @@ nm_setting_802_1x_class_init(NMSetting8021xClass *klass) PROP_PIN, NM_SETTING_PARAM_SECRET, NMSetting8021xPrivate, - pin); + pin, + .direct_string_allow_empty = TRUE); /** * NMSetting8021x:pin-flags: diff --git a/src/libnm-core-impl/nm-setting-adsl.c b/src/libnm-core-impl/nm-setting-adsl.c index 3336c27471..f9aacb83f4 100644 --- a/src/libnm-core-impl/nm-setting-adsl.c +++ b/src/libnm-core-impl/nm-setting-adsl.c @@ -283,7 +283,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass) PROP_USERNAME, NM_SETTING_PARAM_NONE, NMSettingAdslPrivate, - username); + username, + .direct_string_allow_empty = TRUE); /** * NMSettingAdsl:password: @@ -296,7 +297,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass) PROP_PASSWORD, NM_SETTING_PARAM_SECRET, NMSettingAdslPrivate, - password); + password, + .direct_string_allow_empty = TRUE); /** * NMSettingAdsl:password-flags: @@ -322,7 +324,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass) NM_SETTING_PARAM_NONE, NMSettingAdslPrivate, protocol, - .direct_set_string_ascii_strdown = TRUE); + .direct_set_string_ascii_strdown = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingAdsl:encapsulation: @@ -336,7 +339,8 @@ nm_setting_adsl_class_init(NMSettingAdslClass *klass) NM_SETTING_PARAM_NONE, NMSettingAdslPrivate, encapsulation, - .direct_set_string_ascii_strdown = TRUE); + .direct_set_string_ascii_strdown = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingAdsl:vpi: diff --git a/src/libnm-core-impl/nm-setting-bluetooth.c b/src/libnm-core-impl/nm-setting-bluetooth.c index 795379f39b..3c2605a17e 100644 --- a/src/libnm-core-impl/nm-setting-bluetooth.c +++ b/src/libnm-core-impl/nm-setting-bluetooth.c @@ -283,7 +283,8 @@ nm_setting_bluetooth_class_init(NMSettingBluetoothClass *klass) PROP_TYPE, NM_SETTING_PARAM_INFERRABLE, NMSettingBluetoothPrivate, - type); + type, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-bridge.c b/src/libnm-core-impl/nm-setting-bridge.c index 253214b590..7e9a09649b 100644 --- a/src/libnm-core-impl/nm-setting-bridge.c +++ b/src/libnm-core-impl/nm-setting-bridge.c @@ -1811,7 +1811,8 @@ nm_setting_bridge_class_init(NMSettingBridgeClass *klass) PROP_VLAN_PROTOCOL, NM_SETTING_PARAM_INFERRABLE, NMSettingBridge, - _priv.vlan_protocol); + _priv.vlan_protocol, + .direct_string_allow_empty = TRUE); /** * NMSettingBridge:vlan-stats-enabled: @@ -1862,7 +1863,8 @@ nm_setting_bridge_class_init(NMSettingBridgeClass *klass) PROP_MULTICAST_ROUTER, NM_SETTING_PARAM_INFERRABLE, NMSettingBridge, - _priv.multicast_router); + _priv.multicast_router, + .direct_string_allow_empty = TRUE); /** * NMSettingBridge:multicast-query-use-ifaddr: diff --git a/src/libnm-core-impl/nm-setting-cdma.c b/src/libnm-core-impl/nm-setting-cdma.c index f27f71a24a..b497cf14e1 100644 --- a/src/libnm-core-impl/nm-setting-cdma.c +++ b/src/libnm-core-impl/nm-setting-cdma.c @@ -236,7 +236,8 @@ nm_setting_cdma_class_init(NMSettingCdmaClass *klass) PROP_NUMBER, NM_SETTING_PARAM_NONE, NMSettingCdmaPrivate, - number); + number, + .direct_string_allow_empty = TRUE); /** * NMSettingCdma:username: @@ -251,7 +252,8 @@ nm_setting_cdma_class_init(NMSettingCdmaClass *klass) PROP_USERNAME, NM_SETTING_PARAM_NONE, NMSettingCdmaPrivate, - username); + username, + .direct_string_allow_empty = TRUE); /** * NMSettingCdma:password: @@ -266,7 +268,8 @@ nm_setting_cdma_class_init(NMSettingCdmaClass *klass) PROP_PASSWORD, NM_SETTING_PARAM_SECRET, NMSettingCdmaPrivate, - password); + password, + .direct_string_allow_empty = TRUE); /** * NMSettingCdma:password-flags: diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c index 4c9ece00f3..909ddc6acd 100644 --- a/src/libnm-core-impl/nm-setting-connection.c +++ b/src/libnm-core-impl/nm-setting-connection.c @@ -2021,7 +2021,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) .from_dbus_is_full = TRUE, .from_dbus_direct_allow_transform = TRUE), NMSettingConnectionPrivate, - id); + id, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:uuid: @@ -2064,7 +2065,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) PROP_UUID, NM_SETTING_PARAM_FUZZY_IGNORE, NMSettingConnectionPrivate, - uuid); + uuid, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:stable-id: @@ -2122,7 +2124,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) PROP_STABLE_ID, NM_SETTING_PARAM_FUZZY_IGNORE, NMSettingConnectionPrivate, - stable_id); + stable_id, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:interface-name: @@ -2163,7 +2166,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) .from_dbus_is_full = TRUE, .from_dbus_direct_allow_transform = TRUE), NMSettingConnectionPrivate, - interface_name); + interface_name, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:type: @@ -2190,7 +2194,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) NM_SETTING_PARAM_INFERRABLE, NMSettingConnectionPrivate, type, - .direct_string_is_refstr = TRUE); + .direct_string_is_refstr = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:permissions: @@ -2422,7 +2427,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) NM_SETTING_PARAM_FUZZY_IGNORE | NM_SETTING_PARAM_REAPPLY_IMMEDIATELY, NMSettingConnectionPrivate, - zone); + zone, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:master: @@ -2453,7 +2459,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) .from_dbus_fcn = _nm_setting_connection_master_from_dbus, ), NMSettingConnectionPrivate, controller, - .is_deprecated = 1); + .direct_string_allow_empty = TRUE, + .is_deprecated = TRUE); /** * NMSettingConnection:controller: @@ -2474,7 +2481,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) _nm_setting_connection_controller_from_dbus), NMSettingConnectionPrivate, controller, - .direct_also_notify = obj_properties[PROP_MASTER]); + .direct_string_allow_empty = TRUE, + .direct_also_notify = obj_properties[PROP_MASTER]); nm_g_array_index(properties_override, NMSettInfoProperty, prop_idx).direct_also_notify = obj_properties[PROP_CONTROLLER]; @@ -2512,7 +2520,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) _nm_setting_connection_slave_type_from_dbus, ), NMSettingConnectionPrivate, port_type, - .is_deprecated = 1); + .is_deprecated = 1, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:port-type: @@ -2537,7 +2546,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) _nm_setting_connection_port_type_from_dbus, ), NMSettingConnectionPrivate, port_type, - .direct_also_notify = obj_properties[PROP_SLAVE_TYPE]); + .direct_string_allow_empty = TRUE, + .direct_also_notify = obj_properties[PROP_SLAVE_TYPE]); nm_g_array_index(properties_override, NMSettInfoProperty, prop_idx).direct_also_notify = obj_properties[PROP_PORT_TYPE]; @@ -2987,7 +2997,8 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) PROP_MUD_URL, NM_SETTING_PARAM_NONE, NMSettingConnectionPrivate, - mud_url); + mud_url, + .direct_string_allow_empty = TRUE); /** * NMSettingConnection:wait-activation-delay: diff --git a/src/libnm-core-impl/nm-setting-dcb.c b/src/libnm-core-impl/nm-setting-dcb.c index cca51641a1..c59ee8b457 100644 --- a/src/libnm-core-impl/nm-setting-dcb.c +++ b/src/libnm-core-impl/nm-setting-dcb.c @@ -920,7 +920,8 @@ nm_setting_dcb_class_init(NMSettingDcbClass *klass) PROP_APP_FCOE_MODE, NM_SETTING_PARAM_NONE, NMSettingDcbPrivate, - app_fcoe_mode); + app_fcoe_mode, + .direct_string_allow_empty = TRUE); /** * NMSettingDcb:app-iscsi-flags: diff --git a/src/libnm-core-impl/nm-setting-gsm.c b/src/libnm-core-impl/nm-setting-gsm.c index 3271571902..0f06d276fa 100644 --- a/src/libnm-core-impl/nm-setting-gsm.c +++ b/src/libnm-core-impl/nm-setting-gsm.c @@ -602,7 +602,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, number, - .is_deprecated = TRUE, ); + .is_deprecated = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:username: @@ -617,7 +618,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_USERNAME, NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, - username); + username, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:password: @@ -632,7 +634,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_PASSWORD, NM_SETTING_PARAM_SECRET, NMSettingGsmPrivate, - password); + password, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:password-flags: @@ -663,7 +666,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, apn, - .direct_set_string_strip = TRUE); + .direct_set_string_strip = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:network-id: @@ -681,7 +685,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, network_id, - .direct_set_string_strip = TRUE); + .direct_set_string_strip = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:pin: @@ -696,7 +701,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_PIN, NM_SETTING_PARAM_SECRET, NMSettingGsmPrivate, - pin); + pin, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:pin-flags: @@ -740,7 +746,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_DEVICE_ID, NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, - device_id); + device_id, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:sim-id: @@ -758,7 +765,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_SIM_ID, NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, - sim_id); + sim_id, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:sim-operator-id: @@ -777,7 +785,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_SIM_OPERATOR_ID, NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, - sim_operator_id); + sim_operator_id, + .direct_string_allow_empty = TRUE); /** * NMSettingGsm:mtu: @@ -831,7 +840,8 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) PROP_INITIAL_EPS_APN, NM_SETTING_PARAM_NONE, NMSettingGsmPrivate, - initial_eps_apn); + initial_eps_apn, + .direct_string_allow_empty = TRUE); /* Ignore incoming deprecated properties */ _nm_properties_override_dbus(properties_override, diff --git a/src/libnm-core-impl/nm-setting-hsr.c b/src/libnm-core-impl/nm-setting-hsr.c index d9a662b16f..d8b4d89bd8 100644 --- a/src/libnm-core-impl/nm-setting-hsr.c +++ b/src/libnm-core-impl/nm-setting-hsr.c @@ -209,7 +209,8 @@ nm_setting_hsr_class_init(NMSettingHsrClass *klass) PROP_PORT1, NM_SETTING_PARAM_INFERRABLE, NMSettingHsr, - _priv.port1); + _priv.port1, + .direct_string_allow_empty = TRUE); /** * NMSettingHsr:port2: @@ -224,7 +225,8 @@ nm_setting_hsr_class_init(NMSettingHsrClass *klass) PROP_PORT2, NM_SETTING_PARAM_INFERRABLE, NMSettingHsr, - _priv.port2); + _priv.port2, + .direct_string_allow_empty = TRUE); /** * NMSettingHsr:multicast-spec: diff --git a/src/libnm-core-impl/nm-setting-infiniband.c b/src/libnm-core-impl/nm-setting-infiniband.c index 74f8cb5177..203e4b2bda 100644 --- a/src/libnm-core-impl/nm-setting-infiniband.c +++ b/src/libnm-core-impl/nm-setting-infiniband.c @@ -414,7 +414,8 @@ nm_setting_infiniband_class_init(NMSettingInfinibandClass *klass) PROP_TRANSPORT_MODE, NM_SETTING_PARAM_INFERRABLE, NMSettingInfinibandPrivate, - transport_mode); + transport_mode, + .direct_string_allow_empty = TRUE); /** * NMSettingInfiniband:p-key: @@ -480,7 +481,8 @@ nm_setting_infiniband_class_init(NMSettingInfinibandClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingInfinibandPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-ip-config.c b/src/libnm-core-impl/nm-setting-ip-config.c index d4547655d1..bfebe7d13d 100644 --- a/src/libnm-core-impl/nm-setting-ip-config.c +++ b/src/libnm-core-impl/nm-setting-ip-config.c @@ -5951,7 +5951,8 @@ _nm_sett_info_property_override_create_array_ip_config(int addr_family) properties_override, obj_properties[PROP_METHOD], &nm_sett_info_propert_type_direct_string, - .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, method)); + .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, method), + .direct_string_allow_empty = TRUE); _nm_properties_override_gobj( properties_override, @@ -5964,20 +5965,23 @@ _nm_sett_info_property_override_create_array_ip_config(int addr_family) .from_dbus_fcn = _nm_setting_property_from_dbus_fcn_direct_ip_config_gateway), .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, gateway), .direct_set_string_ip_address_addr_family = addr_family + 1, - .direct_set_string_ip_address_addr_family_map_zero_to_null = TRUE); + .direct_set_string_ip_address_addr_family_map_zero_to_null = TRUE, + .direct_string_allow_empty = TRUE); _nm_properties_override_gobj( properties_override, obj_properties[PROP_DHCP_HOSTNAME], &nm_sett_info_propert_type_direct_string, .direct_offset = - NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_hostname)); + NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_hostname), + .direct_string_allow_empty = TRUE); _nm_properties_override_gobj( properties_override, obj_properties[PROP_DHCP_IAID], &nm_sett_info_propert_type_direct_string, - .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_iaid)); + .direct_offset = NM_STRUCT_OFFSET_ENSURE_TYPE(char *, NMSettingIPConfigPrivate, dhcp_iaid), + .direct_string_allow_empty = TRUE); /* ---dbus--- * property: routing-rules diff --git a/src/libnm-core-impl/nm-setting-ip-tunnel.c b/src/libnm-core-impl/nm-setting-ip-tunnel.c index f04842067d..3512ff2e68 100644 --- a/src/libnm-core-impl/nm-setting-ip-tunnel.c +++ b/src/libnm-core-impl/nm-setting-ip-tunnel.c @@ -584,7 +584,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingIPTunnelPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); /** * NMSettingIPTunnel:mode: @@ -630,7 +631,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass) PROP_LOCAL, NM_SETTING_PARAM_INFERRABLE, NMSettingIPTunnelPrivate, - local); + local, + .direct_string_allow_empty = TRUE); /** * NMSettingIPTunnel:remote: @@ -646,7 +648,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass) PROP_REMOTE, NM_SETTING_PARAM_INFERRABLE, NMSettingIPTunnelPrivate, - remote); + remote, + .direct_string_allow_empty = TRUE); /** * NMSettingIPTunnel:ttl @@ -716,7 +719,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass) PROP_INPUT_KEY, NM_SETTING_PARAM_INFERRABLE, NMSettingIPTunnelPrivate, - input_key); + input_key, + .direct_string_allow_empty = TRUE); /** * NMSettingIPTunnel:output-key: @@ -732,7 +736,8 @@ nm_setting_ip_tunnel_class_init(NMSettingIPTunnelClass *klass) PROP_OUTPUT_KEY, NM_SETTING_PARAM_INFERRABLE, NMSettingIPTunnelPrivate, - output_key); + output_key, + .direct_string_allow_empty = TRUE); /** * NMSettingIPTunnel:encapsulation-limit: diff --git a/src/libnm-core-impl/nm-setting-ip4-config.c b/src/libnm-core-impl/nm-setting-ip4-config.c index 09ce3a25df..92495125ea 100644 --- a/src/libnm-core-impl/nm-setting-ip4-config.c +++ b/src/libnm-core-impl/nm-setting-ip4-config.c @@ -919,7 +919,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) PROP_DHCP_CLIENT_ID, NM_SETTING_PARAM_NONE, NMSettingIP4ConfigPrivate, - dhcp_client_id); + dhcp_client_id, + .direct_string_allow_empty = TRUE); /* ---ifcfg-rh--- * property: dad-timeout @@ -972,7 +973,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) PROP_DHCP_FQDN, NM_SETTING_PARAM_NONE, NMSettingIP4ConfigPrivate, - dhcp_fqdn); + dhcp_fqdn, + .direct_string_allow_empty = TRUE); /** * NMSettingIP4Config:dhcp-vendor-class-identifier: @@ -999,7 +1001,8 @@ nm_setting_ip4_config_class_init(NMSettingIP4ConfigClass *klass) PROP_DHCP_VENDOR_CLASS_IDENTIFIER, NM_SETTING_PARAM_NONE, NMSettingIP4ConfigPrivate, - dhcp_vendor_class_identifier); + dhcp_vendor_class_identifier, + .direct_string_allow_empty = TRUE); /** * NMSettingIP4Config:link-local: diff --git a/src/libnm-core-impl/nm-setting-ip6-config.c b/src/libnm-core-impl/nm-setting-ip6-config.c index e34745d656..9d607264fa 100644 --- a/src/libnm-core-impl/nm-setting-ip6-config.c +++ b/src/libnm-core-impl/nm-setting-ip6-config.c @@ -1069,7 +1069,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) PROP_TOKEN, NM_SETTING_PARAM_INFERRABLE, NMSettingIP6ConfigPrivate, - token); + token, + .direct_string_allow_empty = TRUE); /** * NMSettingIP6Config:ra-timeout: @@ -1172,7 +1173,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) PROP_DHCP_DUID, NM_SETTING_PARAM_NONE, NMSettingIP6ConfigPrivate, - dhcp_duid); + dhcp_duid, + .direct_string_allow_empty = TRUE); /** * NMSettingIP6Config:dhcp-pd-hint: @@ -1201,7 +1203,8 @@ nm_setting_ip6_config_class_init(NMSettingIP6ConfigClass *klass) NMSettingIP6ConfigPrivate, dhcp_pd_hint, .direct_set_fcn.set_string = - _set_string_fcn_dhcp_pd_hint); + _set_string_fcn_dhcp_pd_hint, + .direct_string_allow_empty = TRUE); /* IP6-specific property overrides */ diff --git a/src/libnm-core-impl/nm-setting-macsec.c b/src/libnm-core-impl/nm-setting-macsec.c index 8e2336eba4..f66fc52a39 100644 --- a/src/libnm-core-impl/nm-setting-macsec.c +++ b/src/libnm-core-impl/nm-setting-macsec.c @@ -456,7 +456,8 @@ nm_setting_macsec_class_init(NMSettingMacsecClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingMacsecPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); /** * NMSettingMacsec:mode: @@ -507,7 +508,8 @@ nm_setting_macsec_class_init(NMSettingMacsecClass *klass) PROP_MKA_CAK, NM_SETTING_PARAM_SECRET, NMSettingMacsecPrivate, - mka_cak); + mka_cak, + .direct_string_allow_empty = TRUE); /** * NMSettingMacsec:mka-cak-flags: @@ -539,7 +541,8 @@ nm_setting_macsec_class_init(NMSettingMacsecClass *klass) PROP_MKA_CKN, NM_SETTING_PARAM_NONE, NMSettingMacsecPrivate, - mka_ckn); + mka_ckn, + .direct_string_allow_empty = TRUE); /** * NMSettingMacsec:port: diff --git a/src/libnm-core-impl/nm-setting-macvlan.c b/src/libnm-core-impl/nm-setting-macvlan.c index 1f808c3cc0..2adecdfe6c 100644 --- a/src/libnm-core-impl/nm-setting-macvlan.c +++ b/src/libnm-core-impl/nm-setting-macvlan.c @@ -226,7 +226,8 @@ nm_setting_macvlan_class_init(NMSettingMacvlanClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingMacvlanPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); /** * NMSettingMacvlan:mode: diff --git a/src/libnm-core-impl/nm-setting-ovs-bridge.c b/src/libnm-core-impl/nm-setting-ovs-bridge.c index 909e357650..bc5dd04a68 100644 --- a/src/libnm-core-impl/nm-setting-ovs-bridge.c +++ b/src/libnm-core-impl/nm-setting-ovs-bridge.c @@ -242,7 +242,8 @@ nm_setting_ovs_bridge_class_init(NMSettingOvsBridgeClass *klass) PROP_FAIL_MODE, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsBridge, - fail_mode); + fail_mode, + .direct_string_allow_empty = TRUE); /** * NMSettingOvsBridge:mcast-snooping-enable: @@ -305,7 +306,8 @@ nm_setting_ovs_bridge_class_init(NMSettingOvsBridgeClass *klass) PROP_DATAPATH_TYPE, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsBridge, - datapath_type); + datapath_type, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-ovs-dpdk.c b/src/libnm-core-impl/nm-setting-ovs-dpdk.c index 87e9a3e8ce..53931f469d 100644 --- a/src/libnm-core-impl/nm-setting-ovs-dpdk.c +++ b/src/libnm-core-impl/nm-setting-ovs-dpdk.c @@ -190,7 +190,8 @@ nm_setting_ovs_dpdk_class_init(NMSettingOvsDpdkClass *klass) PROP_DEVARGS, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsDpdk, - devargs); + devargs, + .direct_string_allow_empty = TRUE); /** * NMSettingOvsDpdk:n-rxq: diff --git a/src/libnm-core-impl/nm-setting-ovs-interface.c b/src/libnm-core-impl/nm-setting-ovs-interface.c index 68ce9ff4dd..8837908755 100644 --- a/src/libnm-core-impl/nm-setting-ovs-interface.c +++ b/src/libnm-core-impl/nm-setting-ovs-interface.c @@ -394,7 +394,8 @@ nm_setting_ovs_interface_class_init(NMSettingOvsInterfaceClass *klass) PROP_TYPE, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsInterface, - type); + type, + .direct_string_allow_empty = TRUE); /** * NMSettingOvsInterface:ofport-request: * diff --git a/src/libnm-core-impl/nm-setting-ovs-patch.c b/src/libnm-core-impl/nm-setting-ovs-patch.c index 2781d43599..e44646a65f 100644 --- a/src/libnm-core-impl/nm-setting-ovs-patch.c +++ b/src/libnm-core-impl/nm-setting-ovs-patch.c @@ -138,7 +138,8 @@ nm_setting_ovs_patch_class_init(NMSettingOvsPatchClass *klass) PROP_PEER, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsPatch, - peer); + peer, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-ovs-port.c b/src/libnm-core-impl/nm-setting-ovs-port.c index c4c3d88090..f2071d4354 100644 --- a/src/libnm-core-impl/nm-setting-ovs-port.c +++ b/src/libnm-core-impl/nm-setting-ovs-port.c @@ -614,7 +614,8 @@ nm_setting_ovs_port_class_init(NMSettingOvsPortClass *klass) PROP_VLAN_MODE, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsPort, - vlan_mode); + vlan_mode, + .direct_string_allow_empty = TRUE); /** * NMSettingOvsPort:tag: @@ -672,7 +673,8 @@ nm_setting_ovs_port_class_init(NMSettingOvsPortClass *klass) PROP_LACP, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsPort, - lacp); + lacp, + .direct_string_allow_empty = TRUE); /** * NMSettingOvsPort:bond-mode: @@ -687,7 +689,8 @@ nm_setting_ovs_port_class_init(NMSettingOvsPortClass *klass) PROP_BOND_MODE, NM_SETTING_PARAM_INFERRABLE, NMSettingOvsPort, - bond_mode); + bond_mode, + .direct_string_allow_empty = TRUE); /** * NMSettingOvsPort:bond-updelay: diff --git a/src/libnm-core-impl/nm-setting-pppoe.c b/src/libnm-core-impl/nm-setting-pppoe.c index 6c2e1e86a3..48da78e7f1 100644 --- a/src/libnm-core-impl/nm-setting-pppoe.c +++ b/src/libnm-core-impl/nm-setting-pppoe.c @@ -240,7 +240,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingPppoePrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); /** * NMSettingPppoe:service: @@ -256,7 +257,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass) PROP_SERVICE, NM_SETTING_PARAM_NONE, NMSettingPppoePrivate, - service); + service, + .direct_string_allow_empty = TRUE); /** * NMSettingPppoe:username: @@ -269,7 +271,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass) PROP_USERNAME, NM_SETTING_PARAM_NONE, NMSettingPppoePrivate, - username); + username, + .direct_string_allow_empty = TRUE); /** * NMSettingPppoe:password: @@ -282,7 +285,8 @@ nm_setting_pppoe_class_init(NMSettingPppoeClass *klass) PROP_PASSWORD, NM_SETTING_PARAM_SECRET, NMSettingPppoePrivate, - password); + password, + .direct_string_allow_empty = TRUE); /** * NMSettingPppoe:password-flags: diff --git a/src/libnm-core-impl/nm-setting-private.h b/src/libnm-core-impl/nm-setting-private.h index 9fe49de48b..cf4054db68 100644 --- a/src/libnm-core-impl/nm-setting-private.h +++ b/src/libnm-core-impl/nm-setting-private.h @@ -1048,6 +1048,7 @@ _nm_properties_override(GArray *properties_override, const NMSettInfoProperty *p &nm_sett_info_propert_type_direct_mac_address, \ .direct_offset = \ NM_STRUCT_OFFSET_ENSURE_TYPE(char *, private_struct_type, private_struct_field), \ + .direct_string_allow_empty = TRUE, \ __VA_ARGS__); \ } \ G_STMT_END diff --git a/src/libnm-core-impl/nm-setting-proxy.c b/src/libnm-core-impl/nm-setting-proxy.c index 62ba5050a4..e50721dfd0 100644 --- a/src/libnm-core-impl/nm-setting-proxy.c +++ b/src/libnm-core-impl/nm-setting-proxy.c @@ -307,7 +307,8 @@ nm_setting_proxy_class_init(NMSettingProxyClass *klass) PROP_PAC_URL, NM_SETTING_PARAM_NONE, NMSettingProxyPrivate, - pac_url); + pac_url, + .direct_string_allow_empty = TRUE); /** * NMSettingProxy:pac-script: @@ -339,7 +340,8 @@ nm_setting_proxy_class_init(NMSettingProxyClass *klass) PROP_PAC_SCRIPT, NM_SETTING_PARAM_NONE, NMSettingProxyPrivate, - pac_script); + pac_script, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-tun.c b/src/libnm-core-impl/nm-setting-tun.c index a6060850f9..05460104a4 100644 --- a/src/libnm-core-impl/nm-setting-tun.c +++ b/src/libnm-core-impl/nm-setting-tun.c @@ -260,7 +260,8 @@ nm_setting_tun_class_init(NMSettingTunClass *klass) PROP_OWNER, NM_SETTING_PARAM_INFERRABLE, NMSettingTunPrivate, - owner); + owner, + .direct_string_allow_empty = TRUE); /** * NMSettingTun:group: @@ -276,7 +277,8 @@ nm_setting_tun_class_init(NMSettingTunClass *klass) PROP_GROUP, NM_SETTING_PARAM_INFERRABLE, NMSettingTunPrivate, - group); + group, + .direct_string_allow_empty = TRUE); /** * NMSettingTun:pi: diff --git a/src/libnm-core-impl/nm-setting-veth.c b/src/libnm-core-impl/nm-setting-veth.c index 40e3c9613a..6b84233d01 100644 --- a/src/libnm-core-impl/nm-setting-veth.c +++ b/src/libnm-core-impl/nm-setting-veth.c @@ -146,7 +146,8 @@ nm_setting_veth_class_init(NMSettingVethClass *klass) PROP_PEER, NM_SETTING_PARAM_INFERRABLE, NMSettingVeth, - _priv.peer); + _priv.peer, + .direct_string_allow_empty = TRUE); g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties); diff --git a/src/libnm-core-impl/nm-setting-vlan.c b/src/libnm-core-impl/nm-setting-vlan.c index a211d2e637..534ed71372 100644 --- a/src/libnm-core-impl/nm-setting-vlan.c +++ b/src/libnm-core-impl/nm-setting-vlan.c @@ -872,7 +872,8 @@ nm_setting_vlan_class_init(NMSettingVlanClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingVlanPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); /** * NMSettingVlan:id: @@ -963,7 +964,8 @@ nm_setting_vlan_class_init(NMSettingVlanClass *klass) NM_SETTING_PARAM_INFERRABLE, NMSettingVlanPrivate, protocol, - .direct_string_is_refstr = TRUE); + .direct_string_is_refstr = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingVlan:ingress-priority-map: diff --git a/src/libnm-core-impl/nm-setting-vpn.c b/src/libnm-core-impl/nm-setting-vpn.c index aa030626f7..b867d01860 100644 --- a/src/libnm-core-impl/nm-setting-vpn.c +++ b/src/libnm-core-impl/nm-setting-vpn.c @@ -1090,7 +1090,8 @@ nm_setting_vpn_class_init(NMSettingVpnClass *klass) PROP_SERVICE_TYPE, NM_SETTING_PARAM_NONE, NMSettingVpnPrivate, - service_type); + service_type, + .direct_string_allow_empty = TRUE); /** * NMSettingVpn:user-name: @@ -1108,7 +1109,8 @@ nm_setting_vpn_class_init(NMSettingVpnClass *klass) PROP_USER_NAME, NM_SETTING_PARAM_NONE, NMSettingVpnPrivate, - user_name); + user_name, + .direct_string_allow_empty = TRUE); /** * NMSettingVpn:persistent: diff --git a/src/libnm-core-impl/nm-setting-vxlan.c b/src/libnm-core-impl/nm-setting-vxlan.c index 357a9ebd63..50abd883da 100644 --- a/src/libnm-core-impl/nm-setting-vxlan.c +++ b/src/libnm-core-impl/nm-setting-vxlan.c @@ -444,7 +444,8 @@ nm_setting_vxlan_class_init(NMSettingVxlanClass *klass) PROP_PARENT, NM_SETTING_PARAM_INFERRABLE, NMSettingVxlanPrivate, - parent); + parent, + .direct_string_allow_empty = TRUE); /** * NMSettingVxlan:id: @@ -480,7 +481,8 @@ nm_setting_vxlan_class_init(NMSettingVxlanClass *klass) NMSettingVxlanPrivate, local, .direct_set_string_ip_address_addr_family = - AF_UNSPEC + 1); + AF_UNSPEC + 1, + .direct_string_allow_empty = TRUE); /** * NMSettingVxlan:remote: @@ -499,7 +501,8 @@ nm_setting_vxlan_class_init(NMSettingVxlanClass *klass) NMSettingVxlanPrivate, remote, .direct_set_string_ip_address_addr_family = - AF_UNSPEC + 1); + AF_UNSPEC + 1, + .direct_string_allow_empty = TRUE); /** * NMSettingVxlan:source-port-min: diff --git a/src/libnm-core-impl/nm-setting-wifi-p2p.c b/src/libnm-core-impl/nm-setting-wifi-p2p.c index e8ce4bdc83..31dbea5c4d 100644 --- a/src/libnm-core-impl/nm-setting-wifi-p2p.c +++ b/src/libnm-core-impl/nm-setting-wifi-p2p.c @@ -201,7 +201,8 @@ nm_setting_wifi_p2p_class_init(NMSettingWifiP2PClass *setting_wifi_p2p_class) PROP_PEER, NM_SETTING_PARAM_NONE, NMSettingWifiP2P, - _priv.peer); + _priv.peer, + .direct_string_allow_empty = TRUE); /** * NMSettingWifiP2P:wps-method: diff --git a/src/libnm-core-impl/nm-setting-wimax.c b/src/libnm-core-impl/nm-setting-wimax.c index 37483a54ec..e68aeb3d51 100644 --- a/src/libnm-core-impl/nm-setting-wimax.c +++ b/src/libnm-core-impl/nm-setting-wimax.c @@ -175,7 +175,8 @@ nm_setting_wimax_class_init(NMSettingWimaxClass *klass) NM_SETTING_PARAM_NONE, NMSettingWimaxPrivate, network_name, - .is_deprecated = TRUE, ); + .is_deprecated = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingWimax:mac-address: diff --git a/src/libnm-core-impl/nm-setting-wired.c b/src/libnm-core-impl/nm-setting-wired.c index 82c3840ffa..e09fd70d94 100644 --- a/src/libnm-core-impl/nm-setting-wired.c +++ b/src/libnm-core-impl/nm-setting-wired.c @@ -1203,7 +1203,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass) PROP_PORT, NM_SETTING_PARAM_NONE, NMSettingWiredPrivate, - port); + port, + .direct_string_allow_empty = TRUE); /** * NMSettingWired:speed: @@ -1269,7 +1270,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass) PROP_DUPLEX, NM_SETTING_PARAM_NONE, NMSettingWiredPrivate, - duplex); + duplex, + .direct_string_allow_empty = TRUE); /** * NMSettingWired:auto-negotiate: @@ -1458,7 +1460,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass) PROP_GENERATE_MAC_ADDRESS_MASK, NM_SETTING_PARAM_FUZZY_IGNORE, NMSettingWiredPrivate, - generate_mac_address_mask); + generate_mac_address_mask, + .direct_string_allow_empty = TRUE); /** * NMSettingWired:mac-address-blacklist: @@ -1556,7 +1559,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass) PROP_S390_NETTYPE, NM_SETTING_PARAM_INFERRABLE, NMSettingWiredPrivate, - s390_nettype); + s390_nettype, + .direct_string_allow_empty = TRUE); /** * NMSettingWired:s390-options: (type GHashTable(utf8,utf8)) @@ -1644,7 +1648,8 @@ nm_setting_wired_class_init(NMSettingWiredClass *klass) PROP_WAKE_ON_LAN_PASSWORD, NM_SETTING_PARAM_NONE, NMSettingWiredPrivate, - wol_password); + wol_password, + .direct_string_allow_empty = TRUE); /** * NMSettingWired:accept-all-mac-addresses: diff --git a/src/libnm-core-impl/nm-setting-wireguard.c b/src/libnm-core-impl/nm-setting-wireguard.c index f736a54496..1e7ed05b1d 100644 --- a/src/libnm-core-impl/nm-setting-wireguard.c +++ b/src/libnm-core-impl/nm-setting-wireguard.c @@ -2363,7 +2363,8 @@ nm_setting_wireguard_class_init(NMSettingWireGuardClass *klass) NMSettingWireGuard, _priv.private_key, .direct_set_fcn.set_string = - _set_string_fcn_public_key); + _set_string_fcn_public_key, + .direct_string_allow_empty = TRUE); /** * NMSettingWireGuard:private-key-flags: diff --git a/src/libnm-core-impl/nm-setting-wireless-security.c b/src/libnm-core-impl/nm-setting-wireless-security.c index dc9e28cb9f..e420b32b71 100644 --- a/src/libnm-core-impl/nm-setting-wireless-security.c +++ b/src/libnm-core-impl/nm-setting-wireless-security.c @@ -1420,7 +1420,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) NM_SETTING_PARAM_REQUIRED, NMSettingWirelessSecurityPrivate, key_mgmt, - .direct_set_string_ascii_strdown = TRUE); + .direct_set_string_ascii_strdown = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:wep-tx-keyidx: @@ -1473,7 +1474,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) NM_SETTING_PARAM_NONE, NMSettingWirelessSecurityPrivate, auth_alg, - .direct_set_string_ascii_strdown = TRUE); + .direct_set_string_ascii_strdown = TRUE, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:proto: @@ -1591,7 +1593,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_LEAP_USERNAME, NM_SETTING_PARAM_NONE, NMSettingWirelessSecurityPrivate, - leap_username); + leap_username, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:wep-key0: @@ -1611,7 +1614,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_WEP_KEY0, NM_SETTING_PARAM_SECRET, NMSettingWirelessSecurityPrivate, - wep_key0); + wep_key0, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:wep-key1: @@ -1631,7 +1635,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_WEP_KEY1, NM_SETTING_PARAM_SECRET, NMSettingWirelessSecurityPrivate, - wep_key1); + wep_key1, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:wep-key2: @@ -1651,7 +1656,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_WEP_KEY2, NM_SETTING_PARAM_SECRET, NMSettingWirelessSecurityPrivate, - wep_key2); + wep_key2, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:wep-key3: @@ -1671,7 +1677,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_WEP_KEY3, NM_SETTING_PARAM_SECRET, NMSettingWirelessSecurityPrivate, - wep_key3); + wep_key3, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:wep-key-flags: @@ -1715,7 +1722,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_PSK, NM_SETTING_PARAM_SECRET, NMSettingWirelessSecurityPrivate, - psk); + psk, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:psk-flags: @@ -1757,7 +1765,8 @@ nm_setting_wireless_security_class_init(NMSettingWirelessSecurityClass *klass) PROP_LEAP_PASSWORD, NM_SETTING_PARAM_SECRET, NMSettingWirelessSecurityPrivate, - leap_password); + leap_password, + .direct_string_allow_empty = TRUE); /** * NMSettingWirelessSecurity:leap-password-flags: diff --git a/src/libnm-core-impl/nm-setting-wireless.c b/src/libnm-core-impl/nm-setting-wireless.c index 0bc72116b9..152bbde3d9 100644 --- a/src/libnm-core-impl/nm-setting-wireless.c +++ b/src/libnm-core-impl/nm-setting-wireless.c @@ -1413,7 +1413,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass) PROP_MODE, NM_SETTING_PARAM_NONE, NMSettingWirelessPrivate, - mode); + mode, + .direct_string_allow_empty = TRUE); /** * NMSettingWireless:band: @@ -1440,7 +1441,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass) PROP_BAND, NM_SETTING_PARAM_NONE, NMSettingWirelessPrivate, - band); + band, + .direct_string_allow_empty = TRUE); /** * NMSettingWireless:channel: @@ -1707,7 +1709,8 @@ nm_setting_wireless_class_init(NMSettingWirelessClass *klass) PROP_GENERATE_MAC_ADDRESS_MASK, NM_SETTING_PARAM_FUZZY_IGNORE, NMSettingWirelessPrivate, - generate_mac_address_mask); + generate_mac_address_mask, + .direct_string_allow_empty = TRUE); /** * NMSettingWireless:mac-address-blacklist: diff --git a/src/libnm-core-impl/nm-setting-wpan.c b/src/libnm-core-impl/nm-setting-wpan.c index 0bfbed7f9b..ba947a863d 100644 --- a/src/libnm-core-impl/nm-setting-wpan.c +++ b/src/libnm-core-impl/nm-setting-wpan.c @@ -255,7 +255,8 @@ nm_setting_wpan_class_init(NMSettingWpanClass *klass) NMSettingWpanPrivate, mac_address, .direct_set_string_mac_address_len = - IEEE802154_ADDR_LEN); + IEEE802154_ADDR_LEN, + .direct_string_allow_empty = TRUE); /** * NMSettingWpan:pan-id: diff --git a/src/libnm-core-impl/nm-setting.c b/src/libnm-core-impl/nm-setting.c index ed0df70028..758338e5ce 100644 --- a/src/libnm-core-impl/nm-setting.c +++ b/src/libnm-core-impl/nm-setting.c @@ -2429,8 +2429,27 @@ _verify_properties(NMSetting *setting, GError **error) case NM_VALUE_TYPE_NONE: case NM_VALUE_TYPE_UINT32: case NM_VALUE_TYPE_UINT64: - case NM_VALUE_TYPE_STRING: break; + case NM_VALUE_TYPE_STRING: + { + const char *val; + + if (!property_info->direct_string_allow_empty + && (val = *((const char *const *) + _nm_setting_get_private_field(setting, sett_info, property_info))) + && val[0] == '\0') { + g_set_error_literal(error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _("cannot be empty")); + g_prefix_error(error, + "%s.%s: ", + klass->setting_info->setting_name, + property_info->name); + return FALSE; + } + break; + } default: nm_assert_not_reached(); } diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index a279e3af9d..ee552cc1ea 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -4740,6 +4740,15 @@ test_setting_metadata(void) } if (sip->direct_strv_preserve_empty) g_assert(sip->property_type->direct_type == NM_VALUE_TYPE_STRV); + if (sip->direct_string_allow_empty) { + g_assert(sip->property_type->direct_type == NM_VALUE_TYPE_STRING); + } + if (!sip->direct_string_allow_empty + && sip->property_type->direct_type == NM_VALUE_TYPE_STRING) { + g_error("currently all properties must have this set: FAIL: %s.%s", + nm_setting_get_name(setting), + sip->name); + } if (sip->direct_set_string_mac_address_len != 0) { g_assert(NM_IN_SET(sip->property_type, diff --git a/src/libnm-core-intern/nm-core-internal.h b/src/libnm-core-intern/nm-core-internal.h index 1fc33550c8..8e2573370b 100644 --- a/src/libnm-core-intern/nm-core-internal.h +++ b/src/libnm-core-intern/nm-core-internal.h @@ -839,6 +839,23 @@ struct _NMSettInfoProperty { /* Whether the string property is implemented as a (downcast) NMRefString. */ bool direct_string_is_refstr : 1; + /* Usually, string properties cannot be empty (because it's unclear how + * that relates to NULL and how to distinguish that in nmcli). In some + * cases, it's allowed however (e.g. "gsm.apm"). + * + * The lack of this flag indicates to perform an additional check after + * verify(), that the string is not empty. + * + * In some cases, we can also normalize an empty value, in which case verify() + * also allows the string to be empty. + * + * FIXME: historically, many properties allowed to be empty. Hence, to + * preserve behavior this flag is also set for many properties where it + * maybe should not be set. We should review the use of this flag and clear + * it where possible. New properties generally should not allow empty + * strings (unless they have specific reasons). */ + bool direct_string_allow_empty : 1; + /* Usually, for strv arrays (NM_VALUE_TYPE_STRV, NMValueStrv) there is little * difference between NULL/unset and empty arrays. E.g. g_object_get() will * return NULL and never an empty strv array. From 8062d04cd4515f0491ac4d309a30c8b0da90eb68 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 8 Jan 2024 12:28:02 +0100 Subject: [PATCH 5/7] libnm: don't set .direct_string_allow_empty for _nm_setting_property_define_direct_mac_address() Most properties don't accept empty strings and reject them during verify(). All _nm_setting_property_define_direct_mac_address() call nm_utils_hwaddr_valid() on the string, which rejects empty strings. Clear the .direct_string_allow_empty flag for those. The usage of the flag is misleading. --- src/libnm-core-impl/nm-setting-private.h | 1 - src/libnm-core-impl/tests/test-setting.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-private.h b/src/libnm-core-impl/nm-setting-private.h index cf4054db68..9fe49de48b 100644 --- a/src/libnm-core-impl/nm-setting-private.h +++ b/src/libnm-core-impl/nm-setting-private.h @@ -1048,7 +1048,6 @@ _nm_properties_override(GArray *properties_override, const NMSettInfoProperty *p &nm_sett_info_propert_type_direct_mac_address, \ .direct_offset = \ NM_STRUCT_OFFSET_ENSURE_TYPE(char *, private_struct_type, private_struct_field), \ - .direct_string_allow_empty = TRUE, \ __VA_ARGS__); \ } \ G_STMT_END diff --git a/src/libnm-core-impl/tests/test-setting.c b/src/libnm-core-impl/tests/test-setting.c index ee552cc1ea..e4f3ab9fc1 100644 --- a/src/libnm-core-impl/tests/test-setting.c +++ b/src/libnm-core-impl/tests/test-setting.c @@ -4743,12 +4743,6 @@ test_setting_metadata(void) if (sip->direct_string_allow_empty) { g_assert(sip->property_type->direct_type == NM_VALUE_TYPE_STRING); } - if (!sip->direct_string_allow_empty - && sip->property_type->direct_type == NM_VALUE_TYPE_STRING) { - g_error("currently all properties must have this set: FAIL: %s.%s", - nm_setting_get_name(setting), - sip->name); - } if (sip->direct_set_string_mac_address_len != 0) { g_assert(NM_IN_SET(sip->property_type, From f766ec0a168029806346f96c07bcdd16af1f6ea5 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 8 Jan 2024 12:54:43 +0100 Subject: [PATCH 6/7] libnm: drop some unnecessary direct_string_allow_empty "nm_setting_hsr_get_port1" is new API and verify() already enforces that the strings are not empty. The flag is redundant. Also drop it from a few other places, where it's redundant. --- src/libnm-core-impl/nm-setting-connection.c | 6 ++---- src/libnm-core-impl/nm-setting-hsr.c | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-connection.c b/src/libnm-core-impl/nm-setting-connection.c index 909ddc6acd..892e7d3151 100644 --- a/src/libnm-core-impl/nm-setting-connection.c +++ b/src/libnm-core-impl/nm-setting-connection.c @@ -2021,8 +2021,7 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) .from_dbus_is_full = TRUE, .from_dbus_direct_allow_transform = TRUE), NMSettingConnectionPrivate, - id, - .direct_string_allow_empty = TRUE); + id); /** * NMSettingConnection:uuid: @@ -2065,8 +2064,7 @@ nm_setting_connection_class_init(NMSettingConnectionClass *klass) PROP_UUID, NM_SETTING_PARAM_FUZZY_IGNORE, NMSettingConnectionPrivate, - uuid, - .direct_string_allow_empty = TRUE); + uuid); /** * NMSettingConnection:stable-id: diff --git a/src/libnm-core-impl/nm-setting-hsr.c b/src/libnm-core-impl/nm-setting-hsr.c index d8b4d89bd8..d9a662b16f 100644 --- a/src/libnm-core-impl/nm-setting-hsr.c +++ b/src/libnm-core-impl/nm-setting-hsr.c @@ -209,8 +209,7 @@ nm_setting_hsr_class_init(NMSettingHsrClass *klass) PROP_PORT1, NM_SETTING_PARAM_INFERRABLE, NMSettingHsr, - _priv.port1, - .direct_string_allow_empty = TRUE); + _priv.port1); /** * NMSettingHsr:port2: @@ -225,8 +224,7 @@ nm_setting_hsr_class_init(NMSettingHsrClass *klass) PROP_PORT2, NM_SETTING_PARAM_INFERRABLE, NMSettingHsr, - _priv.port2, - .direct_string_allow_empty = TRUE); + _priv.port2); /** * NMSettingHsr:multicast-spec: From 955f113f461764cc34cffdadb29639db89d2df7f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 9 Jan 2024 09:37:29 +0100 Subject: [PATCH 7/7] libnm/docs: update comment about "apn.gsm" and empty string --- src/libnm-core-impl/nm-setting-gsm.c | 4 ++++ src/libnmc-setting/settings-docs.h.in | 2 +- src/nmcli/gen-metadata-nm-settings-nmcli.xml.in | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/libnm-core-impl/nm-setting-gsm.c b/src/libnm-core-impl/nm-setting-gsm.c index 0f06d276fa..632b0ccc81 100644 --- a/src/libnm-core-impl/nm-setting-gsm.c +++ b/src/libnm-core-impl/nm-setting-gsm.c @@ -658,6 +658,10 @@ nm_setting_gsm_class_init(NMSettingGsmClass *klass) * is important to use the correct APN for the user's mobile broadband plan. * The APN may only be composed of the characters a-z, 0-9, ., and - per GSM * 03.60 Section 14.9. + * + * If the APN is unset (the default) then it may be detected based on + * "auto-config" setting. The property can be explicitly set to the + * empty string to prevent that and use no APN. **/ _nm_setting_property_define_direct_string(properties_override, obj_properties, diff --git a/src/libnmc-setting/settings-docs.h.in b/src/libnmc-setting/settings-docs.h.in index be9a938508..77cde6620e 100644 --- a/src/libnmc-setting/settings-docs.h.in +++ b/src/libnmc-setting/settings-docs.h.in @@ -139,7 +139,7 @@ #define DESCRIBE_DOC_NM_SETTING_DCB_PRIORITY_GROUP_ID N_("An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the Priority Group ID. Allowed Priority Group ID values are 0 - 7 or 15 for the unrestricted group.") #define DESCRIBE_DOC_NM_SETTING_DCB_PRIORITY_STRICT_BANDWIDTH N_("An array of 8 boolean values, where the array index corresponds to the User Priority (0 - 7) and the value indicates whether or not the priority may use all of the bandwidth allocated to its assigned group.") #define DESCRIBE_DOC_NM_SETTING_DCB_PRIORITY_TRAFFIC_CLASS N_("An array of 8 uint values, where the array index corresponds to the User Priority (0 - 7) and the value indicates the traffic class (0 - 7) to which the priority is mapped.") -#define DESCRIBE_DOC_NM_SETTING_GSM_APN N_("The GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9.") +#define DESCRIBE_DOC_NM_SETTING_GSM_APN N_("The GPRS Access Point Name specifying the APN used when establishing a data session with the GSM-based network. The APN often determines how the user will be billed for their network usage and whether the user has access to the Internet or just a provider-specific walled-garden, so it is important to use the correct APN for the user's mobile broadband plan. The APN may only be composed of the characters a-z, 0-9, ., and - per GSM 03.60 Section 14.9. If the APN is unset (the default) then it may be detected based on \"auto-config\" setting. The property can be explicitly set to the empty string to prevent that and use no APN.") #define DESCRIBE_DOC_NM_SETTING_GSM_AUTO_CONFIG N_("When TRUE, the settings such as APN, username, or password will default to values that match the network the modem will register to in the Mobile Broadband Provider database.") #define DESCRIBE_DOC_NM_SETTING_GSM_DEVICE_ID N_("The device unique identifier (as given by the WWAN management service) which this connection applies to. If given, the connection will only apply to the specified device.") #define DESCRIBE_DOC_NM_SETTING_GSM_HOME_ONLY N_("When TRUE, only connections to the home network will be allowed. Connections to roaming networks will not be made.") diff --git a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in index 99cf1b16c7..8806bf2550 100644 --- a/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in +++ b/src/nmcli/gen-metadata-nm-settings-nmcli.xml.in @@ -1089,7 +1089,7 @@ values="none (0x0), agent-owned (0x1), not-saved (0x2), not-required (0x4)" />