Commit Graph

29669 Commits

Author SHA1 Message Date
Lubomir Rintel
51a182581f release: bump version to 1.37.0 (development) 2022-02-04 18:24:18 +01:00
Lubomir Rintel
7d0faf5077 release: bump version to 1.35.90 (1.36-rc1) 2022-02-04 18:14:15 +01:00
Lubomir Rintel
dc9d932ecc NEWS: update for 1.36-rc1 2022-02-04 18:04:41 +01:00
Thomas Haller
f16d027eb8 systemd: workaround gcc warning about LOG2ULL() by disabling code (2)
gcc-4.8.5-44.el7.x86_64 warns:

    In file included from ./src/libnm-systemd-shared/src/basic/hashmap.h:10:0,
                     from ./src/libnm-systemd-shared/src/shared/dns-domain.h:10,
                     from src/libnm-systemd-shared/nm-sd-utils-shared.c:12:
    ./src/libnm-systemd-shared/src/basic/util.h: In function 'log2u64':
    ./src/libnm-systemd-shared/src/basic/util.h:30:20: error: first argument to '__builtin_choose_expr' not a constant
     #define LOG2ULL(x) __builtin_choose_expr(__builtin_constant_p(x), CONST_LOG2ULL(x), NONCONST_LOG2ULL(x))
                        ^
    ./src/libnm-systemd-shared/src/basic/util.h:34:16: note: in expansion of macro 'LOG2ULL'
             return LOG2ULL(x);
                    ^
    ./src/libnm-systemd-shared/src/basic/util.h: In function 'log2i':
    ./src/libnm-systemd-shared/src/basic/util.h:53:18: error: first argument to '__builtin_choose_expr' not a constant
     #define LOG2U(x) __builtin_choose_expr(__builtin_constant_p(x), CONST_LOG2U(x), NONCONST_LOG2U(x))
                      ^
    ./src/libnm-systemd-shared/src/basic/util.h:56:16: note: in expansion of macro 'LOG2U'
             return LOG2U(x);
                    ^
    ./src/libnm-systemd-shared/src/basic/util.h: In function 'log2u':
    ./src/libnm-systemd-shared/src/basic/util.h:53:18: error: first argument to '__builtin_choose_expr' not a constant
     #define LOG2U(x) __builtin_choose_expr(__builtin_constant_p(x), CONST_LOG2U(x), NONCONST_LOG2U(x))
                      ^
    ./src/libnm-systemd-shared/src/basic/util.h:60:16: note: in expansion of macro 'LOG2U'
             return LOG2U(x);
                    ^
2022-02-04 16:30:02 +01:00
Lubomir Rintel
c8ba636d0e dhcp-options: change "dhcp6_ntp_server" to plural form
The option can be present multiple times.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1085
2022-02-04 15:54:15 +01:00
Lubomir Rintel
f15fb5ecaa contrib/modemu: extend PDP support
Improve it just a bit to make ModemManager 1.18 happy.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1087
2022-02-04 15:54:15 +01:00
Lubomir Rintel
ea37c42b16 contrib/modemu: respond to AT+COPS?
This queries the operator code. If NetworkManager got one, it can
connect the modem device automatically without setting the APN.

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1086
2022-02-04 15:54:15 +01:00
Thomas Haller
a16b380d32 systemd: workaround gcc warning about LOG2ULL() by disabling code
gcc-4.8.5-44.el7.x86_64 warns:

    In file included from ./src/libnm-systemd-shared/src/basic/hashmap.h:10:0,
                     from ./src/libnm-systemd-shared/src/shared/dns-domain.h:10,
                     from src/libnm-systemd-shared/nm-sd-utils-shared.c:12:
    ./src/libnm-systemd-shared/src/basic/util.h: In function 'log2u64':
    ./src/libnm-systemd-shared/src/basic/util.h:30:20: error: first argument to '__builtin_choose_expr' not a constant
     #define LOG2ULL(x) __builtin_choose_expr(__builtin_constant_p(x), CONST_LOG2ULL(x), NONCONST_LOG2ULL(x))
                        ^
    ./src/libnm-systemd-shared/src/basic/util.h:34:16: note: in expansion of macro 'LOG2ULL'
             return LOG2ULL(x);
                    ^
    ./src/libnm-systemd-shared/src/basic/util.h: In function 'log2i':
    ./src/libnm-systemd-shared/src/basic/util.h:53:18: error: first argument to '__builtin_choose_expr' not a constant
     #define LOG2U(x) __builtin_choose_expr(__builtin_constant_p(x), CONST_LOG2U(x), NONCONST_LOG2U(x))
                      ^
    ./src/libnm-systemd-shared/src/basic/util.h:56:16: note: in expansion of macro 'LOG2U'
             return LOG2U(x);
                    ^
    ./src/libnm-systemd-shared/src/basic/util.h: In function 'log2u':
    ./src/libnm-systemd-shared/src/basic/util.h:53:18: error: first argument to '__builtin_choose_expr' not a constant
     #define LOG2U(x) __builtin_choose_expr(__builtin_constant_p(x), CONST_LOG2U(x), NONCONST_LOG2U(x))
                      ^
    ./src/libnm-systemd-shared/src/basic/util.h:60:16: note: in expansion of macro 'LOG2U'
             return LOG2U(x);
                    ^
2022-02-04 13:32:43 +01:00
Thomas Haller
18cb8205b3 systemd: merge branch systemd into main
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1068
2022-02-03 18:50:26 +01:00
Thomas Haller
3399e19df8 device: update metered status when getting DHCP lease
The metered status can depend on the DHCP lease, as we accept the
ANDROID_METERED vendor option. That means, on a DHCP update we need
to re-evaluate the metered flag.

This fixes a potential race, where IPv6 might succeed first and
activation completes (with GUESS_NO metered flag). A subsequent
DHCPv4 update requires to re-evaluate that decision.

Fixes-test: @connection_metered_guess_yes

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1080
2022-02-03 18:46:38 +01:00
Lubomir Rintel
ecc73eb239 ovs-port: always remove the OVSDB entry on slave release
When the link is externally removed, the OVSDB entry will be left
behind. That's not cool -- we need to remove it.

https://bugzilla.redhat.com/show_bug.cgi?id=1935026
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1084
2022-02-03 13:38:21 +01:00
Thomas Haller
405afad0a6 platform: merge branch 'th/platform-netlink-alloc'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1069
2022-02-03 13:12:55 +01:00
Thomas Haller
d73594682f platform: no need to initialize nla sockaddr parameter to nl_recv()
We always call nl_recv() in a loop. If it would be necessary to clear
the variable, then it would need to happen inside the loop. But it's
not necessary.
2022-02-03 13:11:17 +01:00
Thomas Haller
dd3dffb1b0 platform: use pre-allocated receive buffer for rtnetlink socket
Instead of allocating a receive buffer for each nl_recv() call, re-use a
pre-allocated buffer.

The buffer is part of NMPlatform and kept around. As we would not have more
than one NMPlatform instance per netns, we waste a limited amount of
memory.

The buffer gets initialized with 32k, which should be large enough for
any rtnetlink message that we might receive. As before, if the buffer
would be too small, then the first large message would be lost (as we don't
peek). But then we would allocate a larger buffer, resync the platform cache
and recover.
2022-02-03 13:10:29 +01:00
Thomas Haller
e8cfa22929 platform/netlink: accept pre-allocated receive buffer for nl_recv()
Add parameter to accept a pre-allocated buffer for nl_recv(). In
practice, rtnetlink messages are not larger than 32k, so we can always
pre-allocate it and avoid the need to heap allocate it.
2022-02-03 13:08:47 +01:00
Thomas Haller
340f05ba42 platform: use proper g_free() function for netlink receive buffer
In the past, nl_recv() was libnl3 code and thus used malloc()/realloc() to
allocate the buffer. That meant, we should free the buffer with libc's free()
function instead of glib's g_free(). That is what nm_auto_free is for.

Nowadays, nl_recv() is forked and glib-ified, and uses the glib wrappers to
allocate the buffer. Thus the buffer should also be freed with g_free()
(and gs_free).

In practice there is no difference, because glib's allocation directly
uses libc's malloc/free. This is purely a matter of style.
2022-02-03 13:07:35 +01:00
Beniamino Galvani
5153810bd6 merge: branch 'bg/assume-plat-init'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1081
2022-02-03 09:21:16 +01:00
Beniamino Galvani
d72a292005 device: fix assuming connections when platform-init arrives late
When the NM_UNMANAGED_PLATFORM_INIT flag is cleared last in
device_link_changed(), a recheck-assume is scheduled and then the
device goes immediately to UNAVAILABLE. During the state transition,
addresses and routes are removed from the interface. Then,
recheck-assume finds that the device can be assumed but it's too late
since the device was already deconfigured.

This is a problem as the whole point of assuming a device is to
activate a connection while leaving the device untouched.

In the NMCI "dracut_NM_vlan_over_bridge and dracut_NM_vlan_over_bond"
test, NM in real root tries to assume a vlan device that was activated
in initrd. When the interface gets deconfigured in UNAVAILABLE, the
connection to the NFS server breaks and the rootfs becomes
inaccessible.

The fix to this problem is to delay state transitions in
device_link_changed() to a idle handler, so that recheck-assume can
run before.

Fixes-test: @dracut_NM_vlan_over_bridge
Fixes-test: @dracut_NM_vlan_over_bond

https://bugzilla.redhat.com/show_bug.cgi?id=2047302
2022-02-03 09:17:20 +01:00
Beniamino Galvani
b2e1bd4436 device: remove unused if branch in device_link_changed()
nm_device_set_unmanaged_by_user_settings() does nothing when the
device is unmanaged by platform-init. Remove the if branch to make
this more explicit.
2022-02-03 09:16:39 +01:00
Thomas Haller
dc1092e22b l3cfg: merge branch 'th/l3cfg-acd-crash'
https://bugzilla.redhat.com/show_bug.cgi?id=2047788

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1077
2022-02-02 11:10:36 +01:00
Thomas Haller
db0d84f13a l3cfg: fix handling "instance-reset" ACD event
The ACD state handling is unfortunately very complicated. That is, because
we obviously need to track state about how ACD is going (the acd_data, and
in particular NML3AcdAddrState). Then there are various things that can
happen, which are the AcdStateChangeMode enums. All these state-changes
come together in one function: _l3_acd_data_state_change(), which is
therefore complicated (I don't think that it would become simpler by
spreading this code out to different functions, on the contrary).
Anyway.

So, what happens when we need to reset the n-acd instance? For example,
because the MAC address of the link changed or some error. I guess, we
need to restart probing.

Previously, I think this was not handled properly. We already tried to
fix this several times, the last was commit b331606386 ('l3cfg: on
n-acd instance-reset clear also ready ACD state'). There is still an
issue ([1]).

The bug [1] is, that we are in state NM_L3_ACD_ADDR_STATE_READY, during
 ACD_STATE_CHANGE_MODE_TIMEOUT event. That leads to an assertion
failure.

  #5  0x00007f23be74698f in g_assertion_message_expr (domain=0x5629aca70359 "nm", file=0x5629aca62aab "src/core/nm-l3cfg.c", line=2395, func=0x5629acb26b30 <__func__.72.lto_priv.4> "_l3_acd_data_state_change", expr=<optimized out>) at ../glib/gtestutils.c:3091
  #6  0x00005629ac937e46 in _l3_acd_data_state_change (self=0x5629add69790, acd_data=0x5629add8d520, state_change_mode=ACD_STATE_CHANGE_MODE_TIMEOUT, sender_addr=0x0, p_now_msec=0x7ffded506460) at src/core/nm-l3cfg.c:2395
  #7  0x00005629ac939f4d in _l3_acd_data_timeout_cb (user_data=user_data@entry=0x5629add8d520) at src/core/nm-l3cfg.c:1933
  #8  0x00007f23be71c5a1 in g_timeout_dispatch (source=0x5629addd7a80, callback=0x5629ac939ee0 <_l3_acd_data_timeout_cb>, user_data=0x5629add8d520) at ../glib/gmain.c:4889
  #9  0x00007f23be71bd4f in g_main_dispatch (context=0x5629adc6da00) at ../glib/gmain.c:3337
  #10 g_main_context_dispatch (context=0x5629adc6da00) at ../glib/gmain.c:4055

That can only happen, (I think) when we scheduled the timeout
during an earlier ACD_STATE_CHANGE_MODE_INSTANCE_RESET event. Meaning,
we need to handle instance-reset better.

Instead, during instance-reset, switch always back to state PROBING, and
let the timeout figure it out.

[1] https://bugzilla.redhat.com/show_bug.cgi?id=2047788
2022-02-02 11:08:31 +01:00
Thomas Haller
d7a951b947 l3cfg: add comment to _acd_data_collect_tracks_data() about linear search 2022-02-02 11:08:30 +01:00
Thomas Haller
f00980e5ca l3cfg: add assertion for scheduling timeout in _l3_acd_data_timeout_schedule()
The first point is that ACD timeout is strongly tied to the current state. That
is (somewhat) obvious, because _l3_acd_data_state_set_full() will clear any pending
timeout. So you can only schedule a timeout *after* setting the state,
and setting the next state, will clear the timeout.

Likewise, note that l3_acd_data_state_change() for the event
ACD_STATE_CHANGE_MODE_TIMEOUT asserts that it is only called in the few
states where that is expected. See rhbz#2047788 where that assertion
gets hit.

The first point means that we must only schedule a timer when we are
also in a state that supports that. Add an assertion for that at the
point when scheduling the timeout. The assert at this point is useful,
because it catches the moment when we do the wrong thing (instead of
getting the assertion later during the timeout, when we no longer know
where the error happened).

See-also: https://bugzilla.redhat.com/show_bug.cgi?id=2047788
2022-02-02 11:08:30 +01:00
Thomas Haller
6012853010 l3cfg: use nm_g_timeout_add_source() helpers in "nm-l3cfg.c"
It's shorter, and brevity lets us focus on the important things in the
code.
2022-02-02 11:08:30 +01:00
Thomas Haller
88e7ea20c3 l3cfg: only constructing log message when needed in _l3_acd_data_state_set_full() 2022-02-02 11:08:30 +01:00
Thomas Haller
49fe45b155 l3cfg: merge branch 'th/device-manual-l3cd-prio'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1065
2022-02-02 09:47:08 +01:00
Thomas Haller
5cbf666279 core: increase l3cfg merge priority for VPN config
Now that higher priorities numbers really mean more important,
it seems that the VPN configuration should be rather important.

Bump the number, also in relation to NMDevice's L3ConfigDataType.

It might not matter too much, because usually the VPN tunnel device does
not have NDevice to add other l3cds and those from VPN might be alone.
Except, maybe with routing VPN (libreswan) that is different. Dunno.
2022-02-01 19:22:02 +01:00
Thomas Haller
5774af9cbd device: adjust NM_L3CFG_CONFIG_PRIORITY_IPV6LL and L3_CONFIG_DATA_TYPE_LL_6
NM_L3CFG_CONFIG_PRIORITY_IPV6LL and L3_CONFIG_DATA_TYPE_LL_6 are
somewhat related. They probably should be numerically identical.

Now, L3_CONFIG_DATA_TYPE_LL_6 cannot be zero (because
L3_CONFIG_DATA_TYPE_LL_4 is zero and L3ConfigDataType values must be
distinct). Therefore, also bump NM_L3CFG_CONFIG_PRIORITY_IPV6LL to 1.
Of course, NM_L3CFG_CONFIG_PRIORITY_IPV6LL is not obviously more important
than NM_L3CFG_CONFIG_PRIORITY_IPV4LL. But to be consistent with
L3_CONFIG_DATA_TYPE_LL_6 is probably more important here.
2022-02-01 19:22:01 +01:00
Thomas Haller
24896e636b l3cfg: fix order of NML3ConfigData priorities in NML3Cfg
There was a disagreement whether higher priority numbers mean more/less
important. NMDevice and callers of nm_l3cfg_add_config() assumed that
higher numbers are more important, while _l3_config_datas_get_sorted_cmp()
did the inverse.

There is no obvious right or wrong. We only need to agree. It seems
slightly more sensible to keep the caller's interpretation.
2022-02-01 19:22:01 +01:00
Thomas Haller
982807ec4e Revert "nm-device: prefer manually configured addresses to automatic"
This commit does not seem correct. The enum was moved with the declared
intent to make manual IP configuration preferred. But the code comment
in L3ConfigDataType states that higher numbers are more important.
Also, all the other values are intentionally ordered so that more
important method have higher numbers. For example, LL_4 < DHCP_4 < SHARED_4 <
DEV_4 (in increasing priority). While it's often not clear whether to
prefer one method over the other, or what the actual effect of (LL_4 < DHCP_4)
is, the numbers were chosen intentionally.

Only moving MANUALIP first, counters the relative order of the other values.
If there is the problem, that the code comment is wrong (and lower
numbers mean more important), then we would have to reverse all
enum values.

The real problem is that NML3Cfg's _l3_config_datas_get_sorted_cmp()
has the wrong order/understanding. So the real fix is there and will
be done next. That is, unless we would agree that _l3_config_datas_get_sorted_cmp()
is in the right, and prefer lower numbers -- in which case all values had to be
reversed.

This reverts commit af1903fe3f.
2022-02-01 19:22:01 +01:00
Lubomir Rintel
c03d166322 dhcp: include "dhcp6_ntp_server" in Dhcp6Config
Works for the internal DHCP client only as sd-dhcp does the option
parsing for us.

The option 56 is not understood by dhclient so we would need to parse it
ourselves. Let's not do it for now, as the RFC seems to written in a
somewhat poor taste.

https://bugzilla.redhat.com/show_bug.cgi?id=2047415#c2
2022-02-01 15:56:18 +01:00
Thomas Haller
f42de1dfba core/trivial: whitespace 2022-02-01 15:51:07 +01:00
Thomas Haller
dd85cb1958 dhcp: improve error message in assertion of NMDhcpOption data
We have global data NMDhcpOption that describes the DHCP meta data.
There is a consistency check with NM_MORE_ASSERTS.

Improve the error message when the meta data is inconsistent to
help finding the bug.
2022-02-01 15:42:57 +01:00
Fernando Fernandez Mancera
3034b99c00 ovsdb: unrealize removed ovs-interfaces on UNAVAILABLE state
When NetworkManager shuts down, it is not done properly. We cannot
ensure that all pending async operations are cancelled and therefore
there are possible device leaks. This means that not all the devices
will be disposed and finalized because a different component is handling
a reference to it.

Since the l3cfg refactor, this is affecting to ovs ports. When shutting
down sometimes there are ovs-interface or ovs-port devices that are not
being cleared correctly. When starting NetworkManager back, these
devices are not going to be created again because they already exist and
the existing compatible connections will be instruct to use the device.
But currently, ovsdb is only unrealizing a device after removal if the
state is UNMANAGED. This is wrong, because it will left an inconsistent
state in NetworkManager and the ovs-port/ovs-interface connection won't
be activated.

The interfaces removed by ovsdb must be unrealized if they are on
UNAVAILABLE state.

https://bugzilla.redhat.com/show_bug.cgi?id=2029937
2022-01-31 11:46:17 +01:00
Thomas Haller
0f5536d60c device/wwan: add compat define for MM_MODEM_CAPABILITY_5GNR
MM_MODEM_CAPABILITY_5GNR was added in ModemManager 1.14. Add a define
for compatibility with older versions.
2022-01-29 23:43:27 +01:00
Thomas Haller
34dd9d1f1c wwan: merge branch 'th/wwan-5gnr-capability'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1076
2022-01-29 16:29:19 +01:00
Thomas Haller
068f8dc496 device/wwan: drop deprecated MM_MODEM_CAPABILITY_LTE_ADVANCED
This is long deprecated, and was apparently never even used/exposed
by ModemManager. Drop it.
2022-01-29 16:28:37 +01:00
Thomas Haller
748feaee89 device/wwan: use cleanup macro in get_capabilities() 2022-01-29 16:26:02 +01:00
Thomas Haller
c0f9925de8 device/wwan: static assert that ModemManager and NM capabilities correspond 2022-01-29 16:26:02 +01:00
Thomas Haller
64630f57a2 device/wwan: ensure capabilities are suitable 32 bit flags
The properties NM_DEVICE_MODEM_CAPABILITIES and
NM_DEVICE_MODEM_CURRENT_CAPABILITIES are uint, with a range from zero to
G_MAXUINT32.

nm_modem_get_capabilities() passes the "untrusted" flags from
ModemManager. Ensure that they fit into 32 bit, and don't cause an
assertion failure due to the range check.

Yes, in practice, on all platforms where we build (known to me), guint
is always the same as guint32. So this has little effect.

Also, cast to guint. Previously, this was just a C enum
NMDeviceModemCapabilities, which theoretically has implementation
defined sizes. Yes, in practice, they too are of size guint, and this
was not an actual bug. But be specific about converting between
different integer types.
2022-01-29 16:22:31 +01:00
Thomas Haller
d501e96857 libnm: use MODEM_CAPS_3GPP()/MODEM_CAPS_3GPP2() macros in get_setting_type() 2022-01-29 16:22:30 +01:00
Thomas Haller
8f6423ac06 libnm,core: use NM_FLAGS_ANY() for MODEM_CAPS_3GPP()/MODEM_CAPS_3GPP2()
Macros should (where possible and sensible) behave function-like.
That means for example, that they evaluate arguments only once, and
use parentheses around code that expands, so that unexpected uses
work correctly. The parentheses was missing.

Instead, just use the NM_FLAGS_ANY() macro which gets this right.
2022-01-29 16:22:30 +01:00
Thomas Haller
e9de583bb9 libnm: add "Since" gtkdoc comment to @NM_DEVICE_MODEM_CAPABILITY_5GNR 2022-01-29 16:16:32 +01:00
Daniele Palmas
ca8168775c libnm,core: add 5GNR device modem capability
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1076
2022-01-29 16:15:29 +01:00
Thomas Haller
ead18781ad release: bump version to 1.35.7 (development) 2022-01-28 15:06:13 +01:00
Thomas Haller
81cf70b0c1 libnm: merge branch 'th/libnm-dangling-property-2'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1075
2022-01-28 11:02:22 +01:00
Thomas Haller
039f0b2803 libnm: add code comments to NMClient 2022-01-28 11:01:53 +01:00
Thomas Haller
125b1f9a9a libnm/tests: enable check for dangling pointer in test_activate_virtual() 2022-01-28 11:01:53 +01:00
Thomas Haller
8eef822093 libnm: fix dangling pointer in "o" properties when unregistering NMObject
When NMClient gets destroyed, it unrefs all NMObject. We need to unbreak
cycles then, and the property getters must return NULL. In particular,
for "o" type properties (NMLDBusPropertyO), this was not done correctly.
For example, calling nm_device_get_active_connection() while/after
destroying the NMClient can give a dangling pointer and assertion
failure. This will also be covered by test_activate_virtual(). Probably
a similar issue can happen, when a D-Bus object gets removed (without
destroying NMClient altogether).

The fix is that nml_dbus_property_o_clear() needs to clear "nmobj". That
is correct, because the pointer is no longer valid and should not be there.
And the unit test shows that in fact a pointer is left there, and
clearing it fixes it.

That was different from an earlier attempt to fix this (in commit 62b2aa85e8
('Revert "libnm: fix dangling pointer in public API while destructing NMClient"')),
where clearing the pointer at a different place broke things. That
attempt was wrong, because nml_dbus_property_o_notify_changed() needs to be the
one that sets/clears nmobj field during a regular update. But the case
here is not a regular update, nml_dbus_property_o_clear() happens during
unregister/cleanup, and then we need to clear the pointer.

Fixes: ce0e898fb4 ('libnm: refactor caching of D-Bus objects in NMClient')

https://bugzilla.redhat.com/show_bug.cgi?id=2039331
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/896
See-also: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1064

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1075
2022-01-28 11:01:45 +01:00
Beniamino Galvani
9d60cd2813 dhcp: fix crash accepting leases without addresses
For IPv6 the lease doesn't necessarily have an address. If the address
is missing or the DHCP client doesn't implement accept(), we don't
need to wait for the address in platform.

From https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1066#note_1233210 :

  0  0x00007ffff760f88c in __pthread_kill_implementation () at /lib64/libc.so.6
  1  0x00007ffff75c26a6 in raise () at /lib64/libc.so.6
  2  0x00007ffff75ac7d3 in abort () at /lib64/libc.so.6
  3  0x00007ffff77c5d4c in g_assertion_message (domain=<optimized out>, file=<optimized out>, line=<optimized out>, func=<optimized out>, message=<optimized out>)
      at ../glib/gtestutils.c:3223
  4  0x00007ffff782645f in g_assertion_message_expr
      (domain=domain@entry=0x5555559e7c96 "nm", file=file@entry=0x5555559deac0 "src/core/dhcp/nm-dhcp-client.c", line=line@entry=609, func=func@entry=0x5555559e0090 <__func__.31> "l3_cfg_notify_cb", expr=expr@entry=0x5555559df5cf "lease_address") at ../glib/gtestutils.c:3249
  5  0x00005555558b2866 in l3_cfg_notify_cb (l3cfg=0x555555c29790, notify_data=<optimized out>, self=0x555555e9a1b0) at src/core/dhcp/nm-dhcp-client.c:609
  9  0x00007ffff791abe3 in <emit signal ??? on instance ???> (instance=instance@entry=0x555555c29790, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3553
      6  0x00007ffff78fcc7f in g_closure_invoke (closure=0x555555ca3900, return_value=0x0, n_param_values=2, param_values=0x7fffffffd420, invocation_hint=0x7fffffffd3a0)
      at ../gobject/gclosure.c:830
      7  0x00007ffff7919106 in signal_emit_unlocked_R
      (node=node@entry=0x555555bbadc0, detail=detail@entry=0, instance=instance@entry=0x555555c29790, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffd420) at ../gobject/gsignal.c:3742
      8  0x00007ffff791a9ca in g_signal_emit_valist (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffd5f0)
      at ../gobject/gsignal.c:3497
  10 0x000055555564c8a6 in _nm_l3cfg_emit_signal_notify (self=self@entry=0x555555c29790, notify_data=notify_data@entry=0x7fffffffdf30) at src/core/nm-l3cfg.c:576
  11 0x000055555564ce77 in _nm_l3cfg_emit_signal_notify_simple (self=self@entry=0x555555c29790, notify_type=notify_type@entry=NM_L3_CONFIG_NOTIFY_TYPE_POST_COMMIT)
      at src/core/nm-l3cfg.c:585
  12 0x0000555555656082 in _l3_commit (self=self@entry=0x555555c29790, commit_type=NM_L3_CFG_COMMIT_TYPE_UPDATE, commit_type@entry=NM_L3_CFG_COMMIT_TYPE_AUTO, is_idle=is_idle@entry=1)
      at src/core/nm-l3cfg.c:4201
  13 0x0000555555656189 in _l3_commit_on_idle_cb (user_data=user_data@entry=0x555555c29790) at src/core/nm-l3cfg.c:2961
  14 0x00007ffff77f847b in g_idle_dispatch (source=0x555555d65680, callback=0x55555565612c <_l3_commit_on_idle_cb>, user_data=0x555555c29790) at ../glib/gmain.c:5897
  15 0x00007ffff77fc130 in g_main_dispatch (context=0x555555aa5020) at ../glib/gmain.c:3381
  16 g_main_context_dispatch (context=0x555555aa5020) at ../glib/gmain.c:4099
  17 0x00007ffff7851208 in g_main_context_iterate.constprop.0 (context=0x555555aa5020, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4175
  18 0x00007ffff77fb853 in g_main_loop_run (loop=0x555555aa5970) at ../glib/gmain.c:4373
  19 0x0000555555593c56 in main (argc=<optimized out>, argv=<optimized out>) at src/core/main.c:509

Fixes: e1648d0665 ('core: commit l3cd asynchronously on DHCP bound event')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1074
2022-01-27 22:17:46 +01:00