diff options
author | Dan Williams <dcbw@redhat.com> | 2008-10-01 21:38:23 +0000 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2008-10-01 21:38:23 +0000 |
commit | 95798eb451833cecafe75deebd277914a2fd4ce5 (patch) | |
tree | 6b120d813988ab91338240dafaa7040d464291a7 /libnm-util/nm-param-spec-specialized.c | |
parent | 7d94e978a33a416e19d7eedfc2a64b243c3f5a43 (diff) | |
download | NetworkManager-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.c | 31 |
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); |