From 01fd4b7d2cf25812bd56b0538d45ead88b428b1f Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 30 Aug 2021 09:01:21 +0200 Subject: [PATCH] initrd: fix crash parsing plain '=' without key ./src/nm-initrd-generator/nm-initrd-generator -s -- = Fixes: ecc074b2f8a6 ('initrd: add command line parser') https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/776 --- src/nm-initrd-generator/nmi-cmdline-reader.c | 8 ++++-- .../tests/test-cmdline-reader.c | 25 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/nm-initrd-generator/nmi-cmdline-reader.c b/src/nm-initrd-generator/nmi-cmdline-reader.c index aa0d915128..2afdb8dedd 100644 --- a/src/nm-initrd-generator/nmi-cmdline-reader.c +++ b/src/nm-initrd-generator/nmi-cmdline-reader.c @@ -1335,7 +1335,9 @@ nmi_cmdline_reader_parse(const char * sysfs_dir, tag = get_word(&argument, '='); - if (nm_streq(tag, "net.ifnames")) + if (!tag) { + /* pass */ + } else if (nm_streq(tag, "net.ifnames")) net_ifnames = !nm_streq(argument, "0"); else if (nm_streq(tag, "rd.peerdns")) reader->ignore_auto_dns = !_nm_utils_ascii_str_to_bool(argument, TRUE); @@ -1369,7 +1371,9 @@ nmi_cmdline_reader_parse(const char * sysfs_dir, argument = argument_clone; tag = get_word(&argument, '='); - if (nm_streq(tag, "ip")) + if (!tag) { + /* pass */ + } else if (nm_streq(tag, "ip")) reader_parse_ip(reader, sysfs_dir, argument); else if (nm_streq(tag, "rd.route")) { if (!routes) diff --git a/src/nm-initrd-generator/tests/test-cmdline-reader.c b/src/nm-initrd-generator/tests/test-cmdline-reader.c index 09c6a892e3..6bc3052265 100644 --- a/src/nm-initrd-generator/tests/test-cmdline-reader.c +++ b/src/nm-initrd-generator/tests/test-cmdline-reader.c @@ -300,7 +300,7 @@ test_dhcp_timeout(void) static void test_if_auto_with_mtu(void) { - const char *const *ARGV = NM_MAKE_STRV("ip=eth0:dhcp,dhcp6:1666"); + const char *const *ARGV = NM_MAKE_STRV("ip=eth0:dhcp,dhcp6:1666", "="); gs_unref_object NMConnection *connection = NULL; NMSettingConnection * s_con; NMSettingWired * s_wired; @@ -471,7 +471,7 @@ test_if_ip4_manual(void) static void test_if_ip4_manual_no_dev(void) { - const char *const * ARGV = NM_MAKE_STRV("ip=192.0.2.2::192.0.2.1:24:::"); + const char *const * ARGV = NM_MAKE_STRV("ip=192.0.2.2::192.0.2.1:24:::", "=foo"); NMConnection * connection; NMSettingConnection *s_con; NMSettingIPConfig * s_ip4; @@ -2471,6 +2471,26 @@ test_rd_ethtool(void) g_hash_table_unref(connections); } +/*****************************************************************************/ + +static void +test_plain_equal_char(void) +{ + _parse_no_con(NM_MAKE_STRV("=")); + _parse_no_con(NM_MAKE_STRV("=foo")); + _parse_no_con(NM_MAKE_STRV("BOOT_IMAGE=(hd0,msdos2)/boot/vmlinuz-5.13.10-100.fc33.x86_64", + "root=UUID=ff252b4a-8294-4961-abcb-74c8fc868db7", + "ro", + "rhgb", + "quiet", + "pci", + "=", + "nomsi,", + "noaer")); +} + +/*****************************************************************************/ + NMTST_DEFINE(); int @@ -2526,6 +2546,7 @@ main(int argc, char **argv) g_test_add_func("/initrd/cmdline/infiniband/pkey", test_infiniband_pkey); g_test_add_func("/initrd/cmdline/carrier_timeout", test_carrier_timeout); g_test_add_func("/initrd/cmdline/rd_ethtool", test_rd_ethtool); + g_test_add_func("/initrd/cmdline/plain_equal_char", test_plain_equal_char); return g_test_run(); }