Fix memory leak and compilation problems using AIX 5 native compiler.
authorKevin Buettner <kevinb@redhat.com>
Mon, 9 Jul 2001 16:53:03 +0000 (16:53 +0000)
committerKevin Buettner <kevinb@redhat.com>
Mon, 9 Jul 2001 16:53:03 +0000 (16:53 +0000)
gdb/mi/ChangeLog
gdb/mi/mi-main.c

index 5bf43f7689896715e95532fea6f90c28615408a1..9784216d777e2db78efbab76bffb3795a91b0dff 100644 (file)
@@ -1,3 +1,12 @@
+2001-07-09  Kevin Buettner  <kevinb@redhat.com>
+
+       * mi-main.c (register_changed_p, get_register): Use alloca()
+       to allocate space previously allocated via gcc's
+       variable-length array extension.
+       (mi_cmd_data_write_register_values, mi_cmd_data_write_memory):
+       Change type of ``buffer'' to ``void *''.  Don't cast return value
+       from xmalloc().  Add a cleanup to free the xmalloc'd buffer.
+
 2001-07-07  Andrew Cagney  <ac131313@redhat.com>
 
        * mi-main.c (mi_cmd_data_evaluate_expression): Replace value_ptr
index 78b7f7c2efb9bc4f51c02f8c5b0b8bf773695836..2ac2dd143f8315c56b6b592487cd5f27a968b0c5 100644 (file)
@@ -378,7 +378,7 @@ mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
 static int
 register_changed_p (int regnum)
 {
-  char raw_buffer[MAX_REGISTER_RAW_SIZE];
+  char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
 
   if (read_relative_register_raw_bytes (regnum, raw_buffer))
     return -1;
@@ -483,8 +483,8 @@ mi_cmd_data_list_register_values (char *command, char **argv, int argc)
 static int
 get_register (int regnum, int format)
 {
-  char raw_buffer[MAX_REGISTER_RAW_SIZE];
-  char virtual_buffer[MAX_REGISTER_VIRTUAL_SIZE];
+  char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
+  char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
   int optim;
   static struct ui_stream *stb = NULL;
 
@@ -551,7 +551,6 @@ mi_cmd_data_write_register_values (char *command, char **argv, int argc)
   int regnum;
   int i;
   int numregs;
-  char *buffer;
   LONGEST value;
   char format;
 
@@ -602,14 +601,19 @@ mi_cmd_data_write_register_values (char *command, char **argv, int argc)
          && REGISTER_NAME (regnum) != NULL
          && *REGISTER_NAME (regnum) != '\000')
        {
+         void *buffer;
+         struct cleanup *old_chain;
+
          /* Get the value as a number */
          value = parse_and_eval_address (argv[i + 1]);
          /* Get the value into an array */
-         buffer = (unsigned char *) xmalloc (REGISTER_SIZE);
+         buffer = xmalloc (REGISTER_SIZE);
+         old_chain = make_cleanup (xfree, buffer);
          store_signed_integer (buffer, REGISTER_SIZE, value);
          /* Write it down */
          write_register_bytes (REGISTER_BYTE (regnum), buffer, REGISTER_RAW_SIZE (regnum));
-         /* write_register_bytes (REGISTER_BYTE (regnum), buffer, REGISTER_SIZE); */
+         /* Free the buffer.  */
+         do_cleanups (old_chain);
        }
       else
        {
@@ -973,7 +977,8 @@ mi_cmd_data_write_memory (char *command, char **argv, int argc)
   /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
      enough when using a compiler other than GCC. */
   LONGEST value;
-  unsigned char *buffer;
+  void *buffer;
+  struct cleanup *old_chain;
   long offset = 0;
   int optind = 0;
   char *optarg;
@@ -1025,10 +1030,13 @@ mi_cmd_data_write_memory (char *command, char **argv, int argc)
   /* Get the value as a number */
   value = parse_and_eval_address (argv[3]);
   /* Get the value into an array */
-  buffer = (unsigned char *) xmalloc (word_size);
+  buffer = xmalloc (word_size);
+  old_chain = make_cleanup (xfree, buffer);
   store_signed_integer (buffer, word_size, value);
   /* Write it down to memory */
   write_memory (addr, buffer, word_size);
+  /* Free the buffer.  */
+  do_cleanups (old_chain);
 
   return MI_CMD_DONE;
 }