You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by mj...@apache.org on 2018/04/02 19:20:46 UTC

[13/23] guacamole-server git commit: GUACAMOLE-269: Remove all dynamic allocation and simplify implementation.

GUACAMOLE-269: Remove all dynamic allocation and simplify implementation.


Project: http://git-wip-us.apache.org/repos/asf/guacamole-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-server/commit/45b832bf
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-server/tree/45b832bf
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-server/diff/45b832bf

Branch: refs/heads/master
Commit: 45b832bfdc7ced13a8aa5a4a090a60dae818dffe
Parents: dd7522b
Author: Nick Couchman <vn...@apache.org>
Authored: Thu Mar 8 09:32:19 2018 -0500
Committer: Nick Couchman <vn...@apache.org>
Committed: Thu Mar 8 11:36:15 2018 -0500

----------------------------------------------------------------------
 src/protocols/ssh/ssh.c     | 19 +++-----
 src/protocols/ssh/ttymode.c | 68 ++++++++++------------------
 src/protocols/ssh/ttymode.h | 98 ++++++++++------------------------------
 3 files changed, 57 insertions(+), 128 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/45b832bf/src/protocols/ssh/ssh.c
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/ssh.c b/src/protocols/ssh/ssh.c
index 35d4013..9881c30 100644
--- a/src/protocols/ssh/ssh.c
+++ b/src/protocols/ssh/ssh.c
@@ -193,7 +193,8 @@ void* ssh_client_thread(void* data) {
     }
 
     /* Initialize a ttymode array */
-    guac_ssh_ttymodes* ssh_ttymodes = guac_ssh_ttymodes_init(1);
+    const int num_tty_opcodes = 1;
+    char ssh_ttymodes[(GUAC_SSH_TTY_OPCODE_SIZE * num_tty_opcodes) + 1];
 
     /* Set up screen recording, if requested */
     if (settings->recording_path != NULL) {
@@ -212,9 +213,6 @@ void* ssh_client_thread(void* data) {
             settings->resolution, settings->width, settings->height,
             settings->color_scheme, settings->backspace);
 
-    /* Add the backspace key to the ttymode array */
-    guac_ssh_ttymodes_add(ssh_ttymodes, GUAC_SSH_TTY_OP_VERASE, settings->backspace);
-
     /* Fail if terminal init failed */
     if (ssh_client->term == NULL) {
         guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR,
@@ -303,22 +301,19 @@ void* ssh_client_thread(void* data) {
 
     }
 
-    /* Get char pointer array for TTY Mode Encoding */
-    int ttymode_size = guac_ssh_ttymodes_size(ssh_ttymodes);
-    char* ttymode_array = guac_ssh_ttymodes_to_array(ssh_ttymodes, ttymode_size);
+    /* Set up the ttymode array prior to requesting the PTY */
+    if (guac_ssh_ttymodes_init(ssh_ttymodes, sizeof(ssh_ttymodes),
+            num_tty_opcodes, (guac_ssh_ttymode){ GUAC_SSH_TTY_OP_VERASE, settings->backspace}))
+        guac_client_abort(client, GUAC_PROTOCOL_STATUS_SERVER_ERROR, "Error configuring TTY mode encoding.");
 
     /* Request PTY */
     if (libssh2_channel_request_pty_ex(ssh_client->term_channel, "linux", sizeof("linux")-1,
-            ttymode_array, ttymode_size, ssh_client->term->term_width,
+            ssh_ttymodes, sizeof(ssh_ttymodes), ssh_client->term->term_width,
             ssh_client->term->term_height, 0, 0)) {
         guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR, "Unable to allocate PTY.");
         return NULL;
     }
 
-    /* We're done with TTY Mode Encoding, so free structures. */
-    free(ttymode_array);
-    free(ssh_ttymodes);
-
     /* If a command is specified, run that instead of a shell */
     if (settings->command != NULL) {
         if (libssh2_channel_exec(ssh_client->term_channel, settings->command)) {

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/45b832bf/src/protocols/ssh/ttymode.c
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/ttymode.c b/src/protocols/ssh/ttymode.c
index 1541da6..4c6091e 100644
--- a/src/protocols/ssh/ttymode.c
+++ b/src/protocols/ssh/ttymode.c
@@ -20,58 +20,40 @@
 #include "config.h"
 #include "ttymode.h"
 
+#include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 
-guac_ssh_ttymodes* guac_ssh_ttymodes_init(int max_opcodes) {
-    /* Allocate enough space for the max opcodes */
-    guac_ssh_ttymode* ttymode_array = malloc(sizeof(guac_ssh_ttymode) * max_opcodes);
-    
-    /* Set up the initial data structure. */
-    guac_ssh_ttymodes* empty_modes = malloc(sizeof(guac_ssh_ttymodes));
-    empty_modes->ttymode_array = ttymode_array;
-    empty_modes->num_opcodes = 0;
+int guac_ssh_ttymodes_init(char opcode_array[], const int array_size,
+        const int num_opcodes, ...) {
 
-    return empty_modes;
-}
-
-void guac_ssh_ttymodes_add(guac_ssh_ttymodes *tty_modes, char opcode, uint32_t value) {
-    /* Increment number of opcodes */
-    tty_modes->num_opcodes++;
+    /* Initialize the variable argument list. */
+    va_list args;
+    va_start(args, num_opcodes);
 
-    /* Add new values */
-    tty_modes->ttymode_array[tty_modes->num_opcodes - 1].opcode = opcode;
-    tty_modes->ttymode_array[tty_modes->num_opcodes - 1].value = value;
-}
+    /* Check to make sure the array has enough space.
+       We need one extra byte at the end for the ending opcode. */
+    if ((num_opcodes * GUAC_SSH_TTY_OPCODE_SIZE) >= (array_size))
+        return 1;
 
-int guac_ssh_ttymodes_size(guac_ssh_ttymodes *tty_modes) {
-    /* Each opcode pair is 5 bytes (1 opcode, 4 value)
-       Add one for the ending opcode */
-    return (tty_modes->num_opcodes * 5) + 1;
-}
+    for (int i = 0; i < num_opcodes; i++) {
+        /* Calculate offset in array */
+        int offset = i * GUAC_SSH_TTY_OPCODE_SIZE;
 
-char* guac_ssh_ttymodes_to_array(guac_ssh_ttymodes *tty_modes, int data_size) {
- 
-    char* temp = malloc(data_size);
+        /* Get the next argument to this function */
+        guac_ssh_ttymode ttymode = va_arg(args, guac_ssh_ttymode);
 
-    /* Loop through the array based on number of tracked
-       opcodes and convert each one. */
-    for (int i = 0; i < tty_modes->num_opcodes; i++) {
-        int idx = i * 5;
-        uint32_t value = tty_modes->ttymode_array[i].value;
+        /* Place opcode and value in array */
+        opcode_array[offset] = ttymode.opcode;
+        opcode_array[offset + 1] = (ttymode.value >> 24) & 0xFF;
+        opcode_array[offset + 2] = (ttymode.value >> 16) & 0xFF;
+        opcode_array[offset + 3] = (ttymode.value >> 8) & 0xFF;
+        opcode_array[offset + 4] = ttymode.value & 0xFF;
+    }
 
-        /* Opcode goes in first byte. */
-        temp[idx] = tty_modes->ttymode_array[i].opcode;
+    /* Put the end opcode in the last opcode space */
+    opcode_array[num_opcodes * GUAC_SSH_TTY_OPCODE_SIZE] = GUAC_SSH_TTY_OP_END;
 
-        /* Convert 32-bit int to individual bytes. */
-        temp[idx+1] = (value >> 24) & 0xFF;
-        temp[idx+2] = (value >> 16) & 0xFF;
-        temp[idx+3] = (value >> 8) & 0xFF;
-        temp[idx+4] = value & 0xFF;
-    }
-    
-    /* Add the ending opcode */
-    temp[data_size - 1] = GUAC_SSH_TTY_OP_END;
+    return 0;
 
-    return temp;
 }

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/45b832bf/src/protocols/ssh/ttymode.h
----------------------------------------------------------------------
diff --git a/src/protocols/ssh/ttymode.h b/src/protocols/ssh/ttymode.h
index 30f36e6..be40b84 100644
--- a/src/protocols/ssh/ttymode.h
+++ b/src/protocols/ssh/ttymode.h
@@ -25,21 +25,29 @@
 #include <stdint.h>
 
 /**
+ * The size of a TTY mode encoding opcode and
+ * value pair.  As defined in the SSH RFC, this
+ * is 5 bytes - a single byte for the opcode, and
+ * 4 bytes for the value.
+ */
+#define GUAC_SSH_TTY_OPCODE_SIZE 5
+
+/**
  * The SSH TTY mode encoding opcode that terminates
  * the list of TTY modes.
  */
 #define GUAC_SSH_TTY_OP_END 0
 
 /**
- * The SSH tty mode encoding opcode that configures
+ * The SSH TTY mode encoding opcode that configures
  * the TTY erase code to configure the server
  * backspace key.
  */
 #define GUAC_SSH_TTY_OP_VERASE 3
 
 /**
- * A data type which holds a single opcode
- * and the value for that opcode.
+ * Simple structure that defines a opcode and
+ * value pair.
  */
 typedef struct guac_ssh_ttymode {
     char opcode;
@@ -47,82 +55,26 @@ typedef struct guac_ssh_ttymode {
 } guac_ssh_ttymode;
 
 /**
- * A data type which holds an array of 
- * guac_ssh_ttymode data, along with the count of
- * the number of opcodes currently in the array.
- */
-typedef struct guac_ssh_ttymodes {
-    guac_ssh_ttymode* ttymode_array;
-    int num_opcodes;
-} guac_ssh_ttymodes;
-
-
-/**
- * Initialize an empty guac_ssh_ttymodes data structure,
- * with a null array of guac_ssh_ttymode and opcodes
- * set to zero.
+ * Initialize an array with the specified opcode/value
+ * pairs, and return the size, in bytes, of the array.
  *
- * @param max_opcodes
- *     The maximum number of opcodes that will be allocated.
+ * @param opcode_array
+ *     Pointer to the opcode array.
  *
- * @return
- *     The pointer array for the gauc_ssh_ttymodes data
- *     structure generated by the function.
- */
-guac_ssh_ttymodes* guac_ssh_ttymodes_init(int max_opcodes);
-
-/**
- * Add an item to the opcode array.  This resizes the
- * array, increments the number of opcodes, and adds
- * the specified opcode and value pair to the data
- * structure.
- *
- * @param tty_modes
- *     The pointer to the guac_ssh_ttymodes data structure
- *     to add the opcode to.
- * 
- * @param opcode
- *     The single byte opcode as documented in section 8
- *     of the SSH RFC.
- *
- * @param value
- *     The four byte value of the opcodeto add to the
- *     guac_ssh_ttymodes data structure.     
- */
-void guac_ssh_ttymodes_add(guac_ssh_ttymodes *tty_modes, char opcode, uint32_t value);
-
-/**
- * Retrieve the size, in bytes, of the ttymode_array
- * in the given guac_ssh_ttymodes data structure.
- * 
- * @param tty_modes
- *     The pointer to the guac_ssh_ttymodes structure
- *     whose size we are curious about.
- *
- * @return
- *     The number of bytes of the opcodes and value paris
- *     in the data structure.
- */
-int guac_ssh_ttymodes_size(guac_ssh_ttymodes *tty_modes);
-
-/**
- * Convert the ttymodes data structure into a char
- * pointer array suitable for passing into the
- * libssh2_channel_request_pty_ex() function.
+ * @param array_size
+ *     Size, in bytes, of the array.
  *
- * @param tty_modes
- *     The pointer to the guac_ssh_ttymodes structure
- *     that contains the opcode and value pairs
- *     we want to convert to a character pointer array.
+ * @param num_opcodes
+ *     Number of opcodes to expect.
  *
- * @param data_size
- *     The size of the resulting character pointer
- *     array.
+ * @params ...
+ *     A variable number of guac_ssh_ttymodes
+ *     to place in the array.
  *
  * @return
- *     The character pointer array of opcode and
- *     value pairs to be passed to a SSH session.
+ *     The size, in bytes, of the array.
  */
-char* guac_ssh_ttymodes_to_array(guac_ssh_ttymodes *tty_modes, int data_size);
+int guac_ssh_ttymodes_init(char opcode_array[], const int array_size,
+        const int num_opcodes, ...);
 
 #endif