Package: network-manager
Version: 0.9.10.0-2
Severity: serious
Tags: patch
Justification: breaks unrelated software

Hello,

When using unrelated software, such as openvpn, that pushes default routes,
network-manager immediately (and incorrectly) removes that route. This is new
behavior in 0.9.10, it does not do this in previous versions.

I spent quite a bit of time debugging this issue with upstream NM people
on their IRC channel, in the end they came up with a patch that was
committed upstream in git with the following hash:
06703c1670d0f96834b268920b09792e22fdb4c4)

I tested this change, and it worked well for me, previously I uploaded a NMU,
with this patch, thinking that this was #755015, and it successfully fixed the
problem for me and others I know who are experiencing this issue. However, the
NMU was not acknowledged in -2, due to it being targeted for the incorrect bug
number.

Considering that this effectively breaks all OpenVPN setups (and other software
that modifies default routes) that are not using network-manager's built-in VPN
mechanisms, this seems to me a serious regression over previous versions. Seeing
as upstream has acknowledged this issue and provided a fix for it and that fix
has been tested and even migrated to testing, it seems to me appropriate to
cherry-pick the change in the package without waiting for the next major release
of NM. 

I'm happy to re-NMU this fix, this time with the right bug number. Attached is
the NMU diff (I'd only add the bug number to the changelog).

micah


-- System Information:
Debian Release: jessie/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.14-2-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.utf8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages network-manager depends on:
ii  adduser                3.113+nmu3
ii  dbus                   1.8.6-2
ii  init-system-helpers    1.21
ii  isc-dhcp-client        4.3.1-1
ii  libc6                  2.19-10
ii  libdbus-1-3            1.8.6-2
ii  libdbus-glib-1-2       0.102-1
ii  libgcrypt11            1.5.4-3
ii  libglib2.0-0           2.40.0-5
ii  libgnutls-deb0-28      3.3.7-2
ii  libgudev-1.0-0         208-8
ii  libmm-glib0            1.2.0-1
ii  libndp0                1.4-1
ii  libnewt0.52            0.52.17-1
ii  libnl-3-200            3.2.24-2
ii  libnl-genl-3-200       3.2.24-2
ii  libnl-route-3-200      3.2.24-2
ii  libnm-glib4            0.9.10.0-2
ii  libnm-util2            0.9.10.0-2
ii  libpam-systemd         208-8
ii  libpolkit-gobject-1-0  0.105-6.1
ii  libreadline6           6.3-8
ii  libsoup2.4-1           2.46.0-2
ii  libsystemd-daemon0     208-8
ii  libsystemd-login0      208-8
ii  libteamdctl0           1.12-1
ii  libuuid1               2.20.1-5.8
ii  lsb-base               4.1+Debian13
ii  policykit-1            0.105-6.1
ii  udev                   208-8
ii  wpasupplicant          1.1-1

Versions of packages network-manager recommends:
ii  crda          3.13-1
ii  dnsmasq-base  2.71-1
ii  iptables      1.4.21-2
ii  modemmanager  1.2.0-1
ii  ppp           2.4.6-2

Versions of packages network-manager suggests:
ii  avahi-autoipd  0.6.31-4
pn  libteam-utils  <none>

-- Configuration Files:
/etc/NetworkManager/NetworkManager.conf changed:
[main]
plugins=ifupdown,keyfile
[ifupdown]
managed=false
[logging]


-- no debconf information
diff -Nru network-manager-0.9.10.0/debian/changelog network-manager-0.9.10.0/debian/changelog
--- network-manager-0.9.10.0/debian/changelog	2014-07-10 00:49:54.000000000 -0400
+++ network-manager-0.9.10.0/debian/changelog	2014-08-11 12:37:33.000000000 -0400
@@ -1,3 +1,11 @@
+network-manager (0.9.10.0-2.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * Pull patch from upstream to fix checks for default
+    routes
+
+ -- Micah Anderson <mi...@debian.org>  Mon, 11 Aug 2014 12:08:31 -0400
+
 network-manager (0.9.10.0-2) unstable; urgency=medium
 
   * New upstream release.
diff -Nru network-manager-0.9.10.0/debian/patches/0006-Fix-checks-for-default-routes network-manager-0.9.10.0/debian/patches/0006-Fix-checks-for-default-routes
--- network-manager-0.9.10.0/debian/patches/0006-Fix-checks-for-default-routes	1969-12-31 19:00:00.000000000 -0500
+++ network-manager-0.9.10.0/debian/patches/0006-Fix-checks-for-default-routes	2014-08-11 12:37:08.000000000 -0400
@@ -0,0 +1,83 @@
+Index: network-manager-0.9.10.0/src/nm-ip4-config.c
+===================================================================
+--- network-manager-0.9.10.0.orig/src/nm-ip4-config.c	2014-07-03 20:44:19.000000000 -0400
++++ network-manager-0.9.10.0/src/nm-ip4-config.c	2014-07-29 19:42:06.965378158 -0400
+@@ -198,7 +198,7 @@
+ 	for (i = 0; i < priv->routes->len; i++) {
+ 		const NMPlatformIP4Route *route = &g_array_index (priv->routes, NMPlatformIP4Route, i);
+ 
+-		if (route->network == 0) {
++		if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
+ 			if (route->metric < lowest_metric) {
+ 				priv->gateway = route->gateway;
+ 				lowest_metric = route->metric;
+@@ -276,7 +276,8 @@
+ 			/* Don't add the default route if the connection
+ 			 * is never supposed to be the default connection.
+ 			 */
+-			if (nm_ip4_config_get_never_default (config) && route.network == 0)
++			if (   nm_ip4_config_get_never_default (config)
++			    && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route))
+ 				continue;
+ 
+ 			g_array_append_val (routes, route);
+Index: network-manager-0.9.10.0/src/nm-ip6-config.c
+===================================================================
+--- network-manager-0.9.10.0.orig/src/nm-ip6-config.c	2014-07-03 20:44:19.000000000 -0400
++++ network-manager-0.9.10.0/src/nm-ip6-config.c	2014-07-29 19:42:06.965378158 -0400
+@@ -308,7 +308,7 @@
+ 	for (i = 0; i < priv->routes->len; i++) {
+ 		const NMPlatformIP6Route *route = &g_array_index (priv->routes, NMPlatformIP6Route, i);
+ 
+-		if (IN6_IS_ADDR_UNSPECIFIED (&route->network)) {
++		if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route)) {
+ 			if (route->metric < lowest_metric) {
+ 				priv->gateway = route->gateway;
+ 				lowest_metric = route->metric;
+@@ -387,7 +387,8 @@
+ 			/* Don't add the default route if the connection
+ 			 * is never supposed to be the default connection.
+ 			 */
+-			if (nm_ip6_config_get_never_default (config) && IN6_IS_ADDR_UNSPECIFIED (&route.network))
++			if (   nm_ip6_config_get_never_default (config)
++			    && NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route))
+ 				continue;
+ 
+ 			g_array_append_val (routes, route);
+Index: network-manager-0.9.10.0/src/platform/nm-linux-platform.c
+===================================================================
+--- network-manager-0.9.10.0.orig/src/platform/nm-linux-platform.c	2014-07-03 20:44:19.000000000 -0400
++++ network-manager-0.9.10.0/src/platform/nm-linux-platform.c	2014-07-29 19:42:06.969378050 -0400
+@@ -3520,7 +3520,7 @@
+ 	for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) {
+ 		if (_route_match ((struct rtnl_route *) object, AF_INET, ifindex)) {
+ 			if (init_ip4_route (&route, (struct rtnl_route *) object)) {
+-				if (route.plen != 0 || include_default)
++				if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route) || include_default)
+ 					g_array_append_val (routes, route);
+ 			}
+ 		}
+@@ -3542,7 +3542,7 @@
+ 	for (object = nl_cache_get_first (priv->route_cache); object; object = nl_cache_get_next (object)) {
+ 		if (_route_match ((struct rtnl_route *) object, AF_INET6, ifindex)) {
+ 			if (init_ip6_route (&route, (struct rtnl_route *) object)) {
+-				if (route.plen != 0 || include_default)
++				if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (&route) || include_default)
+ 					g_array_append_val (routes, route);
+ 			}
+ 		}
+Index: network-manager-0.9.10.0/src/platform/nm-platform.h
+===================================================================
+--- network-manager-0.9.10.0.orig/src/platform/nm-platform.h	2014-07-03 20:44:13.000000000 -0400
++++ network-manager-0.9.10.0/src/platform/nm-platform.h	2014-07-29 19:41:45.549955242 -0400
+@@ -248,6 +248,10 @@
+ 	};
+ } NMPlatformIPRoute;
+ 
++#define NM_PLATFORM_IP_ROUTE_IS_DEFAULT(route) \
++       ( ((const NMPlatformIPRoute *) (route))->plen <= 0 )
++
++
+ typedef struct {
+ 	__NMPlatformIPRoute_COMMON;
+ 	in_addr_t network;
diff -Nru network-manager-0.9.10.0/debian/patches/series network-manager-0.9.10.0/debian/patches/series
--- network-manager-0.9.10.0/debian/patches/series	2014-07-10 00:49:54.000000000 -0400
+++ network-manager-0.9.10.0/debian/patches/series	2014-08-11 12:37:21.000000000 -0400
@@ -3,3 +3,4 @@
 0003-Don-t-setup-Sleep-Monitor-if-not-booted-with-systemd.patch
 0004-Use-symlinks-for-nmtui.patch
 0005-Mark-virtual-ethernet-interfaces-as-unmanaged.patch
+0006-Fix-checks-for-default-routes

Reply via email to