Commit 758e3e38f5aceea2502179c7c4840911337f8a3f

Authored by Jay Berkenbilt
1 parent 90217e66

Add option --warning-exit-0 to exit 0 instead of 3 with warnings

ChangeLog
1 2020-10-20 Jay Berkenbilt <ejb@ql.org> 1 2020-10-20 Jay Berkenbilt <ejb@ql.org>
2 2
  3 + * Add --warning-exit-0 option to the qpdf command line. When
  4 + specified, qpdf will exit with a status of 0 rather than 3 when
  5 + there are warnings without errors. Combine with --no-warn to
  6 + completely ignore warnings.
  7 +
  8 + * Bug fix: fix further cases in which errors were written to
  9 + stdout. Fixes #438.
  10 +
3 * Build option: add --disable-rpath option to ./configure, which 11 * Build option: add --disable-rpath option to ./configure, which
4 disables passing -rpath to the linker when building shared 12 disables passing -rpath to the linker when building shared
5 libraries with libtool. Fixes #422. 13 libraries with libtool. Fixes #422.
1 Candidates for upcoming release 1 Candidates for upcoming release
2 =============================== 2 ===============================
3 3
4 -* Quick issues:  
5 - * Add --warning-exit-0 option. Search for --no-warn in the docs.  
6 -  
7 * Easy build/test 4 * Easy build/test
8 * #352: building standalone executables (lambda layer) 5 * #352: building standalone executables (lambda layer)
9 * #460: potential malware in fuzzer seed corpus 6 * #460: potential malware in fuzzer seed corpus
manual/qpdf-manual.xml
@@ -603,7 +603,9 @@ make @@ -603,7 +603,9 @@ make
603 <listitem> 603 <listitem>
604 <para> 604 <para>
605 <literal>0</literal>: no errors or warnings were found. The 605 <literal>0</literal>: no errors or warnings were found. The
606 - file may still have problems qpdf can't detect. 606 + file may still have problems qpdf can't detect. If
  607 + <option>--warning-exit-0</option> was specified, exit status 0
  608 + is used even if there are warnings.
607 </para> 609 </para>
608 </listitem> 610 </listitem>
609 <listitem> 611 <listitem>
@@ -618,7 +620,9 @@ make @@ -618,7 +620,9 @@ make
618 able to recover from. In some cases, the resulting file may 620 able to recover from. In some cases, the resulting file may
619 still be damaged. Note that qpdf still exits with status 621 still be damaged. Note that qpdf still exits with status
620 <literal>3</literal> if it finds warnings even when 622 <literal>3</literal> if it finds warnings even when
621 - <option>--no-warn</option> is specified. 623 + <option>--no-warn</option> is specified. With
  624 + <option>--warning-exit-0</option>, warnings without errors
  625 + exit with status 0 instead of 3.
622 </para> 626 </para>
623 </listitem> 627 </listitem>
624 </itemizedlist> 628 </itemizedlist>
@@ -778,7 +782,19 @@ make @@ -778,7 +782,19 @@ make
778 <para> 782 <para>
779 Suppress writing of warnings to stderr. If warnings were 783 Suppress writing of warnings to stderr. If warnings were
780 detected and suppressed, <command>qpdf</command> will still 784 detected and suppressed, <command>qpdf</command> will still
781 - exit with exit code 3. 785 + exit with exit code 3. See also
  786 + <option>--warning-exit-0</option>.
  787 + </para>
  788 + </listitem>
  789 + </varlistentry>
  790 + <varlistentry>
  791 + <term><option>--warning-exit-0</option></term>
  792 + <listitem>
  793 + <para>
  794 + If warnings are found but no errors, exit with exit code 0
  795 + instead 3. When combined with <option>--no-warn</option>, the
  796 + effect is for <command>qpdf</command> to completely ignore
  797 + warnings.
782 </para> 798 </para>
783 </listitem> 799 </listitem>
784 </varlistentry> 800 </varlistentry>
qpdf/qpdf.cc
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 #include <qpdf/QIntC.hh> 30 #include <qpdf/QIntC.hh>
31 31
32 static int constexpr EXIT_ERROR = 2; 32 static int constexpr EXIT_ERROR = 2;
33 -static int constexpr EXIT_WARNING = 3; 33 +static int EXIT_WARNING = 3; // may be changed to 0 at runtime
34 34
35 // For is-encrypted and requires-password 35 // For is-encrypted and requires-password
36 static int constexpr EXIT_IS_NOT_ENCRYPTED = 2; 36 static int constexpr EXIT_IS_NOT_ENCRYPTED = 2;
@@ -773,6 +773,7 @@ class ArgParser @@ -773,6 +773,7 @@ class ArgParser
773 void argVerbose(); 773 void argVerbose();
774 void argProgress(); 774 void argProgress();
775 void argNoWarn(); 775 void argNoWarn();
  776 + void argWarningExitZero();
776 void argDeterministicId(); 777 void argDeterministicId();
777 void argStaticId(); 778 void argStaticId();
778 void argStaticAesIv(); 779 void argStaticAesIv();
@@ -1017,6 +1018,7 @@ ArgParser::initOptionTable() @@ -1017,6 +1018,7 @@ ArgParser::initOptionTable()
1017 (*t)["verbose"] = oe_bare(&ArgParser::argVerbose); 1018 (*t)["verbose"] = oe_bare(&ArgParser::argVerbose);
1018 (*t)["progress"] = oe_bare(&ArgParser::argProgress); 1019 (*t)["progress"] = oe_bare(&ArgParser::argProgress);
1019 (*t)["no-warn"] = oe_bare(&ArgParser::argNoWarn); 1020 (*t)["no-warn"] = oe_bare(&ArgParser::argNoWarn);
  1021 + (*t)["warning-exit-0"] = oe_bare(&ArgParser::argWarningExitZero);
1020 (*t)["deterministic-id"] = oe_bare(&ArgParser::argDeterministicId); 1022 (*t)["deterministic-id"] = oe_bare(&ArgParser::argDeterministicId);
1021 (*t)["static-id"] = oe_bare(&ArgParser::argStaticId); 1023 (*t)["static-id"] = oe_bare(&ArgParser::argStaticId);
1022 (*t)["static-aes-iv"] = oe_bare(&ArgParser::argStaticAesIv); 1024 (*t)["static-aes-iv"] = oe_bare(&ArgParser::argStaticAesIv);
@@ -1230,6 +1232,7 @@ ArgParser::argHelp() @@ -1230,6 +1232,7 @@ ArgParser::argHelp()
1230 << "--verbose provide additional informational output\n" 1232 << "--verbose provide additional informational output\n"
1231 << "--progress give progress indicators while writing output\n" 1233 << "--progress give progress indicators while writing output\n"
1232 << "--no-warn suppress warnings\n" 1234 << "--no-warn suppress warnings\n"
  1235 + << "--warning-exit-0 exit with code 0 instead of 3 if there are warnings\n"
1233 << "--linearize generated a linearized (web optimized) file\n" 1236 << "--linearize generated a linearized (web optimized) file\n"
1234 << "--replace-input use in place of specifying an output file; qpdf will\n" 1237 << "--replace-input use in place of specifying an output file; qpdf will\n"
1235 << " replace the input file with the output\n" 1238 << " replace the input file with the output\n"
@@ -1621,8 +1624,11 @@ ArgParser::argHelp() @@ -1621,8 +1624,11 @@ ArgParser::argHelp()
1621 << "Ordinarily, qpdf exits with a status of 0 on success or a status of 2\n" 1624 << "Ordinarily, qpdf exits with a status of 0 on success or a status of 2\n"
1622 << "if any errors occurred. If there were warnings but not errors, qpdf\n" 1625 << "if any errors occurred. If there were warnings but not errors, qpdf\n"
1623 << "exits with a status of 3. If warnings would have been issued but --no-warn\n" 1626 << "exits with a status of 3. If warnings would have been issued but --no-warn\n"
1624 - << "was given, an exit status of 3 is still used. qpdf does not use exit\n"  
1625 - << "status 1, since that is used by the shell if it can't execute qpdf.\n"; 1627 + << "was given, an exit status of 3 is still used. If you want qpdf to exit\n"
  1628 + << "with status 0 when there are warnings, use the --warning-exit-0 flag.\n"
  1629 + << "When --no-warn and --warning-exit-0 are used together, the effect is for\n"
  1630 + << "qpdf to completely ignore warnings. qpdf does not use exit status 1,\n"
  1631 + << "since that is used by the shell if it can't execute qpdf.\n";
1626 } 1632 }
1627 1633
1628 void 1634 void
@@ -2119,6 +2125,12 @@ ArgParser::argNoWarn() @@ -2119,6 +2125,12 @@ ArgParser::argNoWarn()
2119 } 2125 }
2120 2126
2121 void 2127 void
  2128 +ArgParser::argWarningExitZero()
  2129 +{
  2130 + ::EXIT_WARNING = 0;
  2131 +}
  2132 +
  2133 +void
2122 ArgParser::argDeterministicId() 2134 ArgParser::argDeterministicId()
2123 { 2135 {
2124 o.deterministic_id = true; 2136 o.deterministic_id = true;
qpdf/qtest/qpdf.test
@@ -2472,7 +2472,7 @@ my @badfiles = (&quot;not a PDF file&quot;, # 1 @@ -2472,7 +2472,7 @@ my @badfiles = (&quot;not a PDF file&quot;, # 1
2472 "startxref to space then eof", # 38 2472 "startxref to space then eof", # 38
2473 ); 2473 );
2474 2474
2475 -$n_tests += @badfiles + 6; 2475 +$n_tests += @badfiles + 7;
2476 2476
2477 # Test 6 contains errors in the free table consistency, but we no 2477 # Test 6 contains errors in the free table consistency, but we no
2478 # longer have any consistency check for this since it is not important 2478 # longer have any consistency check for this since it is not important
@@ -2499,6 +2499,10 @@ for (my $i = 1; $i &lt;= scalar(@badfiles); ++$i) @@ -2499,6 +2499,10 @@ for (my $i = 1; $i &lt;= scalar(@badfiles); ++$i)
2499 $td->runtest("Suppress warnings", 2499 $td->runtest("Suppress warnings",
2500 {$td->COMMAND => "qpdf --no-warn bad14.pdf a.pdf"}, 2500 {$td->COMMAND => "qpdf --no-warn bad14.pdf a.pdf"},
2501 {$td->STRING => "", $td->EXIT_STATUS => 3}); 2501 {$td->STRING => "", $td->EXIT_STATUS => 3});
  2502 +$td->runtest("Suppress warnings",
  2503 + {$td->COMMAND =>
  2504 + "qpdf --no-warn --warning-exit-0 bad14.pdf a.pdf"},
  2505 + {$td->STRING => "", $td->EXIT_STATUS => 0});
2502 $td->runtest("Suppress warnings with --check", 2506 $td->runtest("Suppress warnings with --check",
2503 {$td->COMMAND => "qpdf --check --no-warn bad14.pdf"}, 2507 {$td->COMMAND => "qpdf --check --no-warn bad14.pdf"},
2504 {$td->FILE => "bad14-check-no-warn.out", 2508 {$td->FILE => "bad14-check-no-warn.out",