Skip to content

Commit e96fda7

Browse files
committed
reject an empty option name in getMatchingOptions
An empty name after hyphen stripping matched every long option, so the token "--=value" bound the value to a long option that was never named.
1 parent afb0fd1 commit e96fda7

2 files changed

Lines changed: 17 additions & 0 deletions

File tree

src/main/java/org/apache/commons/cli/Options.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ public Options addRequiredOption(final String opt, final String longOpt, final b
219219
public List<String> getMatchingOptions(final String opt) {
220220
final String clean = Util.stripLeadingHyphens(opt);
221221
final List<String> matchingOpts = new ArrayList<>();
222+
// an empty name is not a partial name, it would match every long option
223+
if (Util.isEmpty(clean)) {
224+
return matchingOpts;
225+
}
222226
// for a perfect match return the single option only
223227
if (longOpts.containsKey(clean)) {
224228
return Collections.singletonList(clean);

src/test/java/org/apache/commons/cli/OptionsTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,19 @@ void testGetMatchingOpts() {
182182
assertToStrings(options.getOption("verbose"));
183183
}
184184

185+
@Test
186+
void testGetMatchingOptsEmptyName() throws Exception {
187+
final Options options = new Options();
188+
options.addOption(Option.builder("c").longOpt("config-file").hasArg().get());
189+
assertTrue(options.getMatchingOptions("").isEmpty());
190+
assertTrue(options.getMatchingOptions("-").isEmpty());
191+
assertTrue(options.getMatchingOptions("--").isEmpty());
192+
// "--=value" names no option, so it must not bind a value to config-file
193+
for (final CommandLineParser parser : new CommandLineParser[] { new DefaultParser(), new PosixParser() }) {
194+
assertThrows(UnrecognizedOptionException.class, () -> parser.parse(options, new String[] { "--=/etc/shadow" }));
195+
}
196+
}
197+
185198
@Test
186199
void testGetOptionsGroups() {
187200
final Options options = new Options();

0 commit comments

Comments
 (0)