Commit graph

14374 commits

Author SHA1 Message Date
Andrew Zaborowski
b86d83860e iwd: Add default "auto" value for [main].iwd-config-path
Since the [main].iwd-config-path functionality, where NM watches for
NMSettingsConnection changes and update IWD network config files with
new settings, has proven to work without issues so far, enable it by
default.  Instead of hardcoding /var/lib/iwd as the value, and since the
value can't be probed at NM compile time, query it from IWD's recently-
added D-Bus interface for settings when [main].iwd-config-path is either
missing or set to the new value "auto".
2021-05-26 16:47:04 +02:00
Andrew Zaborowski
62dc214033 iwd: Fix conversion of user certificate path in EAP settings
Fix a copy-paste error when converting NMSettingsConnection profiles to
IWD network config format.

Fixes: 9d22ae7981 ('wifi: Add utilities for writing IWD connection profiles')
2021-05-26 16:47:04 +02:00
Thomas Haller
8fcbbdd7a4
all: reimplement g_strstrip() macro to avoid Coverity warning
Coverity has issues with functions that handle ownership like
g_strstrip(). Thus the scan is full of false positives like:

  Error: RESOURCE_LEAK (CWE-772): [#def45] [important]
  NetworkManager-1.31.5/src/core/devices/wwan/nm-service-providers.c:134: alloc_fn: Storage is returned from allocation function "g_strdup".
  NetworkManager-1.31.5/src/core/devices/wwan/nm-service-providers.c:134: noescape: Resource "g_strdup(attribute_values[i])" is not freed or pointed-to in "g_strchug".
  NetworkManager-1.31.5/src/core/devices/wwan/nm-service-providers.c:134: leaked_storage: Failing to save or free storage allocated by "g_strdup(attribute_values[i])" leaks it.
  #  132|               if (strcmp(attribute_names[i], "value") == 0) {
  #  133|                   parse_context->state = PARSER_METHOD_GSM_APN;
  #  134|->                 parse_context->apn   = g_strstrip(g_strdup(attribute_values[i]));
  #  135|                   break;
  #  136|               }

Add a workaround for that.

There are other functions that have the same problem, but the usage
g_strstrip(g_strdup(...)) is common to warrant a special workaround.
2021-05-26 15:46:01 +02:00
Thomas Haller
9154f0128a
glib-aux: avoid coverity warning in nm_str_buf_append_printf()
It's a false positive. Still avoid it.

  Error: FORWARD_NULL (CWE-476): [#def479]
  NetworkManager-1.31.5/src/libnm-glib-aux/nm-shared-utils.c:5558: var_compare_op: Comparing "strbuf->_priv_str" to null implies that "strbuf->_priv_str" might be null.
  NetworkManager-1.31.5/src/libnm-glib-aux/nm-shared-utils.c:5575: var_deref_model: Passing "strbuf" to "nm_str_buf_maybe_expand", which dereferences null "strbuf->_priv_str".
  # 5573|           l2 = ((gsize) l) + 1u;
  # 5574|
  # 5575|->         nm_str_buf_maybe_expand(strbuf, l2, FALSE);
  # 5576|
  # 5577|           va_start(args, format);

  Error: FORWARD_NULL (CWE-476): [#def480]
  NetworkManager-1.31.5/src/libnm-glib-aux/nm-shared-utils.c:5558: var_compare_op: Comparing "strbuf->_priv_str" to null implies that "strbuf->_priv_str" might be null.
  NetworkManager-1.31.5/src/libnm-glib-aux/nm-shared-utils.c:5575: no_write_call: Although "nm_str_buf_maybe_expand" does overwrite "strbuf->_priv_str" on some paths, it also contains at least one feasible path which does not overwrite it.
  NetworkManager-1.31.5/src/libnm-glib-aux/nm-shared-utils.c:5578: var_deref_op: Dereferencing null pointer "strbuf->_priv_str".
  # 5576|
  # 5577|           va_start(args, format);
  # 5578|->         l = g_vsnprintf(&strbuf->_priv_str[strbuf->_priv_len], l2, format, args);
  # 5579|           va_end(args);
  # 5580|
2021-05-26 15:46:01 +02:00
Thomas Haller
a559950d41
libnm/tests: avoid Coverity warning in test code _do_test_utils_str_utf8safe_unescape()
Error: FORWARD_NULL (CWE-476): [#def435]
    NetworkManager-1.31.5/src/libnm-core-impl/tests/test-general.c:9084: var_compare_op: Comparing "str" to null implies that "str" might be null.
    NetworkManager-1.31.5/src/libnm-core-impl/tests/test-general.c:9105: var_deref_model: Passing null pointer "str" to "strchr", which dereferences it.
    # 9103|           s = nm_utils_str_utf8safe_unescape(str, NM_UTILS_STR_UTF8_SAFE_FLAG_NONE, &str_free_1);
    # 9104|           g_assert_cmpstr(s, ==, expected);
    # 9105|->         if (strchr(str, '\\')) {
    # 9106|               g_assert(str_free_1 != str);
    # 9107|               g_assert(s == str_free_1);
2021-05-26 15:46:00 +02:00
Thomas Haller
6646ee6546
libnm/tests: avoid potential crash in test code test_nm_utils_escaped_tokens()
It causes a Coverity warning, so let's work around it.
2021-05-26 15:46:00 +02:00
Thomas Haller
bbe39ed095
libnm: use cleanup attribute in NMVpnPluginOld's _connect_generic() 2021-05-26 15:45:59 +02:00
Thomas Haller
e56f126071
libnm: fix error handling in NMVpnPluginOld's _connect_generic()
Also Coverity found that something is wrong here:

   Error: FORWARD_NULL (CWE-476): [#def361]
   NetworkManager-1.31.5/src/libnm-client-impl/nm-vpn-plugin-old.c:441: var_compare_op: Comparing "connection" to null implies that "connection" might be null.
   NetworkManager-1.31.5/src/libnm-client-impl/nm-vpn-plugin-old.c:489: var_deref_model: Passing null pointer "connection" to "g_object_unref", which dereferences it.
   #  487|       }
   #  488|
   #  489|->     g_object_unref(connection);
   #  490|   }
   #  491|

Fixes: 6793a32a8c ('libnm: port to GDBus')
2021-05-26 15:45:59 +02:00
Thomas Haller
8db23d47e4
ifcfg-rh: minor cleanup in svEscape() 2021-05-26 15:45:59 +02:00
Thomas Haller
370316fc3e
ifcfg-rh: allocate exact buffer in _escape_ansic()
Previously, we would allocate a buffer of the worst case, that is,
4 times the number of bytes, in case all of them require octal escaping.

Coverity doesn't like _escape_ansic() for another reason:

   Error: NULL_RETURNS (CWE-476): [#def298]
   NetworkManager-1.31.5/src/core/settings/plugins/ifcfg-rh/shvar.c:161: returned_null: "g_malloc" returns "NULL".
   NetworkManager-1.31.5/src/core/settings/plugins/ifcfg-rh/shvar.c:161: alias: Assigning: "q" = "dest = g_malloc(strlen(source) * 4UL + 1UL + 3UL)". Both pointers are now "NULL".
   NetworkManager-1.31.5/src/core/settings/plugins/ifcfg-rh/shvar.c:163: dereference: Incrementing a pointer which might be null: "q".
   #  161|       q = dest = g_malloc(strlen(source) * 4 + 1 + 3);
   #  162|
   #  163|->     *q++ = '$';
   #  164|       *q++ = '\'';
   #  165|

It doesn't recognize that g_malloc() shouldn't return NULL (because
we never request zero bytes).

I am not sure how to avoid that, but let's rework the code to first count
how many characters we exactly need. It think that should also help with
the coverity warning.

Doing exact allocation requires first to count the number of required
bytes. It still might be worth it, because we might keep the allocated
strings a bit longer around.
2021-05-26 15:45:59 +02:00
Thomas Haller
f305a411cf
libnm: abort read in nm_vpn_service_plugin_read_vpn_details() on '\0'
We expect to read NUL terminated strings. Upon NUL, we should do
something. Assume this is EOF.
2021-05-26 15:45:58 +02:00
Thomas Haller
6bf7908d05
libnm: abort huge read in nm_vpn_service_plugin_read_vpn_details()
There is no need to accept such a huge read. Abort.
2021-05-26 15:45:58 +02:00
Thomas Haller
4a9fcb0fc3
libnm: buffer reads in nm_vpn_service_plugin_read_vpn_details()
It seems very ugly to read one byte at a time. Use a naive buffered
reader, so that we can read multiple bytes at a time, and return them
one by one.

Also, this now keeps state of any error/EOF. Once we reach EOF, we won't
read again. The previous code did that too, but I think this code is
easier to read.
2021-05-26 15:45:58 +02:00
Thomas Haller
1338a2ef96
libnm: avoid sleep in nm_vpn_service_plugin_read_vpn_details()
Polling with sleep() is really ugly. Use poll() instead.
2021-05-26 15:45:58 +02:00
Thomas Haller
ddf1942bfb
libnm: avoid g_warning() in nm_vpn_service_plugin_read_vpn_details()
g_warning() and printing to stdout/stderr are not suitable actions
for a library. If there is something important, find a way to report the
condition to the caller. If it's not important, stay quiet.
2021-05-26 15:45:58 +02:00
Thomas Haller
f0dc95e517
libnm: avoid strcmp in nm_vpn_service_plugin_read_vpn_details() 2021-05-26 15:45:57 +02:00
Thomas Haller
62c1944e7d
libnm: fix logic and double free in nm_vpn_service_plugin_read_vpn_details()
"val" and "key" are now marked as nm_auto. They are freed at the end,
and we should not free them before breaking the loop (at least not,
without also clearing the variables).

Fixes: 02dbba49d6 ('libnm: fix leak in nm_vpn_service_plugin_read_vpn_details()')
2021-05-26 15:45:57 +02:00
Thomas Haller
8da91cd85f
glib-aux: add nm_clear_g_string() helper
Since g_string_free() takes an additional argument,
it's not direclty usable with nm_clear_pointer(ptr, g_string_free);

As workaround, add nm_clear_g_string() helper.
2021-05-26 15:45:57 +02:00
Wen Liang
18839361ac
bond: support tlb_dynamic_lb in balance-alb mode
In kernel, `tlb_dynamic_lb` is supported to configure in bonding mode
`balance-alb`. Therefore, add the support in NetworkManager to avoid
undesirable limitation.

Kernel previously had such limitation and it was removed in
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e79c1055749e3183a2beee04a24da378623329c5.

Signed-off-by: Wen Liang <liangwen12year@gmail.com>

https://bugzilla.redhat.com/show_bug.cgi?id=1959934

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/868
2021-05-26 14:57:21 +02:00
Thomas Haller
8ba66f8ec9
trivial: improve code comments 2021-05-26 12:07:11 +02:00
Thomas Haller
174f7bd27b
core: rework string handling in enslave_slave()
Coverity doesn't like the previous code:

  Error: RESOURCE_LEAK (CWE-772): [#def34] [important]
  NetworkManager-1.31.5/src/core/devices/team/nm-device-team.c:835: alloc_fn: Storage is returned from allocation function "g_strdup".
  NetworkManager-1.31.5/src/core/devices/team/nm-device-team.c:835: noescape: Resource "g_strdup(config)" is not freed or pointed-to in "g_strdelimit".
  NetworkManager-1.31.5/src/core/devices/team/nm-device-team.c:835: leaked_storage: Failing to save or free storage allocated by "g_strdup(config)" leaks it.
  #  833|                       char *sanitized_config;
  #  834|
  #  835|->                     sanitized_config = g_strdelimit(g_strdup(config), "\r\n", ' ');
  #  836|                       err = teamdctl_port_config_update_raw(priv->tdc, slave_iface, sanitized_config);
  #  837|                       g_free(sanitized_config);

Maybe this works better.
2021-05-25 13:56:42 +02:00
Thomas Haller
ff9f2d27ec
bluetooth: ensure function-like behavior of _LOG_bzobj() macro
We want that macros behave like functions, in that they evaluate all
their arguments exactly once.
2021-05-25 13:27:26 +02:00
Thomas Haller
2d5489dcbb
glib-aux: minor cleanup in nm_uuid_is_valid_nm() 2021-05-19 10:56:36 +02:00
Fernando Fernandez Mancera
38246b1802 ifcfg: fix wired reader for ACCEPT_ALL_MAC_ADDRESSES key
When the ACCEPT_ALL_MAC_ADDRESSES key is found by the wired reader, the
wired setting was not being created.

Fixes: d946aa0c50 ('wired-setting: add support to accept-all-mac-addresses')
Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
2021-05-19 08:40:41 +00:00
Beniamino Galvani
a3f35ea5cc ovs: block auto activation of ovs-interfaces until ovsdb is ready
Otherwise the device tries to activate too early and fails.
2021-05-19 10:29:11 +02:00
Beniamino Galvani
e694f2cec1 manager: fix active_connection_find()
Commit 33b9fa3a3c ("manager: Keep volatile/external connections
while referenced by async_op_lst") changed active_connection_find() to
also return active connections that are not yet activating but are
waiting authorization.

This has side effect for other callers of the function. In particular,
_get_activatable_connections_filter() should exclude only ACs that are
really active, not those waiting for authorization.

Otherwise, in ensure_master_active_connection() all the ACs waiting
authorization are missed and we might fail to find the right master
AC.

Add an argument to active_connection_find to select whether include
ACs waiting authorization.

Fixes: 33b9fa3a3c ('manager: Keep volatile/external connections while referenced by async_op_lst')

https://bugzilla.redhat.com/show_bug.cgi?id=1955101
2021-05-19 10:29:11 +02:00
Thomas Haller
aef9b95aaa
dhcp: map "static" DHCP state for dhcpcd to bound
A user might configure /etc/dhcpcd.conf to contain static fallback addresses.
In that case, the dhcpcd plugin reports the state as "static". Let's treat
that the same way as bound.

Note that this is not an officially supported or endorsed way of
configuring fallback addresses in NetworkManager. Rather, when using
DHCP plugins, the user can hack the system and make unsupported
modifications in /etc/dhcpcd.conf or /etc/dhcp. This change only makes
it a bit easier to do it.

See-also: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/579#note_922758

https://bugzilla.gnome.org/show_bug.cgi?id=768362

Based-on-patch-by: gordonb3 <gordon@bosvangennip.nl>
2021-05-19 09:21:48 +02:00
Thomas Haller
75a64dd199
core: add nm_l3_config_data_iter_ip_{address,route}_for_each() helpers 2021-05-18 09:41:55 +02:00
Thomas Haller
4d929cc023
l3cfg: add more getters to NML3ConfigData 2021-05-18 09:41:55 +02:00
Thomas Haller
82cd0a8689
glib-aux: add nm_ip_addr_from_packed_array() helper 2021-05-18 09:41:54 +02:00
Thomas Haller
0abc14b3a0
core: remove unused best_ip_config_[46] field in NMDnsManager 2021-05-18 09:41:54 +02:00
Thomas Haller
55b722820d
l3cfg: fix nm_l3_config_data_new_clone() to make exact copy
We use the merge function to initialize the cloned instance.
Previously, merge did not always copy all properties, so the
cloned instance might not have been identical. Fix that.
2021-05-18 09:41:54 +02:00
Thomas Haller
71eefff6e7
core: return instance from nm_dhcp_lease_ref()/nm_dhcp_lease_unref() for convenience 2021-05-18 09:41:53 +02:00
Thomas Haller
4ef4201b0a
core: make IS_IPv4 variable an "int" type
gboolean is a typedef for int, so there is no difference in behavior.
However, we use IS_IPv4 as index into arrays of length two. Making
it "int" seems more approriate. Also, this is what all the other
(similar) code does.
2021-05-18 09:41:53 +02:00
Thomas Haller
bb1a495213
device: refactor dhcp-anycast-address handling for OLPC mesh device
dhcp-anycast-address is only set by OLPC mesh device. It's ugly to have
this in form of a nm_device_set_dhcp_anycast_address() method, because
that means to cache the address in NMDevice. Meaning, we have more state
in NMDevice, where it's not clear where it comes from.

Instead, whenever we need to DHCP anycast address, as the subclass to
provide it (if any). This way, it gets extracted from the currently
applied connection at the moment when it is needed. Beyond that, the
setting is not duplicated/cached in NMDevice anymore.
2021-05-18 09:41:53 +02:00
Thomas Haller
ca6d30cb24
libnm: comment "olpc-mesh.dhcp-anycast-address" only working with dhclient 2021-05-18 09:41:52 +02:00
Thomas Haller
5aa7e254bd
dhcp: refactor DHCP anycast_address to be property of NMDhcpClient
Instead of passing the setting on during ip4_start()/ip6_start(), make
it a property of NMDhcpClient.

This property is currently only set by OLPC devices, and is only
implemented by NMDhcpDhclient. As such, it also does not need to change
or get reset. Hence, and immutable, construct-only property is clearer,
because we don't have to pass parameters to ip[46]_start().

Arguably, the parameter is still there, but being immutable and always
set, make it easier to reason about it.
2021-05-18 09:41:52 +02:00
Thomas Haller
98a89a05ec
core: explicitly disable ethtool.pause-autoneg when setting pause-rx/pause-tx
Kernel will coerce values like

    ethtool -A eth0 autoneg on rx off

to have autonet still on.

Also, if autoneg on the interface is enabled, then `ethtool  -A eth0 tx off`
has no effect.

In NetworkManager, the user cannot configure "autoneg on" together with
any rx/tx settings. That would render the profile invalid. However, we
also need to take care that a profile

  nmcli connection add ... ethtool.pause-autoneg ignore ethtool.pause-tx off

really means off. That means, we must coerce an unspecified autoneg
setting to "off".
2021-05-17 23:31:21 +02:00
Thomas Haller
dfc5667603
libnm: reject setting ethtool.pause-autoneg while setting pause-rx/pause-tx
Setting pause-rx/pause-tx to an explicit value, implies that the user
does not want to enable autoneg. Reject that as invalid value in the
connection profile.
2021-05-17 23:31:21 +02:00
Beniamino Galvani
e67ddd826f device: commit MTU during stage2
Currently we commit the MTU to the device when updating the IP
configuration, or when a port device is added to the controller. This
means that for a connection with DHCP, the MTU is set only after DHCP
has completed. In particular, if DHCP doesn't complete and the
connection has an infinite timeout, the MTU is never set.

_commit_mtu() tracks different sources for the MTU of a device, and
each source has a different priority. Among these sources there are
the parent link (for VLANs), a dynamic IP configuration (DHCP, PPP)
and the connection profile.

A MTU from the connection always has the highest priority and
overrides other sources.

Therefore, if the connection specifies an MTU it can be applied at
stage2, even before configuring IP addressing.

https://bugzilla.redhat.com/show_bug.cgi?id=1890234
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/859
2021-05-17 16:20:36 +02:00
Beniamino Galvani
3c4450aa4d core: don't reset assume state too early
If the device is still unmanaged by platform-init (which means that
udev didn't emit the event for the interface) when the device gets
realized, we currently clear the assume state. Later, when the device
becomes managed, NM is not able to properly assume the device using
the UUID.

This situation arises, for example, when NM already configured the
device in initrd; after NM is restarted in the real root, udev events
can be delayed causing this race condition.

Among all unamanaged flags, platform-init is the only one that can be
delayed externally. We should not clear the assume state if the device
has only platform-init in the unmanaged flags.
2021-05-14 18:19:38 +02:00
Beniamino Galvani
5dc6d73243 managed: remove unneeded call to nm_device_assume_state_reset()
_set_state_full() in NMDevice already calls
nm_device_assume_state_reset() when the device reaches state >
DISCONNECTED.
2021-05-14 18:19:38 +02:00
Beniamino Galvani
f244aa6907 device: add NM_UNMANAGED_ALL 2021-05-14 18:19:38 +02:00
Thomas Haller
0609f1f31c
firewall: for now always default firewall-backend to "itables"
ntables backend is not yet well tested. Don't flip the default yet
but for now always use iptables.

Once nftables is shown to work well, revert this patch.
2021-05-14 11:46:56 +02:00
Thomas Haller
a79d5e2218
firewall: add special firewall-backend "none" 2021-05-14 11:41:33 +02:00
Thomas Haller
9ebdb967de
firewall: implement masquerading for shared mode with nftables
Add support for nftables, as a second backend beside iptables (firewalld
still missing).

Like iptables, choose to call the `nft` tool. The alternative would be
to use libnftables or talk netlink.

It's ugly to blocking wait for a process to complete. We already do that
for iptables, but we better should not because we should not treat other
processes as trusted and not allow untrusted code to block NetworkManager.
Fixing that would require a central manager that serializes all requests.
Especially with firewalld support, this will be interesting again,
because we don't want to synchronously talk D-Bus either.
For now, `nft` is still called synchronously. However, the internal
implementation uses an asynchronous function. That currently
serves no purpose except supporting a timeout. Otherwise, the only
reason why this is asynchronous is that I implemented this first, and
I think in the future we want this code to be non-blocking. So, instead
of dropping the asynchronous code, I wrap it in a synchronous function
for now.

The configured nft table is:

    table inet nm-shared-eth0 {
            chain nat_postrouting {
                    type nat hook postrouting priority srcnat; policy accept;
                    ip saddr 192.168.42.0/24 ip daddr != 192.168.42.0/24 masquerade
            }

            chain filter_forward {
                    type filter hook forward priority filter; policy accept;
                    ip daddr 192.168.42.0/24 oifname "eth0" ct state { established, related } accept
                    ip saddr 192.168.42.0/24 iifname "eth0" accept
                    iifname "eth0" oifname "eth0" accept
                    iifname "eth0" reject
                    oifname "eth0" reject
            }
    }
2021-05-14 11:41:33 +02:00
Thomas Haller
1da1ad9c99
firewall: make firewall-backend configurable via "NetworkManager.conf"
"iptables" and "nftables" will be supported. Currently, the code is
unused and only "iptables" is supported.
2021-05-14 11:41:32 +02:00
Thomas Haller
2a1d42e77d
firewall: refactor is_comment argument to _share_iptables_get_name()
The new name makes it more generic, because the limitation exists
for iptables chains. Everything else (iptables comments, nftables
tables) has no such length limit.
2021-05-14 11:41:32 +02:00
Thomas Haller
8a11380e80
glib-aux: add nm_auto_pop_and_unref_gmaincontext cleanup macro 2021-05-14 11:41:32 +02:00
Thomas Haller
071ef784cf
glib-aux: add nm_g_subprocess_terminate_in_background() helper 2021-05-14 11:41:32 +02:00