diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 30500f4a74..e5708da7d4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2020-05-15 Philippe Waroquiers + + * 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 * unittests/help-doc-selftests.c: Rename to diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index c17521b1f6..8538fadd9c 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 d951ead1c9..78b8901084 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 dda5b68473..820af44416 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-15 Philippe Waroquiers + + * gdb.base/alias.exp: Test aliases starting with a prefix of + another alias. + 2020-05-15 Gary Benson * 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 be78d9e936..9a9557668e 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"