diff --git a/ChangeLog b/ChangeLog index ba03fe8..5fd1ce6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024-02-01 M Holger + + * Bug fix: in qpdf CLI / QPDFJob throw a QPDFUsage exception if a + parameter is given for a flag. Previously the parameter was ignored and + e.g. --encrypt=n was treated as --encrypt. Fixes #1329. + 2024-09-20 Chao Li * Add C API function qpdf_oh_free_buffer to release memory allocated diff --git a/libqpdf/QPDFArgParser.cc b/libqpdf/QPDFArgParser.cc index 5377b2b..fc8f2ef 100644 --- a/libqpdf/QPDFArgParser.cc +++ b/libqpdf/QPDFArgParser.cc @@ -9,6 +9,8 @@ #include #include +using namespace std::literals; + QPDFArgParser::Members::Members(int argc, char const* const argv[], char const* progname_env) : argc(argc), @@ -532,7 +534,13 @@ QPDFArgParser::parseArgs() } usage(message); } + if (oe.bare_arg_handler) { + if (have_parameter) { + usage( + "--"s + arg_s + " does not take a parameter, but \"" + parameter + + "\" was given"); + } oe.bare_arg_handler(); } else if (oe.param_arg_handler) { oe.param_arg_handler(parameter); diff --git a/qpdf/qtest/arg-parsing.test b/qpdf/qtest/arg-parsing.test index 238f19c..395e469 100644 --- a/qpdf/qtest/arg-parsing.test +++ b/qpdf/qtest/arg-parsing.test @@ -15,7 +15,7 @@ cleanup(); my $td = new TestDriver('arg-parsing'); -my $n_tests = 25; +my $n_tests = 26; $td->runtest("required argument", {$td->COMMAND => "qpdf --password minimal.pdf"}, @@ -32,6 +32,11 @@ $td->runtest("required argument with choices", {$td->REGEXP => "must be given as --decode-level=\\{.*all.*\\}", $td->EXIT_STATUS => 2}, $td->NORMALIZE_NEWLINES); +$td->runtest("flag with parameter", + {$td->COMMAND => "qpdf --qdf=false minimal.pdf"}, + {$td->REGEXP => "--qdf does not take a parameter, but \"false\" was given", + $td->EXIT_STATUS => 2}, + $td->NORMALIZE_NEWLINES); copy("minimal.pdf", '@file.pdf'); $td->runtest("\@file exists and file doesn't", {$td->COMMAND => "qpdf --check \@file.pdf"},