gdb/tui: avoid theoretical bug with 'tui reg' command
authorAndrew Burgess <aburgess@redhat.com>
Thu, 31 Mar 2022 13:44:25 +0000 (14:44 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Thu, 7 Apr 2022 15:01:18 +0000 (16:01 +0100)
While looking at the 'tui reg' command as part of another patch, I
spotted a theoretical bug.

The 'tui reg' command takes the name of a register group, but also
handles partial register group matches, though the partial match has to
be unique.  The current command logic goes:

With the code as currently written, if a target description named a
register group either 'prev' or 'next' then GDB would see this as an
ambiguous register name, and refuse to switch groups.

Naming a register group 'prev' or 'next' seems pretty unlikely, but,
by adding a single else block we can prevent this problem.

Now, if there's a 'prev' or 'next' register group, the user will not
be able to select the group directly, the 'prev' and 'next' names will
always iterate through the available groups instead.  But at least the
user could select their groups by iteration, rather than direct
selection.

gdb/tui/tui-regs.c

index 5c6189a59b1703b5e85ac2aa6f767651f532b0e0..75ffa9babbf03090077eb1a2f79eef027dfcb2f2 100644 (file)
@@ -580,19 +580,21 @@ tui_reg_command (const char *args, int from_tty)
        match = tui_reg_next (current_group, gdbarch);
       else if (strncmp (args, "prev", len) == 0)
        match = tui_reg_prev (current_group, gdbarch);
-
-      /* This loop matches on the initial part of a register group
-        name.  If this initial part in ARGS matches only one register
-        group then the switch is made.  */
-      for (group = reggroup_next (gdbarch, NULL);
-          group != NULL;
-          group = reggroup_next (gdbarch, group))
+      else
        {
-         if (strncmp (reggroup_name (group), args, len) == 0)
+         /* This loop matches on the initial part of a register group
+            name.  If this initial part in ARGS matches only one register
+            group then the switch is made.  */
+         for (group = reggroup_next (gdbarch, NULL);
+              group != NULL;
+              group = reggroup_next (gdbarch, group))
            {
-             if (match != NULL)
-               error (_("ambiguous register group name '%s'"), args);
-             match = group;
+             if (strncmp (reggroup_name (group), args, len) == 0)
+               {
+                 if (match != NULL)
+                   error (_("ambiguous register group name '%s'"), args);
+                 match = group;
+               }
            }
        }