From 57dfa999f77d84a184960d3c2095c6c1d28c8a4e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 21 Jun 2022 10:31:02 +0200 Subject: [PATCH] dhcp/nettools: accept missing "subnet mask" (option 1) in DHCP lease Do the same as dhclient plugin in nm_dhcp_utils_ip4_config_from_options(). https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/1037 --- src/core/dhcp/nm-dhcp-nettools.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/core/dhcp/nm-dhcp-nettools.c b/src/core/dhcp/nm-dhcp-nettools.c index 224f96d37..0a25f90d2 100644 --- a/src/core/dhcp/nm-dhcp-nettools.c +++ b/src/core/dhcp/nm-dhcp-nettools.c @@ -237,20 +237,26 @@ lease_parse_address(NDhcp4ClientLease *lease, } r = _client_lease_query(lease, NM_DHCP_OPTION_DHCP4_SUBNET_MASK, &l_data, &l_data_len); - if (r != 0 - || !nm_dhcp_lease_data_parse_in_addr(l_data, - l_data_len, - &a_netmask, - iface, - NM_DHCP_OPTION_DHCP4_SUBNET_MASK)) { - nm_utils_error_set_literal(error, - NM_UTILS_ERROR_UNKNOWN, - "could not get netmask from lease"); - return FALSE; + if (r == N_DHCP4_E_UNSET) { + /* Some DHCP servers may not set the subnet-mask (issue#1037). + * Do the same as the dhclient plugin and use a default. */ + a_plen = _nm_utils_ip4_get_default_prefix(a_address.s_addr); + a_netmask = _nm_utils_ip4_prefix_to_netmask(a_plen); + } else { + if (r != 0 + || !nm_dhcp_lease_data_parse_in_addr(l_data, + l_data_len, + &a_netmask, + iface, + NM_DHCP_OPTION_DHCP4_SUBNET_MASK)) { + nm_utils_error_set_literal(error, + NM_UTILS_ERROR_UNKNOWN, + "could not get netmask from lease"); + return FALSE; + } + a_plen = _nm_utils_ip4_netmask_to_prefix(a_netmask); } - a_plen = _nm_utils_ip4_netmask_to_prefix(a_netmask); - nm_dhcp_option_add_option_in_addr(options, AF_INET, NM_DHCP_OPTION_DHCP4_NM_IP_ADDRESS,