]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_filedb/lib/OverUnderflowCheck.h
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_filedb / lib / OverUnderflowCheck.h
diff --git a/OSX/libsecurity_filedb/lib/OverUnderflowCheck.h b/OSX/libsecurity_filedb/lib/OverUnderflowCheck.h
new file mode 100644 (file)
index 0000000..7224ac7
--- /dev/null
@@ -0,0 +1,85 @@
+#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