[balsa] Use existing buffers for base-64 conversions



commit 3284432081262fe443b6ebda8cab0e1dd2f16a2d
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Wed Apr 12 22:35:45 2017 -0400

    Use existing buffers for base-64 conversions
    
        * libbalsa/imap/auth-gssapi.c (ag_get_token), (ag_parse_request),
        (ag_negotiate_parameters): use existing buffers for base-64
        conversions.

 ChangeLog                   |    6 ++++++
 libbalsa/imap/auth-gssapi.c |   34 ++++++++++++++++++++--------------
 2 files changed, 26 insertions(+), 14 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index a61004d..d4eb5d1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-04-12  Peter Bloomfield  <pbloomfield bellsouth net>
+
+       * libbalsa/imap/auth-gssapi.c (ag_get_token), (ag_parse_request),
+       (ag_negotiate_parameters): use existing buffers for base-64
+       conversions.
+
 2017-04-09  Albrecht Dreß
 
        * libbalsa/mailbox_pop3.c (libbalsa_mailbox_pop3_check): do not
diff --git a/libbalsa/imap/auth-gssapi.c b/libbalsa/imap/auth-gssapi.c
index 7da29b3..480223c 100644
--- a/libbalsa/imap/auth-gssapi.c
+++ b/libbalsa/imap/auth-gssapi.c
@@ -218,8 +218,10 @@ ag_get_token(gss_ctx_id_t *context, gss_name_t target, gss_buffer_t sec_token,
     OM_uint32 state, min_stat;
     gss_buffer_desc send_token;
     unsigned cflags;
-    gchar *b64buf;
-    
+    gint outlen;
+    gint b64state = 0;
+    gint b64save = 0;
+
     *client_token = '\0';
     state = gss_init_sec_context
         (&min_stat, GSS_C_NO_CREDENTIAL, context,
@@ -230,9 +232,9 @@ ag_get_token(gss_ctx_id_t *context, gss_name_t target, gss_buffer_t sec_token,
     if (state != GSS_S_COMPLETE && state != GSS_S_CONTINUE_NEEDED)
         return state;
 
-    b64buf = g_base64_encode(send_token.value, send_token.length);
-    strncpy(client_token, b64buf, (size_t) token_sz);
-    g_free(b64buf);
+    outlen = g_base64_encode_step(send_token.value, send_token.length, FALSE,
+                                  client_token, &b64state, &b64save);
+    outlen += g_base64_encode_close(FALSE, client_token + outlen, &b64state, &b64save);
     gss_release_buffer(&min_stat, &send_token);
     return state;
 }
@@ -242,12 +244,12 @@ ag_parse_request(ImapMboxHandle *handle, char *buf, ssize_t buf_sz,
                  gss_buffer_desc *request)
 {
     char line[LONG_STRING];
-    guchar *rawbuf;
+    gint b64state = 0;
+    guint b64save = 0;
 
     sio_gets(handle->sio, line, LONG_STRING); /* FIXME: error checking */
-    rawbuf = g_base64_decode(line, &request->length);
-    memcpy(buf, rawbuf, request->length);
-    g_free(rawbuf);
+    request->length =
+        g_base64_decode_step(line, strlen(line), (guchar *) buf, &b64state, &b64save);
     request->value = buf;
 }
 
@@ -267,7 +269,9 @@ ag_negotiate_parameters(ImapMboxHandle *handle, const char * user,
     char server_conf_flags;
     unsigned char *t;
     unsigned long buf_size;
-    gchar *b64buf;
+    gint outlen;
+    gint b64state = 0;
+    gint b64save = 0;
 
     ag_parse_request(handle, buf, sizeof(buf), &request_buf);
     state = gss_unwrap(&min_stat, context, &request_buf, &send_token,
@@ -314,10 +318,12 @@ ag_negotiate_parameters(ImapMboxHandle *handle, const char * user,
         return FALSE;
     }
     
-    b64buf = g_base64_encode(send_token.value, send_token.length);
-    sio_printf(handle->sio, "%s\r\n", b64buf); imap_handle_flush(handle);
-    g_free(b64buf);
-    
+    outlen = g_base64_encode_step(send_token.value,
+                                  MIN(send_token.length, ((sizeof buf - 1) / 4 - 1) * 3),
+                                  FALSE, buf, &b64state, &b64save);
+    outlen += g_base64_encode_close(FALSE, buf + outlen, &b64state, &b64save);
+    buf[outlen] = '\0';
+    sio_printf(handle->sio, "%s\r\n", buf); imap_handle_flush(handle);
     WAIT_FOR_PROMPT(*rc,handle,cmdno,buf,sizeof(buf));
     if (*rc == IMR_RESPOND)
         return FALSE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]