diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index f248555b0a..92bd48d833 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -962,6 +962,9 @@ Release 2.7.0 - UNRELEASED HADOOP-11599. Client#getTimeout should use IPC_CLIENT_PING_DEFAULT when IPC_CLIENT_PING_KEY is not configured. (zhihai xu via ozawa) + HADOOP-11545. ArrayIndexOutOfBoundsException is thrown with "hadoop + credential list -provider". (Brahma Reddy Battula via aajisaka) + Release 2.6.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialShell.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialShell.java index f39740309e..e8a721f65b 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialShell.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/alias/CredentialShell.java @@ -97,6 +97,10 @@ protected int init(String[] args) throws IOException { for (int i = 0; i < args.length; i++) { // parse command line if (args[i].equals("create")) { + if (i == args.length - 1) { + printCredShellUsage(); + return 1; + } String alias = args[++i]; command = new CreateCommand(alias); if (alias.equals("-help")) { @@ -104,6 +108,10 @@ protected int init(String[] args) throws IOException { return 0; } } else if (args[i].equals("delete")) { + if (i == args.length - 1) { + printCredShellUsage(); + return 1; + } String alias = args[++i]; command = new DeleteCommand(alias); if (alias.equals("-help")) { @@ -113,6 +121,10 @@ protected int init(String[] args) throws IOException { } else if (args[i].equals("list")) { command = new ListCommand(); } else if (args[i].equals("-provider")) { + if (i == args.length - 1) { + printCredShellUsage(); + return 1; + } userSuppliedProvider = true; getConf().set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH, args[++i]); @@ -195,7 +207,7 @@ protected void warnIfTransientProvider() { } private class ListCommand extends Command { - public static final String USAGE = "list [-provider] [-help]"; + public static final String USAGE = "list [-provider provider-path]"; public static final String DESC = "The list subcommand displays the aliases contained within \n" + "a particular provider - as configured in core-site.xml or " + @@ -237,7 +249,7 @@ public String getUsage() { private class DeleteCommand extends Command { public static final String USAGE = - "delete [-provider] [-f] [-help]"; + "delete [-f] [-provider provider-path]"; public static final String DESC = "The delete subcommand deletes the credential\n" + "specified as the argument from within the provider\n" + @@ -308,7 +320,8 @@ public String getUsage() { } private class CreateCommand extends Command { - public static final String USAGE = "create [-provider] [-help]"; + public static final String USAGE = + "create [-provider provider-path]"; public static final String DESC = "The create subcommand creates a new credential for the name specified\n" + "as the argument within the provider indicated through\n" + diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/alias/TestCredShell.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/alias/TestCredShell.java index 7ba4bc17e2..7551df6711 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/alias/TestCredShell.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/security/alias/TestCredShell.java @@ -212,4 +212,19 @@ public void testCommandHelpExitsNormally() throws Exception { 0, shell.init(new String[] {cmd, "-help"})); } } + + @Test + public void testEmptyArgForCommands() throws Exception { + CredentialShell shell = new CredentialShell(); + String[] command = { "list", "-provider" }; + assertEquals("Expected empty argument on " + command + " to return 1", 1, + shell.init(command)); + + for (String cmd : Arrays.asList("create", "delete")) { + shell.setConf(new Configuration()); + assertEquals("Expected empty argument on " + cmd + " to return 1", 1, + shell.init(new String[] { cmd })); + } + + } }