len = (connection->bufsize < bufsize) ? connection->bufsize : bufsize;
       memcpy(buf, connection->buffer, len);
-      connection->bufsize -= len;
-      if (connection->bufsize > 0) {
-        for (i = 0; i < sizeof(connection->buffer) - len; i++)
+      if (connection->bufsize - len == 0) {
+        free(connection->buffer);
+        connection->buffer = NULL;
+      } else {
+        for (i = 0; i < connection->bufsize - len; i++)
            connection->buffer[i] = connection->buffer[i+len];
       }
+      connection->bufsize -= len;
 
       return len;
    }
    } while (maj_stat == 0 && output_token.length == 0 && output_token.value == NULL);
 
    if (output_token.length > bufsize) {
-      if (output_token.length - bufsize > sizeof(connection->buffer))
-        return EINVAL;
       connection->bufsize = output_token.length - bufsize;
+      connection->buffer = malloc(connection->bufsize);
+      if (connection->buffer == NULL) {
+        connection->bufsize = 0;
+        ret = EDG_WLL_GSS_ERROR_ERRNO;
+        goto end;
+      }
       memcpy(connection->buffer, output_token.value + bufsize, connection->bufsize);
       output_token.length = bufsize;
    }
-   memcpy(buf, output_token.value, output_token.length);
 
+   memcpy(buf, output_token.value, output_token.length);
    ret = output_token.length;
+
+end:
    gss_release_buffer(&min_stat, &output_token);
 
    return ret;
    if (connection->bufsize > 0) {
       size_t len;
 
-
       len = (connection->bufsize < bufsize) ? connection->bufsize : bufsize;
       memcpy(buf, connection->buffer, len);
-      connection->bufsize -= len;
-      if (connection->bufsize > 0) {
-         for (i = 0; i < sizeof(connection->buffer) - len; i++)
+      if (connection->bufsize - len == 0) {
+        free(connection->buffer);
+        connection->buffer = NULL;
+      } else {
+         for (i = 0; i < connection->bufsize - len; i++)
             connection->buffer[i] = connection->buffer[i+len];
       }
+      connection->bufsize -= len;
       *total = len;
    }
 
       if (con->sock >= 0)
         close(con->sock);
    }
+   if (con->buffer)
+      free(con->buffer);
    memset(con, 0, sizeof(*con));
    con->context = GSS_C_NO_CONTEXT;
    con->sock = -1;