aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-08-05 21:42:01 +0200
committerJay Berkenbilt <ejb@ql.org>2018-08-05 21:43:34 +0200
commite1cd5891af199dc6d926a1792c9add182b39fc56 (patch)
treeecd28806fec54a353924d9681bd8fa6670d6abc5
parent651b51f0564d7726df09faf6ac0a0dd36e4fa65a (diff)
downloadqpdf-e1cd5891af199dc6d926a1792c9add182b39fc56.tar.zst
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?
-rw-r--r--ChangeLog5
-rw-r--r--libqpdf/QPDFWriter.cc3
-rw-r--r--qpdf/qtest/qpdf.test11
-rw-r--r--qpdf/qtest/qpdf/small-progress.out3
4 files changed, 21 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 7888293f..42598e8a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-05 Jay Berkenbilt <ejb@ql.org>
+
+ * Bug fix: infinite loop on progress reporting for very small
+ files. Fixes #230.
+
2018-08-04 Jay Berkenbilt <ejb@ql.org>
* 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
@@ -927,6 +927,17 @@ $td->runtest("don't overwrite self",
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 ---");
$n_tests += 4;
# Whenever object-types.pdf is edited, object-types-os.pdf should be
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%