[Pidgin] #16536: crash: double free or corruption
Pidgin
trac at pidgin.im
Fri Jan 16 07:50:50 EST 2015
#16536: crash: double free or corruption
------------------------------------+------------------------
Reporter: jts | Owner:
Type: patch | Status: new
Milestone: Patches Needing Review | Component: libpurple
Version: 2.10.11 | Resolution:
Keywords: |
------------------------------------+------------------------
Changes (by Robby):
* milestone: => Patches Needing Review
Old description:
> pidgin crashes when disabling a SIP account:
>
> {{{
> *** glibc detected *** /home/eda/tools/vendors/pidgin/2.10.11/bin/pidgin:
> double free or corruption (fasttop): 0x0000000000cccca0 ***
> }}}
>
> Backtrace:
>
> {{{
> #5 0x00002aaaad0038cf in g_free (mem=0xcccca0) at gmem.c:252
> #6 0x00002aaaad3300e6 in purple_proxy_connect_data_destroy
> (connect_data=0xcccc00) at proxy.c:586
> #7 0x00002aaab5289b00 in sipe_backend_transport_disconnect
> (conn=0xcc8e60) at purple-transport.c:324
> #8 0x00002aaab525a4ba in sip_transport_disconnect
> (sipe_private=0xd449a0) at sip-transport.c:1385
> #9 0x00002aaab5264f5b in sipe_core_connection_cleanup
> (sipe_private=0xd449a0) at sipe-core.c:336
> #10 0x00002aaab5265063 in sipe_core_deallocate (sipe_public=<value
> optimized out>) at sipe-core.c:395
> #11 0x00002aaab5253ce6 in sipe_purple_close (gc=0xc9b010) at purple-
> plugin.c:485
> #12 0x00002aaaad31167d in _purple_connection_destroy (gc=0xc9b010) at
> connection.c:275
> #13 0x00002aaaad300e22 in purple_account_disconnect (account=0x8b7650) at
> account.c:1343
> }}}
>
> The problem starts in {{{_purple_connection_destroy()}}}:
>
> {{{
> purple_proxy_connect_cancel_with_handle(gc);
>
> prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
> if (prpl_info->close)
> (prpl_info->close)(gc);
> }}}
>
> {{{purple_proxy_connect_cancel_with_handle()}}} starts a sequence which
> calls {{{purple_proxy_connect_data_destroy()}}}, which frees
> {{{connect_data}}}. {{{prpl_info->close}}} goes through the sequence
> shown in the backtrace, which ends up at
> {{{purple_proxy_connect_data_destroy()}}} again, resulting in a double
> free.
>
> The following patch appears to fix the problem:
>
> {{{
> *** proxy.c 2015-01-16 01:40:32.000000000 -0500
> --- proxy.c.new 2015-01-16 01:39:46.000000000 -0500
> ***************
> *** 568,573 ****
> --- 568,576 ----
> static void
> purple_proxy_connect_data_destroy(PurpleProxyConnectData *connect_data)
> {
> + if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data))
> + return;
> +
> handles = g_slist_remove(handles, connect_data);
>
> if (connect_data->query_data != NULL)
> }}}
>
> You could argue the problem is in the SIPE plugin instead of pidgin, but
> since all {{{purple_proxy_connect_data_destroy()}}} does is work on the
> {{{connect_data}}} argument, it seems an ounce of prevention is worth a
> pound of cure by verifying it's valid first. However, if it's better
> dealt with in the plugin code just let me know, and I'll file a ticket
> with the SIPE project. Thanks.
New description:
pidgin crashes when disabling an SIP account:
{{{
*** glibc detected *** /home/eda/tools/vendors/pidgin/2.10.11/bin/pidgin:
double free or corruption (fasttop): 0x0000000000cccca0 ***
}}}
Backtrace:
{{{
#5 0x00002aaaad0038cf in g_free (mem=0xcccca0) at gmem.c:252
#6 0x00002aaaad3300e6 in purple_proxy_connect_data_destroy
(connect_data=0xcccc00) at proxy.c:586
#7 0x00002aaab5289b00 in sipe_backend_transport_disconnect
(conn=0xcc8e60) at purple-transport.c:324
#8 0x00002aaab525a4ba in sip_transport_disconnect (sipe_private=0xd449a0)
at sip-transport.c:1385
#9 0x00002aaab5264f5b in sipe_core_connection_cleanup
(sipe_private=0xd449a0) at sipe-core.c:336
#10 0x00002aaab5265063 in sipe_core_deallocate (sipe_public=<value
optimized out>) at sipe-core.c:395
#11 0x00002aaab5253ce6 in sipe_purple_close (gc=0xc9b010) at purple-
plugin.c:485
#12 0x00002aaaad31167d in _purple_connection_destroy (gc=0xc9b010) at
connection.c:275
#13 0x00002aaaad300e22 in purple_account_disconnect (account=0x8b7650) at
account.c:1343
}}}
The problem starts in {{{_purple_connection_destroy()}}}:
{{{
purple_proxy_connect_cancel_with_handle(gc);
prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl);
if (prpl_info->close)
(prpl_info->close)(gc);
}}}
{{{purple_proxy_connect_cancel_with_handle()}}} starts a sequence which
calls {{{purple_proxy_connect_data_destroy()}}}, which frees
{{{connect_data}}}. {{{prpl_info->close}}} goes through the sequence shown
in the backtrace, which ends up at
{{{purple_proxy_connect_data_destroy()}}} again, resulting in a double
free.
The following patch appears to fix the problem:
{{{
*** proxy.c 2015-01-16 01:40:32.000000000 -0500
--- proxy.c.new 2015-01-16 01:39:46.000000000 -0500
***************
*** 568,573 ****
--- 568,576 ----
static void
purple_proxy_connect_data_destroy(PurpleProxyConnectData *connect_data)
{
+ if (!PURPLE_PROXY_CONNECT_DATA_IS_VALID(connect_data))
+ return;
+
handles = g_slist_remove(handles, connect_data);
if (connect_data->query_data != NULL)
}}}
You could argue the problem is in the SIPE plugin instead of pidgin, but
since all {{{purple_proxy_connect_data_destroy()}}} does is work on the
{{{connect_data}}} argument, it seems an ounce of prevention is worth a
pound of cure by verifying it's valid first. However, if it's better dealt
with in the plugin code just let me know, and I'll file a ticket with the
SIPE project. Thanks.
--
--
Ticket URL: <https://developer.pidgin.im/ticket/16536#comment:1>
Pidgin <https://pidgin.im>
Pidgin
More information about the Tracker
mailing list