From c9fbdf3cb0d31e6ca24baa5a43a56d878317a620 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 17 Dec 2019 18:18:48 +0100 Subject: [PATCH] dhcp: test parsing of domain-search option Add a test for the parsing of the the domain-search option. --- src/dhcp/nm-dhcp-nettools.c | 59 ++++++++++++++++++++++---------- src/dhcp/nm-dhcp-utils.h | 2 ++ src/dhcp/tests/test-dhcp-utils.c | 55 +++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 18 deletions(-) diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c index 2cb7c51b61..f59b27e356 100644 --- a/src/dhcp/nm-dhcp-nettools.c +++ b/src/dhcp/nm-dhcp-nettools.c @@ -775,23 +775,12 @@ lease_parse_domainname (NDhcp4ClientLease *lease, str->str); } -static void -lease_parse_search_domains (NDhcp4ClientLease *lease, - NMIP4Config *ip4_config, - GHashTable *options) +char ** +nm_dhcp_parse_search_list (guint8 *data, size_t n_data) { - nm_auto_free_gstring GString *str = NULL; - uint8_t *data, *cache; - size_t n_data, n_cache = 0; - int r; - - r = n_dhcp4_client_lease_query (lease, NM_DHCP_OPTION_DHCP4_DOMAIN_SEARCH_LIST, &data, &n_data); - if (r) - return; - - cache = data; - - nm_gstring_prepare (&str); + GPtrArray *array = NULL; + guint8 *cache = data; + size_t n_cache = 0; for (;;) { nm_auto_free_gstring GString *domain = NULL; @@ -801,8 +790,42 @@ lease_parse_search_domains (NDhcp4ClientLease *lease, if (!lease_option_print_domain_name (domain, cache, &n_cache, &data, &n_data)) break; - g_string_append (nm_gstring_add_space_delimiter (str), domain->str); - nm_ip4_config_add_search (ip4_config, domain->str); + if (!array) + array = g_ptr_array_new (); + + g_ptr_array_add (array, g_string_free (domain, FALSE)); + domain = NULL; + } + + if (array) { + g_ptr_array_add (array, NULL); + return (char **) g_ptr_array_free (array, FALSE); + } else + return NULL; +} + +static void +lease_parse_search_domains (NDhcp4ClientLease *lease, + NMIP4Config *ip4_config, + GHashTable *options) +{ + nm_auto_free_gstring GString *str = NULL; + uint8_t *data; + size_t n_data; + gs_strfreev char **domains = NULL; + guint i; + int r; + + r = n_dhcp4_client_lease_query (lease, NM_DHCP_OPTION_DHCP4_DOMAIN_SEARCH_LIST, &data, &n_data); + if (r) + return; + + domains = nm_dhcp_parse_search_list (data, n_data); + nm_gstring_prepare (&str); + + for (i = 0; domains && domains[i]; i++) { + g_string_append (nm_gstring_add_space_delimiter (str), domains[i]); + nm_ip4_config_add_search (ip4_config, domains[i]); } nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, diff --git a/src/dhcp/nm-dhcp-utils.h b/src/dhcp/nm-dhcp-utils.h index e4c3331478..ecb91809be 100644 --- a/src/dhcp/nm-dhcp-utils.h +++ b/src/dhcp/nm-dhcp-utils.h @@ -36,5 +36,7 @@ gboolean nm_dhcp_utils_get_leasefile_path (int addr_family, const char *uuid, char **out_leasefile_path); +char **nm_dhcp_parse_search_list (guint8 *data, size_t n_data); + #endif /* __NETWORKMANAGER_DHCP_UTILS_H__ */ diff --git a/src/dhcp/tests/test-dhcp-utils.c b/src/dhcp/tests/test-dhcp-utils.c index d038906964..e601534eb2 100644 --- a/src/dhcp/tests/test-dhcp-utils.c +++ b/src/dhcp/tests/test-dhcp-utils.c @@ -199,6 +199,60 @@ test_vendor_option_metered (void) g_hash_table_destroy (options); } +static void +test_parse_search_list (void) +{ + guint8 *data; + char **domains; + + data = (guint8 []) { + 0x05, 'l', 'o', 'c', 'a', 'l', + 0x00 + }; + domains = nm_dhcp_parse_search_list (data, 7); + g_assert (domains); + g_assert_cmpint (g_strv_length (domains), ==, 1); + g_assert_cmpstr (domains[0], ==, "local"); + g_strfreev (domains); + + data = (guint8 []) { + 0x04, 't', 'e', 's', 't', + 0x07, 'e', 'x', 'a', 'm', 'p', 'l', 'e', + 0x03, 'c', 'o', 'm', + 0x00, + 0xc0, 0x05, + 0x03, 'a', 'b', 'c', + 0xc0, 0x0d, + 0x06, 'f', 'o', 'o', 'b', 'a', 'r', + 0x00 + }; + domains = nm_dhcp_parse_search_list (data, 34); + g_assert (domains); + g_assert_cmpint (g_strv_length (domains), ==, 4); + g_assert_cmpstr (domains[0], ==, "test.example.com"); + g_assert_cmpstr (domains[1], ==, "example.com"); + g_assert_cmpstr (domains[2], ==, "abc.com"); + g_assert_cmpstr (domains[3], ==, "foobar"); + g_strfreev (domains); + + data = (guint8 []) { + 0x40, 'b', 'a', 'd', + }; + domains = nm_dhcp_parse_search_list (data, 4); + g_assert (!domains); + + data = (guint8 []) { + 0x04, 'o', 'k', 'a', 'y', + 0x00, + 0x40, 'b', 'a', 'd', + }; + domains = nm_dhcp_parse_search_list (data, 10); + g_assert (domains); + g_assert_cmpint (g_strv_length (domains), ==, 1); + g_assert_cmpstr (domains[0], ==, "okay"); + g_strfreev (domains); +} + static void ip4_test_route (NMIP4Config *ip4_config, guint route_num, @@ -732,6 +786,7 @@ int main (int argc, char **argv) g_test_add_func ("/dhcp/ip4-prefix-classless", test_ip4_prefix_classless); g_test_add_func ("/dhcp/client-id-from-string", test_client_id_from_string); g_test_add_func ("/dhcp/vendor-option-metered", test_vendor_option_metered); + g_test_add_func ("/dhcp/parse-search-list", test_parse_search_list); return g_test_run (); }