Use NM_UTILS_ERROR_UNKNOWN explicitly instead of the unrelated variable
'r', which happens to be 0 at this point from a prior unrelated call.
Fixes: aa8d5a3e9e ('dhcp: support FQDN flags in the nettools backend')
When nm_utils_file_set_contents() fails to write a certificate blob to
disk, cert_writer() only logged a warning and silently continued. The
overall write operation would "succeed", producing a keyfile missing the
certificate entry entirely. This could lead to a broken 802.1X
connection profile that fails authentication at runtime.
Propagate the error via g_set_error() so that nm_keyfile_write() returns
failure and the profile write is properly aborted.
Fixes: ecca85066d ('keyfile: write certificates and keys in a human-readable manner')
The "{&sv}" format in g_variant_iter_next() borrows the key but creates
a new reference for the value.
Fixes: f4f165f945 ('settings: add "plugin" argument to AddAndActivate2()')
The "{&sv}" format in g_variant_iter_next() borrows the key but creates
a new reference for the value.
Fixes: 82d16789a5 ('settings-connection: add a "plugin" argument to Update2()')
complete_connection() unconditionally rejects veth connections that
already have a peer name set, even when the peer name matches the
device's actual peer. Only reject when the names differ.
Fixes: 7c05ff1632 ('device: fix complete-connection for veth devices')
clean_dns_domains() uses "i != 0" as the condition to set the changed
flag, but "i" is the total number of DNS domains (it equals
rdata->dns_domains->len after the loop). The correct condition is
"i != j", which is true only when some domains actually expired.
Without this fix, any cleanup cycle with at least one DNS domain
triggers a spurious NM_NDISC_CONFIG_DNS_DOMAINS change notification.
Fixes: 4c2035347e ('ndisc: track expiry of Router Advertisements in milliseconds')
clean_addresses() uses "=" instead of "|=" when setting the changed
flags, which overwrites any flags set by previous cleanup functions
(e.g. clean_gateways()). This can cause gateway change notifications
to be lost when gateways and addresses expire at the same time.
Fixes: 4c2035347e ('ndisc: track expiry of Router Advertisements in milliseconds')
The clean_routes(), clean_dns_servers() and clean_dns_domains()
functions all pass rdata->gateways to _array_set_size_max() instead of
their respective arrays.
Fixes: c2c8c67d8c ('ndisc: rate limit number of accepted RA data to track')
When no existing route has lower priority than the new one, insert
at the end of the array instead of at the beginning. This is the
same fix that was applied to gateways.
Fixes: b324b970bc ('rdisc: fix double-addition of gateways & routes if priority increases')
The 'break' statement was outside the 'if' block, causing the
loop to always exit after the first iteration regardless of
whether the route matched the condition.
Fixes: 75c423f4c8 ('core: honor the ipv4.clat property')
In nm_l3_config_data_get_direct_route_for_host(), after the first check filters
out routes with a shorter prefix than the current best, the remaining candidates
have plen >= best_route->plen. The metric comparison must only apply when the
prefix lengths are equal; otherwise a more specific route (longer prefix) is
incorrectly skipped if it has a higher metric than the current best.
Fixes: 695ce608ba ('l3cfg: add nm_l3_config_data_add_dependent_routes()')
In _dedup_multi_index_cmp(), the !cmp_full path for NMP_OBJECT_TYPE_IP4_ADDRESS
compares obj_b->ip4_address.address with obj_b->ip4_address.address (and same
for peer_address), which always evaluates to zero. This means two different IPv4
addresses with the same plen are incorrectly considered equal.
Use obj_a on the left side of the comparison as intended.
Fixes: cb29244552 ('core: support compare flags in nm_l3_config_data_cmp_full()')
When ip4_start() is called after a restart (priv->client already exists),
nettools_create() is skipped so effective_client_id stays NULL. The
unconditional nm_dhcp_client_set_effective_client_id() call then clears
the client-id that was properly set during the initial start.
Only update the effective client-id when it was actually obtained from
nettools_create().
Fixes: 1db882ca63 ('dhcp: allow the plugin to be restarted')
The macro intended to represent approximately three years in seconds
but used 356 days/year instead of 365, making the period 27 days
shorter than intended.
Fixes: 7a0b6b17bb ('libnm-core: add ipv6.dhcp-duid property')
When detach_port() returns a value other than NM_TERNARY_DEFAULT,
the g_object_ref(port) passed as user_data for the async callback
is never released.
Fixes: 07dc237e5c ('device: wait port detach before leaving the DEACTIVATING state')
When building in release mode the compiler complains with:
../src/nmtui/nmt-page-bond.c: In function ‘other_options_widget_changed’:
../src/nmtui/nmt-page-bond.c:373:13: error: ‘name’ may be used uninitialized [-Werror=maybe-uninitialized]
373 | if (_is_other_option(name)) {
| ^~~~~~~~~~~~~~~~~~~~~~
../src/nmtui/nmt-page-bond.c:357:25: note: ‘name’ was declared here
357 | const char *name;
| ^~~~
That happens because "name" is initialized inside an assertion, which
is removed in release builds. Assertions must not have side effects.
Move the initialization out of the assertion.
Fixes: 6a841072ec ('nmtui/bond: introduce "other options" list')
Fixes Issue 1948: IPv6 link with RA and PD should be healthy
Use-case:
Some ISPs provide IPv6 via Prefix Delegation (PD) only. The default route is
link-local and the prefix can be used via an "ipv6.method: shared" interface.
This patch considers PD as a valid address for dhcp6 lease/link purposes.
Per pacrunner's documentation:
array{string} Domains [optional]
Domain names and IP range for which this proxy
configuration shall be valid. IP range should
be in CIDR format. eg:"192.168.1.0/12" for IPv4
and similarly for IPv6.
The dns-search property is not supposed to affect to the Proxy
settings. Is only meant to contain DNS search domains.
Fixes: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/work_items/1940
If the header `pppd/pppd.h` is not found, it’s *not* mentioned, that
PPP/PPPoE support can be disabled.
$ meson setup -Dselinux=false -Dlibaudit=no /dev/shm/nm-build
[…]
Run-time dependency gnutls found: YES 3.8.9
Run-time dependency pppd found: NO (tried pkgconfig and cmake)
Has header "pppd/pppd.h" : NO
meson.build:627:4: ERROR: Assert failed: couldn't find pppd.h. pppd development headers are required
Add `Use -Dppp=false to build without it.` to help the user.
Given linux bridge/bond holds DHCP config with
`ipv4.dhcp-send-release: ture` or `ipv6.dhcp-send-release: true`,
when stopping NetworkManager daemon, then NM daemon might
remove/deactivate physical interface first causing DHCP release packet
cannot be delivered.
To fix the issue, we sort the device deletion to let software device
that holds DHCP config to remove first.
Merge Request: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2379
Co-authored-by: Rahul Rajesh <rajeshrah22@gmail.com>
Add _dev_ipdhcpx_cleanup in __set_state_full in DEACTIVATING STATE
before STATE_CHANGED signal is emitted to ensure DHCP RELEASE
packet is sent.
Assisted-by: Cursor with Claude Opus 4.5
The inner condition at line 4086 duplicated the outer check for
NM_CONNECTION_SERIALIZE_ALL, making the else-if branch for
NM_CONNECTION_SERIALIZE_WITH_NON_SECRET unreachable. This meant
the non-secret serialization path was never actually tested.
Restructure to make both branches reachable.
Found by Coverity (CID: DEADCODE).
Fixes: 395a78618b ('libnm/tests: add tests for creating wireguard connection profiles')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The validation checks 'addr' (the extracted address portion before '/')
but the error message prints 'string' (the full input including the
prefix). For input like "192.168.1.999/24", the error would show the
full string instead of just the invalid address part.
Found by Coverity (CID: COPY_PASTE_ERROR).
Fixes: 539db43619 ('libnm: avoid heap allocation for checking valid routes in nm_ip_route_attribute_validate()')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The error variable is declared outside the loop but freed with
g_error_free() which does not reset the pointer to NULL. On the
next iteration, g_set_error() sees a non-NULL *err (dangling pointer)
and error->message dereferences freed memory.
Use g_clear_error() instead which also resets the pointer.
Found by Coverity (CID: USE_AFTER_FREE).
Fixes: ecc074b2f8 ('initrd: add command line parser')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
nm_wireguard_peer_new() returns a new peer with refcount 1.
nmt_wireguard_peer_editor_new() takes its own copy via
g_value_dup_boxed(), so the original peer was never unreffed.
Unref the peer after passing it to the editor.
Found by Coverity (CID: RESOURCE_LEAK).
Fixes: b0f5b1d97a ('tui: add WireGuard support to nmtui')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The loop condition checked the same pointer twice instead of checking
the array element: `ip_data->domains.search && ip_data->domains.search`
should be `ip_data->domains.search && ip_data->domains.search[i]`.
As written, the loop would never terminate when `search` is non-NULL
(only in debug builds with NM_MORE_ASSERTS > 5).
Found by Coverity (CID: CONSTANT_EXPRESSION_RESULT).
Fixes: b8dab47705 ('dns: fix handling default routing domains with systemd-resolved')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
find_port_info() can return NULL if the port is not registered.
The code dereferenced `info->port_state` before the null check,
which would crash. Move the null check before the dereference.
Found by Coverity (CID: REVERSE_INULL).
Fixes: a8329587c8 ('device: fix bug when deactivating port connections asynchronously')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The literal `1` is a 32-bit int. When prefix length is less than 33,
the shift `(64 - plen)` exceeds 31 bits, causing undefined behavior.
Cast to guint64 (same type as `num_subnets`) to perform the shift in
64-bit arithmetic.
Found by Coverity (CID: OVERFLOW_BEFORE_WIDEN).
Fixes: ec12fcf6bf ('policy: delegate IPv6 configuration to ipv6.method=shared connections')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
while the default value of the same in NM is 0, which causes warnings to
arise, change this default value.
Allow the range in NM to stay 0-255 as 0 is used to indicate arp_missed_max
is unset (for modes that don't support the setting), however do not let it
be set beyond the kernel permissible range for the modes that support it, set
it to the kernel default of 2 instead.
Do not apply or reapply the arp_missed_max setting when it is not
supported.
Signed-off-by: Pradyumn Rahar <pradyumn.rahar@oracle.com>
Adjust %postun to handle missing udev, in the same way %post does.
This permits installation inside a container without udev.
/usr/sbin/update-alternatives is needed for the initscripts-updown
subpackage only.
When creating the first device in a veth pair, the peer ifindex is
valid, but the peer device does not exist yet. This should be set
when update_properties() is called for the second device, but fix
the conditional.