about summary refs log tree commit diff
path: root/src/dhcp/nm-dhcp-utils.c
diff options
context:
space:
mode:
authorSebastien Bacher <seb128@ubuntu.com>2019-05-10 15:07:08 +0200
committerSebastien Bacher <seb128@ubuntu.com>2019-05-22 13:41:30 +0200
commitd57a1dd26f8e9859252b0983c2d2ec3b95eb5714 (patch)
tree46f1146e87af8cc7b58b751f7e575bd0abb2f59d /src/dhcp/nm-dhcp-utils.c
parentad9ed8bfb963266b4eea524131845f406cfc55d7 (diff)
parent85563b7fc7ec2cd21e38debb9b28db342e2e8e7c (diff)
Import Debian changes 1.18.0-1ubuntu1
network-manager (1.18.0-1ubuntu1) eoan; urgency=medium

  * Update to 1.18, merge on Debian, new version includes nwe support for
    policy routing rules and for VLAN filtering for Linux bridge.
  * Remaining Ubuntu changes
    - Use systemd-resolved instead of dnsmasq
    - debian/control:
      + Depend on isc-dhcp-client instead of recommends
      + Recommend network-manager-pptp
      + Suggest avahi-autoipd for IPv4LL support
    - debian/rules, debian/network-manager.postinst:
      + Don't restart NetworkManager on upgrade but recommend restarting
        the computer
    - debian/rules, debian/network-manager.postinst:
      + Don't install sysvinit scripts or migrate from sysvinit
    - debian/network-manager.postinst:
      + Don't add the netdev group.
      + drop in an empty override file for NetworkManager to manage all
        devices for upgrade from any version, as long as there is no
        netplan configuration yet.
    - debian/default-wifi-powersave-on.conf, debian/rules:
      + Install a config file to enable WiFi powersave
    - Enable build tests
    - Add autopkgtests
    - debian/source_network-manager.py, debian/network-manager.install,
      debian/network-manager.links: Add apport hook
    - Add network-manager-config-connectivity-ubuntu package
    - NetworkManager.conf: disable MAC randomization feature. There is no
      easy way for desktop users to disable this feature yet. And there are
      reports that it doesn't work well with some systems.
    - Update Vcs links to point to Ubuntu branch
    - Add patches. See patch descriptions for more details:
      + Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch
      + Update-dnsmasq-parameters.patch
      + Disable-general-with-expect.patch
      + libnm-Check-self-still-NMManager-or-not.patch
      + dns-manager-don-t-merge-split-DNS-search-domains.patch (but disabled)
      + Read-system-connections-from-run.patch
    - debian/tests/urfkill-integration - don't stop/start network manager
    - Revert "Add Conflicts to network-manager-dev against deprecated libraries"
      This reverts commit b4acc5e03e2b821e1cccc69529bb70826c741942.  We're still
      building libnm-glib for now, so these packages have a use in Ubuntu.
  * Removed delta, not needed anymore
    - debian/network-manager.maintscript
      + Remove /etc/dbus-1/system.d/nm-ofono.conf
Diffstat (limited to 'src/dhcp/nm-dhcp-utils.c')
-rw-r--r--src/dhcp/nm-dhcp-utils.c103
1 files changed, 45 insertions, 58 deletions
diff --git a/src/dhcp/nm-dhcp-utils.c b/src/dhcp/nm-dhcp-utils.c
index 5227eea7..7aa867c0 100644
--- a/src/dhcp/nm-dhcp-utils.c
+++ b/src/dhcp/nm-dhcp-utils.c
@@ -22,7 +22,7 @@
 #include <unistd.h>
 #include <arpa/inet.h>
 
-#include "nm-utils/nm-dedup-multi.h"
+#include "nm-glib-aux/nm-dedup-multi.h"
 
 #include "nm-dhcp-utils.h"
 #include "nm-utils.h"
@@ -100,67 +100,56 @@ out:
 	return have_routes;
 }
 
-static const char **
-process_dhclient_rfc3442_route (const char **octets,
-                                NMPlatformIP4Route *route,
-                                gboolean *success)
+static gboolean
+process_dhclient_rfc3442_route (const char *const**p_octets,
+                                NMPlatformIP4Route *route)
 {
-	const char **o = octets;
-	int addr_len = 0, i = 0;
-	long int tmp;
-	char *next_hop;
-	guint32 tmp_addr;
-
-	*success = FALSE;
-
-	if (!*o)
-		return o; /* no prefix */
-
-	tmp = strtol (*o, NULL, 10);
-	if (tmp < 0 || tmp > 32)  /* 32 == max IP4 prefix length */
-		return o;
-
-	memset (route, 0, sizeof (*route));
-	route->plen = tmp;
+	const char *const*o = *p_octets;
+	gs_free char *next_hop = NULL;
+	int addr_len;
+	int v_plen;
+	in_addr_t tmp_addr;
+	in_addr_t v_network = 0;
+
+	v_plen = _nm_utils_ascii_str_to_int64 (*o, 10, 0, 32, -1);
+	if (v_plen == -1)
+		return FALSE;
 	o++;
 
-	if (tmp > 0)
-		addr_len = ((tmp - 1) / 8) + 1;
+	addr_len =   v_plen > 0
+	           ? ((v_plen - 1) / 8) + 1
+	           : 0;
 
 	/* ensure there's at least the address + next hop left */
-	if (g_strv_length ((char **) o) < addr_len + 4)
-		goto error;
+	if (NM_PTRARRAY_LEN (o) < addr_len + 4)
+		return FALSE;
 
-	if (tmp) {
+	if (v_plen > 0) {
 		const char *addr[4] = { "0", "0", "0", "0" };
-		char *str_addr;
+		gs_free char *str_addr = NULL;
+		int i;
 
 		for (i = 0; i < addr_len; i++)
 			addr[i] = *o++;
 
 		str_addr = g_strjoin (".", addr[0], addr[1], addr[2], addr[3], NULL);
-		if (inet_pton (AF_INET, str_addr, &tmp_addr) <= 0) {
-			g_free (str_addr);
-			goto error;
-		}
-		g_free (str_addr);
-		route->network = nm_utils_ip4_address_clear_host_address (tmp_addr, tmp);
+		if (inet_pton (AF_INET, str_addr, &tmp_addr) <= 0)
+			return FALSE;
+		v_network = nm_utils_ip4_address_clear_host_address (tmp_addr, v_plen);
 	}
 
-	/* Handle next hop */
 	next_hop = g_strjoin (".", o[0], o[1], o[2], o[3], NULL);
-	if (inet_pton (AF_INET, next_hop, &tmp_addr) <= 0) {
-		g_free (next_hop);
-		goto error;
-	}
-	route->gateway = tmp_addr;
-	g_free (next_hop);
-
-	*success = TRUE;
-	return o + 4; /* advance to past the next hop */
+	o += 4;
+	if (inet_pton (AF_INET, next_hop, &tmp_addr) <= 0)
+		return FALSE;
 
-error:
-	return o;
+	*route = (NMPlatformIP4Route) {
+		.network = v_network,
+		.plen    = v_plen,
+		.gateway = tmp_addr,
+	};
+	*p_octets = o;
+	return TRUE;
 }
 
 static gboolean
@@ -171,23 +160,23 @@ ip4_process_dhclient_rfc3442_routes (const char *iface,
                                      NMIP4Config *ip4_config,
                                      guint32 *gwaddr)
 {
-	char **octets, **o;
+	gs_free const char **octets = NULL;
+	const char *const*o;
 	gboolean have_routes = FALSE;
-	NMPlatformIP4Route route;
-	gboolean success;
 
-	o = octets = g_strsplit_set (str, " .", 0);
-	if (g_strv_length (octets) < 5) {
+	octets = nm_utils_strsplit_set_with_empty (str, " .");
+	if (NM_PTRARRAY_LEN (octets) < 5) {
 		_LOG2W (LOGD_DHCP4, iface, "ignoring invalid classless static routes '%s'", str);
-		goto out;
+		return FALSE;
 	}
 
+	o = octets;
 	while (*o) {
-		memset (&route, 0, sizeof (route));
-		o = (char **) process_dhclient_rfc3442_route ((const char **) o, &route, &success);
-		if (!success) {
+		NMPlatformIP4Route route;
+
+		if (!process_dhclient_rfc3442_route (&o, &route)) {
 			_LOG2W (LOGD_DHCP4, iface, "ignoring invalid classless static routes");
-			break;
+			return have_routes;
 		}
 
 		have_routes = TRUE;
@@ -211,8 +200,6 @@ ip4_process_dhclient_rfc3442_routes (const char *iface,
 		}
 	}
 
-out:
-	g_strfreev (octets);
 	return have_routes;
 }