1#ifndef __OVERUNDERFLOWCHECK__
2#define __OVERUNDERFLOWCHECK__
3
4inline uint32 CheckUInt32Add(uint32 a, uint32 b)
5{
6	uint32 c = a + b;
7	if (c < a)
8	{
9		CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
10	}
11
12	return c;
13}
14
15
16
17inline uint32 CheckUInt32Subtract(uint32 a, uint32 b)
18{
19	if (a < b)
20	{
21		CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
22	}
23
24	return a - b;
25}
26
27
28
29inline uint32 CheckUInt32Multiply(uint32 a, uint32 b)
30{
31	uint32 c = a * b;
32	uint64 cc = ((uint64) a) * ((uint64) b);
33	if (c != cc)
34	{
35		CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
36	}
37
38	return c;
39}
40
41
42
43inline uint64 Check64BitAdd(uint64 a, uint64 b)
44{
45	uint64 c = a + b;
46	if (c < a)
47	{
48		CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
49	}
50
51	return c;
52}
53
54
55
56inline uint64 Check64BitSubtract(uint64 a, uint64 b)
57{
58	if (a < b)
59	{
60		CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
61	}
62
63	return a - b;
64}
65
66
67
68inline uint64 Check64BitMultiply(uint64 a, uint64 b)
69{
70	if (a != 0)
71	{
72		uint64 max = (uint64) -1;
73		uint64 limit = max / a;
74		if (b > limit)
75		{
76			CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
77		}
78	}
79
80	return a * b;
81}
82
83
84
85#endif
86