diff options
author | LemonBoy <thatlemon@gmail.com> | 2017-01-24 22:19:50 +0100 |
---|---|---|
committer | LemonBoy <thatlemon@gmail.com> | 2017-01-24 22:19:50 +0100 |
commit | 19c51789967a2f63da033e60f6ef08848b9cd144 (patch) | |
tree | c8f1d3fc9a7164568e3cdeb7df39726debade583 | |
parent | 228f487a69cc032b368a0ae0daea6796b7d10d6e (diff) | |
download | irssi-19c51789967a2f63da033e60f6ef08848b9cd144.zip |
Prevent a memory leak during the processing of the SASL response.
We also get rid of an allocation in the process of doing so.
-rw-r--r-- | src/irc/core/sasl.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/irc/core/sasl.c b/src/irc/core/sasl.c index 1021bea4..635b7dfb 100644 --- a/src/irc/core/sasl.c +++ b/src/irc/core/sasl.c @@ -174,10 +174,16 @@ static gboolean sasl_reassemble_incoming(IRC_SERVER_REC *server, const char *fra *decoded = g_string_new_len("", 0); } else { gsize dec_len; - gchar *tmp; - - tmp = (gchar *) g_base64_decode(enc_req->str, &dec_len); - *decoded = g_string_new_len(tmp, dec_len); + gint state = 0; + guint save = 0; + + /* Since we're not going to use the enc_req GString anymore we + * can perform the decoding in place. */ + dec_len = g_base64_decode_step(enc_req->str, enc_req->len, + (guchar *)enc_req->str, + &state, &save); + /* A copy of the data is made when the GString is created. */ + *decoded = g_string_new_len(enc_req->str, dec_len); } g_string_free(enc_req, TRUE); |