diff options
author | Ryan Lortie <desrt@desrt.ca> | 2011-09-12 08:06:13 -0400 |
---|---|---|
committer | Ryan Lortie <desrt@desrt.ca> | 2011-09-12 08:12:44 -0400 |
commit | 92652ac79177bcdced5f01122debb50eabdb3e2c (patch) | |
tree | 5ba761e3661af847ee328a281b8f684f7ed338e6 | |
parent | a5dd6fcc4f46a322cc547a5fcfa1b52cbc5ec6d6 (diff) | |
download | glib-92652ac79177bcdced5f01122debb50eabdb3e2c.tar.gz |
hashing: always use signed chars
Our hashing of non-ASCII strings was undefined due to the fact that
'char' is signed on some platforms, unsigned on others. Always use a
signed char.
Discovered by Alexander Larsson.
https://bugzilla.gnome.org/show_bug.cgi?id=658806
-rw-r--r-- | gvdb-builder.c | 2 | ||||
-rw-r--r-- | gvdb-reader.c | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/gvdb-builder.c b/gvdb-builder.c index f65ca7dbd..91adec673 100644 --- a/gvdb-builder.c +++ b/gvdb-builder.c @@ -93,7 +93,7 @@ djb_hash (const gchar *key) guint32 hash_value = 5381; while (*key) - hash_value = hash_value * 33 + *key++; + hash_value = hash_value * 33 + *(signed char *)key++; return hash_value; } diff --git a/gvdb-reader.c b/gvdb-reader.c index 73f4f1385..57816af73 100644 --- a/gvdb-reader.c +++ b/gvdb-reader.c @@ -254,7 +254,7 @@ gvdb_table_lookup (GvdbTable *file, return NULL; for (key_length = 0; key[key_length]; key_length++) - hash_value = (hash_value * 33) + key[key_length]; + hash_value = (hash_value * 33) + ((signed char *) key)[key_length]; if (!gvdb_table_bloom_filter (file, hash_value)) return NULL; |