From 5cca669ff39c6909be906e8974e424ffd2ea42c2 Mon Sep 17 00:00:00 2001 From: Antonio Cardace Date: Thu, 27 Aug 2020 18:18:31 +0200 Subject: [PATCH] core: add 'dhcp-vendor-class-identifier' validation function So that it can be reused. Signed-off-by: Antonio Cardace --- .../nm-libnm-core-utils.c | 55 +++++++++++++++++++ .../nm-libnm-core-utils.h | 2 + libnm-core/nm-setting-ip4-config.c | 48 +--------------- po/POTFILES.in | 1 + src/devices/nm-device.c | 11 ++-- 5 files changed, 65 insertions(+), 52 deletions(-) diff --git a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c index f2c85cc60c..8be7d913fc 100644 --- a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c +++ b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c @@ -6,6 +6,8 @@ #include "nm-common-macros.h" +#include "nm-errors.h" + #include /*****************************************************************************/ @@ -257,3 +259,56 @@ NM_UTILS_ENUM2STR_DEFINE (nm_utils_route_type2str, guint8, NM_UTILS_ENUM2STR (RTN_UNREACHABLE, "unreachable"), NM_UTILS_ENUM2STR (RTN_UNSPEC, "unspecified"), ); + +gboolean +nm_utils_validate_dhcp4_vendor_class_id (const char *vci, GError **error) +{ + const char * bin; + gsize unescaped_len; + gs_free char *to_free = NULL; + + g_return_val_if_fail (!error || !(*error), FALSE); + g_return_val_if_fail (vci, FALSE); + + if (vci[0] == '\0') { + g_set_error_literal (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _ ("property cannot be an empty string")); + g_prefix_error (error, + "%s.%s: ", + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); + return FALSE; + } + + bin = nm_utils_buf_utf8safe_unescape (vci, + NM_UTILS_STR_UTF8_SAFE_FLAG_NONE, + &unescaped_len, + (gpointer *) &to_free); + /* a DHCP option cannot be longer than 255 bytes */ + if (unescaped_len > 255) { + g_set_error_literal (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _ ("property cannot be longer than 255 bytes")); + g_prefix_error (error, + "%s.%s: ", + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); + return FALSE; + } + if (strlen (bin) != unescaped_len) { + g_set_error_literal (error, + NM_CONNECTION_ERROR, + NM_CONNECTION_ERROR_INVALID_PROPERTY, + _ ("property cannot contain any nul bytes")); + g_prefix_error (error, + "%s.%s: ", + NM_SETTING_IP4_CONFIG_SETTING_NAME, + NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); + return FALSE; + } + + return TRUE; +} diff --git a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h index 97c7144d55..d426104fa4 100644 --- a/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h +++ b/libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.h @@ -140,4 +140,6 @@ guint8 nm_utils_route_type_by_name (const char *name); const char *nm_utils_route_type2str (guint8 val, char *buf, gsize len); +gboolean nm_utils_validate_dhcp4_vendor_class_id (const char *vci, GError **error); + #endif /* __NM_LIBNM_SHARED_UTILS_H__ */ diff --git a/libnm-core/nm-setting-ip4-config.c b/libnm-core/nm-setting-ip4-config.c index 509894c92e..c83656e62d 100644 --- a/libnm-core/nm-setting-ip4-config.c +++ b/libnm-core/nm-setting-ip4-config.c @@ -227,51 +227,9 @@ verify (NMSetting *setting, NMConnection *connection, GError **error) return FALSE; } - if (priv->dhcp_vendor_class_identifier) { - const char * bin; - gsize unescaped_len; - gs_free char *to_free = NULL; - - if (priv->dhcp_vendor_class_identifier[0] == '\0') { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _ ("property cannot be an empty string")); - g_prefix_error (error, - "%s.%s: ", - NM_SETTING_IP4_CONFIG_SETTING_NAME, - NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); - return FALSE; - } - - bin = nm_utils_buf_utf8safe_unescape (priv->dhcp_vendor_class_identifier, - NM_UTILS_STR_UTF8_SAFE_FLAG_NONE, - &unescaped_len, - (gpointer *) &to_free); - /* a DHCP option cannot be longer than 255 bytes */ - if (unescaped_len > 255) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _ ("property cannot be longer than 255 bytes")); - g_prefix_error (error, - "%s.%s: ", - NM_SETTING_IP4_CONFIG_SETTING_NAME, - NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); - return FALSE; - } - if (strlen (bin) != unescaped_len) { - g_set_error_literal (error, - NM_CONNECTION_ERROR, - NM_CONNECTION_ERROR_INVALID_PROPERTY, - _ ("property cannot contain any nul bytes")); - g_prefix_error (error, - "%s.%s: ", - NM_SETTING_IP4_CONFIG_SETTING_NAME, - NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER); - return FALSE; - } - } + if ( priv->dhcp_vendor_class_identifier + && !nm_utils_validate_dhcp4_vendor_class_id (priv->dhcp_vendor_class_identifier, error)) + return FALSE; /* Failures from here on are NORMALIZABLE_ERROR... */ diff --git a/po/POTFILES.in b/po/POTFILES.in index 25cb5c4a6c..ea2eafa3f3 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -59,6 +59,7 @@ libnm-core/nm-dbus-utils.c libnm-core/nm-keyfile/nm-keyfile-utils.c libnm-core/nm-keyfile/nm-keyfile.c libnm-core/nm-libnm-core-aux/nm-libnm-core-aux.c +libnm-core/nm-libnm-core-intern/nm-libnm-core-utils.c libnm-core/nm-setting-6lowpan.c libnm-core/nm-setting-8021x.c libnm-core/nm-setting-adsl.c diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 729b1af22c..0f47a2c3ba 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -8829,7 +8829,6 @@ dhcp4_get_vendor_class_identifier (NMDevice *self, NMSettingIP4Config *s_ip4) { gs_free char *config_data_prop = NULL; gs_free char *to_free = NULL; - gboolean validate = FALSE; const char *conn_prop; GBytes *bytes = NULL; const char *bin; @@ -8839,12 +8838,14 @@ dhcp4_get_vendor_class_identifier (NMDevice *self, NMSettingIP4Config *s_ip4) if (!conn_prop) { /* set in NetworkManager.conf ? */ - validate = TRUE; config_data_prop = nm_config_data_get_connection_default ( NM_CONFIG_GET_DATA, NM_CON_DEFAULT ("ipv4.dhcp-vendor-class-identifier"), self); - conn_prop = config_data_prop; + + if ( config_data_prop + && nm_utils_validate_dhcp4_vendor_class_id (config_data_prop, NULL)) + conn_prop = config_data_prop; } if (conn_prop) { @@ -8852,10 +8853,6 @@ dhcp4_get_vendor_class_identifier (NMDevice *self, NMSettingIP4Config *s_ip4) NM_UTILS_STR_UTF8_SAFE_FLAG_NONE, &len, (gpointer *) &to_free); - - if (validate && (bin[0] == '\0' || len > 255 || strlen (bin) != len)) - return NULL; - if (to_free) bytes = g_bytes_new_take (g_steal_pointer (&to_free), len); else