1 krisbash 1.1 #ifndef _intsafe_h
2 #define _intsafe_h
3
4 #include "palcommon.h"
5
6 PAL_BEGIN_EXTERNC
7
8 #define INTSAFE_E_ARITHMETIC_OVERFLOW ((HRESULT)0x80070216L) // 0x216 = 534 = ERROR_ARITHMETIC_OVERFLOW
9 #define _SIZE_T_ERROR 0xffffffff
10
11 #ifndef SIZE_MAX
12 # ifdef PAL_64BIT
13 # define SIZE_MAX (18446744073709551615UL)
14 # else
15 # define SIZE_MAX (4294967295U)
16 # endif
17 #endif
18
19 PAL_INLINE HRESULT
20 SizeTAdd(
21 _In_ size_t Augend,
22 krisbash 1.1 _In_ size_t Addend,
23 _Out_ _Deref_out_range_(==, Augend + Addend) size_t* pResult)
24 {
25 HRESULT hr;
26
27 if ((Augend + Addend) >= Augend)
28 {
29 *pResult = (Augend + Addend);
30 hr = S_OK;
31 }
32 else
33 {
34 *pResult = _SIZE_T_ERROR;
35 hr = INTSAFE_E_ARITHMETIC_OVERFLOW;
36 }
37 return hr;
38 }
39
40 PAL_INLINE HRESULT
41 SizeTMult(
42 _In_ size_t Multiplicand,
43 krisbash 1.1 _In_ size_t Multiplier,
44 _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) size_t* pResult)
45 {
46 HRESULT hr;
47 if (Multiplier == 0 || Multiplicand == 0 || Multiplicand <= SIZE_MAX / Multiplier)
48 {
49 *pResult = Multiplicand * Multiplier;
50 hr = S_OK;
51 }
52 else
53 {
54 *pResult = _SIZE_T_ERROR;
55 hr = INTSAFE_E_ARITHMETIC_OVERFLOW;
56 }
57 return hr;
58 }
59
60 PAL_END_EXTERNC
61
62 #endif /* _intsafe_h */
|