[Pkg-utopia-commits] r2056 - in /packages/unstable/networkmanager/debian: changelog patches/13-validate_mac_addr.patch patches/24-get_mode_fix_r3122.patch patches/24-libnl1-pre8_fix.patch patches/25-libnl_unique_pid_r3155.patch patches/26-libnl_1.0-pre8_r3206.patch

biebl at users.alioth.debian.org biebl at users.alioth.debian.org
Thu Jan 24 21:59:21 UTC 2008


Author: biebl
Date: Thu Jan 24 21:59:21 2008
New Revision: 2056

URL: http://svn.debian.org/wsvn/pkg-utopia/?sc=1&rev=2056
Log:
* Rebuild against libnl1. (Closes: #461922)
* debian/patches/24-get_mode_fix_r3122.patch
  - Pull r3122 from upstream stable branch.
  - Fix getting mode of device.
* debian/patches/25-libnl_unique_pid_r3155.patch
  - Pull r3155 from stable branch.
  - Ensures that the pid acquired by libnl is unique.
* debian/patches/26-libnl_1.0-pre8_r3206.patch
  - Pull r3206 from upstream stable branch.
  - Replaces 24-libnl1-pre8_fix.patch, which has been removed.
  - Fixes a FTBFS on architectures using SIGTRAP in G_BREAKPOINT().
    (Closes: #459740)
* debian/patches/13-validate_mac_addr.patch
  - Drop APs with an invalid MAC address. (Closes: #461500)
    Thanks to Sjoerd Simons for the patch.

Added:
    packages/unstable/networkmanager/debian/patches/13-validate_mac_addr.patch
    packages/unstable/networkmanager/debian/patches/24-get_mode_fix_r3122.patch
    packages/unstable/networkmanager/debian/patches/25-libnl_unique_pid_r3155.patch
    packages/unstable/networkmanager/debian/patches/26-libnl_1.0-pre8_r3206.patch
Removed:
    packages/unstable/networkmanager/debian/patches/24-libnl1-pre8_fix.patch
Modified:
    packages/unstable/networkmanager/debian/changelog

Modified: packages/unstable/networkmanager/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/networkmanager/debian/changelog?rev=2056&op=diff
==============================================================================
--- packages/unstable/networkmanager/debian/changelog (original)
+++ packages/unstable/networkmanager/debian/changelog Thu Jan 24 21:59:21 2008
@@ -1,8 +1,22 @@
 network-manager (0.6.5-5) UNRELEASED; urgency=low
 
-  * NOT RELEASED YET
-
- -- Michael Biebl <biebl at debian.org>  Tue, 25 Dec 2007 17:22:22 +0100
+  * Rebuild against libnl1. (Closes: #461922)
+  * debian/patches/24-get_mode_fix_r3122.patch
+    - Pull r3122 from upstream stable branch.
+    - Fix getting mode of device.
+  * debian/patches/25-libnl_unique_pid_r3155.patch
+    - Pull r3155 from stable branch.
+    - Ensures that the pid acquired by libnl is unique.
+  * debian/patches/26-libnl_1.0-pre8_r3206.patch
+    - Pull r3206 from upstream stable branch.
+    - Replaces 24-libnl1-pre8_fix.patch, which has been removed.
+    - Fixes a FTBFS on architectures using SIGTRAP in G_BREAKPOINT().
+      (Closes: #459740)
+  * debian/patches/13-validate_mac_addr.patch
+    - Drop APs with an invalid MAC address. (Closes: #461500)
+      Thanks to Sjoerd Simons for the patch.
+
+ -- Michael Biebl <biebl at debian.org>  Thu, 24 Jan 2008 22:49:09 +0100
 
 network-manager (0.6.5-4) unstable; urgency=low
 

Added: packages/unstable/networkmanager/debian/patches/13-validate_mac_addr.patch
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/networkmanager/debian/patches/13-validate_mac_addr.patch?rev=2056&op=file
==============================================================================
--- packages/unstable/networkmanager/debian/patches/13-validate_mac_addr.patch (added)
+++ packages/unstable/networkmanager/debian/patches/13-validate_mac_addr.patch Thu Jan 24 21:59:21 2008
@@ -1,0 +1,33 @@
+--- network-manager-0.6.5.orig/src/nm-device-802-11-wireless.c
++++ network-manager-0.6.5/src/nm-device-802-11-wireless.c
+@@ -3439,6 +3439,20 @@
+ }
+ 
+ static gboolean
++has_valid_ether_addr (NMAccessPoint *ap)
++{
++	struct ether_addr *addr;
++	int i;
++
++	addr = nm_ap_get_address (ap);
++	for (i = 0 ; i < ETH_ALEN; i++)
++		if (addr->ether_addr_octet[i] != 0)
++			return TRUE;
++
++	return FALSE;
++}
++
++static gboolean
+ process_scan_results (NMDevice80211Wireless *dev,
+                       const guint8 *res_buf,
+                       guint32 res_buf_len)
+@@ -3474,7 +3488,8 @@
+ 
+ 				/* Merge previous AP */
+ 				if (ap) {
+-					add_new_ap_to_device_list (dev, ap);
++					if (has_valid_ether_addr (ap))
++						add_new_ap_to_device_list (dev, ap);
+ 					nm_ap_unref (ap);
+ 					ap = NULL;
+ 				}

Added: packages/unstable/networkmanager/debian/patches/24-get_mode_fix_r3122.patch
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/networkmanager/debian/patches/24-get_mode_fix_r3122.patch?rev=2056&op=file
==============================================================================
--- packages/unstable/networkmanager/debian/patches/24-get_mode_fix_r3122.patch (added)
+++ packages/unstable/networkmanager/debian/patches/24-get_mode_fix_r3122.patch Thu Jan 24 21:59:21 2008
@@ -1,0 +1,13 @@
+Index: src/nm-device-802-11-wireless.c
+===================================================================
+--- src/nm-device-802-11-wireless.c	(Revision 3121)
++++ src/nm-device-802-11-wireless.c	(Revision 3122)
+@@ -1144,7 +1144,7 @@
+ #endif
+ 		if (iw_get_ext (nm_dev_sock_get_fd (sk), nm_device_get_iface (NM_DEVICE (self)), SIOCGIWMODE, &wrq) == 0)
+ 		{
+-			if ((mode == IW_MODE_ADHOC) || (mode == IW_MODE_INFRA))
++			if ((wrq.u.mode == IW_MODE_ADHOC) || (wrq.u.mode == IW_MODE_INFRA))
+ 				mode = wrq.u.mode;
+ 		}
+ 		else

Added: packages/unstable/networkmanager/debian/patches/25-libnl_unique_pid_r3155.patch
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/networkmanager/debian/patches/25-libnl_unique_pid_r3155.patch?rev=2056&op=file
==============================================================================
--- packages/unstable/networkmanager/debian/patches/25-libnl_unique_pid_r3155.patch (added)
+++ packages/unstable/networkmanager/debian/patches/25-libnl_unique_pid_r3155.patch Thu Jan 24 21:59:21 2008
@@ -1,0 +1,417 @@
+Index: src/NetworkManagerSystem.c
+===================================================================
+--- src/NetworkManagerSystem.c	(Revision 3154)
++++ src/NetworkManagerSystem.c	(Revision 3155)
+@@ -177,24 +177,6 @@
+ }
+ 
+ 
+-static struct nl_cache * get_link_cache (struct nl_handle *nlh)
+-{
+-	static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+-	static struct nl_cache * link_cache = NULL;
+-
+-	g_static_mutex_lock (&mutex);
+-	if (!link_cache)
+-		link_cache = rtnl_link_alloc_cache (nlh);
+-	if (!link_cache)
+-		nm_warning ("ERROR: couldn't allocate rtnl link cache!");
+-	else
+-		nl_cache_update (nlh, link_cache);
+-	g_static_mutex_unlock (&mutex);
+-
+-	return link_cache;
+-}
+-
+-
+ static void iface_to_rtnl_index (const char *iface, struct nl_handle *nlh, struct rtnl_addr *addr)
+ {
+ 	struct nl_cache *	cache = NULL;
+@@ -204,14 +186,17 @@
+ 	g_return_if_fail (nlh != NULL);
+ 	g_return_if_fail (addr != NULL);
+ 
+-	if ((cache = get_link_cache (nlh)))
+-	{
+-		i = rtnl_link_name2i (cache, iface);
+-		if (RTNL_LINK_NOT_FOUND != i)
+-			rtnl_addr_set_ifindex (addr, i);
++	cache = rtnl_link_alloc_cache (nlh);
++	if (!cache) {
++		nm_warning ("%s: couldn't allocate link cache.", __func__);
++		return;
+ 	}
+-	else
+-		nm_warning ("iface_to_rtnl_link() couldn't allocate link cache.");
++
++	nl_cache_update (nlh, cache);
++	i = rtnl_link_name2i (cache, iface);
++	if (RTNL_LINK_NOT_FOUND != i)
++		rtnl_addr_set_ifindex (addr, i);
++	nl_cache_destroy_and_free (cache);
+ }
+ 
+ 
+@@ -223,45 +208,104 @@
+ 	g_return_val_if_fail (iface != NULL, NULL);
+ 	g_return_val_if_fail (nlh != NULL, NULL);
+ 
+-	if ((cache = get_link_cache (nlh)))
+-		have_link = rtnl_link_get_by_name (cache, iface);
+-	else
+-		nm_warning ("iface_to_rtnl_link() couldn't allocate link cache.");
++	cache = rtnl_link_alloc_cache (nlh);
++	if (!cache) {
++		nm_warning ("%s: couldn't allocate link cache.", __func__);
++		return NULL;
++	}
+ 
++	nl_cache_update (nlh, cache);
++	have_link = rtnl_link_get_by_name (cache, iface);
++	nl_cache_destroy_and_free (cache);
++
+ 	return have_link;
+ }
+ 
++static GStaticMutex nlh_mutex = G_STATIC_MUTEX_INIT;
+ 
+-static struct nl_handle * new_nl_handle (void)
++GHashTable *nl_pids = NULL;
++
++static struct
++nl_handle * new_nl_handle (void)
+ {
+-	struct nl_handle *	nlh = NULL;
++	struct nl_handle * nlh = NULL;
++	guint32 nl_pid;
++	int i = 0;
+ 
+-	nlh = nl_handle_alloc_nondefault(NL_CB_VERBOSE);
+-	nl_handle_set_pid (nlh, (pthread_self() << 16 | getpid()));
+-	if (nl_connect(nlh, NETLINK_ROUTE) < 0)
+-	{
+-		nm_warning ("%s: couldn't connecto to netlink: %s", __func__, nl_geterror());
+-		nl_handle_destroy (nlh);
+-		nlh = NULL;
++	g_static_mutex_lock (&nlh_mutex);
++
++	if (nl_pids == NULL) {
++		nl_pids = g_hash_table_new (g_direct_hash, g_direct_equal);
++		g_assert (nl_pids);
++
++		/* Insert the PID used by nm-netlink-monitor.c */
++		g_hash_table_insert (nl_pids, GUINT_TO_POINTER (getpid ()), GUINT_TO_POINTER (1));
+ 	}
+ 
++	while (i++ < 10) {
++		nl_pid = g_random_int ();
++		if (!g_hash_table_lookup (nl_pids, GUINT_TO_POINTER (nl_pid)))
++			break;
++	}
++
++	if (i < 10) {
++		nlh = nl_handle_alloc_nondefault (NL_CB_VERBOSE);
++		nl_handle_set_pid (nlh, nl_pid);
++
++		if (nl_connect (nlh, NETLINK_ROUTE) < 0) {
++			nm_warning ("%s: couldn't connect to netlink: %s", __func__, nl_geterror ());
++			nl_handle_destroy (nlh);
++			nlh = NULL;
++		} else {
++			g_hash_table_insert (nl_pids, GUINT_TO_POINTER (nl_pid), GUINT_TO_POINTER (1));
++		}
++	} else {
++		g_warning ("%s: couldn't find free netlink pid.", __func__);
++	}
++
++	g_static_mutex_unlock (&nlh_mutex);
++
+ 	return nlh;
+ }
+ 
++static void
++destroy_nl_handle (struct nl_handle *nlh)
++{
++	g_return_if_fail (nlh != NULL);
+ 
++	g_static_mutex_lock (&nlh_mutex);
++	g_hash_table_remove (nl_pids, GUINT_TO_POINTER (nl_handle_get_pid (nlh)));
++	g_static_mutex_unlock (&nlh_mutex);
++
++	nl_close (nlh);
++	nl_handle_destroy (nlh);
++
++}
++
++
+ int
+ nm_system_get_rtnl_index_from_iface (const char *iface)
+ {
+ 	struct nl_handle *	nlh = NULL;
+-	struct nl_cache *	cache = NULL;
++	struct nl_cache *	cache;
+ 	int				i = RTNL_LINK_NOT_FOUND;
+ 
+ 	nlh = new_nl_handle ();
+-	if (nlh && (cache = get_link_cache (nlh)))
+-		i = rtnl_link_name2i (cache, iface);
+-	nl_close (nlh);
+-	nl_handle_destroy (nlh);
++	if (!nlh)
++		return RTNL_LINK_NOT_FOUND;
+ 
++	cache = rtnl_link_alloc_cache (nlh);
++	if (!cache) {
++		nm_warning ("%s: couldn't allocate link cache.");
++		goto out;
++	}
++
++	nl_cache_update (nlh, cache);
++	i = rtnl_link_name2i (cache, iface);
++	nl_cache_destroy_and_free (cache);
++
++out:
++	destroy_nl_handle (nlh);
+ 	return i;
+ }
+ 
+@@ -275,18 +319,31 @@
+ 	char *			buf = NULL;
+ 
+ 	nlh = new_nl_handle ();
+-	if (nlh && (cache = get_link_cache (nlh)))
+-	{
+-		buf = g_malloc0 (MAX_IFACE_LEN);
+-		if (!rtnl_link_i2name (cache, rtnl_index, buf, MAX_IFACE_LEN - 1))
+-		{
+-			g_free (buf);
+-			buf = NULL;
+-		}
++	if (!nlh)
++		return NULL;
++
++	cache = rtnl_link_alloc_cache (nlh);
++	if (!cache) {
++		nm_warning ("%s: couldn't allocate link cache.");
++		goto out;
+ 	}
+-	nl_close (nlh);
+-	nl_handle_destroy (nlh);
+ 
++	nl_cache_update (nlh, cache);
++
++	buf = g_malloc0 (MAX_IFACE_LEN);
++	if (!buf)
++		goto destroy_cache;
++
++	if (!rtnl_link_i2name (cache, rtnl_index, buf, MAX_IFACE_LEN - 1)) {
++		g_free (buf);
++		buf = NULL;
++	}
++
++destroy_cache:
++	nl_cache_destroy_and_free (cache);
++
++out:
++	destroy_nl_handle (nlh);
+ 	return buf;
+ }
+ 
+@@ -313,13 +370,15 @@
+ 	config = nm_device_get_ip4_config (dev);
+ 	g_return_val_if_fail (config != NULL, FALSE);
+ 
++	nlh = new_nl_handle ();
++	if (!nlh)
++		return FALSE;
++
+ 	nm_system_delete_default_route ();
+ 	nm_system_device_flush_addresses (dev);
+ 	nm_system_device_flush_routes (dev);
+ 	nm_system_flush_arp_cache ();
+ 
+-	nlh = new_nl_handle ();
+-
+ 	if ((addr = nm_ip4_config_to_rtnl_addr (config, NM_RTNL_ADDR_DEFAULT)))
+ 	{
+ 		iface_to_rtnl_index (nm_device_get_iface (dev), nlh, addr);
+@@ -330,8 +389,7 @@
+ 	else
+ 		nm_warning ("nm_system_device_set_from_ip4_config(): couldn't create rtnl address!\n");
+ 
+-	nl_close (nlh);
+-	nl_handle_destroy (nlh);
++	destroy_nl_handle (nlh);
+ 
+ 	sleep (1);
+ 	nm_system_device_set_ip4_route (dev, nm_ip4_config_get_gateway (config), 0, 0, nm_ip4_config_get_mss (config));
+@@ -424,7 +482,13 @@
+  * Set IPv4 configuration of a VPN device from an NMIP4Config object.
+  *
+  */
+-gboolean nm_system_vpn_device_set_from_ip4_config (NMNamedManager *named, NMDevice *active_device, const char *iface, NMIP4Config *config, char **routes, int num_routes)
++gboolean
++nm_system_vpn_device_set_from_ip4_config (NMNamedManager *named,
++                                          NMDevice *active_device,
++                                          const char *iface,
++                                          NMIP4Config *config,
++                                          char **routes,
++                                          int num_routes)
+ {
+ 	NMIP4Config *		ad_config = NULL;
+ 	struct nl_handle *	nlh = NULL;
+@@ -437,71 +501,73 @@
+ 	if (active_device && (ad_config = nm_device_get_ip4_config (active_device)))
+ 		nm_system_device_set_ip4_route (active_device, nm_ip4_config_get_gateway (ad_config), nm_ip4_config_get_gateway (config), 0xFFFFFFFF, nm_ip4_config_get_mss (config));
+ 
+-	if (iface != NULL && strlen (iface))
+-	{
+-		nm_system_device_set_up_down_with_iface (iface, TRUE);
++	if (!iface || !strlen (iface))
++		goto done;
+ 
+-		nlh = new_nl_handle ();
++	nlh = new_nl_handle ();
++	if (!nlh)
++		goto done;
+ 
+-		if ((addr = nm_ip4_config_to_rtnl_addr (config, NM_RTNL_ADDR_PTP_DEFAULT)))
+-		{
+-			int err = 0;
+-			iface_to_rtnl_index (iface, nlh, addr);
+-			if ((err = rtnl_addr_add (nlh, addr, 0)) < 0)
+-				nm_warning ("nm_system_device_set_from_ip4_config(): error %d returned from rtnl_addr_add():\n%s", err, nl_geterror());
+-			rtnl_addr_put (addr);
+-		}
+-		else
+-			nm_warning ("nm_system_vpn_device_set_from_ip4_config(): couldn't create rtnl address!\n");
++	nm_system_device_set_up_down_with_iface (iface, TRUE);
+ 
+-		/* Set the MTU */
+-		if ((request = rtnl_link_alloc ()))
+-		{
+-			struct rtnl_link * old;
++	if ((addr = nm_ip4_config_to_rtnl_addr (config, NM_RTNL_ADDR_PTP_DEFAULT)))
++	{
++		int err = 0;
++		iface_to_rtnl_index (iface, nlh, addr);
++		if ((err = rtnl_addr_add (nlh, addr, 0)) < 0)
++			nm_warning ("nm_system_device_set_from_ip4_config(): error %d returned from rtnl_addr_add():\n%s", err, nl_geterror());
++		rtnl_addr_put (addr);
++	}
++	else
++		nm_warning ("nm_system_vpn_device_set_from_ip4_config(): couldn't create rtnl address!\n");
+ 
+-			old = iface_to_rtnl_link (iface, nlh);
+-			rtnl_link_set_mtu (request, 1412);
+-			rtnl_link_change (nlh, old, request, 0);
++	/* Set the MTU */
++	if ((request = rtnl_link_alloc ()))
++	{
++		struct rtnl_link * old;
+ 
+-			rtnl_link_put (old);
+-			rtnl_link_put (request);
+-		}
++		old = iface_to_rtnl_link (iface, nlh);
++		rtnl_link_set_mtu (request, 1412);
++		rtnl_link_change (nlh, old, request, 0);
+ 
+-		nl_close (nlh);
+-		nl_handle_destroy (nlh);
++		rtnl_link_put (old);
++		rtnl_link_put (request);
++	}
+ 
+-		sleep (1);
++	destroy_nl_handle (nlh);
+ 
+-		nm_system_device_flush_routes_with_iface (iface);
+-		if (num_routes <= 0)
++	sleep (1);
++
++	nm_system_device_flush_routes_with_iface (iface);
++	if (num_routes <= 0)
++	{
++		nm_system_delete_default_route ();
++		nm_system_device_add_default_route_via_device_with_iface (iface);
++	}
++	else
++	{
++		int i;
++		for (i = 0; i < num_routes; i++)
+ 		{
+-			nm_system_delete_default_route ();
+-			nm_system_device_add_default_route_via_device_with_iface (iface);
+-		}
+-		else
+-		{
+-			int i;
+-			for (i = 0; i < num_routes; i++)
++			char *valid_ip4_route;
++
++			/* Make sure the route is valid, otherwise it's a security risk as the route
++			 * text is simply taken from the user, and passed directly to system().  If
++			 * we did not check the route, think of:
++			 *
++			 *     system("/sbin/ip route add `rm -rf /` dev eth0")
++			 *
++			 * where `rm -rf /` was the route text.  As UID 0 (root), we have to be careful.
++			 */
++			if ((valid_ip4_route = validate_ip4_route (routes[i])))
+ 			{
+-				char *valid_ip4_route;
+-
+-				/* Make sure the route is valid, otherwise it's a security risk as the route
+-				 * text is simply taken from the user, and passed directly to system().  If
+-				 * we did not check the route, think of:
+-				 *
+-				 *     system("/sbin/ip route add `rm -rf /` dev eth0")
+-				 *
+-				 * where `rm -rf /` was the route text.  As UID 0 (root), we have to be careful.
+-				 */
+-				if ((valid_ip4_route = validate_ip4_route (routes[i])))
+-				{
+-					nm_system_device_add_route_via_device_with_iface (iface, valid_ip4_route);
+-					g_free (valid_ip4_route);
+-				}
++				nm_system_device_add_route_via_device_with_iface (iface, valid_ip4_route);
++				g_free (valid_ip4_route);
+ 			}
+ 		}
+ 	}
+ 
++done:
+ 	nm_named_manager_add_ip4_config (named, config);
+ 
+ 	return TRUE;
+@@ -548,7 +614,8 @@
+ 
+ 	g_return_val_if_fail (iface != NULL, FALSE);
+ 
+-	if (!(nlh = new_nl_handle ()))
++	nlh = new_nl_handle ();
++	if (!nlh)
+ 		return FALSE;
+ 
+ 	if (!(request = rtnl_link_alloc ()))
+@@ -569,9 +636,7 @@
+ 	success = TRUE;
+ 
+ out:
+-	nl_close (nlh);
+-	nl_handle_destroy (nlh);
+-
++	destroy_nl_handle (nlh);
+ 	return success;
+ }
+ 
+@@ -614,6 +679,6 @@
+ out_request:
+ 	rtnl_link_put (request);
+ out_nl_close:
+-	nl_close (nlh);
+-	nl_handle_destroy (nlh);
++	destroy_nl_handle (nlh);
+ }
++

Added: packages/unstable/networkmanager/debian/patches/26-libnl_1.0-pre8_r3206.patch
URL: http://svn.debian.org/wsvn/pkg-utopia/packages/unstable/networkmanager/debian/patches/26-libnl_1.0-pre8_r3206.patch?rev=2056&op=file
==============================================================================
--- packages/unstable/networkmanager/debian/patches/26-libnl_1.0-pre8_r3206.patch (added)
+++ packages/unstable/networkmanager/debian/patches/26-libnl_1.0-pre8_r3206.patch Thu Jan 24 21:59:21 2008
@@ -1,0 +1,202 @@
+Index: src/nm-netlink-monitor.c
+===================================================================
+--- src/nm-netlink-monitor.c	(Revision 3205)
++++ src/nm-netlink-monitor.c	(Revision 3206)
+@@ -174,7 +174,7 @@
+ 	}
+ 
+ 	monitor_address.nl_family = AF_NETLINK;
+-	monitor_address.nl_pid = getpid ();
++	monitor_address.nl_pid = UINT_MAX;
+ 	monitor_address.nl_groups = RTMGRP_LINK;
+ 
+ 	if (bind (fd, 
+@@ -365,7 +365,7 @@
+ 	packet.header.nlmsg_len = NLMSG_LENGTH (sizeof (struct rtgenmsg));
+ 	packet.header.nlmsg_flags = NLM_F_ROOT | NLM_F_MATCH | NLM_F_REQUEST;
+ 	packet.header.nlmsg_type = RTM_GETLINK;
+-	packet.header.nlmsg_pid = getpid ();
++	packet.header.nlmsg_pid = UINT_MAX;
+ 	/* Might be good to generate a unique sequence number and track
+ 	   the response */
+ 	packet.header.nlmsg_seq = sequence_number << 16;
+Index: src/NetworkManagerSystem.c
+===================================================================
+--- src/NetworkManagerSystem.c	(Revision 3205)
++++ src/NetworkManagerSystem.c	(Revision 3206)
+@@ -196,7 +196,7 @@
+ 	i = rtnl_link_name2i (cache, iface);
+ 	if (RTNL_LINK_NOT_FOUND != i)
+ 		rtnl_addr_set_ifindex (addr, i);
+-	nl_cache_destroy_and_free (cache);
++	nl_cache_free (cache);
+ }
+ 
+ 
+@@ -216,55 +216,42 @@
+ 
+ 	nl_cache_update (nlh, cache);
+ 	have_link = rtnl_link_get_by_name (cache, iface);
+-	nl_cache_destroy_and_free (cache);
++	nl_cache_free (cache);
+ 
+ 	return have_link;
+ }
+ 
+-static GStaticMutex nlh_mutex = G_STATIC_MUTEX_INIT;
+-
+-GHashTable *nl_pids = NULL;
+-
+ static struct
+-nl_handle * new_nl_handle (void)
++nl_handle *new_nl_handle (gboolean recursive)
+ {
+-	struct nl_handle * nlh = NULL;
+-	guint32 nl_pid;
+-	int i = 0;
++	struct nl_handle *nlh = NULL;
++	struct nl_cb *cb;
+ 
+-	g_static_mutex_lock (&nlh_mutex);
+-
+-	if (nl_pids == NULL) {
+-		nl_pids = g_hash_table_new (g_direct_hash, g_direct_equal);
+-		g_assert (nl_pids);
+-
+-		/* Insert the PID used by nm-netlink-monitor.c */
+-		g_hash_table_insert (nl_pids, GUINT_TO_POINTER (getpid ()), GUINT_TO_POINTER (1));
++	cb = nl_cb_alloc (NL_CB_VERBOSE);
++	nlh = nl_handle_alloc_cb (cb);
++	if (!nlh) {
++		nm_warning ("%s: couldn't allocate netlink handle: %s", __func__, nl_geterror ());
++		return NULL;
+ 	}
+ 
+-	while (i++ < 10) {
+-		nl_pid = g_random_int ();
+-		if (!g_hash_table_lookup (nl_pids, GUINT_TO_POINTER (nl_pid)))
+-			break;
+-	}
++	if (nl_connect (nlh, NETLINK_ROUTE) < 0) {
++		/* HACK: try one more time. Because the netlink monitor for link state
++		 * inits before we get here, it grabs the port that matches the PID
++		 * of the NM process, which also happens to be the PID that libnl uses
++		 * the first time too.  The real fix is to convert nm-netlink-monitor.c
++		 * over to use libnl.
++		 */
++		nl_handle_destroy (nlh);
++		if (recursive)
++			return NULL;
+ 
+-	if (i < 10) {
+-		nlh = nl_handle_alloc_nondefault (NL_CB_VERBOSE);
+-		nl_handle_set_pid (nlh, nl_pid);
+-
+-		if (nl_connect (nlh, NETLINK_ROUTE) < 0) {
++		nlh = new_nl_handle (TRUE);
++		if (!nlh) {
+ 			nm_warning ("%s: couldn't connect to netlink: %s", __func__, nl_geterror ());
+-			nl_handle_destroy (nlh);
+-			nlh = NULL;
+-		} else {
+-			g_hash_table_insert (nl_pids, GUINT_TO_POINTER (nl_pid), GUINT_TO_POINTER (1));
++			return NULL;
+ 		}
+-	} else {
+-		g_warning ("%s: couldn't find free netlink pid.", __func__);
+ 	}
+ 
+-	g_static_mutex_unlock (&nlh_mutex);
+-
+ 	return nlh;
+ }
+ 
+@@ -273,16 +260,10 @@
+ {
+ 	g_return_if_fail (nlh != NULL);
+ 
+-	g_static_mutex_lock (&nlh_mutex);
+-	g_hash_table_remove (nl_pids, GUINT_TO_POINTER (nl_handle_get_pid (nlh)));
+-	g_static_mutex_unlock (&nlh_mutex);
+-
+ 	nl_close (nlh);
+ 	nl_handle_destroy (nlh);
+-
+ }
+ 
+-
+ int
+ nm_system_get_rtnl_index_from_iface (const char *iface)
+ {
+@@ -290,7 +271,7 @@
+ 	struct nl_cache *	cache;
+ 	int				i = RTNL_LINK_NOT_FOUND;
+ 
+-	nlh = new_nl_handle ();
++	nlh = new_nl_handle (FALSE);
+ 	if (!nlh)
+ 		return RTNL_LINK_NOT_FOUND;
+ 
+@@ -302,7 +283,7 @@
+ 
+ 	nl_cache_update (nlh, cache);
+ 	i = rtnl_link_name2i (cache, iface);
+-	nl_cache_destroy_and_free (cache);
++	nl_cache_free (cache);
+ 
+ out:
+ 	destroy_nl_handle (nlh);
+@@ -318,7 +299,7 @@
+ 	struct nl_cache *	cache = NULL;
+ 	char *			buf = NULL;
+ 
+-	nlh = new_nl_handle ();
++	nlh = new_nl_handle (FALSE);
+ 	if (!nlh)
+ 		return NULL;
+ 
+@@ -340,7 +321,7 @@
+ 	}
+ 
+ destroy_cache:
+-	nl_cache_destroy_and_free (cache);
++	nl_cache_free (cache);
+ 
+ out:
+ 	destroy_nl_handle (nlh);
+@@ -370,7 +351,7 @@
+ 	config = nm_device_get_ip4_config (dev);
+ 	g_return_val_if_fail (config != NULL, FALSE);
+ 
+-	nlh = new_nl_handle ();
++	nlh = new_nl_handle (FALSE);
+ 	if (!nlh)
+ 		return FALSE;
+ 
+@@ -504,7 +485,7 @@
+ 	if (!iface || !strlen (iface))
+ 		goto done;
+ 
+-	nlh = new_nl_handle ();
++	nlh = new_nl_handle (FALSE);
+ 	if (!nlh)
+ 		goto done;
+ 
+@@ -614,7 +595,7 @@
+ 
+ 	g_return_val_if_fail (iface != NULL, FALSE);
+ 
+-	nlh = new_nl_handle ();
++	nlh = new_nl_handle (FALSE);
+ 	if (!nlh)
+ 		return FALSE;
+ 
+@@ -658,7 +639,7 @@
+ 	if (!mtu)
+ 		return;
+ 
+-	nlh = new_nl_handle ();
++	nlh = new_nl_handle (FALSE);
+ 	if (!nlh)
+ 		return;
+ 




More information about the Pkg-utopia-commits mailing list