summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2020-10-22 11:44:48 +0200
committerJay Berkenbilt <ejb@ql.org>2020-10-22 11:48:40 +0200
commit7f4a4df919f0b305ba7d3b63ed722ab38e3eb2d5 (patch)
tree1f66c115fe66138f5a49a8a30768dfbbd4ae4938 /include
parent24196c08cb2457ab3e7a6d0226e6c28ac55bb832 (diff)
downloadqpdf-7f4a4df919f0b305ba7d3b63ed722ab38e3eb2d5.tar.zst
Add range_check method to QIntC
Diffstat (limited to 'include')
-rw-r--r--include/qpdf/BufferInputSource.hh2
-rw-r--r--include/qpdf/QIntC.hh14
2 files changed, 14 insertions, 2 deletions
diff --git a/include/qpdf/BufferInputSource.hh b/include/qpdf/BufferInputSource.hh
index 65206d50..561018f6 100644
--- a/include/qpdf/BufferInputSource.hh
+++ b/include/qpdf/BufferInputSource.hh
@@ -54,8 +54,6 @@ class BufferInputSource: public InputSource
virtual void unreadCh(char ch);
private:
- static void range_check(qpdf_offset_t cur, qpdf_offset_t delta);
-
class Members
{
friend class BufferInputSource;
diff --git a/include/qpdf/QIntC.hh b/include/qpdf/QIntC.hh
index 6f1f4b63..5f7f21bb 100644
--- a/include/qpdf/QIntC.hh
+++ b/include/qpdf/QIntC.hh
@@ -222,6 +222,20 @@ namespace QIntC // QIntC = qpdf Integer Conversion
{
return IntConverter<T, unsigned long long>::convert(i);
}
+
+ template <typename T>
+ void range_check(T const& cur, T const& delta)
+ {
+ if ((delta > 0) &&
+ ((std::numeric_limits<T>::max() - cur) < delta))
+ {
+ std::ostringstream msg;
+ msg.imbue(std::locale::classic());
+ msg << "adding " << delta << " to " << cur
+ << " would cause an integer overflow";
+ throw std::range_error(msg.str());
+ }
+ }
};
#endif // QINTC_HH