summaryrefslogtreecommitdiff
path: root/libnm-util/nm-param-spec-specialized.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2008-10-01 21:38:23 +0000
committerDan Williams <dcbw@redhat.com>2008-10-01 21:38:23 +0000
commit95798eb451833cecafe75deebd277914a2fd4ce5 (patch)
tree6b120d813988ab91338240dafaa7040d464291a7 /libnm-util/nm-param-spec-specialized.c
parent7d94e978a33a416e19d7eedfc2a64b243c3f5a43 (diff)
downloadNetworkManager-95798eb451833cecafe75deebd277914a2fd4ce5.tar.gz
2008-10-01 Dan Williams <dcbw@redhat.com>
Fix setting value comparison issue that caused some settings to look the same when they were really different (rh #464417) * libnm-util/nm-param-spec-specialized.c - (type_is_fixed_size): return fundamental size of the fixed type too - (nm_gvalues_compare_collection): use the fundamental fixed type size in the comparison so that the _entire_ fixed type collection gets compared rather than just the first 'len1' bytes git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4134 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
Diffstat (limited to 'libnm-util/nm-param-spec-specialized.c')
-rw-r--r--libnm-util/nm-param-spec-specialized.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/libnm-util/nm-param-spec-specialized.c b/libnm-util/nm-param-spec-specialized.c
index d8f218dc79..10621fac47 100644
--- a/libnm-util/nm-param-spec-specialized.c
+++ b/libnm-util/nm-param-spec-specialized.c
@@ -39,20 +39,41 @@ struct _NMParamSpecSpecialized {
static gint nm_gvalues_compare (const GValue *value1, const GValue *value2);
static gboolean
-type_is_fixed_size (GType type)
+type_is_fixed_size (GType type, gsize *tsize)
{
switch (type) {
case G_TYPE_CHAR:
+ if (tsize) *tsize = sizeof (char);
+ return TRUE;
case G_TYPE_UCHAR:
+ if (tsize) *tsize = sizeof (guchar);
+ return TRUE;
case G_TYPE_BOOLEAN:
+ if (tsize) *tsize = sizeof (gboolean);
+ return TRUE;
case G_TYPE_LONG:
+ if (tsize) *tsize = sizeof (glong);
+ return TRUE;
case G_TYPE_ULONG:
+ if (tsize) *tsize = sizeof (gulong);
+ return TRUE;
case G_TYPE_INT:
+ if (tsize) *tsize = sizeof (gint);
+ return TRUE;
case G_TYPE_UINT:
+ if (tsize) *tsize = sizeof (guint);
+ return TRUE;
case G_TYPE_INT64:
+ if (tsize) *tsize = sizeof (gint64);
+ return TRUE;
case G_TYPE_UINT64:
+ if (tsize) *tsize = sizeof (guint64);
+ return TRUE;
case G_TYPE_FLOAT:
+ if (tsize) *tsize = sizeof (gfloat);
+ return TRUE;
case G_TYPE_DOUBLE:
+ if (tsize) *tsize = sizeof (gdouble);
return TRUE;
default:
return FALSE;
@@ -232,8 +253,9 @@ nm_gvalues_compare_collection (const GValue *value1, const GValue *value2)
guint len1;
guint len2;
GType value_type = dbus_g_type_get_collection_specialization (G_VALUE_TYPE (value1));
+ gsize element_size = 0;
- if (type_is_fixed_size (value_type)) {
+ if (type_is_fixed_size (value_type, &element_size)) {
gpointer data1 = NULL;
gpointer data2 = NULL;
@@ -243,7 +265,7 @@ nm_gvalues_compare_collection (const GValue *value1, const GValue *value2)
if (len1 != len2)
ret = len1 < len2 ? -1 : len1 > len2;
else
- ret = memcmp (data1, data2, len1);
+ ret = memcmp (data1, data2, len1 * element_size);
} else {
GSList *list1 = NULL;
GSList *list2 = NULL;
@@ -372,8 +394,7 @@ nm_gvalues_compare (const GValue *value1, const GValue *value2)
if (type1 != type2)
return type1 < type2 ? -1 : type1 > type2;
-
- if (type_is_fixed_size (type1))
+ if (type_is_fixed_size (type1, NULL))
ret = nm_gvalues_compare_fixed (value1, value2);
else if (type1 == G_TYPE_STRING)
ret = nm_gvalues_compare_string (value1, value2);