Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/inputs-channel.c | 5 ++++ server/tests/test-leaks.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/server/inputs-channel.c b/server/inputs-channel.c index f6ad27ec..b4292f0e 100644 --- a/server/inputs-channel.c +++ b/server/inputs-channel.c @@ -566,6 +566,7 @@ inputs_channel_finalize(GObject *object) InputsChannel *self = INPUTS_CHANNEL(object); RedsState *reds = red_channel_get_server(RED_CHANNEL(self)); + inputs_channel_detach_tablet(self, self->tablet); reds_core_timer_remove(reds, self->key_modifiers_timer); G_OBJECT_CLASS(inputs_channel_parent_class)->finalize(object); @@ -652,6 +653,10 @@ int inputs_channel_has_tablet(InputsChannel *inputs) void inputs_channel_detach_tablet(InputsChannel *inputs, SpiceTabletInstance *tablet) { spice_printerr(""); + if (tablet != NULL && tablet == inputs->tablet) { + g_free(tablet->st); + tablet->st = NULL; + } inputs->tablet = NULL; } diff --git a/server/tests/test-leaks.c b/server/tests/test-leaks.c index 7032000a..41734c57 100644 --- a/server/tests/test-leaks.c +++ b/server/tests/test-leaks.c @@ -178,6 +178,71 @@ static void migration_leaks(void) basic_event_loop_destroy(); } +static void tablet_set_logical_size(SpiceTabletInstance* sin, int width, int height) +{ +} + +static void tablet_position(SpiceTabletInstance* sin, int x, int y, + uint32_t buttons_state) +{ +} + +static void tablet_wheel(SpiceTabletInstance* sin, int wheel, + uint32_t buttons_state) +{ +} + +static void tablet_buttons(SpiceTabletInstance *sin, + uint32_t buttons_state) +{ +} + +static const SpiceTabletInterface tablet_interface = { + .base = { + .type = SPICE_INTERFACE_TABLET, + .description = "tablet", + .major_version = SPICE_INTERFACE_TABLET_MAJOR, + .minor_version = SPICE_INTERFACE_TABLET_MINOR, + }, + .set_logical_size = tablet_set_logical_size, + .position = tablet_position, + .wheel = tablet_wheel, + .buttons = tablet_buttons, +}; + +static void tablet_leaks(void) +{ + SpiceCoreInterface *core; + SpiceServer *server; + SpiceTabletInstance tablet; + + core = basic_event_loop_init(); + g_assert_nonnull(core); + + // test if leaks without spice_server_remove_interface + server = spice_server_new(); + g_assert_nonnull(server); + g_assert_cmpint(spice_server_init(server, core), ==, 0); + + tablet.base.sif = &tablet_interface.base; + spice_server_add_interface(server, &tablet.base); + + spice_server_destroy(server); + + // test if leaks with spice_server_remove_interface + server = spice_server_new(); + g_assert_nonnull(server); + g_assert_cmpint(spice_server_init(server, core), ==, 0); + + tablet.base.sif = &tablet_interface.base; + spice_server_add_interface(server, &tablet.base); + spice_server_remove_interface(&tablet.base); + + spice_server_destroy(server); + + basic_event_loop_destroy(); +} + int main(int argc, char *argv[]) { g_test_init(&argc, &argv, NULL); @@ -185,6 +250,7 @@ int main(int argc, char *argv[]) g_test_add_func("/server/server leaks", server_leaks); g_test_add_func("/server/vmc leaks", vmc_leaks); g_test_add_func("/server/migration leaks", migration_leaks); + g_test_add_func("/server/tablet leaks", tablet_leaks); return g_test_run(); } -- 2.14.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel