[gnome-desktop] gnome-xkb-info: Don't store duplicated layouts in locale tables
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-desktop] gnome-xkb-info: Don't store duplicated layouts in locale tables
- Date: Thu, 14 Mar 2013 13:30:03 +0000 (UTC)
commit b8f4a289a813ba2152ea85cef075392721ff2b7b
Author: Rui Matos <tiagomatos gmail com>
Date: Thu Mar 7 11:34:28 2013 +0100
gnome-xkb-info: Don't store duplicated layouts in locale tables
We can't store duplicated layouts anywhere since those get destroyed
when the 'layout' element ends and we'd end up with invalid entries
potentially leading to crashes when used.
Just doing a g_hash_table_remove() on the layouts_by_* tables was a
thinko and could never work since those only contain other tables as
values and it's in this second level tables that the layouts are
stored.
https://bugzilla.gnome.org/show_bug.cgi?id=695350
libgnome-desktop/gnome-xkb-info.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
---
diff --git a/libgnome-desktop/gnome-xkb-info.c b/libgnome-desktop/gnome-xkb-info.c
index cc43f91..7e2df28 100644
--- a/libgnome-desktop/gnome-xkb-info.c
+++ b/libgnome-desktop/gnome-xkb-info.c
@@ -367,13 +367,21 @@ add_layout_to_table (GHashTable *table,
{
GHashTable *set;
+ if (!layout->xkb_name)
+ return;
+
set = g_hash_table_lookup (table, key);
if (!set)
{
- set = g_hash_table_new (NULL, NULL);
+ set = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_replace (table, g_strdup (key), set);
}
- g_hash_table_add (set, layout);
+ else
+ {
+ if (g_hash_table_contains (set, layout->xkb_name))
+ return;
+ }
+ g_hash_table_replace (set, layout->xkb_name, layout);
}
static void
@@ -397,8 +405,6 @@ parse_end_element (GMarkupParseContext *context,
if (g_hash_table_contains (priv->layouts_table, priv->current_parser_layout->id))
{
- g_hash_table_remove (priv->layouts_by_country, priv->current_parser_layout);
- g_hash_table_remove (priv->layouts_by_language, priv->current_parser_layout);
g_clear_pointer (&priv->current_parser_layout, free_layout);
return;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]