summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2021-03-16 10:00:44 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2021-03-17 10:02:09 +0100
commit0f8fe3c76b9ecdf52c1690295f7dcc7b7ade16b6 (patch)
tree19a4ebbff0d30be6bdbd0dd9244e5062b791a4ed
parent9c0c0ac966cb4dddaeba72580edc20c777280858 (diff)
downloadNetworkManager-bg/initrd-znet-empty.tar.gz
initrd: fix crash parsing empty rd.znet argumentbg/initrd-znet-empty
Ignore a rd.znet argument without subchannels. When using net.ifnames (the default), subchannels are used to build the interface name, which is required to match the right connection. With net.ifnames=0 the interface name is build using a prefix and a global counter and therefore in theory it is possible to omit subchannels. However, without subchannels there won't be a udev rule that renames the interface and so it can't work. https://bugzilla.redhat.com/show_bug.cgi?id=1931284 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/783
-rw-r--r--src/nm-initrd-generator/nmi-cmdline-reader.c5
-rw-r--r--src/nm-initrd-generator/tests/test-cmdline-reader.c19
2 files changed, 24 insertions, 0 deletions
diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c
index d6b84c2e57..37f3f51c3d 100644
--- a/src/nm-initrd-generator/nmi-cmdline-reader.c
+++ b/src/nm-initrd-generator/nmi-cmdline-reader.c
@@ -924,6 +924,11 @@ reader_parse_rd_znet(Reader *reader, char *argument, gboolean net_ifnames)
subchannels[0] = get_word(&argument, ',');
subchannels[1] = get_word(&argument, ',');
+ /* Without subchannels we can't univocally match
+ * a device. */
+ if (!subchannels[0] || !subchannels[1])
+ return;
+
if (nm_streq0(nettype, "ctc")) {
if (net_ifnames == TRUE) {
prefix = "sl";
diff --git a/src/nm-initrd-generator/tests/test-cmdline-reader.c b/src/nm-initrd-generator/tests/test-cmdline-reader.c
index 0bdd430b22..9292c44114 100644
--- a/src/nm-initrd-generator/tests/test-cmdline-reader.c
+++ b/src/nm-initrd-generator/tests/test-cmdline-reader.c
@@ -1855,6 +1855,24 @@ test_rd_znet_no_ip(void)
}
static void
+test_rd_znet_malformed(void)
+{
+ const char *const *const ARGV0 = NM_MAKE_STRV("rd.znet=");
+ const char *const *const ARGV1 = NM_MAKE_STRV("rd.znet=,");
+ const char *const *const ARGV2 = NM_MAKE_STRV("rd.znet=foobar");
+ const char *const *const ARGV3 = NM_MAKE_STRV("rd.znet=qeth,0.0.0800,,,layer2=0,portno=1");
+ const char *const *const ARGV[] = {ARGV0, ARGV1, ARGV2, ARGV3};
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS(ARGV); i++) {
+ gs_unref_hashtable GHashTable *connections = NULL;
+
+ connections = _parse_cons(ARGV[i]);
+ g_assert_cmpint(g_hash_table_size(connections), ==, 0);
+ }
+}
+
+static void
test_bootif_ip(void)
{
const char *const *ARGV = NM_MAKE_STRV("BOOTIF=00:53:AB:cd:02:03", "ip=dhcp");
@@ -2189,6 +2207,7 @@ main(int argc, char **argv)
g_test_add_func("/initrd/cmdline/rd_znet", test_rd_znet);
g_test_add_func("/initrd/cmdline/rd_znet/legacy", test_rd_znet_legacy);
g_test_add_func("/initrd/cmdline/rd_znet/no_ip", test_rd_znet_no_ip);
+ g_test_add_func("/initrd/cmdline/rd_znet/empty", test_rd_znet_malformed);
g_test_add_func("/initrd/cmdline/bootif/ip", test_bootif_ip);
g_test_add_func("/initrd/cmdline/bootif/no_ip", test_bootif_no_ip);
g_test_add_func("/initrd/cmdline/bootif/hwtype", test_bootif_hwtype);