rpms/NetworkManager/devel NetworkManager-0.4-aplist-fix-hidden.patch, NONE, 1.1 NetworkManager-0.4-assert-fix.patch, NONE, 1.1 NetworkManager-0.4-devup.patch, NONE, 1.1 NetworkManager-0.4-leak-fixes.patch, NONE, 1.1 NetworkManager-0.4-novarargs.patch, NONE, 1.1 NetworkManager-0.4-use-thread-join.patch, NONE, 1.1 NetworkManager.spec, 1.42, 1.43

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Wed May 4 18:33:17 UTC 2005


Author: dcbw

Update of /cvs/dist/rpms/NetworkManager/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv32344

Modified Files:
	NetworkManager.spec 
Added Files:
	NetworkManager-0.4-aplist-fix-hidden.patch 
	NetworkManager-0.4-assert-fix.patch 
	NetworkManager-0.4-devup.patch 
	NetworkManager-0.4-leak-fixes.patch 
	NetworkManager-0.4-novarargs.patch 
	NetworkManager-0.4-use-thread-join.patch 
Log Message:
* Wed May  4 2005 Dan Williams <dcbw at redhat.com> - 0.4-9.cvs20050404
- Fix some memory leaks (Tom Parker)
- Join to threads rather than spinning for their completion (Tom Parker)
- Fix misuse of a g_assert() (Colin Walters)
- Fix return checking of an ioctl() (Bill Moss)
- Better detection and matching of hidden access points (Bill Moss)
- Don't use varargs, and therefore don't crash on PPC (Peter Jones)



NetworkManager-0.4-aplist-fix-hidden.patch:
 NetworkManagerAPList.c |  145 ++++++++++++++++++++++++++++++++++++++++---------
 NetworkManagerAPList.h |    1 
 NetworkManagerPolicy.c |    2 
 3 files changed, 123 insertions(+), 25 deletions(-)

--- NEW FILE NetworkManager-0.4-aplist-fix-hidden.patch ---
--- NetworkManager-0.4/src/NetworkManagerPolicy.c.aplist-fix-hidden	2005-03-31 12:02:41.000000000 -0500
+++ NetworkManager-0.4/src/NetworkManagerPolicy.c	2005-05-04 11:36:18.000000000 -0400
@@ -515,6 +515,8 @@
 			}
 			else
 				nm_device_copy_allowed_to_dev_list (dev, data->allowed_ap_list);
+
+			nm_ap_list_remove_duplicate_essids (nm_device_ap_list_get (dev));
 		}
 	}	
 
--- NetworkManager-0.4/src/NetworkManagerAPList.h.aplist-fix-hidden	2005-02-25 16:19:21.000000000 -0500
+++ NetworkManager-0.4/src/NetworkManagerAPList.h	2005-05-04 11:37:17.000000000 -0400
@@ -38,6 +38,7 @@
 
 void				nm_ap_list_append_ap			(NMAccessPointList *list, NMAccessPoint *ap);
 void				nm_ap_list_remove_ap			(NMAccessPointList *list, NMAccessPoint *ap);
+void				nm_ap_list_remove_duplicate_essids	(NMAccessPointList *list);
 
 NMAccessPoint *	nm_ap_list_get_ap_by_essid		(NMAccessPointList *list, const char *network);
 NMAccessPoint *	nm_ap_list_get_ap_by_address		(NMAccessPointList *list, const struct ether_addr *addr);
--- NetworkManager-0.4/src/NetworkManagerAPList.c.aplist-fix-hidden	2005-05-04 11:31:13.000000000 -0400
+++ NetworkManager-0.4/src/NetworkManagerAPList.c	2005-05-04 11:36:18.000000000 -0400
@@ -192,6 +192,80 @@
 	nm_ap_list_unlock (list);
 }
 
+/* nm_ap_list_remove_duplicate_essids
+ *
+ */
+void    nm_ap_list_remove_duplicate_essids (NMAccessPointList *list)
+{
+	NMAccessPoint   *removal_ap;
+	NMAccessPoint   *list_ap_max;
+	GSList          *elt_i = NULL;	
+	GSList          *elt_j = NULL;
+	GSList		*elt_max = NULL;
+	GSList          *removal_list = NULL;
+	GSList          *elt;
+	gint8            max_strength = 0;
+	gint8            strengthj = 0;
+
+	g_return_if_fail (list != NULL);
+
+	if (!nm_ap_list_lock (list))
+	{
+		nm_warning ("nm_ap_list_append_ap() could not acquire AP list mutex." );
+		return;
+	}
+
+	for (elt_i = list->ap_list; elt_i; elt_i = g_slist_next (elt_i))
+	{
+		NMAccessPoint   *list_ap_i = (NMAccessPoint *)(elt_i->data);
+		gboolean         found = FALSE;
+
+		for (elt_j = list->ap_list; elt_j < elt_i; elt_j = g_slist_next (elt_j))
+		{
+			NMAccessPoint   *list_ap_j = (NMAccessPoint *)(elt_j->data);
+
+			if ((found = (nm_null_safe_strcmp (nm_ap_get_essid (list_ap_i), nm_ap_get_essid (list_ap_j)) == 0)))
+				break;
+		}
+
+		if (found)
+			continue;
+
+		elt_max = elt_i;
+		list_ap_max = (NMAccessPoint *)(elt_i->data);
+		max_strength = nm_ap_get_strength (list_ap_i);
+
+		for (elt_j = g_slist_next (elt_i); elt_j; elt_j = g_slist_next (elt_j))
+		{
+			NMAccessPoint   *list_ap_j = (NMAccessPoint *)(elt_j->data);
+
+			strengthj = nm_ap_get_strength (list_ap_j);
+			if (nm_null_safe_strcmp (nm_ap_get_essid (list_ap_i), nm_ap_get_essid (list_ap_j)) == 0)
+			{
+				if (strengthj > max_strength)
+				{
+					removal_list = g_slist_append (removal_list, list_ap_max);
+					list_ap_max = list_ap_j;
+					max_strength = strengthj;
+				}
+				else
+					removal_list = g_slist_append (removal_list, list_ap_j);
+			}
+		}
+	}
+	nm_ap_list_unlock (list);
+
+	for (elt = removal_list; elt; elt = g_slist_next (elt))
+	{
+		if ((removal_ap = (NMAccessPoint *)(elt->data)))
+		{
+			nm_ap_list_remove_ap (list, removal_ap);
+		}
+	}
+	g_slist_free (removal_list);
+
+}
+
 
 /*
  * nm_ap_list_get_ap_by_essid
@@ -382,49 +456,70 @@
 gboolean nm_ap_list_merge_scanned_ap (NMAccessPointList *list, NMAccessPoint *merge_ap,
 				gboolean *new, gboolean *strength_changed)
 {
-	NMAccessPoint	*list_ap;
-	gboolean		 success = FALSE;
+	NMAccessPoint   *list_ap_addr, *list_ap_essid;
+	gboolean                 success = FALSE;
 
 	g_return_val_if_fail (list != NULL, FALSE);
 	g_return_val_if_fail (merge_ap != NULL, FALSE);
 	g_return_val_if_fail (new != NULL, FALSE);
 	g_return_val_if_fail (strength_changed != NULL, FALSE);
 
-	if (!(list_ap = nm_ap_list_get_ap_by_address (list, nm_ap_get_address (merge_ap))))
-		list_ap = nm_ap_list_get_ap_by_essid (list, nm_ap_get_essid (merge_ap));
+	if ((list_ap_addr = nm_ap_list_get_ap_by_address (list, nm_ap_get_address (merge_ap))))
+	{
 
-	if (list_ap)
+		/* First, we check for an address match. If the merge AP has the
+		 * same address as a list AP, the merge AP and the list AP
+		 * must be the same physical AP. The list AP properties must be from
+		 * a previous scan so the time_last_seen's are not equal.
+		 * Update encryption, authentication method,
+		 * strength, and the time_last_seen. */
+
+		const GTimeVal  *merge_ap_seen = nm_ap_get_last_seen (merge_ap);
+		const GTimeVal *list_ap_addr_seen = nm_ap_get_last_seen (list_ap_addr);
+
+		nm_ap_set_encrypted (list_ap_addr, nm_ap_get_encrypted (merge_ap));
+		nm_ap_set_auth_method (list_ap_addr, nm_ap_get_auth_method (merge_ap));
+		if  (nm_ap_get_strength (merge_ap) != nm_ap_get_strength (list_ap_addr))
+		{
+			nm_ap_set_strength (list_ap_addr, nm_ap_get_strength (merge_ap));
+		*strength_changed = TRUE;
+		}
+		nm_ap_set_last_seen (list_ap_addr, merge_ap_seen);
+	}
+	else if ((list_ap_essid = nm_ap_list_get_ap_by_essid (list, nm_ap_get_essid (merge_ap))))
 	{
-		const GTimeVal	*merge_ap_seen = nm_ap_get_last_seen (merge_ap);
-		const GTimeVal *list_ap_seen = nm_ap_get_last_seen (list_ap);
 
-		/* Merge some properties on the AP that are new from scan to scan. */
-		nm_ap_set_encrypted (list_ap, nm_ap_get_encrypted (merge_ap));
-		nm_ap_set_auth_method (list_ap, nm_ap_get_auth_method (merge_ap));
-
-		/* Don't update the strength on the existing AP if the timestamp is
-		 * the same as the AP we're going to merge (which means that they were
-		 * found in the same scan, have the same ESSID, but are different APs)
-		 * and the existing AP's strength is greater than the one we're about
-		 * to merge.  This helps keep the ESSID's reported strength that of the
-		 * strongest AP we can see.
-		 */
-		if (!(    (list_ap_seen->tv_sec == merge_ap_seen->tv_sec)
-			  && (nm_ap_get_strength (list_ap) > nm_ap_get_strength (merge_ap))))
+		/* Second, we check for an ESSID match. In this case,
+       		 * a list AP has the same non-NULL ESSID as the merge AP. Update the
+		 * encryption and authentication method. Update the strength and address
+		 * except when the time_last_seen of the list AP is the same as the
+		 * time_last_seen of the merge AP and the strength of the list AP is greater
+		 * than or equal to the strength of the merge AP. If the time_last_seen's are
+		 * equal, the merge AP and the list AP come from the same scan.
+		 * Update the time_last_seen. */
+
+		const GTimeVal  *merge_ap_seen = nm_ap_get_last_seen (merge_ap);
+		const GTimeVal *list_ap_essid_seen = nm_ap_get_last_seen (list_ap_essid);
+
+		nm_ap_set_encrypted (list_ap_essid, nm_ap_get_encrypted (merge_ap));
+		nm_ap_set_auth_method (list_ap_essid, nm_ap_get_auth_method (merge_ap));
+
+		if (!((list_ap_essid_seen->tv_sec == merge_ap_seen->tv_sec)
+			&& (nm_ap_get_strength (list_ap_essid) >= nm_ap_get_strength (merge_ap))))
 		{
-			nm_ap_set_strength (list_ap, nm_ap_get_strength (merge_ap));
+			nm_ap_set_strength (list_ap_essid, nm_ap_get_strength (merge_ap));
+			nm_ap_set_address (list_ap_essid, nm_ap_get_address (merge_ap)); 
 			*strength_changed = TRUE;
 		}
-
-		nm_ap_set_last_seen (list_ap, merge_ap_seen);
+		nm_ap_set_last_seen (list_ap_essid, merge_ap_seen);
 	}
 	else
 	{
-		/* Add the whole AP, list takes ownership. */
+		/* Add the merge AP to the list. */
+
 		nm_ap_list_append_ap (list, merge_ap);
 		*new = TRUE;
 	}
-
 	return TRUE;
 }
 

NetworkManager-0.4-assert-fix.patch:
 nm-dbus-nm.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletion(-)

--- NEW FILE NetworkManager-0.4-assert-fix.patch ---
--- NetworkManager-0.4/src/nm-dbus-nm.c.assert-fix	2005-05-04 11:24:05.000000000 -0400
+++ NetworkManager-0.4/src/nm-dbus-nm.c	2005-05-04 11:24:41.000000000 -0400
@@ -129,7 +129,10 @@
 		 * (something which should never happen), die.
 		 */
 		if (!appended)
-			g_assert ("Device list existed, but no devices were in it.");
+		{
+			nm_warning ("Device list existed, but no devices were in it.");
+			g_assert_not_reached ();
+		}
 
 		dbus_message_iter_close_container (&iter, &iter_array);
 		nm_unlock_mutex (data->data->dev_list_mutex, __FUNCTION__);

NetworkManager-0.4-devup.patch:
 NetworkManagerDevice.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

--- NEW FILE NetworkManager-0.4-devup.patch ---
--- NetworkManager-0.4/src/NetworkManagerDevice.c.devup	2005-05-04 11:28:55.000000000 -0400
+++ NetworkManager-0.4/src/NetworkManagerDevice.c	2005-05-04 11:29:37.000000000 -0400
@@ -1557,8 +1557,7 @@
 
 	/* Get flags already there */
 	strcpy (ifr.ifr_name, nm_device_get_iface (dev));
-	err = ioctl (sk, SIOCGIFFLAGS, &ifr);
-	if (!err)
+	if (ioctl (sk, SIOCGIFFLAGS, &ifr) != -1)
 	{
 		/* If the interface doesn't have those flags already,
 		 * set them on it.
@@ -1567,7 +1566,7 @@
 		{
 			ifr.ifr_flags &= ~IFF_UP;
 			ifr.ifr_flags |= IFF_UP & flags;
-			if ((err = ioctl (sk, SIOCSIFFLAGS, &ifr)))
+			if (ioctl (sk, SIOCSIFFLAGS, &ifr) == -1)
 				nm_warning ("nm_device_set_up_down() could not bring device %s %s.  errno = %d", nm_device_get_iface (dev), (up ? "up" : "down"), errno );
 		}
 		/* Make sure we have a valid MAC address, some cards reload firmware when they

NetworkManager-0.4-leak-fixes.patch:
 NetworkManager.c       |    2 ++
 NetworkManagerAPList.c |    1 +
 NetworkManagerDevice.c |    3 ++-
 NetworkManagerUtils.c  |    1 +
 nm-netlink-monitor.c   |    4 +++-
 5 files changed, 9 insertions(+), 2 deletions(-)

--- NEW FILE NetworkManager-0.4-leak-fixes.patch ---
Index: src/NetworkManager.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManager.c,v
retrieving revision 1.67
diff -u -r1.67 NetworkManager.c
--- src/NetworkManager.c	6 Apr 2005 16:45:48 -0000	1.67
+++ src/NetworkManager.c	14 Apr 2005 11:12:17 -0000
@@ -526,6 +526,8 @@
 	g_main_loop_unref (data->main_loop);
 	g_main_context_unref (data->main_context);
 
+	g_io_channel_unref(data->sigterm_iochannel);
+
 	memset (data, 0, sizeof (NMData));
 }
 
Index: src/NetworkManagerAPList.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerAPList.c,v
retrieving revision 1.36
diff -u -r1.36 NetworkManagerAPList.c
--- src/NetworkManagerAPList.c	6 Apr 2005 19:05:10 -0000	1.36
+++ src/NetworkManagerAPList.c	14 Apr 2005 11:12:17 -0000
@@ -116,6 +116,7 @@
 			nm_unlock_mutex (list->mutex, __FUNCTION__);
 
 		g_mutex_free (list->mutex);
+		g_free(list);
 	}
 }
 
Index: src/NetworkManagerDevice.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevice.c,v
retrieving revision 1.121
diff -u -r1.121 NetworkManagerDevice.c
--- src/NetworkManagerDevice.c	6 Apr 2005 19:16:31 -0000	1.121
+++ src/NetworkManagerDevice.c	14 Apr 2005 11:12:17 -0000
@@ -842,7 +842,8 @@
 	if (g_file_get_contents (carrier_path, &contents, &length, NULL)) {
 		link = (gboolean) atoi (contents);
 		g_free (contents);
-	} 
+	}
+	g_free(carrier_path);
 
 	/* We say that non-carrier-detect devices always have a link, because
 	 * they never get auto-selected by NM.  User has to force them on us,
Index: src/NetworkManagerUtils.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerUtils.c,v
retrieving revision 1.33
diff -u -r1.33 NetworkManagerUtils.c
--- src/NetworkManagerUtils.c	6 Apr 2005 16:45:48 -0000	1.33
+++ src/NetworkManagerUtils.c	14 Apr 2005 11:12:17 -0000
@@ -448,6 +448,7 @@
 
 		if (parent_udi && libhal_device_property_exists (ctx, parent_udi, "info.linux.driver", NULL))
 			driver_name = libhal_device_get_property_string (ctx, parent_udi, "info.linux.driver", NULL);
+		g_free(parent_udi);
 	}
 
 	return (driver_name);
Index: src/nm-netlink-monitor.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/nm-netlink-monitor.c,v
retrieving revision 1.4
diff -u -r1.4 nm-netlink-monitor.c
--- src/nm-netlink-monitor.c	17 Mar 2005 21:43:21 -0000	1.4
+++ src/nm-netlink-monitor.c	14 Apr 2005 11:12:17 -0000
@@ -569,7 +569,7 @@
 				  NmNetlinkMonitor *monitor)
 {
 	GError *error;
-	gchar *received_bytes;
+	gchar *received_bytes=NULL;
 	gboolean processing_is_done;
 	gsize num_received_bytes;
 	guint num_bytes_to_process;
@@ -711,6 +711,8 @@
 			g_free (interface_name);
 		}
 	}
+	if (received_bytes!=NULL)
+		g_free(received_bytes);
 
 	return TRUE;
 }

NetworkManager-0.4-novarargs.patch:
 src/NetworkManagerDevice.c         |  141 ++++++++++++++++++++++---------------
 src/NetworkManagerUtils.c          |   75 ++++++++-----------
 src/NetworkManagerUtils.h          |   18 ++--
 vpn-daemons/vpnc/nm-vpnc-service.c |    0 
 4 files changed, 132 insertions(+), 102 deletions(-)

--- NEW FILE NetworkManager-0.4-novarargs.patch ---
Index: src/NetworkManagerDevice.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevice.c,v
retrieving revision 1.123
diff -u -r1.123 NetworkManagerDevice.c
--- src/NetworkManagerDevice.c	15 Apr 2005 20:00:28 -0000	1.123
+++ src/NetworkManagerDevice.c	21 Apr 2005 18:01:19 -0000
@@ -259,6 +259,7 @@
 {
 	NMDevice	*dev;
 	GError	*error = NULL;
+	nm_completion_args args;
 
 	g_return_val_if_fail (iface != NULL, NULL);
 	g_return_val_if_fail (strlen (iface) > 0, NULL);
@@ -392,11 +393,13 @@
 	}
 
 	/* Block until our device thread has actually had a chance to start. */
+	args[0] = &dev->worker_started;
+	args[1] = "nm_device_new(): waiting for device's worker thread to start";
+	args[2] = (void *)LOG_INFO;
+	args[3] = 0;
 	nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY,
-			G_USEC_PER_SEC / 20, nm_completion_boolean_test, NULL,
-			&dev->worker_started,
-			"nm_device_new(): waiting for device's worker thread to start",
-			LOG_INFO, 0);
+			G_USEC_PER_SEC / 20, nm_completion_boolean_test, NULL, args);
+
 	nm_info ("nm_device_new(): device's worker thread started, continuing.");
 
 	return (dev);
@@ -1564,16 +1567,13 @@
 }
 
 /* I really wish nm_v_wait_for_completion_or_timeout could translate these
- * to first class args instead of a va_list, so these helpers could be nice
- * and _tiny_.
- *
- * ... and we can probably do that with __builtin_apply(), or libffi,
- * but that's kindof cheating. */
-gboolean nm_completion_device_is_up_test(int tries, va_list args)
-{
-	NMDevice *dev = va_arg(args, NMDevice *);
-	gboolean *err = va_arg(args, gboolean *);
-	gboolean cancelable = va_arg(args, gboolean);
+ * to first class args instead of a all this void * arg stuff, so these
+ * helpers could be nice and _tiny_. */
+gboolean nm_completion_device_is_up_test(int tries, nm_completion_args args)
+{
+	NMDevice *dev = args[0];
+	gboolean *err = args[1];
+	gboolean cancelable = (gboolean)args[2];
 
 	g_return_val_if_fail(dev != NULL, TRUE);
 	g_return_val_if_fail(err != NULL, TRUE);
@@ -1598,13 +1598,17 @@
 gboolean nm_device_bring_up_wait (NMDevice *dev, gboolean cancelable)
 {
 	gboolean err = FALSE;
+	nm_completion_args args;
 
 	g_return_val_if_fail (dev != NULL, TRUE);
 
 	nm_device_bring_up (dev);
+
+	args[0] = dev;
+	args[1] = &err;
+	args[2] = (void *)cancelable;
 	nm_wait_for_completion(400, G_USEC_PER_SEC / 200, NULL,
-			nm_completion_device_is_up_test, dev,
-			&err, cancelable);
+			nm_completion_device_is_up_test, args);
 	if (err)
 		nm_info ("failed to bring device up");
 	return err;
@@ -1617,11 +1621,11 @@
 	nm_device_set_up_down (dev, FALSE);
 }
 
-gboolean nm_completion_device_is_down_test(int tries, va_list args)
+gboolean nm_completion_device_is_down_test(int tries, nm_completion_args args)
 {
-	NMDevice *dev = va_arg(args, NMDevice *);
-	gboolean *err = va_arg(args, gboolean *);
-	gboolean cancelable = va_arg(args, gboolean);
+	NMDevice *dev = args[0];
+	gboolean *err = args[1];
+	gboolean cancelable = (gboolean)args[2];
 
 	g_return_val_if_fail(dev != NULL, TRUE);
 	g_return_val_if_fail(err != NULL, TRUE);
@@ -1639,13 +1643,17 @@
 gboolean nm_device_bring_down_wait (NMDevice *dev, gboolean cancelable)
 {
 	gboolean err = FALSE;
+	nm_completion_args args;
 
 	g_return_val_if_fail (dev != NULL, TRUE);
 
 	nm_device_bring_down (dev);
+
+	args[0] = dev;
+	args[1] = &err;
+	args[2] = (void *)cancelable;
 	nm_wait_for_completion(400, G_USEC_PER_SEC / 200, NULL,
-			nm_completion_device_is_down_test, dev,
-			&err, cancelable);
+			nm_completion_device_is_down_test, args);
 	if (err)
 		nm_info ("failed to bring device down");
 	return err;
@@ -1848,13 +1856,13 @@
 }
 
 
-static gboolean nm_dwwfl_test (int tries, va_list args)
+static gboolean nm_dwwfl_test (int tries, nm_completion_args args)
 {
-	NMDevice *dev = va_arg (args, NMDevice *);
-	guint *assoc_count = va_arg (args, guint *);
-	double *last_freq = va_arg (args, double *);
-	char *essid = va_arg (args, char *);
-	int required = va_arg (args, int);
+	NMDevice *dev = args[0];
+	guint *assoc_count = args[1];
+	double *last_freq = args[2];
+	char *essid = args[3];
+	int required = (int)args[4];
 
 	double cur_freq = nm_device_get_frequency (dev);
 	gboolean assoc = nm_device_wireless_is_associated (dev);
@@ -1902,6 +1910,7 @@
 	double		last_freq = 0;
 	guint		assoc_count = 0;
 	struct timeval	timeout = { .tv_sec = 0, .tv_usec = 0 };
+	nm_completion_args args;
 
 	/* we want to sleep for a very short amount of time, to minimize
 	 * hysteresis on the boundaries of our required time.  But we
@@ -1927,9 +1936,13 @@
 	 * associated, the driver stops scanning.  To detect that, we look
 	 * for the essid and frequency to remain constant for 3 seconds.
 	 * When it remains constant, we assume it's a real link. */
+	args[0] = dev;
+	args[1] = &assoc;
+	args[2] = &last_freq;
+	args[3] = (void *)essid;
+	args[4] = (void *)(required_tries * 2);
 	nm_wait_for_timeout (&timeout, G_USEC_PER_SEC / delay,
-			    nm_dwwfl_test, nm_dwwfl_test, dev, &assoc,
-			    &last_freq, essid, required_tries * 2);
+			    nm_dwwfl_test, nm_dwwfl_test, args);
 
 	/* If we've had a reasonable association count, we say we have a link */
 	if (assoc > required_tries)
@@ -1938,10 +1951,10 @@
 }
 
 
-static gboolean nm_device_link_test(int tries, va_list args)
+static gboolean nm_device_link_test(int tries, nm_completion_args args)
 {
-	NMDevice *dev = va_arg(args, NMDevice *);
-	gboolean *err = va_arg(args, gboolean *);
+	NMDevice *dev = args[0];
+	gboolean *err = args[1];
 
 	g_return_val_if_fail(dev != NULL, TRUE);
 	g_return_val_if_fail(err != NULL, TRUE);
@@ -1960,10 +1973,13 @@
 	gboolean err;
 	const gint delay = (G_USEC_PER_SEC * nm_device_get_association_pause_value (dev)) / interval;
 	const gint max_cycles = timeout * interval;
+	nm_completion_args args;
 
 	g_return_val_if_fail (dev != NULL, TRUE);
 
-	nm_wait_for_completion (max_cycles, delay, NULL, nm_device_link_test, dev, &err);
+	args[0] = dev;
+	args[1] = &err;
+	nm_wait_for_completion (max_cycles, delay, NULL, nm_device_link_test, args);
 	return !err;
 }
 
@@ -2229,11 +2245,11 @@
 
 
 /* this gets called without the scan mutex held */
-static gboolean nm_wa_test (int tries, va_list args)
+static gboolean nm_wa_test (int tries, nm_completion_args args)
 {
-	NMDevice *dev = va_arg (args, NMDevice *);
-	NMAccessPoint **best_ap = va_arg (args, NMAccessPoint **);
-	gboolean *err = va_arg (args, gboolean *);
+	NMDevice *dev = args[0];
+	NMAccessPoint **best_ap = args[1];
+	gboolean *err = args[2];
 
 	g_return_val_if_fail(dev != NULL, TRUE);
 	g_return_val_if_fail(best_ap != NULL, TRUE);
@@ -2283,10 +2299,10 @@
 }
 
 
-static gboolean nm_dukr_test (int tries, va_list args)
+static gboolean nm_dukr_test (int tries, nm_completion_args args)
 {
-	NMDevice	*dev = va_arg (args, NMDevice *);
-	gboolean	*err = va_arg (args, gboolean *);
+	NMDevice	*dev = args[0];
+	gboolean	*err = args[1];
 
 	g_return_val_if_fail (dev != NULL, TRUE);
 	g_return_val_if_fail (err != NULL, TRUE);
@@ -2321,6 +2337,7 @@
 	gboolean			 need_key = FALSE;
 	gboolean			 found_ap = FALSE;
 	gboolean			 err = FALSE;
+	nm_completion_args	 args;
 
 	g_return_val_if_fail (dev != NULL, FALSE);
 	g_return_val_if_fail (dev->app_data != NULL, FALSE);
@@ -2346,7 +2363,11 @@
 	nm_device_set_now_scanning (dev, TRUE);
 
 	/* Get an access point to connect to */
-	nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY, G_USEC_PER_SEC / 50, nm_wa_test, NULL, dev, &best_ap, &err);
+	args[0] = dev;
+	args[1] = &best_ap;
+	args[2] = &err;
+	nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY, G_USEC_PER_SEC / 50,
+			nm_wa_test, NULL, args);
 	if (err)
 	{
 		/* Wierd as it may seem, we lock here to balance the unlock in "out:" */
@@ -2397,8 +2418,11 @@
 
 		/* Wait for the key to come back */
 		nm_debug ("Activation (%s/wireless): asking for user key.", nm_device_get_iface (dev));
-		nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY, G_USEC_PER_SEC / 20,
-							nm_dukr_test, nm_dukr_test, dev, &err);
+
+		args[0] = dev;
+		args[1] = &err;
+		nm_wait_for_completion (NM_COMPLETION_TRIES_INFINITY,
+				G_USEC_PER_SEC / 20, nm_dukr_test, nm_dukr_test, args);
 		nm_debug ("Activation (%s/wireless): user key received.", nm_device_get_iface (dev));
 
 		/* Done waiting, grab lock again */
@@ -2706,9 +2730,9 @@
 }
 
 
-static gboolean nm_ac_test (int tries, va_list args)
+static gboolean nm_ac_test (int tries, nm_completion_args args)
 {
-	NMDevice *dev = va_arg (args, NMDevice *);
+	NMDevice *dev = args[0];
 
 	g_return_val_if_fail (dev != NULL, TRUE);
 
@@ -2743,6 +2767,8 @@
  */
 void nm_device_activation_cancel (NMDevice *dev)
 {
+	nm_completion_args args;
+
 	g_return_if_fail (dev != NULL);
 
 	if (nm_device_is_activating (dev))
@@ -2754,8 +2780,9 @@
 		 * The other problem with waiting here is that we hold up dbus traffic
 		 * that we should respond to.
 		 */
+		args[0] = dev;
 		nm_wait_for_completion(NM_COMPLETION_TRIES_INFINITY,
-				G_USEC_PER_SEC / 20, nm_ac_test, NULL, dev);
+				G_USEC_PER_SEC / 20, nm_ac_test, NULL, args);
 		nm_debug ("Activation (%s/wireless): cancelled.", nm_device_get_iface(dev));
 	}
 }
@@ -3638,12 +3665,13 @@
 }
 
 
-static gboolean nm_completion_scan_has_results (int tries, va_list args)
+static gboolean nm_completion_scan_has_results (int tries, 
+		nm_completion_args args)
 {
-	NMDevice				*dev = va_arg (args, NMDevice *);
-	gboolean				*err = va_arg (args, gboolean *);
-	int					 sk = va_arg (args, int);
-	NMWirelessScanResults	*scan_results = va_arg (args, NMWirelessScanResults *);
+	NMDevice				*dev = args[0];
+	gboolean				*err = args[1];
+	NMSock				*sk = args[2];
+	NMWirelessScanResults	*scan_results = args[3];
 	int					 rc;
 
 	g_return_val_if_fail (dev != NULL, TRUE);
@@ -3747,6 +3775,7 @@
 			double		orig_freq = 0;
 			int			orig_rate = 0;
 			const int		max_wait = G_USEC_PER_SEC * nm_device_get_association_pause_value (dev) /2;
+			nm_completion_args args;
 
 			orig_mode = nm_device_get_mode (dev);
 			if (orig_mode == NETWORK_MODE_ADHOC)
@@ -3762,9 +3791,13 @@
 			nm_device_set_frequency (dev, 0);
 
 			scan_results = g_malloc0 (sizeof (NMWirelessScanResults));
+
+			args[0] = dev;
+			args[1] = &err;
+			args[2] = sk;
+			args[3] = scan_results;
 			nm_wait_for_completion(max_wait, max_wait/20,
-				nm_completion_scan_has_results, NULL,
-				dev, &err, sk, scan_results);
+				nm_completion_scan_has_results, NULL, args);
 
 			nm_device_set_mode (dev, orig_mode);
 			/* Only set frequency if ad-hoc mode */
Index: src/NetworkManagerUtils.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerUtils.c,v
retrieving revision 1.34
diff -u -r1.34 NetworkManagerUtils.c
--- src/NetworkManagerUtils.c	15 Apr 2005 20:00:28 -0000	1.34
+++ src/NetworkManagerUtils.c	21 Apr 2005 18:01:23 -0000
@@ -651,7 +651,7 @@
 		const guint interval_usecs,
 		nm_completion_func test_func,
 		nm_completion_func action_func,
-		va_list args)
+		nm_completion_args args)
 {
 	int try;
 	gboolean finished = FALSE;
@@ -690,21 +690,19 @@
 	}
 }
 
+/* these should probably be moved to NetworkManagerUtils.h as macros
+ * since they don't do varargs stuff any more */
 void nm_wait_for_completion_or_timeout(
 	const int max_tries,
 	const struct timeval *max_time,
 	const guint interval_usecs,
 	nm_completion_func test_func,
 	nm_completion_func action_func,
-	...)
+	nm_completion_args args)
 {
-	va_list ap;
-	va_start(ap, action_func);
-
 	nm_v_wait_for_completion_or_timeout(max_tries, max_time,
 					    interval_usecs, test_func,
-					    action_func, ap);
-	va_end(ap);
+					    action_func, args);
 }
 
 void nm_wait_for_completion(
@@ -712,15 +710,11 @@
 		const guint interval_usecs,
 		nm_completion_func test_func,
 		nm_completion_func action_func,
-		...)
+		nm_completion_args args)
 {
-	va_list ap;
-	va_start(ap, action_func);
-
 	nm_v_wait_for_completion_or_timeout(max_tries, NULL,
 					    interval_usecs, test_func,
-					    action_func, ap);
-	va_end(ap);
+					    action_func, args);
 }
 
 void nm_wait_for_timeout(
@@ -728,24 +722,19 @@
 		const guint interval_usecs,
 		nm_completion_func test_func,
 		nm_completion_func action_func,
-		...)
+		nm_completion_args args)
 {
-	va_list ap;
-	va_start(ap, action_func);
-
-	nm_v_wait_for_completion_or_timeout(-1, max_time,
-					    interval_usecs, test_func,
-					    action_func, ap);
-	va_end(ap);
+	nm_v_wait_for_completion_or_timeout(-1, max_time, interval_usecs,
+			test_func, action_func, args);
 }
 
 /* you can use these, but they're really just examples */
-gboolean nm_completion_boolean_test(int tries, va_list args)
+gboolean nm_completion_boolean_test(int tries, nm_completion_args args)
 {
-	gboolean *condition = va_arg(args, gboolean *);
-	char *message = va_arg(args, char *);
-	int log_level = va_arg(args, int);
-	int log_interval = va_arg(args, int);
+	gboolean *condition = (gboolean *)args[0];
+	char *message = (char *)args[1];
+	int log_level = (int)args[2];
+	int log_interval = (int)args[3];
 
 	g_return_val_if_fail (condition != NULL, TRUE);
 
@@ -767,14 +756,16 @@
 	return FALSE;
 }
 
-gboolean nm_completion_boolean_function1_test(int tries, va_list args)
+gboolean nm_completion_boolean_function1_test(int tries,
+		nm_completion_args args)
 {
-	nm_completion_boolean_function_1 condition =
-		va_arg(args, nm_completion_boolean_function_1);
-	char *message = va_arg(args, char *);
-	int log_level = va_arg(args, int);
-	int log_interval = va_arg(args, int);
-	u_int64_t arg0 = va_arg(args, unsigned long long);
+	nm_completion_boolean_function_1 condition = args[0];
+	char *message = args[1];
+	int log_level = (int)args[2];
+	int log_interval = (int)args[3];
+	u_int64_t arg0;
+	
+	memcpy(&arg0, &args[4], sizeof (arg0));
 
 	g_return_val_if_fail (condition, TRUE);
 
@@ -788,15 +779,17 @@
 	return FALSE;
 }
 
-gboolean nm_completion_boolean_function2_test(int tries, va_list args)
+gboolean nm_completion_boolean_function2_test(int tries,
+		nm_completion_args args)
 {
-	nm_completion_boolean_function_2 condition =
-		va_arg(args, nm_completion_boolean_function_2);
-	char *message = va_arg(args, char *);
-	int log_level = va_arg(args, int);
-	int log_interval = va_arg(args, int);
-	u_int64_t arg0 = va_arg(args, unsigned long long);
-	u_int64_t arg1 = va_arg(args, unsigned long long);
+	nm_completion_boolean_function_2 condition = args[0];
+	char *message = args[1];
+	int log_level = (int)args[2];
+	int log_interval = (int)args[3];
+	u_int64_t arg0, arg1;
+
+	memcpy(&arg0, &args[4], sizeof (arg0));
+	memcpy(&arg1, &args[4]+sizeof (arg0), sizeof (arg1));
 
 	g_return_val_if_fail (condition, TRUE);
 
Index: src/NetworkManagerUtils.h
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerUtils.h,v
retrieving revision 1.13
diff -u -r1.13 NetworkManagerUtils.h
--- src/NetworkManagerUtils.h	6 Apr 2005 16:45:48 -0000	1.13
+++ src/NetworkManagerUtils.h	21 Apr 2005 18:01:23 -0000
@@ -66,7 +66,9 @@
 
 #define NM_COMPLETION_TRIES_INFINITY -1
 
-typedef gboolean (*nm_completion_func)(int tries, va_list args);
+typedef void * nm_completion_args[8];
+
+typedef gboolean (*nm_completion_func)(int tries, nm_completion_args args);
 typedef gboolean (*nm_completion_boolean_function_1)(u_int64_t arg);
 typedef gboolean (*nm_completion_boolean_function_2)(
 	u_int64_t arg0, u_int64_t arg1);
@@ -76,7 +78,7 @@
 	const guint interval_usecs,
 	nm_completion_func test_func,
 	nm_completion_func action_func,
-	...);
+	nm_completion_args args);
 
 void nm_wait_for_completion_or_timeout(
 	const int max_tries,
@@ -84,18 +86,20 @@
 	const guint interval_usecs,
 	nm_completion_func test_func,
 	nm_completion_func action_func,
-	...);
+	nm_completion_args args);
 
 void nm_wait_for_timeout(
 	const struct timeval *max_time,
 	const guint interval_usecs,
 	nm_completion_func test_func,
 	nm_completion_func action_func,
-	...);
+	nm_completion_args args);
 
-gboolean nm_completion_boolean_test(int tries, va_list args);
-gboolean nm_completion_boolean_function1_test(int tries, va_list args);
-gboolean nm_completion_boolean_function2_test(int tries, va_list args);
+gboolean nm_completion_boolean_test(int tries, nm_completion_args args);
+gboolean nm_completion_boolean_function1_test(int tries,
+		nm_completion_args args);
+gboolean nm_completion_boolean_function2_test(int tries,
+		nm_completion_args args);
 #define nm_completion_boolean_function_test nm_completion_boolean_function1_test
 
 #endif
Index: vpn-daemons/vpnc/nm-vpnc-service.c

NetworkManager-0.4-use-thread-join.patch:
 NetworkManagerDevice.c        |    9 ++++-----
 NetworkManagerDevicePrivate.h |    2 +-
 2 files changed, 5 insertions(+), 6 deletions(-)

--- NEW FILE NetworkManager-0.4-use-thread-join.patch ---
Index: src/NetworkManagerDevice.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevice.c,v
retrieving revision 1.121
diff -u -r1.121 NetworkManagerDevice.c
--- src/NetworkManagerDevice.c	6 Apr 2005 19:16:31 -0000	1.121
+++ src/NetworkManagerDevice.c	14 Apr 2005 14:13:32 -0000
@@ -381,7 +381,8 @@
 		nm_system_device_update_config_info (dev);
 	}
 
-	if (!g_thread_create (nm_device_worker, dev, FALSE, &error))
+	dev->worker = g_thread_create (nm_device_worker, dev, TRUE, &error);
+	if (!dev->worker)
 	{
 		nm_error ("could not create device worker thread. (glib said: '%s')", error->message);
 		g_error_free (error);
@@ -512,7 +513,6 @@
 	dev->loop = NULL;
 	dev->context = NULL;
 
-	dev->worker_done = TRUE;
 	nm_device_unref (dev);
 
 	return NULL;
@@ -525,9 +525,8 @@
 
 	if (dev->loop)
 		g_main_loop_quit (dev->loop);
-	nm_wait_for_completion(NM_COMPLETION_TRIES_INFINITY, 300,
-			nm_completion_boolean_test, NULL, &dev->worker_done,
-			NULL, NULL, 0);
+	g_thread_join(dev->worker);
+	dev->worker = NULL;
 }
 
 
Index: src/NetworkManagerDevicePrivate.h
===================================================================
RCS file: /cvs/gnome/NetworkManager/src/NetworkManagerDevicePrivate.h,v
retrieving revision 1.11
diff -u -r1.11 NetworkManagerDevicePrivate.h
--- src/NetworkManagerDevicePrivate.h	1 Apr 2005 21:30:12 -0000	1.11
+++ src/NetworkManagerDevicePrivate.h	14 Apr 2005 14:13:32 -0000
@@ -106,7 +106,7 @@
 
 	GMainContext			*context;
 	GMainLoop				*loop;
-	gboolean				 worker_done;
+	GThread					*worker;
 	gboolean				 worker_started;
 	guint		 		 renew_timeout;
 	guint				 rebind_timeout;


Index: NetworkManager.spec
===================================================================
RCS file: /cvs/dist/rpms/NetworkManager/devel/NetworkManager.spec,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -r1.42 -r1.43
--- NetworkManager.spec	27 Apr 2005 05:17:34 -0000	1.42
+++ NetworkManager.spec	4 May 2005 18:33:15 -0000	1.43
@@ -13,6 +13,12 @@
 URL: http://people.redhat.com/dcbw/NetworkManager/
 Source: %{name}-%{version}.cvs20050404.tar.gz
 Patch0: NetworkManager-0.4-newdbus.patch
+Patch1: NetworkManager-0.4-leak-fixes.patch
+Patch2: NetworkManager-0.4-use-thread-join.patch
+Patch3: NetworkManager-0.4-assert-fix.patch
+Patch4: NetworkManager-0.4-devup.patch
+Patch5: NetworkManager-0.4-aplist-fix-hidden.patch
+Patch6: NetworkManager-0.4-novarargs.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-root
 
 PreReq:   chkconfig
@@ -86,7 +92,13 @@
 
 %prep
 %setup -q
-%patch0 -p1
+%patch0 -p1 -b .dbus-0.32
+%patch1 -p0 -b .leak-fixes
+%patch2 -p0 -b .use-thread-join
+%patch3 -p1 -b .assert-fix
+%patch4 -p1 -b .devup
+%patch5 -p1 -b .aplist-fix-hidden
+%patch6 -p0 -b .no-varargs
 
 
 %build
@@ -168,6 +180,14 @@
 
 
 %changelog
+* Wed May  4 2005 Dan Williams <dcbw at redhat.com> - 0.4-9.cvs20050404
+- Fix some memory leaks (Tom Parker)
+- Join to threads rather than spinning for their completion (Tom Parker)
+- Fix misuse of a g_assert() (Colin Walters)
+- Fix return checking of an ioctl() (Bill Moss)
+- Better detection and matching of hidden access points (Bill Moss)
+- Don't use varargs, and therefore don't crash on PPC (Peter Jones)
+
 * Wed Apr 27 2005 Jeremy Katz <katzj at redhat.com> - 0.4-8.cvs20050404
 - fix build with newer dbus
 




More information about the fedora-cvs-commits mailing list