c6f296b
2008-10-01  Dan Williams  <dcbw@redhat.com>
c6f296b
c6f296b
	Fix setting value comparison issue that caused some settings to look the
c6f296b
	same when they were really different (rh #464417)
c6f296b
c6f296b
	* libnm-util/nm-param-spec-specialized.c
c6f296b
		- (type_is_fixed_size): return fundamental size of the fixed type too
c6f296b
		- (nm_gvalues_compare_collection): use the fundamental fixed type size
c6f296b
			in the comparison so that the _entire_ fixed type collection gets
c6f296b
			compared rather than just the first 'len1' bytes
c6f296b
c6f296b
diff -up NetworkManager-0.7.0/libnm-util/nm-param-spec-specialized.c.compare-fix NetworkManager-0.7.0/libnm-util/nm-param-spec-specialized.c
c6f296b
--- NetworkManager-0.7.0/libnm-util/nm-param-spec-specialized.c.compare-fix	2008-10-01 17:41:41.000000000 -0400
c6f296b
+++ NetworkManager-0.7.0/libnm-util/nm-param-spec-specialized.c	2008-10-01 17:42:05.000000000 -0400
c6f296b
@@ -39,20 +39,41 @@ struct _NMParamSpecSpecialized {
c6f296b
 static gint nm_gvalues_compare (const GValue *value1, const GValue *value2);
c6f296b
 
c6f296b
 static gboolean
c6f296b
-type_is_fixed_size (GType type)
c6f296b
+type_is_fixed_size (GType type, gsize *tsize)
c6f296b
 {
c6f296b
 	switch (type) {
c6f296b
 	case G_TYPE_CHAR:
c6f296b
+		if (tsize) *tsize = sizeof (char);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_UCHAR:
c6f296b
+		if (tsize) *tsize = sizeof (guchar);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_BOOLEAN:
c6f296b
+		if (tsize) *tsize = sizeof (gboolean);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_LONG:
c6f296b
+		if (tsize) *tsize = sizeof (glong);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_ULONG:
c6f296b
+		if (tsize) *tsize = sizeof (gulong);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_INT:
c6f296b
+		if (tsize) *tsize = sizeof (gint);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_UINT:
c6f296b
+		if (tsize) *tsize = sizeof (guint);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_INT64:
c6f296b
+		if (tsize) *tsize = sizeof (gint64);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_UINT64:
c6f296b
+		if (tsize) *tsize = sizeof (guint64);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_FLOAT:
c6f296b
+		if (tsize) *tsize = sizeof (gfloat);
c6f296b
+		return TRUE;
c6f296b
 	case G_TYPE_DOUBLE:
c6f296b
+		if (tsize) *tsize = sizeof (gdouble);
c6f296b
 		return TRUE;
c6f296b
 	default:
c6f296b
 		return FALSE;
c6f296b
@@ -232,8 +253,9 @@ nm_gvalues_compare_collection (const GVa
c6f296b
 	guint len1;
c6f296b
 	guint len2;
c6f296b
 	GType value_type = dbus_g_type_get_collection_specialization (G_VALUE_TYPE (value1));
c6f296b
+	gsize element_size = 0;
c6f296b
 
c6f296b
-	if (type_is_fixed_size (value_type)) {
c6f296b
+	if (type_is_fixed_size (value_type, &element_size)) {
c6f296b
 		gpointer data1 = NULL;
c6f296b
 		gpointer data2 = NULL;
c6f296b
 
c6f296b
@@ -243,7 +265,7 @@ nm_gvalues_compare_collection (const GVa
c6f296b
 		if (len1 != len2)
c6f296b
 			ret = len1 < len2 ? -1 : len1 > len2;
c6f296b
 		else
c6f296b
-			ret = memcmp (data1, data2, len1);
c6f296b
+			ret = memcmp (data1, data2, len1 * element_size);
c6f296b
 	} else {
c6f296b
 		GSList *list1 = NULL;
c6f296b
 		GSList *list2 = NULL;
c6f296b
@@ -372,8 +394,7 @@ nm_gvalues_compare (const GValue *value1
c6f296b
 	if (type1 != type2)
c6f296b
 		return type1 < type2 ? -1 : type1 > type2;
c6f296b
 
c6f296b
-
c6f296b
-	if (type_is_fixed_size (type1))
c6f296b
+	if (type_is_fixed_size (type1, NULL))
c6f296b
 		ret = nm_gvalues_compare_fixed (value1, value2);
c6f296b
 	else if (type1 == G_TYPE_STRING) 
c6f296b
 		ret = nm_gvalues_compare_string (value1, value2);