2004-02-25 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Wed, 25 Feb 2004 15:57:42 +0000 (15:57 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 25 Feb 2004 15:57:42 +0000 (15:57 +0000)
PR cli/1566.  Problem found, and fix suggested by David Allan.
* cli/cli-script.c (execute_control_command): Unconditionally
install a cleanup.  Default "ret" to "invalid_control".  Use
"break" instead of "return" to escape from the switch.

gdb/ChangeLog
gdb/cli/cli-script.c

index 0b8330d..cf3a316 100644 (file)
@@ -1,3 +1,10 @@
+2004-02-25  Andrew Cagney  <cagney@redhat.com>
+
+       PR cli/1566.  Problem found, and fix suggested by David Allan. 
+       * cli/cli-script.c (execute_control_command): Unconditionally
+       install a cleanup.  Default "ret" to "invalid_control".  Use
+       "break" instead of "return" to escape from the switch.
+
 2004-02-24  J. Brobecker  <brobecker@gnat.com>
 
        * tui/tui-disasm.c: %s/lines/asm_lines/g to avoid a collision
index a8375a3..ca0c14f 100644 (file)
@@ -294,21 +294,25 @@ execute_control_command (struct command_line *cmd)
 {
   struct expression *expr;
   struct command_line *current;
-  struct cleanup *old_chain = 0;
+  struct cleanup *old_chain = make_cleanup (null_cleanup, 0);
   struct value *val;
   struct value *val_mark;
   int loop;
   enum command_control_type ret;
   char *new_line;
 
+  /* Start by assuming failure, if a problem is detected, the code
+     below will simply "break" out of the switch.  */
+  ret = invalid_control;
+
   switch (cmd->control_type)
     {
     case simple_control:
       /* A simple command, execute it and return.  */
       new_line = insert_args (cmd->line);
       if (!new_line)
-       return invalid_control;
-      old_chain = make_cleanup (free_current_contents, &new_line);
+       break;
+      make_cleanup (free_current_contents, &new_line);
       execute_command (new_line, 0);
       ret = cmd->control_type;
       break;
@@ -325,8 +329,8 @@ execute_control_command (struct command_line *cmd)
        /* Parse the loop control expression for the while statement.  */
        new_line = insert_args (cmd->line);
        if (!new_line)
-         return invalid_control;
-       old_chain = make_cleanup (free_current_contents, &new_line);
+         break;
+       make_cleanup (free_current_contents, &new_line);
        expr = parse_expression (new_line);
        make_cleanup (free_current_contents, &expr);
 
@@ -385,8 +389,8 @@ execute_control_command (struct command_line *cmd)
       {
        new_line = insert_args (cmd->line);
        if (!new_line)
-         return invalid_control;
-       old_chain = make_cleanup (free_current_contents, &new_line);
+         break;
+       make_cleanup (free_current_contents, &new_line);
        /* Parse the conditional for the if statement.  */
        expr = parse_expression (new_line);
        make_cleanup (free_current_contents, &expr);
@@ -424,11 +428,10 @@ execute_control_command (struct command_line *cmd)
 
     default:
       warning ("Invalid control type in command structure.");
-      return invalid_control;
+      break;
     }
 
-  if (old_chain)
-    do_cleanups (old_chain);
+  do_cleanups (old_chain);
 
   return ret;
 }