diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-01-01 13:47:03 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-04-01 14:56:29 +0200 |
commit | 182c2480df3d2dee3e430e02afe6bbee3e45eadd (patch) | |
tree | 6c5c834617b09c1bf8628ae340068b5a96ad91b0 | |
parent | 4d37389befc705b671d8fa7a1da2b7117b50f454 (diff) | |
download | qpdf-182c2480df3d2dee3e430e02afe6bbee3e45eadd.tar.zst |
Refactor QPDF_Array::setItem and rename to setAt
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 10 | ||||
-rw-r--r-- | libqpdf/QPDF_Array.cc | 20 | ||||
-rw-r--r-- | libqpdf/SparseOHArray.cc | 13 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDF_Array.hh | 3 | ||||
-rw-r--r-- | libqpdf/qpdf/SparseOHArray.hh | 6 | ||||
-rw-r--r-- | qpdf/qpdf.testcov | 1 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/object-types-os.out | 1 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/object-types.out | 1 | ||||
-rw-r--r-- | qpdf/test_driver.cc | 1 |
9 files changed, 24 insertions, 32 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index e113089a..396e2063 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -904,16 +904,16 @@ QPDFObjectHandle::getArrayAsVector() void QPDFObjectHandle::setArrayItem(int n, QPDFObjectHandle const& item) { - auto array = asArray(); - if (array) { - checkOwnership(item); - array->setItem(n, item); + if (auto array = asArray()) { + if (!array->setAt(n, item)) { + objectWarning("ignoring attempt to set out of bounds array item"); + QTC::TC("qpdf", "QPDFObjectHandle set array bounds"); + } } else { typeWarning("array", "ignoring attempt to set item"); QTC::TC("qpdf", "QPDFObjectHandle array ignoring set item"); } } - void QPDFObjectHandle::setArrayFromVector(std::vector<QPDFObjectHandle> const& items) { diff --git a/libqpdf/QPDF_Array.cc b/libqpdf/QPDF_Array.cc index e4e1668e..d7505468 100644 --- a/libqpdf/QPDF_Array.cc +++ b/libqpdf/QPDF_Array.cc @@ -1,9 +1,6 @@ #include <qpdf/QPDF_Array.hh> -#include <qpdf/QIntC.hh> #include <qpdf/QPDFObject_private.hh> -#include <qpdf/QUtil.hh> -#include <stdexcept> static const QPDFObjectHandle null_oh = QPDFObjectHandle::newNull(); @@ -188,18 +185,19 @@ QPDF_Array::getAsVector(std::vector<QPDFObjectHandle>& v) const } } -void -QPDF_Array::setItem(int n, QPDFObjectHandle const& oh) +bool +QPDF_Array::setAt(int at, QPDFObjectHandle const& oh) { + if (at < 0 || at >= size()) { + return false; + } + checkOwnership(oh); if (sparse) { - sp_elements.setAt(n, oh); + sp_elements.setAt(at, oh); } else { - size_t idx = size_t(n); - if (n < 0 || idx >= elements.size()) { - throw std::logic_error("bounds error setting item in QPDF_Array"); - } - elements[idx] = oh.getObj(); + elements[size_t(at)] = oh.getObj(); } + return true; } void diff --git a/libqpdf/SparseOHArray.cc b/libqpdf/SparseOHArray.cc index 773d7309..9904af1b 100644 --- a/libqpdf/SparseOHArray.cc +++ b/libqpdf/SparseOHArray.cc @@ -31,19 +31,6 @@ SparseOHArray::disconnect() } void -SparseOHArray::setAt(int idx, QPDFObjectHandle oh) -{ - if (idx >= this->n_elements) { - throw std::logic_error("bounds error setting item in SparseOHArray"); - } - if (oh.isDirectNull()) { - this->elements.erase(idx); - } else { - this->elements[idx] = oh.getObj(); - } -} - -void SparseOHArray::erase(int at) { auto end = elements.end(); diff --git a/libqpdf/qpdf/QPDF_Array.hh b/libqpdf/qpdf/QPDF_Array.hh index edda54ec..f4d1fc3d 100644 --- a/libqpdf/qpdf/QPDF_Array.hh +++ b/libqpdf/qpdf/QPDF_Array.hh @@ -28,9 +28,8 @@ class QPDF_Array: public QPDFValue return sparse ? sp_elements.size() : int(elements.size()); } QPDFObjectHandle at(int n) const noexcept; + bool setAt(int n, QPDFObjectHandle const& oh); void getAsVector(std::vector<QPDFObjectHandle>&) const; - - void setItem(int, QPDFObjectHandle const&); void setFromVector(std::vector<QPDFObjectHandle> const& items); void setFromVector(std::vector<std::shared_ptr<QPDFObject>>&& items); bool insert(int at, QPDFObjectHandle const& item); diff --git a/libqpdf/qpdf/SparseOHArray.hh b/libqpdf/qpdf/SparseOHArray.hh index f2872618..19aa49f0 100644 --- a/libqpdf/qpdf/SparseOHArray.hh +++ b/libqpdf/qpdf/SparseOHArray.hh @@ -28,7 +28,11 @@ class SparseOHArray } QPDFObjectHandle at(int idx) const; void remove_last(); - void setAt(int idx, QPDFObjectHandle oh); + void + setAt(int idx, QPDFObjectHandle oh) + { + elements[idx] = oh.getObj(); + } void erase(int idx); void insert(int idx, QPDFObjectHandle oh); SparseOHArray copy(); diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index 736c02b4..014ea571 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -303,6 +303,7 @@ QPDFObjectHandle array treating as empty 0 QPDFObjectHandle array null for non-array 0 QPDFObjectHandle array treating as empty vector 0 QPDFObjectHandle array ignoring set item 0 +QPDFObjectHandle set array bounds 0 QPDFObjectHandle array ignoring replace items 0 QPDFObjectHandle array ignoring insert item 0 QPDFObjectHandle insert array bounds 0 diff --git a/qpdf/qtest/qpdf/object-types-os.out b/qpdf/qtest/qpdf/object-types-os.out index 1ba84d50..4b02d156 100644 --- a/qpdf/qtest/qpdf/object-types-os.out +++ b/qpdf/qtest/qpdf/object-types-os.out @@ -6,6 +6,7 @@ WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operatio WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 384: ignoring attempt to erase out of bounds array item WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 384: ignoring attempt to erase out of bounds array item WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 384: ignoring attempt to insert out of bounds array item +WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 384: ignoring attempt to set out of bounds array item WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for array attempted on object of type integer: ignoring attempt to erase item WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for array attempted on object of type integer: ignoring attempt to insert item WARNING: object-types-os.pdf object stream 1, object 7 0 at offset 429: operation for array attempted on object of type integer: ignoring attempt to replace items diff --git a/qpdf/qtest/qpdf/object-types.out b/qpdf/qtest/qpdf/object-types.out index bf41044e..b7089b6b 100644 --- a/qpdf/qtest/qpdf/object-types.out +++ b/qpdf/qtest/qpdf/object-types.out @@ -6,6 +6,7 @@ WARNING: object-types.pdf, object 8 0 at offset 669: operation for array attempt WARNING: object-types.pdf, object 8 0 at offset 717: ignoring attempt to erase out of bounds array item WARNING: object-types.pdf, object 8 0 at offset 717: ignoring attempt to erase out of bounds array item WARNING: object-types.pdf, object 8 0 at offset 717: ignoring attempt to insert out of bounds array item +WARNING: object-types.pdf, object 8 0 at offset 717: ignoring attempt to set out of bounds array item WARNING: object-types.pdf, object 8 0 at offset 669: operation for array attempted on object of type integer: ignoring attempt to erase item WARNING: object-types.pdf, object 8 0 at offset 669: operation for array attempted on object of type integer: ignoring attempt to insert item WARNING: object-types.pdf, object 8 0 at offset 669: operation for array attempted on object of type integer: ignoring attempt to replace items diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc index 82361ba0..4a5d0ae8 100644 --- a/qpdf/test_driver.cc +++ b/qpdf/test_driver.cc @@ -1507,6 +1507,7 @@ test_42(QPDF& pdf, char const* arg2) array.eraseItem(-1); array.eraseItem(16059); array.insertItem(42, "/Dontpanic"_qpdf); + array.setArrayItem(42, "/Dontpanic"_qpdf); integer.eraseItem(0); integer.insertItem(0, null); integer.setArrayFromVector(std::vector<QPDFObjectHandle>()); |