Mercurial > pidgin.yaz
view libpurple/tests/tests.h @ 31518:b39b6d0008c5
upnp: Asynch-ronize the callbacks from UPnP to calling code. Refs #12387
I have no idea if this will resolve the crashes, but with the help of the
packet capture, I /think/ these are correct.
Short summary: it's possible for the callback to fire (and ar be freed) before
the top-level function (purple_upnp_cancel_port_mapping) returns, even though
cancel_port_mapping returns the now-invalid ar (which may lead to a subsequent
use-after-free).
At least one call path through the code that I think leads to this (backed
up by one of the debug logs I looked at):
purple_upnp_cancel_port_mapping(...)
do_port_mapping_cb (has_control_mapping == TRUE, ar->add == FALSE)
purple_upnp_generate_action_message_and_send(..., done_port_mapping_cb, ar)
/* We fail to parse the URL (see some debug logs) */
done_port_mapping_cb
ar->cb(FALSE, cbdata)
return;
return;
return;
return ar;
...and something which calls:
do_port_mapping_cb(has_control_mapping == TRUE, ar->add == TRUE)
ar->cb(FALSE, cbdata)
g_free(ar)
return;
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Tue, 28 Dec 2010 05:37:20 +0000 |
parents | 6362579b3d2e |
children | e743507b3767 |
line wrap: on
line source
#ifndef TESTS_H # define TESTS_H #include "../purple.h" #include <check.h> /* define the test suites here */ /* remember to add the suite to the runner in check_libpurple.c */ Suite * master_suite(void); Suite * cipher_suite(void); Suite * jabber_caps_suite(void); Suite * jabber_jutil_suite(void); Suite * jabber_scram_suite(void); Suite * qq_suite(void); Suite * yahoo_util_suite(void); Suite * util_suite(void); /* helper macros */ #define assert_int_equal(expected, actual) { \ fail_if(expected != actual, "Expected '%d' but got '%d'", expected, actual); \ } #define assert_string_equal(expected, actual) { \ const gchar *a = actual; \ fail_unless(strcmp(expected, a) == 0, "Expected '%s' but got '%s'", expected, a); \ } #define assert_string_equal_free(expected, actual) { \ gchar *b = actual; \ assert_string_equal(expected, b); \ g_free(b); \ } #endif /* ifndef TESTS_H */