Commit 720ce9e8f333ba3911fa8003f08fd8813c19181a
1 parent
ac17308c
Improve testing and error handling around operating before processing
Showing
4 changed files
with
19 additions
and
4 deletions
include/qpdf/qpdf-c.h
| @@ -113,7 +113,9 @@ extern "C" { | @@ -113,7 +113,9 @@ extern "C" { | ||
| 113 | char const* qpdf_get_qpdf_version(); | 113 | char const* qpdf_get_qpdf_version(); |
| 114 | 114 | ||
| 115 | /* Returns dynamically allocated qpdf_data pointer; must be freed | 115 | /* Returns dynamically allocated qpdf_data pointer; must be freed |
| 116 | - * by calling qpdf_cleanup. | 116 | + * by calling qpdf_cleanup. You must call qpdf_read or one of the |
| 117 | + * other qpdf_read_* functions before calling any function that | ||
| 118 | + * would need to operate on the PDF file. | ||
| 117 | */ | 119 | */ |
| 118 | QPDF_DLL | 120 | QPDF_DLL |
| 119 | qpdf_data qpdf_init(); | 121 | qpdf_data qpdf_init(); |
libqpdf/QPDF.cc
| @@ -85,8 +85,10 @@ class InvalidInputSource: public InputSource | @@ -85,8 +85,10 @@ class InvalidInputSource: public InputSource | ||
| 85 | private: | 85 | private: |
| 86 | void throwException() | 86 | void throwException() |
| 87 | { | 87 | { |
| 88 | - throw std::runtime_error( | ||
| 89 | - "QPDF operation attempted after closing input source"); | 88 | + throw std::logic_error( |
| 89 | + "QPDF operation attempted on a QPDF object with no input source." | ||
| 90 | + " QPDF operations are invalid before processFile (or another" | ||
| 91 | + " process method) or after closeInputSource"); | ||
| 90 | } | 92 | } |
| 91 | }; | 93 | }; |
| 92 | 94 |
qpdf/qtest/qpdf/test73.out
| 1 | -WARNING: closed input source: object 1/0: error reading object: QPDF operation attempted after closing input source | 1 | +getRoot: attempted to dereference an uninitialized QPDFObjectHandle |
| 2 | +WARNING: closed input source: object 1/0: error reading object: QPDF operation attempted on a QPDF object with no input source. QPDF operations are invalid before processFile (or another process method) or after closeInputSource | ||
| 2 | closed input source: unable to find /Root dictionary | 3 | closed input source: unable to find /Root dictionary |
qpdf/test_driver.cc
| @@ -2715,6 +2715,16 @@ void runtest(int n, char const* filename1, char const* arg2) | @@ -2715,6 +2715,16 @@ void runtest(int n, char const* filename1, char const* arg2) | ||
| 2715 | } | 2715 | } |
| 2716 | else if (n == 73) | 2716 | else if (n == 73) |
| 2717 | { | 2717 | { |
| 2718 | + try | ||
| 2719 | + { | ||
| 2720 | + QPDF pdf2; | ||
| 2721 | + pdf2.getRoot(); | ||
| 2722 | + } | ||
| 2723 | + catch (std::exception& e) | ||
| 2724 | + { | ||
| 2725 | + std::cerr << "getRoot: " << e.what() << std::endl; | ||
| 2726 | + } | ||
| 2727 | + | ||
| 2718 | pdf.closeInputSource(); | 2728 | pdf.closeInputSource(); |
| 2719 | pdf.getRoot().getKey("/Pages").unparseResolved(); | 2729 | pdf.getRoot().getKey("/Pages").unparseResolved(); |
| 2720 | } | 2730 | } |