X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Falloc.c;h=8d1e39a633e78a967a1315b6c799e72afd33bd22;hb=6d7e2826ba9c863f6261e9718e0e822e0ca60aa0;hp=b25e7dc9dbb1f3187e288fa10430960e92f3d1ac;hpb=4fdeb2145d081ff1b84e3f6c99f9d1c048c0d64a;p=pspp diff --git a/src/alloc.c b/src/alloc.c index b25e7dc9db..8d1e39a633 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -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