Reading of system files is now more robust against badly formed / specially
[pspp-builds.git] / src / alloc.c
index b25e7dc9dbb1f3187e288fa10430960e92f3d1ac..8d1e39a633e78a967a1315b6c799e72afd33bd22 100644 (file)
@@ -43,18 +43,31 @@ xmalloc (size_t size)
   return vp;
 }
 
-/* Allocates a block of SIZE bytes, fill it with all-bits-0, and
-   returns it.
-   If SIZE is 0, returns a null pointer.
-   Aborts if unsuccessful. */
+
+/* Allocates a continous block of N_MEMB by SIZE elements, with all
+   bits set to 0.
+   Aborts if unsuccessful.
+*/
 void *
-xcalloc (size_t size)
+xcalloc (size_t n_memb, size_t size)
 {
-  void *vp = xmalloc (size);
-  memset (vp, 0, size);
+  const size_t prod = size * n_memb; 
+  void *vp = 0;
+
+  if (prod == 0)
+    return NULL;
+
+  /* Trap overflow errors */
+  assert ( prod >= size );
+  assert ( prod >= n_memb ) ;
+
+  vp = xmalloc ( prod );
+  memset (vp, 0, prod);
   return vp;
 }
 
+
+
 /* If SIZE is 0, then block PTR is freed and a null pointer is
    returned.
    Otherwise, if PTR is a null pointer, then a new block is allocated