Crash originating from libnm 1.30 when disconnecting ethernet while VPN connection is active
Hello. I am maintaining software that manipulates connection profiles using libnm and I am experiencing crashes in scenarios with VPN connections. I ran checks using Valgrind memcheck and it seems that the crashes are originating from libnm memory violations. The error was originally happening with network manager 1.10, and migrating to the version 1.30 didn't change it.
I modified libnm/nm-client.c by adding 1 line which would log start of the _dbus_settings_updated_cb function:
NML_NMCLIENT_LOG_T(self, "%s: [%s] Updated signal received function started", log_context, object_path);
Here is the output from valgrind:
==00:00:02:42.260 2250==
==00:00:02:42.281 2250== Invalid read of size 8
==00:00:02:42.281 2250== at 0x51D2989: _dbus_settings_updated_cb (nm-client.c:3367) (originally 3365)
==00:00:02:42.281 2250== by 0x70A7BFA: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.6400.3)
==00:00:02:42.281 2250== by 0x5CEBD1C: g_main_context_dispatch (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.3)
==00:00:02:42.281 2250== by 0x5CEC0B7: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.3)
==00:00:02:42.281 2250== by 0x5CEC391: g_main_loop_run (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.6400.3)
==00:00:02:42.282 2250== by 0x470355: Server::run(bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, Gio::DBus::BusType const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (Server.cpp:346)
==00:00:02:42.282 2250== by 0x46FD60: Server::run(bool) (Server.cpp:282)
==00:00:02:42.282 2250== by 0x54A903: main (main.cpp:159)
libnm log with level trace is attached. nmclient.log
The scenario is as follows:
-
Activate ethernet connection
1.1 initially add by nm_client_add_connection_async, it activates automatically.
1.2 on subsequent iterations use nm_client_activate_connection_async
-
Activate OpenVPN connection
2.1 initially add by nm_client_add_connection_async, or get a previously created connection by uuid
2.2 activate it using nm_client_activate_connection_async, wait until it's successfully established
-
Deactivate ethernet connection (using nm_client_deactivate_connection)
-
Repeat until crash happens (usually 2-3 activate/deactivate cycles)