OverUnderflowCheck.h [plain text]
#ifndef __OVERUNDERFLOWCHECK__
#define __OVERUNDERFLOWCHECK__
inline uint32 CheckUInt32Add(uint32 a, uint32 b)
{
uint32 c = a + b;
if (c < a)
{
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
}
return c;
}
inline uint32 CheckUInt32Subtract(uint32 a, uint32 b)
{
if (a < b)
{
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
}
return a - b;
}
inline uint32 CheckUInt32Multiply(uint32 a, uint32 b)
{
uint32 c = a * b;
uint64 cc = ((uint64) a) * ((uint64) b);
if (c != cc)
{
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
}
return c;
}
inline uint64 Check64BitAdd(uint64 a, uint64 b)
{
uint64 c = a + b;
if (c < a)
{
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
}
return c;
}
inline uint64 Check64BitSubtract(uint64 a, uint64 b)
{
if (a < b)
{
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
}
return a - b;
}
inline uint64 Check64BitMultiply(uint64 a, uint64 b)
{
if (a != 0)
{
uint64 max = (uint64) -1;
uint64 limit = max / a;
if (b > limit)
{
CssmError::throwMe(CSSMERR_DL_DATABASE_CORRUPT);
}
}
return a * b;
}
#endif