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