diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-11 11:30:27 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-11 11:30:27 +0100 | 
| commit | 1e52e1ff518987092cfe94bc5c9c4479ed535019 (patch) | |
| tree | 59a0f7c6725f37703797b8825058356ec6bf1f27 | |
| parent | e92c4f4f63ca0ba9ac6f959f7ff894ad2fc72a04 (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.c | 2 | ||||
| -rw-r--r-- | protocols/nogaim.c | 6 | ||||
| -rw-r--r-- | protocols/purple/purple.c | 2 | ||||
| -rw-r--r-- | query.c | 7 | ||||
| -rw-r--r-- | query.h | 5 | 
5 files changed, 13 insertions, 9 deletions
| @@ -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 ); @@ -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 );  } @@ -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 ); | 
