From 1674b67cd117d740976b02dbf37b2d36cb653325 Mon Sep 17 00:00:00 2001 From: m-holger Date: Sun, 17 Aug 2025 14:30:25 +0100 Subject: [PATCH] Refactor `NNTreeIterator::updateIValue`: replace `getArrayNItems` and `getArrayItem` with `size` and subscript operators, simplify logic, and improve error handling. --- libqpdf/NNTree.cc | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/libqpdf/NNTree.cc b/libqpdf/NNTree.cc index 1eea3bd..308cdb1 100644 --- a/libqpdf/NNTree.cc +++ b/libqpdf/NNTree.cc @@ -57,25 +57,21 @@ NNTreeIterator::updateIValue(bool allow_invalid) // we must call updateIValue as well. These cases are handled, and for good measure, we also // call updateIValue in operator* and operator->. - bool okay = false; - if (item_number >= 0 && node.isDictionary()) { - auto items = node.getKey(impl.details.itemsKey()); - if (item_number + 1 < items.getArrayNItems()) { - okay = true; - ivalue.first = items.getArrayItem(item_number); - ivalue.second = items.getArrayItem(1 + item_number); - } else { - impl.error(node, "update ivalue: items array is too short"); - } - } - if (!okay) { + if (item_number < 0 || !node.isDictionary()) { if (!allow_invalid) { throw std::logic_error( "attempt made to dereference an invalid name/number tree iterator"); } ivalue.first = QPDFObjectHandle(); ivalue.second = QPDFObjectHandle(); + return; + } + auto items = node.getKey(impl.details.itemsKey()); + if (!std::cmp_less(item_number + 1, items.size())) { + impl.error(node, "update ivalue: items array is too short"); } + ivalue.first = items[item_number]; + ivalue.second = items[1 + item_number]; } NNTreeIterator::PathElement::PathElement(QPDFObjectHandle const& node, int kid_number) : -- libgit2 0.21.4