mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-29 20:30:27 +01:00
initrd: merge branch 'ac/dhcpclass-initrd'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/614
Signed-off-by: Antonio Cardace <acardace@redhat.com>
(cherry picked from commit 5748e986aa)
This commit is contained in:
commit
ad36890282
7 changed files with 118 additions and 52 deletions
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include "nm-common-macros.h"
|
||||
|
||||
#include "nm-errors.h"
|
||||
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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__ */
|
||||
|
|
|
|||
|
|
@ -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... */
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -8757,7 +8757,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;
|
||||
|
|
@ -8767,12 +8766,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) {
|
||||
|
|
@ -8780,10 +8781,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
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ typedef struct {
|
|||
/* Parameters to be set for all connections */
|
||||
gboolean ignore_auto_dns;
|
||||
int dhcp_timeout;
|
||||
char *dhcp4_vci;
|
||||
} Reader;
|
||||
|
||||
static Reader *
|
||||
|
|
@ -52,6 +53,7 @@ reader_destroy (Reader *reader, gboolean free_hash)
|
|||
g_ptr_array_unref (reader->array);
|
||||
hash = g_steal_pointer (&reader->hash);
|
||||
nm_clear_g_free (&reader->hostname);
|
||||
nm_clear_g_free (&reader->dhcp4_vci);
|
||||
nm_g_slice_free (reader);
|
||||
if (!free_hash)
|
||||
return g_steal_pointer (&hash);
|
||||
|
|
@ -95,6 +97,7 @@ reader_create_connection (Reader *reader,
|
|||
NM_SETTING_IP_CONFIG_MAY_FAIL, TRUE,
|
||||
NM_SETTING_IP_CONFIG_IGNORE_AUTO_DNS, reader->ignore_auto_dns,
|
||||
NM_SETTING_IP_CONFIG_DHCP_TIMEOUT, reader->dhcp_timeout,
|
||||
NM_SETTING_IP4_CONFIG_DHCP_VENDOR_CLASS_IDENTIFIER, reader->dhcp4_vci,
|
||||
NULL);
|
||||
|
||||
setting = nm_setting_ip6_config_new ();
|
||||
|
|
@ -927,6 +930,9 @@ nmi_cmdline_reader_parse (const char *sysfs_dir, const char *const*argv, char **
|
|||
else if (nm_streq (tag, "rd.net.timeout.dhcp")) {
|
||||
reader->dhcp_timeout = _nm_utils_ascii_str_to_int64 (argument,
|
||||
10, 0, G_MAXINT32, 0);
|
||||
} else if (nm_streq (tag, "rd.net.dhcp.vendor-class")) {
|
||||
if (nm_utils_validate_dhcp4_vendor_class_id (argument, NULL))
|
||||
nm_utils_strdup_reset (&reader->dhcp4_vci, argument);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1485,6 +1485,52 @@ test_bootif_off (void)
|
|||
g_assert_cmpstr (hostname, ==, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
test_dhcp_vendor_class_id (void)
|
||||
{
|
||||
gs_unref_hashtable GHashTable *connections = NULL;
|
||||
const char *const*ARGV = NM_MAKE_STRV ("rd.net.dhcp.vendor-class=testvci",
|
||||
"ip=eno1:dhcp");
|
||||
NMConnection *connection;
|
||||
NMSettingIP4Config *s_ip4;
|
||||
gs_free char *hostname = NULL;
|
||||
gs_free char *vci_long = NULL;
|
||||
char vci_arg_long[512] = {0};
|
||||
|
||||
connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
|
||||
g_assert (connections);
|
||||
g_assert_cmpint (g_hash_table_size (connections), ==, 1);
|
||||
g_assert_cmpstr (hostname, ==, NULL);
|
||||
|
||||
connection = g_hash_table_lookup (connections, "eno1");
|
||||
g_assert (connection);
|
||||
nmtst_assert_connection_verifies_without_normalization (connection);
|
||||
s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting_ip4_config (connection));
|
||||
g_assert_cmpstr (nm_setting_ip4_config_get_dhcp_vendor_class_identifier (s_ip4), ==, "testvci");
|
||||
|
||||
ARGV = NM_MAKE_STRV ("rd.net.dhcp.vendor-class",
|
||||
"ip=eno1:dhcp");
|
||||
connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
|
||||
connection = g_hash_table_lookup (connections, "eno1");
|
||||
g_assert (connection);
|
||||
nmtst_assert_connection_verifies_without_normalization (connection);
|
||||
s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting_ip4_config (connection));
|
||||
g_assert (nm_setting_ip4_config_get_dhcp_vendor_class_identifier (s_ip4) == NULL);
|
||||
|
||||
|
||||
|
||||
memset (vci_arg_long, 'A', 400);
|
||||
vci_long = g_strdup_printf ("rd.net.dhcp.vendor-class=%s", vci_arg_long);
|
||||
ARGV = NM_MAKE_STRV (vci_long,
|
||||
"ip=eno1:dhcp");
|
||||
connections = nmi_cmdline_reader_parse (TEST_INITRD_DIR "/sysfs", ARGV, &hostname);
|
||||
connection = g_hash_table_lookup (connections, "eno1");
|
||||
g_assert (connection);
|
||||
nmtst_assert_connection_verifies_without_normalization (connection);
|
||||
s_ip4 = NM_SETTING_IP4_CONFIG (nm_connection_get_setting_ip4_config (connection));
|
||||
g_assert (nm_setting_ip4_config_get_dhcp_vendor_class_identifier (s_ip4) == NULL);
|
||||
}
|
||||
|
||||
NMTST_DEFINE ();
|
||||
|
||||
int main (int argc, char **argv)
|
||||
|
|
@ -1521,6 +1567,7 @@ int main (int argc, char **argv)
|
|||
g_test_add_func ("/initrd/cmdline/bootif/hwtype", test_bootif_hwtype);
|
||||
g_test_add_func ("/initrd/cmdline/bootif/off", test_bootif_off);
|
||||
g_test_add_func ("/initrd/cmdline/neednet", test_neednet);
|
||||
g_test_add_func ("/initrd/cmdline/dhcp/vendor_class_id", test_dhcp_vendor_class_id);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue