2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-06-04 19:30:53 +00:00

Make QPDFObjectHandle::is* return false for uninitialized objects

This commit is contained in:
Jay Berkenbilt 2021-01-29 10:17:13 -05:00
parent 50decc9bb8
commit 35e7859bc7
3 changed files with 70 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2021-01-29 Jay Berkenbilt <ejb@ql.org>
* QPDFObjectHandle::is* methods to check type now return false on
uninitialized objects rather than crashing or throwing a logic
error.
2021-01-24 Jay Berkenbilt <ejb@ql.org> 2021-01-24 Jay Berkenbilt <ejb@ql.org>
* Implement remove for name and number trees as well as exposing * Implement remove for name and number trees as well as exposing

View File

@ -314,6 +314,10 @@ class QPDFObjectTypeAccessor
bool bool
QPDFObjectHandle::isBool() QPDFObjectHandle::isBool()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Bool>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Bool>::check(obj.getPointer());
} }
@ -328,6 +332,10 @@ QPDFObjectHandle::isDirectNull() const
bool bool
QPDFObjectHandle::isNull() QPDFObjectHandle::isNull()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Null>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Null>::check(obj.getPointer());
} }
@ -335,6 +343,10 @@ QPDFObjectHandle::isNull()
bool bool
QPDFObjectHandle::isInteger() QPDFObjectHandle::isInteger()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Integer>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Integer>::check(obj.getPointer());
} }
@ -342,6 +354,10 @@ QPDFObjectHandle::isInteger()
bool bool
QPDFObjectHandle::isReal() QPDFObjectHandle::isReal()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Real>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Real>::check(obj.getPointer());
} }
@ -375,6 +391,10 @@ QPDFObjectHandle::getNumericValue()
bool bool
QPDFObjectHandle::isName() QPDFObjectHandle::isName()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Name>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Name>::check(obj.getPointer());
} }
@ -382,6 +402,10 @@ QPDFObjectHandle::isName()
bool bool
QPDFObjectHandle::isString() QPDFObjectHandle::isString()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_String>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_String>::check(obj.getPointer());
} }
@ -389,6 +413,10 @@ QPDFObjectHandle::isString()
bool bool
QPDFObjectHandle::isOperator() QPDFObjectHandle::isOperator()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Operator>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Operator>::check(obj.getPointer());
} }
@ -396,6 +424,10 @@ QPDFObjectHandle::isOperator()
bool bool
QPDFObjectHandle::isInlineImage() QPDFObjectHandle::isInlineImage()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_InlineImage>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_InlineImage>::check(obj.getPointer());
} }
@ -403,6 +435,10 @@ QPDFObjectHandle::isInlineImage()
bool bool
QPDFObjectHandle::isArray() QPDFObjectHandle::isArray()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Array>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Array>::check(obj.getPointer());
} }
@ -410,6 +446,10 @@ QPDFObjectHandle::isArray()
bool bool
QPDFObjectHandle::isDictionary() QPDFObjectHandle::isDictionary()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Dictionary>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Dictionary>::check(obj.getPointer());
} }
@ -417,6 +457,10 @@ QPDFObjectHandle::isDictionary()
bool bool
QPDFObjectHandle::isStream() QPDFObjectHandle::isStream()
{ {
if (! this->initialized)
{
return false;
}
dereference(); dereference();
return QPDFObjectTypeAccessor<QPDF_Stream>::check(obj.getPointer()); return QPDFObjectTypeAccessor<QPDF_Stream>::check(obj.getPointer());
} }
@ -424,6 +468,10 @@ QPDFObjectHandle::isStream()
bool bool
QPDFObjectHandle::isReserved() QPDFObjectHandle::isReserved()
{ {
if (! this->initialized)
{
return false;
}
// dereference will clear reserved if this has been replaced // dereference will clear reserved if this has been replaced
dereference(); dereference();
return this->reserved; return this->reserved;
@ -432,7 +480,10 @@ QPDFObjectHandle::isReserved()
bool bool
QPDFObjectHandle::isIndirect() QPDFObjectHandle::isIndirect()
{ {
assertInitialized(); if (! this->initialized)
{
return false;
}
return (this->objid != 0); return (this->objid != 0);
} }
@ -2985,6 +3036,11 @@ QPDFObjectHandle::assertPageObject()
void void
QPDFObjectHandle::dereference() QPDFObjectHandle::dereference()
{ {
if (! this->initialized)
{
throw std::logic_error(
"attempted to dereference an uninitialized QPDFObjectHandle");
}
if (this->obj.getPointer() == 0) if (this->obj.getPointer() == 0)
{ {
PointerHolder<QPDFObject> obj = QPDF::Resolver::resolve( PointerHolder<QPDFObject> obj = QPDF::Resolver::resolve(

View File

@ -4853,6 +4853,13 @@ print "\n";
<classname>QPDF</classname>'s public API. <classname>QPDF</classname>'s public API.
</para> </para>
</listitem> </listitem>
<listitem>
<para>
<function>QPDFObjectHandle::is*</function> methods now return
false rather than crashing when called with an uninitialized
<classname>QPDFObjectHandle</classname> object.
</para>
</listitem>
<listitem> <listitem>
<para> <para>
Re-implement <classname>QPDFNameTreeObjectHelper</classname> Re-implement <classname>QPDFNameTreeObjectHelper</classname>