2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-05-29 00:10:54 +00:00

C API: qpdf_oh_is_initialized

This commit is contained in:
Jay Berkenbilt 2021-12-02 08:04:59 -05:00
parent bef2c2222a
commit e3cc171d02
7 changed files with 34 additions and 9 deletions

View File

@ -1,5 +1,7 @@
2021-12-02 Jay Berkenbilt <ejb@ql.org> 2021-12-02 Jay Berkenbilt <ejb@ql.org>
* C API: Add qpdf_oh_is_initialized.
* C API: Add qpdf_get_last_string_length to return the length of * C API: Add qpdf_get_last_string_length to return the length of
the last string returned. This is necessary in order to fully the last string returned. This is necessary in order to fully
retrieve values of strings that may contain embedded null characters. retrieve values of strings that may contain embedded null characters.

View File

@ -581,6 +581,8 @@ extern "C" {
* to. * to.
*/ */
QPDF_DLL
QPDF_BOOL qpdf_oh_is_initialized(qpdf_data data, qpdf_oh oh);
QPDF_DLL QPDF_DLL
QPDF_BOOL qpdf_oh_is_bool(qpdf_data data, qpdf_oh oh); QPDF_BOOL qpdf_oh_is_bool(qpdf_data data, qpdf_oh oh);
QPDF_DLL QPDF_DLL

View File

@ -881,8 +881,7 @@ qpdf_oh_valid_internal(qpdf_data qpdf, qpdf_oh oh)
{ {
auto i = qpdf->oh_cache.find(oh); auto i = qpdf->oh_cache.find(oh);
bool result = ((i != qpdf->oh_cache.end()) && bool result = ((i != qpdf->oh_cache.end()) &&
(i->second).getPointer() && (i->second).getPointer());
(i->second)->isInitialized());
if (! result) if (! result)
{ {
QTC::TC("qpdf", "qpdf-c invalid object handle"); QTC::TC("qpdf", "qpdf-c invalid object handle");
@ -892,11 +891,18 @@ qpdf_oh_valid_internal(qpdf_data qpdf, qpdf_oh oh)
qpdf->qpdf->getFilename(), qpdf->qpdf->getFilename(),
std::string("C API object handle ") + std::string("C API object handle ") +
QUtil::uint_to_string(oh), QUtil::uint_to_string(oh),
0, "attempted access to unknown/uninitialized object handle")); 0, "attempted access to unknown object handle"));
} }
return result; return result;
} }
QPDF_BOOL qpdf_oh_is_initialized(qpdf_data qpdf, qpdf_oh oh)
{
QTC::TC("qpdf", "qpdf-c called qpdf_oh_is_initialized");
return (qpdf_oh_valid_internal(qpdf, oh) &&
qpdf->oh_cache[oh]->isInitialized());
}
QPDF_BOOL qpdf_oh_is_bool(qpdf_data qpdf, qpdf_oh oh) QPDF_BOOL qpdf_oh_is_bool(qpdf_data qpdf, qpdf_oh oh)
{ {
QTC::TC("qpdf", "qpdf-c called qpdf_oh_is_bool"); QTC::TC("qpdf", "qpdf-c called qpdf_oh_is_bool");

View File

@ -5133,6 +5133,13 @@ print "\n";
embedded null characters. embedded null characters.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Add <function>qpdf_oh_is_initialized</function> to the
C API. While you can't directly create uninitialized objects
from the C API, you still have to be able to detect them.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</listitem> </listitem>
</itemizedlist> </itemizedlist>

View File

@ -512,6 +512,7 @@ static void test24(char const* infile,
qpdf_oh_get_object_id(qpdf, root_from_trailer)); qpdf_oh_get_object_id(qpdf, root_from_trailer));
qpdf_oh pages = qpdf_oh_get_key(qpdf, root, "/Pages"); qpdf_oh pages = qpdf_oh_get_key(qpdf, root, "/Pages");
assert(qpdf_oh_is_dictionary(qpdf, pages)); assert(qpdf_oh_is_dictionary(qpdf, pages));
assert(qpdf_oh_is_initialized(qpdf, pages));
qpdf_oh kids = qpdf_oh_get_key(qpdf, pages, "/Kids"); qpdf_oh kids = qpdf_oh_get_key(qpdf, pages, "/Kids");
assert(qpdf_oh_is_array(qpdf, kids)); assert(qpdf_oh_is_array(qpdf, kids));
assert(qpdf_oh_get_array_n_items(qpdf, kids) == 1); assert(qpdf_oh_get_array_n_items(qpdf, kids) == 1);
@ -687,6 +688,12 @@ static void test24(char const* infile,
qpdf_set_suppress_original_object_IDs(qpdf, QPDF_TRUE); qpdf_set_suppress_original_object_IDs(qpdf, QPDF_TRUE);
qpdf_write(qpdf); qpdf_write(qpdf);
report_errors(); report_errors();
/* Make sure we detect uninitialized objects */
qpdf_data qpdf2 = qpdf_init();
trailer = qpdf_get_trailer(qpdf2);
assert(! qpdf_oh_is_initialized(qpdf2, trailer));
qpdf_cleanup(&qpdf2);
} }
int main(int argc, char* argv[]) int main(int argc, char* argv[])

View File

@ -600,3 +600,4 @@ QPDF_pages findPage not found 0
qpdf overlay page with no resources 0 qpdf overlay page with no resources 0
QPDFObjectHandle check ownership 0 QPDFObjectHandle check ownership 0
qpdf weak crypto warning 0 qpdf weak crypto warning 0
qpdf-c called qpdf_oh_is_initialized 0

View File

@ -7,18 +7,18 @@ item 0: 0 0.00
item 1: 0 0.00 item 1: 0 0.00
item 2: 612 612.00 item 2: 612 612.00
item 3: 792 792.00 item 3: 792 792.00
warning: minimal.pdf (C API object handle 6): attempted access to unknown/uninitialized object handle warning: minimal.pdf (C API object handle 6): attempted access to unknown object handle
code: 5 code: 5
file: minimal.pdf file: minimal.pdf
pos : 0 pos : 0
text: attempted access to unknown/uninitialized object handle text: attempted access to unknown object handle
warning: minimal.pdf (C API object handle 9): attempted access to unknown/uninitialized object handle warning: minimal.pdf (C API object handle 9): attempted access to unknown object handle
code: 5 code: 5
file: minimal.pdf file: minimal.pdf
pos : 0 pos : 0
text: attempted access to unknown/uninitialized object handle text: attempted access to unknown object handle
warning: minimal.pdf (C API object handle 9): attempted access to unknown/uninitialized object handle warning: minimal.pdf (C API object handle 9): attempted access to unknown object handle
code: 5 code: 5
file: minimal.pdf file: minimal.pdf
pos : 0 pos : 0
text: attempted access to unknown/uninitialized object handle text: attempted access to unknown object handle