summaryrefslogtreecommitdiff
path: root/src/irc/core/sasl.c
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2017-01-24 22:19:50 +0100
committerLemonBoy <thatlemon@gmail.com>2017-01-24 22:19:50 +0100
commit19c51789967a2f63da033e60f6ef08848b9cd144 (patch)
treec8f1d3fc9a7164568e3cdeb7df39726debade583 /src/irc/core/sasl.c
parent228f487a69cc032b368a0ae0daea6796b7d10d6e (diff)
downloadirssi-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.
Diffstat (limited to 'src/irc/core/sasl.c')
-rw-r--r--src/irc/core/sasl.c14
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);