diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/cli/cli-cmds.c | 25 | ||||
-rw-r--r-- | gdb/cli/cli-decode.c | 15 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/alias.exp | 6 |
5 files changed, 51 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 30500f4..e5708da 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be> + * cli/cli-cmds.c (alias_command): Check for an existing alias + using lookup_cmd_composition, as valid_command_p is too strict + and forbids aliases that are the prefix of an existing alias + or command. + * cli/cli-decode.c (lookup_cmd_composition): Ensure a prefix + command is properly recognised as a valid command. + +2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be> + * unittests/help-doc-selftests.c: Rename to unittests/command-def-selftests.c * unittests/command-def-selftests.c (help_doc_tests): Update some diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index c17521b..8538fad 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -1694,8 +1694,29 @@ alias_command (const char *args, int from_tty) /* ALIAS must not exist. */ std::string alias_string (argv_to_string (alias_argv, alias_argc)); alias = alias_string.c_str (); - if (valid_command_p (alias)) - error (_("Alias already exists: %s"), alias); + { + cmd_list_element *alias_cmd, *prefix_cmd, *cmd; + + if (lookup_cmd_composition (alias, &alias_cmd, &prefix_cmd, &cmd)) + { + const char *alias_name = alias_argv[alias_argc-1]; + + /* If we found an existing ALIAS_CMD, check that the prefix differ or + the name differ. */ + + if (alias_cmd != nullptr + && alias_cmd->prefix == prefix_cmd + && strcmp (alias_name, alias_cmd->name) == 0) + error (_("Alias already exists: %s"), alias); + + /* Check ALIAS differs from the found CMD. */ + + if (cmd->prefix == prefix_cmd + && strcmp (alias_name, cmd->name) == 0) + error (_("Alias %s is the name of an existing command"), alias); + } + } + /* If ALIAS is one word, it is an alias for the entire COMMAND. Example: alias spe = set print elements diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index d951ead..78b8901 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -1843,6 +1843,8 @@ lookup_cmd_composition (const char *text, cur_list = cmdlist; + text = skip_spaces (text); + while (1) { /* Go through as many command lists as we need to, @@ -1850,9 +1852,6 @@ lookup_cmd_composition (const char *text, prev_cmd = *cmd; - while (*text == ' ' || *text == '\t') - (text)++; - /* Identify the name of the command. */ len = find_command_name_length (text); @@ -1861,7 +1860,7 @@ lookup_cmd_composition (const char *text, return 0; /* TEXT is the start of the first command word to lookup (and - it's length is len). We copy this into a local temporary. */ + it's length is LEN). We copy this into a local temporary. */ command = (char *) alloca (len + 1); memcpy (command, text, len); @@ -1890,12 +1889,14 @@ lookup_cmd_composition (const char *text, } *prefix_cmd = prev_cmd; } - if ((*cmd)->prefixlist) + + text += len; + text = skip_spaces (text); + + if ((*cmd)->prefixlist && *text != '\0') cur_list = *(*cmd)->prefixlist; else return 1; - - text += len; } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index dda5b68..820af44 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-15 Philippe Waroquiers <philippe.waroquiers@skynet.be> + + * gdb.base/alias.exp: Test aliases starting with a prefix of + another alias. + 2020-05-15 Gary Benson <gbenson@redhat.com> * gdb.base/info-os.c (main): Add return statement. diff --git a/gdb/testsuite/gdb.base/alias.exp b/gdb/testsuite/gdb.base/alias.exp index be78d9e..9a95576 100644 --- a/gdb/testsuite/gdb.base/alias.exp +++ b/gdb/testsuite/gdb.base/alias.exp @@ -116,3 +116,9 @@ gdb_test "show print elements" "Limit .* is 56\[.\]" "verify 56" gdb_test_no_output "set print max-elements 57" gdb_test "show print elements" "Limit .* is 57\[.\]" "verify 57" + +# Test aliases having a common prefix. +gdb_test_no_output "alias abcd = backtrace" +gdb_test_no_output "alias abcde = backtrace" +gdb_test_no_output "alias fghij = backtrace" +gdb_test_no_output "alias fghi = backtrace" |