Skip to content

Commit 506cdb5

Browse files
committed
to_big/to_little use type constraint to guard inputs.
1 parent 087ad11 commit 506cdb5

2 files changed

Lines changed: 24 additions & 12 deletions

File tree

include/bitcoin/system/endian/integrals.hpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,30 @@ namespace system {
3737

3838
template <size_t Offset = zero, typename Byte, size_t Size, typename Integral,
3939
if_one_byte<Byte> = true,
40-
if_integral_integer<Integral> = true>
40+
if_integral_integer<Integral> = true,
41+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)> = true>
4142
constexpr void to_big(std_array<Byte, Size>& data, Integral value) NOEXCEPT;
4243

4344
template <size_t Offset = zero, typename Byte, size_t Size, typename Integral,
4445
if_one_byte<Byte> = true,
45-
if_integral_integer<Integral> = true>
46+
if_integral_integer<Integral> = true,
47+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)> = true>
4648
constexpr void to_little(std_array<Byte, Size>& data, Integral value) NOEXCEPT;
4749

4850
/// from_big/from_little (by reference, implicit, offsettable).
4951
/// ---------------------------------------------------------------------------
5052

5153
template <size_t Offset = zero, typename Integral, typename Byte, size_t Size,
5254
if_one_byte<Byte> = true,
53-
if_integral_integer<Integral> = true>
55+
if_integral_integer<Integral> = true,
56+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)> = true>
5457
constexpr void from_big(Integral& value,
5558
const std_array<Byte, Size>& data) NOEXCEPT;
5659

5760
template <size_t Offset = zero, typename Integral, typename Byte, size_t Size,
5861
if_one_byte<Byte> = true,
59-
if_integral_integer<Integral> = true>
62+
if_integral_integer<Integral> = true,
63+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)> = true>
6064
constexpr void from_little(Integral& value,
6165
const std_array<Byte, Size>& data) NOEXCEPT;
6266

@@ -65,12 +69,14 @@ constexpr void from_little(Integral& value,
6569

6670
template<typename Integral, size_t Offset = zero, typename Byte, size_t Size,
6771
if_one_byte<Byte> = true,
68-
if_integral_integer<Integral> = true>
72+
if_integral_integer<Integral> = true,
73+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)> = true>
6974
constexpr Integral from_big(const std_array<Byte, Size>& data) NOEXCEPT;
7075

7176
template<typename Integral, size_t Offset = zero, typename Byte, size_t Size,
7277
if_one_byte<Byte> = true,
73-
if_integral_integer<Integral> = true>
78+
if_integral_integer<Integral> = true,
79+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)> = true>
7480
constexpr Integral from_little(const std_array<Byte, Size>& data) NOEXCEPT;
7581

7682
/// to_big/to_little (by value, implicit).

include/bitcoin/system/impl/endian/integrals.ipp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ namespace system {
3838

3939
template <size_t Offset, typename Byte, size_t Size, typename Integral,
4040
if_one_byte<Byte>,
41-
if_integral_integer<Integral>>
41+
if_integral_integer<Integral>,
42+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)>>
4243
constexpr void to_big(std_array<Byte, Size>& data, Integral value) NOEXCEPT
4344
{
4445
BC_PUSH_WARNING(NO_ARRAY_INDEXING)
@@ -77,7 +78,8 @@ constexpr void to_big(std_array<Byte, Size>& data, Integral value) NOEXCEPT
7778

7879
template <size_t Offset, typename Byte, size_t Size, typename Integral,
7980
if_one_byte<Byte>,
80-
if_integral_integer<Integral>>
81+
if_integral_integer<Integral>,
82+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)>>
8183
constexpr void to_little(std_array<Byte, Size>& data, Integral value) NOEXCEPT
8284
{
8385
BC_PUSH_WARNING(NO_ARRAY_INDEXING)
@@ -119,7 +121,8 @@ constexpr void to_little(std_array<Byte, Size>& data, Integral value) NOEXCEPT
119121

120122
template <size_t Offset, typename Integral, typename Byte, size_t Size,
121123
if_one_byte<Byte>,
122-
if_integral_integer<Integral>>
124+
if_integral_integer<Integral>,
125+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)>>
123126
constexpr void from_big(Integral& value,
124127
const std_array<Byte, Size>& data) NOEXCEPT
125128
{
@@ -162,7 +165,8 @@ constexpr void from_big(Integral& value,
162165

163166
template <size_t Offset, typename Integral, typename Byte, size_t Size,
164167
if_one_byte<Byte>,
165-
if_integral_integer<Integral>>
168+
if_integral_integer<Integral>,
169+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)>>
166170
constexpr void from_little(Integral& value,
167171
const std_array<Byte, Size>& data) NOEXCEPT
168172
{
@@ -208,7 +212,8 @@ constexpr void from_little(Integral& value,
208212

209213
template<typename Integral, size_t Offset, typename Byte, size_t Size,
210214
if_one_byte<Byte>,
211-
if_integral_integer<Integral>>
215+
if_integral_integer<Integral>,
216+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)>>
212217
constexpr Integral from_big(const std_array<Byte, Size>& data) NOEXCEPT
213218
{
214219
Integral out{};
@@ -218,7 +223,8 @@ constexpr Integral from_big(const std_array<Byte, Size>& data) NOEXCEPT
218223

219224
template<typename Integral, size_t Offset, typename Byte, size_t Size,
220225
if_one_byte<Byte>,
221-
if_integral_integer<Integral>>
226+
if_integral_integer<Integral>,
227+
if_not_lesser<safe_subtract(Size, Offset), sizeof(Integral)>>
222228
constexpr Integral from_little(const std_array<Byte, Size>& data) NOEXCEPT
223229
{
224230
Integral out{};

0 commit comments

Comments
 (0)