From 5a1531fff6687c4982a206bc4d09f881bfbf4520 Mon Sep 17 00:00:00 2001 From: Akira Ajisaka Date: Wed, 18 Feb 2015 11:17:10 -0800 Subject: [PATCH] HADOOP-11545. ArrayIndexOutOfBoundsException is thrown with "hadoop credential list -provider". Contributed by Brahma Reddy Battula. (cherry picked from commit 17146099197000d85b3aedc84a672111f2c7908a) --- .../hadoop-common/CHANGES.txt | 3 +++ .../security/alias/CredentialShell.java | 19 ++++++++++++++++--- .../hadoop/security/alias/TestCredShell.java | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 6f03cc7b4d1..a73a3e90924 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -556,6 +556,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 9311a2d2b50..7a632c17ff9 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 @@ public class CredentialShell extends Configured implements Tool { 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 @@ public class CredentialShell extends Configured implements Tool { 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 @@ public class CredentialShell extends Configured implements Tool { } 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 @@ public class CredentialShell extends Configured implements Tool { } 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 class CredentialShell extends Configured implements Tool { 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 class CredentialShell extends Configured implements Tool { } 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 7ba4bc17e29..7551df67116 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 class TestCredShell { 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 })); + } + + } }