summaryrefslogtreecommitdiff
path: root/atspi/atspi-registry.c
diff options
context:
space:
mode:
authorMarcus Habermehl <bhm1980de@googlemail.com>2012-06-04 16:31:46 -0500
committerMike Gorse <mgorse@suse.com>2012-06-04 16:31:46 -0500
commite35e89210b13a7e2a2d2929545bd76116157c828 (patch)
tree49c02e23fe2fe40e02670e035525ed3fb1ebdc6e /atspi/atspi-registry.c
parent1dc8c769980b75adcdede5eb89289be50f4d19d1 (diff)
downloadat-spi2-core-e35e89210b13a7e2a2d2929545bd76116157c828.tar.gz
Fix crash in atspi_deregister_keystroke_listener
Atspi_registry_keystroke_listener has code to copy a keyset before passing to dbind, in order to handle NULL keystrings, but this code was not present in atspi_deregister_keystroke_listener. https://bugs.freedesktop.org/show_bug.cgi?id=50578
Diffstat (limited to 'atspi/atspi-registry.c')
-rw-r--r--atspi/atspi-registry.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/atspi/atspi-registry.c b/atspi/atspi-registry.c
index a4fbb7db..26a3ca22 100644
--- a/atspi/atspi-registry.c
+++ b/atspi/atspi-registry.c
@@ -206,7 +206,9 @@ atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
AtspiKeyEventMask event_types,
GError **error)
{
+ GArray *d_key_set;
gchar *path = _atspi_device_listener_get_path (listener);
+ gint i;
dbus_uint32_t d_modmask = modmask;
dbus_uint32_t d_event_types = event_types;
DBusError d_error;
@@ -217,11 +219,38 @@ atspi_deregister_keystroke_listener (AtspiDeviceListener *listener,
return FALSE;
}
+ /* copy the keyval filter values from the C api into the DBind KeySet */
+ if (key_set)
+ {
+ d_key_set = g_array_sized_new (FALSE, TRUE, sizeof (AtspiKeyDefinition), key_set->len);
+ d_key_set->len = key_set->len;
+ for (i = 0; i < key_set->len; ++i)
+ {
+ AtspiKeyDefinition *kd = ((AtspiKeyDefinition *) key_set->data) + i;
+ AtspiKeyDefinition *d_kd = ((AtspiKeyDefinition *) d_key_set->data) + i;
+ d_kd->keycode = kd->keycode;
+ d_kd->keysym = kd->keysym;
+ if (kd->keystring)
+ {
+ d_kd->keystring = kd->keystring;
+ }
+ else
+ {
+ d_kd->keystring = "";
+ }
+ }
+ }
+ else
+ {
+ d_key_set = g_array_sized_new (FALSE, TRUE, sizeof (AtspiKeyDefinition), 0);
+ }
+
dbind_method_call_reentrant (_atspi_bus(), atspi_bus_registry,
atspi_path_dec, atspi_interface_dec,
"DeregisterKeystrokeListener", &d_error,
- "oa(iisi)uu", path, &key_set, d_modmask,
+ "oa(iisi)uu", path, d_key_set, d_modmask,
d_event_types);
+ g_array_free (d_key_set, TRUE);
g_free (path);
return TRUE;
}