]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_utilities/lib/alloc.h
Security-59306.61.1.tar.gz
[apple/security.git] / OSX / libsecurity_utilities / lib / alloc.h
index 83403e01cfb04d5fdd2d24e3ce55a4652153b218..8d2762278a72a793353ed31b05f367609233c2ad 100644 (file)
@@ -55,10 +55,23 @@ public:
        { return reinterpret_cast<T *>(malloc(sizeof(T))); }
 
        template <class T> T *alloc(UInt32 count) throw(std::bad_alloc)
-       { return reinterpret_cast<T *>(malloc(sizeof(T) * count)); }
+       {
+        size_t bytes = 0;
+        if (__builtin_mul_overflow(sizeof(T), count, &bytes)) {
+            throw std::bad_alloc();
+        }
+        return reinterpret_cast<T *>(malloc(bytes));
+
+    }
 
        template <class T> T *alloc(T *old, UInt32 count) throw(std::bad_alloc)
-       { return reinterpret_cast<T *>(realloc(old, sizeof(T) * count)); }
+       {
+        size_t bytes = 0;
+        if (__builtin_mul_overflow(sizeof(T), count, &bytes)) {
+            throw std::bad_alloc();
+        }
+        return reinterpret_cast<T *>(realloc(old, bytes));
+    }
        
         
        //
@@ -74,8 +87,13 @@ public:
        // All right, if you *really* have to have calloc...
        void *calloc(size_t size, size_t count) throw(std::bad_alloc)
        {
-               void *addr = malloc(size * count);
-               memset(addr, 0, size * count);
+        size_t bytes = 0;
+        if(__builtin_mul_overflow(size, count, &bytes)) {
+            // Multiplication overflowed.
+            throw std::bad_alloc();
+        }
+               void *addr = malloc(bytes);
+               memset(addr, 0, bytes);
                return addr;
        }