aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-07-11 11:30:27 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-07-11 11:30:27 +0100
commit1e52e1ff518987092cfe94bc5c9c4479ed535019 (patch)
tree59a0f7c6725f37703797b8825058356ec6bf1f27
parente92c4f4f63ca0ba9ac6f959f7ff894ad2fc72a04 (diff)
When cleaning up queries, q->data is free()d. Even if it turns out to be
the "struct irc" containing all data belonging to a session. Sanitise memory management a little bit here. (There are some memory leaks in here too that need to be fixed at some point.)
-rw-r--r--ipc.c2
-rw-r--r--protocols/nogaim.c6
-rw-r--r--protocols/purple/purple.c2
-rw-r--r--query.c7
-rw-r--r--query.h5
5 files changed, 13 insertions, 9 deletions
diff --git a/ipc.c b/ipc.c
index 32e58cb7..9a100465 100644
--- a/ipc.c
+++ b/ipc.c
@@ -323,7 +323,7 @@ static void ipc_child_cmd_takeover( irc_t *irc, char **cmd )
"You're already connected to this server. "
"Would you like to take over this session?",
ipc_child_cmd_takeover_yes,
- ipc_child_cmd_takeover_no, irc );
+ ipc_child_cmd_takeover_no, NULL, irc );
/* This one's going to connect to accounts, avoid that. */
b_event_remove( irc->login_source_id );
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index c23b0a3a..7380c575 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -379,7 +379,7 @@ void imc_logout( struct im_connection *ic, int allow_reconnect )
void imcb_ask( struct im_connection *ic, char *msg, void *data,
query_callback doit, query_callback dont )
{
- query_add( (irc_t *) ic->bee->ui_data, ic, msg, doit, dont, data );
+ query_add( (irc_t *) ic->bee->ui_data, ic, msg, doit, dont, g_free, data );
}
void imcb_add_buddy( struct im_connection *ic, const char *handle, const char *group )
@@ -477,7 +477,7 @@ void imcb_ask_auth( struct im_connection *ic, const char *handle, const char *re
data->ic = ic;
data->handle = g_strdup( handle );
query_add( (irc_t *) ic->bee->ui_data, ic, s,
- imcb_ask_auth_cb_yes, imcb_ask_auth_cb_no, data );
+ imcb_ask_auth_cb_yes, imcb_ask_auth_cb_no, g_free, data );
}
@@ -510,7 +510,7 @@ void imcb_ask_add( struct im_connection *ic, const char *handle, const char *rea
data->ic = ic;
data->handle = g_strdup( handle );
query_add( (irc_t *) ic->bee->ui_data, ic, s,
- imcb_ask_add_cb_yes, imcb_ask_add_cb_no, data );
+ imcb_ask_add_cb_yes, imcb_ask_add_cb_no, g_free, data );
}
struct bee_user *imcb_buddy_by_handle( struct im_connection *ic, const char *handle )
diff --git a/protocols/purple/purple.c b/protocols/purple/purple.c
index 2804fdf3..b8d74ba1 100644
--- a/protocols/purple/purple.c
+++ b/protocols/purple/purple.c
@@ -876,7 +876,7 @@ static void *prplcb_request_action( const char *title, const char *primary, cons
/* TODO: IRC stuff here :-( */
q = g_strdup_printf( "Request: %s\n\n%s\n\n%s", title, primary, secondary );
pqad->bee_data = query_add( local_bee->ui_data, purple_ic_by_pa( account ), q,
- prplcb_request_action_yes, prplcb_request_action_no, pqad );
+ prplcb_request_action_yes, prplcb_request_action_no, g_free, pqad );
g_free( q );
diff --git a/query.c b/query.c
index b60669f7..67382b79 100644
--- a/query.c
+++ b/query.c
@@ -30,7 +30,8 @@ static void query_display( irc_t *irc, query_t *q );
static query_t *query_default( irc_t *irc );
query_t *query_add( irc_t *irc, struct im_connection *ic, char *question,
- query_callback yes, query_callback no, void *data )
+ query_callback yes, query_callback no, query_callback free,
+ void *data )
{
query_t *q = g_new0( query_t, 1 );
@@ -38,6 +39,7 @@ query_t *query_add( irc_t *irc, struct im_connection *ic, char *question,
q->question = g_strdup( question );
q->yes = yes;
q->no = no;
+ q->free = free;
q->data = data;
if( strchr( irc->umode, 'b' ) != NULL )
@@ -93,7 +95,8 @@ void query_del( irc_t *irc, query_t *q )
}
g_free( q->question );
- if( q->data ) g_free( q->data ); /* Memory leak... */
+ if( q->free && q->data )
+ q->free( q->data );
g_free( q );
}
diff --git a/query.h b/query.h
index e0ca32ec..f0419573 100644
--- a/query.h
+++ b/query.h
@@ -32,13 +32,14 @@ typedef struct query
{
struct im_connection *ic;
char *question;
- query_callback yes, no;
+ query_callback yes, no, free;
void *data;
struct query *next;
} query_t;
query_t *query_add( irc_t *irc, struct im_connection *ic, char *question,
- query_callback yes, query_callback no, void *data );
+ query_callback yes, query_callback no, query_callback free,
+ void *data );
void query_del( irc_t *irc, query_t *q );
void query_del_by_conn( irc_t *irc, struct im_connection *ic );
void query_answer( irc_t *irc, query_t *q, int ans );