summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-12-29 21:23:09 +0100
committerThomas Haller <thaller@redhat.com>2019-01-07 10:27:03 +0100
commit49fd140493680ef4bef4b51a1682def35d67ef56 (patch)
tree9383c44e038a39f619ddab0ef95146f3b1348a50
parent46ef278c200e0b4c2a96492fd46966ce96322b51 (diff)
downloadNetworkManager-th/keyfile-fixes.tar.gz
libnm-core: add _nm_setting_secret_flags_valid() helperth/keyfile-fixes
Secret-flags are flags, but most combinations don't actually make sense and maybe should be rejected. Anyway, that is not done, and most places just check that there are no unknown flags set. Add _nm_setting_secret_flags_valid() to perform the check at one place instead of having the implementation at various places.
-rw-r--r--libnm-core/nm-core-internal.h18
-rw-r--r--libnm-core/nm-setting-vpn.c3
-rw-r--r--libnm-core/nm-setting.c2
3 files changed, 17 insertions, 6 deletions
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
index f7abfb6c43..1e7ec9bcbc 100644
--- a/libnm-core/nm-core-internal.h
+++ b/libnm-core/nm-core-internal.h
@@ -121,11 +121,21 @@
*/
#define NM_SETTING_COMPARE_FLAG_NONE ((NMSettingCompareFlags) 0)
+/*****************************************************************************/
+
#define NM_SETTING_SECRET_FLAGS_ALL \
- (NM_SETTING_SECRET_FLAG_NONE | \
- NM_SETTING_SECRET_FLAG_AGENT_OWNED | \
- NM_SETTING_SECRET_FLAG_NOT_SAVED | \
- NM_SETTING_SECRET_FLAG_NOT_REQUIRED)
+ ((NMSettingSecretFlags) ( NM_SETTING_SECRET_FLAG_NONE \
+ | NM_SETTING_SECRET_FLAG_AGENT_OWNED \
+ | NM_SETTING_SECRET_FLAG_NOT_SAVED \
+ | NM_SETTING_SECRET_FLAG_NOT_REQUIRED))
+
+static inline gboolean
+_nm_setting_secret_flags_valid (NMSettingSecretFlags flags)
+{
+ return !NM_FLAGS_ANY (flags, ~NM_SETTING_SECRET_FLAGS_ALL);
+}
+
+/*****************************************************************************/
typedef enum { /*< skip >*/
NM_SETTING_PARSE_FLAGS_NONE = 0,
diff --git a/libnm-core/nm-setting-vpn.c b/libnm-core/nm-setting-vpn.c
index 5d488e7f07..d485b2a802 100644
--- a/libnm-core/nm-setting-vpn.c
+++ b/libnm-core/nm-setting-vpn.c
@@ -730,7 +730,8 @@ get_secret_flags (NMSetting *setting,
}
i64 = _nm_utils_ascii_str_to_int64 (flags_val, 10, 0, NM_SETTING_SECRET_FLAGS_ALL, -1);
- if (i64 == -1) {
+ if ( i64 == -1
+ || !_nm_setting_secret_flags_valid (i64)) {
/* The flags keys is set to an unexpected value. That is a configuration
* error. Note that keys named "*-flags" are reserved for secrets. The user
* must not use this for anything but secret flags. Hence, we cannot fail
diff --git a/libnm-core/nm-setting.c b/libnm-core/nm-setting.c
index be3ade3af4..282d1123b4 100644
--- a/libnm-core/nm-setting.c
+++ b/libnm-core/nm-setting.c
@@ -2157,7 +2157,7 @@ nm_setting_set_secret_flags (NMSetting *setting,
{
g_return_val_if_fail (NM_IS_SETTING (setting), FALSE);
g_return_val_if_fail (secret_name != NULL, FALSE);
- g_return_val_if_fail (flags <= NM_SETTING_SECRET_FLAGS_ALL, FALSE);
+ g_return_val_if_fail (_nm_setting_secret_flags_valid (flags), FALSE);
return NM_SETTING_GET_CLASS (setting)->set_secret_flags (setting, secret_name, flags, error);
}