wifi: avoid large shift for calculating netmask in ip4_config_to_iwd_config()

Found by Coverity:

  Error: BAD_SHIFT (CWE-682): [#def53]
  NetworkManager-1.31.3/src/core/devices/wifi/nm-wifi-utils.c:1590: zero_return: Function call "nm_ip_address_get_prefix(addr)" returns 0.
  NetworkManager-1.31.3/src/core/devices/wifi/nm-wifi-utils.c:1590: assignment: Assigning: "prefix" = "nm_ip_address_get_prefix(addr)". The value of "prefix" is now 0.
  NetworkManager-1.31.3/src/core/devices/wifi/nm-wifi-utils.c:1591: large_shift: In expression "0xffffffffU << 32U - prefix", left shifting by more than 31 bits has undefined behavior.  The shift amount, "32U - prefix", is 32.
  # 1589|           NMIPAddress *addr    = nm_setting_ip_config_get_address(s_ip, 0);
  # 1590|           guint        prefix  = nm_ip_address_get_prefix(addr);
  # 1591|->         in_addr_t    netmask = htonl(0xffffffffu << (32 - prefix));
  # 1592|           char         buf[INET_ADDRSTRLEN];
  # 1593|

Fixes: 9d22ae7981 ('wifi: Add utilities for writing IWD connection profiles')
This commit is contained in:
Thomas Haller 2021-05-06 19:01:16 +02:00
parent 820ab364fd
commit 936b60e00f
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728

View file

@ -1591,7 +1591,7 @@ ip4_config_to_iwd_config(GKeyFile *file, NMSettingIPConfig *s_ip, GError **error
if (num) {
NMIPAddress *addr = nm_setting_ip_config_get_address(s_ip, 0);
guint prefix = nm_ip_address_get_prefix(addr);
in_addr_t netmask = htonl(0xffffffffu << (32 - prefix));
in_addr_t netmask = _nm_utils_ip4_prefix_to_netmask(prefix);
char buf[INET_ADDRSTRLEN];
nm_ip_address_get_address_binary(addr, &ip);