From e1cd5891af199dc6d926a1792c9add182b39fc56 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 5 Aug 2018 15:42:01 -0400 Subject: [PATCH] Fix infinite loop on small files with progress reporting (fixes #230) Turns out you can keep adding zero to a number over and over again and it just doesn't get any bigger. Who would have known? --- ChangeLog | 5 +++++ libqpdf/QPDFWriter.cc | 3 ++- qpdf/qtest/qpdf.test | 11 +++++++++++ qpdf/qtest/qpdf/small-progress.out | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 qpdf/qtest/qpdf/small-progress.out diff --git a/ChangeLog b/ChangeLog index 7888293f..42598e8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2018-08-05 Jay Berkenbilt + + * Bug fix: infinite loop on progress reporting for very small + files. Fixes #230. + 2018-08-04 Jay Berkenbilt * Performance fix: optimize page merging operation to avoid diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 447b6627..30ba6f1f 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -3357,9 +3357,10 @@ QPDFWriter::indicateProgress(bool decrement, bool finished) this->m->events_expected))); this->m->progress_reporter->reportProgress(percentage); } + int increment = std::max(1, (this->m->events_expected / 100)); while (this->m->events_seen >= this->m->next_progress_report) { - this->m->next_progress_report += (this->m->events_expected / 100); + this->m->next_progress_report += increment; } } diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 603bbe01..bab7ec1c 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -925,6 +925,17 @@ $td->runtest("don't overwrite self", {$td->REGEXP => "input file and output file are the same.*", $td->EXIT_STATUS => 2}); +show_ntests(); +# ---------- +$td->notify("--- Progress reporting ---"); +$n_tests += 1; + +$td->runtest("progress report on small file", + {$td->COMMAND => "qpdf --progress minimal.pdf a.pdf", + $td->FILTER => "perl filter-progress.pl"}, + {$td->FILE => "small-progress.out", $td->EXIT_STATUS => 0}, + $td->NORMALIZE_NEWLINES); + show_ntests(); # ---------- $td->notify("--- Type checks ---"); diff --git a/qpdf/qtest/qpdf/small-progress.out b/qpdf/qtest/qpdf/small-progress.out new file mode 100644 index 00000000..5845dec2 --- /dev/null +++ b/qpdf/qtest/qpdf/small-progress.out @@ -0,0 +1,3 @@ +qpdf: a.pdf: write progress: 0% +....other write progress.... +qpdf: a.pdf: write progress: 100%