1
0
mirror of https://github.com/irssi/irssi.git synced 2025-02-02 15:08:01 -05:00

Fix memleak in dcc get, by Toby Peterson (Bug 214)

git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3716 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
Wouter Coekaerts 2005-03-06 18:47:05 +00:00 committed by coekie
parent bd8712dde1
commit e159d8b2f0

View File

@ -375,6 +375,22 @@ int get_file_params_count(char **params, int paramcount)
return best; return best;
} }
char *get_file_name(char **params, int fileparams)
{
GString *out = g_string_new(params[0]);
char *ret;
int pos;
for (pos = 1; pos < fileparams; pos++) {
out = g_string_append(out, " ");
out = g_string_append(out, params[pos]);
}
ret = out->str;
g_string_free(out, FALSE);
return ret;
}
/* CTCP: DCC SEND */ /* CTCP: DCC SEND */
static void ctcp_msg_dcc_send(IRC_SERVER_REC *server, const char *data, static void ctcp_msg_dcc_send(IRC_SERVER_REC *server, const char *data,
const char *nick, const char *addr, const char *nick, const char *addr,
@ -405,7 +421,7 @@ static void ctcp_msg_dcc_send(IRC_SERVER_REC *server, const char *data,
fileparams = get_file_params_count(params, paramcount); fileparams = get_file_params_count(params, paramcount);
address = params[fileparams]; address = g_strdup(params[fileparams]);
dcc_str2ip(address, &ip); dcc_str2ip(address, &ip);
port = atoi(params[fileparams+1]); port = atoi(params[fileparams+1]);
size = str_to_uofft(params[fileparams+2]); size = str_to_uofft(params[fileparams+2]);
@ -416,8 +432,7 @@ static void ctcp_msg_dcc_send(IRC_SERVER_REC *server, const char *data,
passive = TRUE; passive = TRUE;
} }
params[fileparams] = NULL; fname = get_file_name(params, fileparams);
fname = g_strjoinv(" ", params);
g_strfreev(params); g_strfreev(params);
len = strlen(fname); len = strlen(fname);
@ -452,12 +467,14 @@ static void ctcp_msg_dcc_send(IRC_SERVER_REC *server, const char *data,
/* This new signal is added to let us invoke /* This new signal is added to let us invoke
dcc_send_connect() which is found in dcc-send.c */ dcc_send_connect() which is found in dcc-send.c */
signal_emit("dcc reply send pasv", 1, temp_dcc); signal_emit("dcc reply send pasv", 1, temp_dcc);
g_free(address);
g_free(fname); g_free(fname);
return; return;
} else if (temp_dcc != NULL && p_id != temp_dcc->pasv_id) { } else if (temp_dcc != NULL && p_id != temp_dcc->pasv_id) {
/* IDs don't match... remove the old DCC SEND and /* IDs don't match... remove the old DCC SEND and
return */ return */
dcc_destroy(DCC(temp_dcc)); dcc_destroy(DCC(temp_dcc));
g_free(address);
g_free(fname); g_free(fname);
return; return;
} }
@ -486,6 +503,7 @@ static void ctcp_msg_dcc_send(IRC_SERVER_REC *server, const char *data,
signal_emit("dcc request", 2, dcc, addr); signal_emit("dcc request", 2, dcc, addr);
g_free(address);
g_free(fname); g_free(fname);
} }