From 810d243f3ebfe46e78024b239da19ac0cf150801 Mon Sep 17 00:00:00 2001 From: Jonathan Kang Date: Thu, 6 Jul 2017 16:20:25 +0800 Subject: [PATCH 1/2] dhcp/dhclient: improve "interface" statement parsing In commit d405cfd9089f9552969e6a3e1a1c4550fc3c1695, parsing "interface" statement is introduced. But it leads to uncommplete parsing of the "request" entry, if one of the lines in "request" entry is prefixed with word "interface". For example, the default configuration of openSUSE distribution: request subnet-mask, broadcast-address, routers, rfc3442-classless-static-routes, interface-mtu, host-name, domain-name, domain-search, domain-name-servers, nis-domain, nis-servers, nds-context, nds-servers, nds-tree-name, netbios-name-servers, netbios-dd-server, netbios-node-type, netbios-scope, ntp-servers; Fixes: d405cfd9089f9552969e6a3e1a1c4550fc3c1695 https://bugzilla.opensuse.org/show_bug.cgi?id=1047004 https://mail.gnome.org/archives/networkmanager-list/2017-July/msg00015.html (cherry picked from commit 3646ed083dda590de1e991915048905b8c784cdd) (cherry picked from commit 7200906a6202285a97969fea8dea86d5dce9cddf) --- src/dhcp/nm-dhcp-dhclient-utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dhcp/nm-dhcp-dhclient-utils.c b/src/dhcp/nm-dhcp-dhclient-utils.c index 216319b..28c290c 100644 --- a/src/dhcp/nm-dhcp-dhclient-utils.c +++ b/src/dhcp/nm-dhcp-dhclient-utils.c @@ -296,7 +296,8 @@ nm_dhcp_dhclient_create_config (const char *interface, continue; if ( !intf[0] - && g_str_has_prefix (p, "interface")) { + && g_str_has_prefix (p, "interface") + && !in_req) { if (read_interface (p, intf, sizeof (intf))) continue; } -- 2.9.3 From 3f2821e1d95c0acb6aebd7d91ae5457c1739b664 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Mon, 10 Jul 2017 11:40:43 +0200 Subject: [PATCH 2/2] dhcp/tests: add test parsing dhclient config (cherry picked from commit 0c23191b01fb0582d8f3d470f463afdabc2fdf46) (cherry picked from commit beeb8df9ac93ad432c9533362d862c0c2466cd5e) --- src/dhcp/tests/test-dhcp-dhclient.c | 70 ++++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/src/dhcp/tests/test-dhcp-dhclient.c b/src/dhcp/tests/test-dhcp-dhclient.c index 40a3e07..3c9760a 100644 --- a/src/dhcp/tests/test-dhcp-dhclient.c +++ b/src/dhcp/tests/test-dhcp-dhclient.c @@ -66,17 +66,16 @@ test_config (const char *orig, &new_client_id); g_assert (new != NULL); -#if DEBUG - if ( strlen (new) != strlen (expected) - || strcmp (new, expected)) { - g_message ("\n- NEW ---------------------------------\n" + if (!nm_streq (new, expected)) { + g_message ("\n* OLD ---------------------------------\n" "%s" - "+ EXPECTED ++++++++++++++++++++++++++++++\n" + "\n- NEW -----------------------------------\n" "%s" - "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", - new, expected); + "\n+ EXPECTED ++++++++++++++++++++++++++++++\n" + "%s" + "\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + orig, new, expected); } -#endif g_assert_cmpstr (new, ==, expected); if (expected_new_client_id) { @@ -831,6 +830,60 @@ test_interface2 (void) NULL); } +static void +test_config_req_intf (void) +{ + static const char *const orig = \ + "request subnet-mask, broadcast-address, routers,\n" + " rfc3442-classless-static-routes,\n" + " interface-mtu, host-name, domain-name, domain-search,\n" + " domain-name-servers, nis-domain, nis-servers,\n" + " nds-context, nds-servers, nds-tree-name,\n" + " netbios-name-servers, netbios-dd-server,\n" + " netbios-node-type, netbios-scope, ntp-servers;\n" + ""; + static const char *const expected = \ + "# Created by NetworkManager\n" + "# Merged from /path/to/dhclient.conf\n" + "\n" + "\n" + "option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;\n" + "option ms-classless-static-routes code 249 = array of unsigned integer 8;\n" + "option wpad code 252 = string;\n" + "\n" + "request; # override dhclient defaults\n" + "also request subnet-mask;\n" + "also request broadcast-address;\n" + "also request routers;\n" + "also request rfc3442-classless-static-routes;\n" + "also request interface-mtu;\n" + "also request host-name;\n" + "also request domain-name;\n" + "also request domain-search;\n" + "also request domain-name-servers;\n" + "also request nis-domain;\n" + "also request nis-servers;\n" + "also request nds-context;\n" + "also request nds-servers;\n" + "also request nds-tree-name;\n" + "also request netbios-name-servers;\n" + "also request netbios-dd-server;\n" + "also request netbios-node-type;\n" + "also request netbios-scope;\n" + "also request ntp-servers;\n" + "also request ms-classless-static-routes;\n" + "also request static-routes;\n" + "also request wpad;\n" + "\n"; + + test_config (orig, expected, + FALSE, NULL, FALSE, + NULL, + NULL, + "eth0", + NULL); +} + /*****************************************************************************/ static void @@ -982,6 +1035,7 @@ main (int argc, char **argv) g_test_add_func ("/dhcp/dhclient/duids", test_duids); g_test_add_func ("/dhcp/dhclient/interface/1", test_interface1); g_test_add_func ("/dhcp/dhclient/interface/2", test_interface2); + g_test_add_func ("/dhcp/dhclient/config/req_intf", test_config_req_intf); g_test_add_func ("/dhcp/dhclient/read_duid_from_leasefile", test_read_duid_from_leasefile); g_test_add_func ("/dhcp/dhclient/read_commented_duid_from_leasefile", test_read_commented_duid_from_leasefile); -- 2.9.3