Mercurial > pidgin
view libpurple/tests/check_libpurple.c @ 28844:ee1ed5d16235
Save the event source ID for search_find_cb so that it's removed when the
log dialog is closed. This fixes a double free which might be caused by
having a large logset (and maybe pressing Close multiple times).
It looks something like this, with a few variations:
== Invalid read of size 8
== at 0x483001: search_find_cb (gtklog.c:425)
== by 0xBB91E50: g_main_context_dispatch (gmain.c:1824)
== by 0xBB953E7: g_main_context_iterate (gmain.c:2455)
== by 0xBB958BC: g_main_loop_run (gmain.c:2663)
== by 0x63AF606: gtk_main (gtkmain.c:1205)
== by 0x485ADF: main (gtkmain.c:978)
== Address 0x1b469860 is 56 bytes inside a block of size 72 free'd
== at 0x4C239EF: free (vg_replace_malloc.c:323)
== by 0x483A6C: destroy_cb (gtklog.c:223)
== by 0xAB9B12C: g_closure_invoke (gclosure.c:767)
== by 0xABB02B1: signal_emit_unlocked_R (gsignal.c:3247)
== by 0xABB1806: g_signal_emit_valist (gsignal.c:2980)
== by 0xABB1CD2: g_signal_emit (gsignal.c:3037)
== by 0xAB9B12C: g_closure_invoke (gclosure.c:767)
== by 0xABB02B1: signal_emit_unlocked_R (gsignal.c:3247)
== by 0xABB1806: g_signal_emit_valist (gsignal.c:2980)
== by 0xABB1CD2: g_signal_emit (gsignal.c:3037)
== by 0x630ECB4: gtk_real_button_released (gtkbutton.c:1707)
== by 0xAB9B12C: g_closure_invoke (gclosure.c:767)
==
Fixes #11071.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Tue, 05 Jan 2010 06:43:18 +0000 |
parents | c0c24f947211 |
children | a40c55113f7d |
line wrap: on
line source
#include <glib.h> #include <stdlib.h> #include "tests.h" #include "../core.h" #include "../eventloop.h" #include "../util.h" /****************************************************************************** * libpurple goodies *****************************************************************************/ static guint purple_check_input_add(gint fd, PurpleInputCondition condition, PurpleInputFunction function, gpointer data) { /* this is a no-op for now, feel free to implement it */ return 0; } static PurpleEventLoopUiOps eventloop_ui_ops = { g_timeout_add, g_source_remove, purple_check_input_add, g_source_remove, NULL, /* input_get_error */ #if GLIB_CHECK_VERSION(2,14,0) g_timeout_add_seconds, #else NULL, #endif NULL, NULL, NULL }; static void purple_check_init(void) { gchar *home_dir; g_type_init(); purple_eventloop_set_ui_ops(&eventloop_ui_ops); /* build our fake home directory */ home_dir = g_build_path(G_DIR_SEPARATOR_S, BUILDDIR, "libpurple", "tests", "home", NULL); purple_util_set_user_dir(home_dir); g_free(home_dir); purple_core_init("check"); } /****************************************************************************** * Check meat and potatoes *****************************************************************************/ Suite* master_suite(void) { Suite *s = suite_create("Master Suite"); return s; } int main(void) { int number_failed; SRunner *sr; if (g_getenv("PURPLE_CHECK_DEBUG")) purple_debug_set_enabled(TRUE); /* Make g_return_... functions fatal, ALWAYS. * As this is the test code, this is NOT controlled * by PURPLE_FATAL_ASSERTS. */ g_log_set_always_fatal(G_LOG_LEVEL_CRITICAL); sr = srunner_create (master_suite()); srunner_add_suite(sr, cipher_suite()); srunner_add_suite(sr, jabber_jutil_suite()); srunner_add_suite(sr, jabber_scram_suite()); srunner_add_suite(sr, qq_suite()); srunner_add_suite(sr, yahoo_util_suite()); srunner_add_suite(sr, util_suite()); /* make this a libpurple "ui" */ purple_check_init(); srunner_run_all (sr, CK_NORMAL); number_failed = srunner_ntests_failed (sr); srunner_free (sr); purple_core_quit(); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; }