]> granicus.if.org Git - sudo/commitdiff
Add ecalloc().
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 30 Mar 2012 18:55:02 +0000 (14:55 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 30 Mar 2012 18:55:02 +0000 (14:55 -0400)
--HG--
branch : 1.7

alloc.c
alloc.h

diff --git a/alloc.c b/alloc.c
index 535465c4aeb86a7295e858cd186ec89caafa934f..fc04da584ce1ea71da03a484e35ee3969359b798 100644 (file)
--- a/alloc.c
+++ b/alloc.c
@@ -106,6 +106,31 @@ emalloc2(nmemb, size)
     return ptr;
 }
 
+/*
+ * ecalloc() allocates nmemb * size bytes and exits with an error
+ * if overflow would occur or if the system malloc(3) fails.  
+ * On success, the allocated space is zero-filled.
+ */
+void *
+ecalloc(nmemb, size)
+    size_t nmemb;
+    size_t size;
+{
+    void *ptr;
+
+    if (nmemb == 0 || size == 0)
+       errorx(1, "internal error, tried to ecalloc(0)");
+    if (nmemb != 1) {
+       if (nmemb > SIZE_MAX / size)
+           errorx(1, "internal error, ecalloc() overflow");
+       size *= nmemb;
+    }
+    if ((ptr = malloc(size)) == NULL)
+       errorx(1, "unable to allocate memory");
+    memset(ptr, 0, size);
+    return ptr;
+}
+
 /*
  * erealloc() calls the system realloc(3) and exits with an error if
  * realloc(3) fails.  You can call erealloc() with a NULL pointer even
diff --git a/alloc.h b/alloc.h
index d3e1b07de6605783f6af5c1045dd16f8244f8720..6f11cb7484467f86e7941b7546804c9aec5840d3 100644 (file)
--- a/alloc.h
+++ b/alloc.h
@@ -22,6 +22,7 @@
 int     easprintf(char **, const char *, ...) __printflike(2, 3);
 int     evasprintf(char **, const char *, va_list) __printflike(2, 0);
 void    efree(void *);
+void   *ecalloc(size_t, size_t);
 void   *emalloc(size_t);
 void   *emalloc2(size_t, size_t);
 void   *erealloc(void *, size_t);
@@ -32,6 +33,7 @@ char  *estrdup(const char *);
 int     easprintf();
 int     evasprintf();
 void    efree();
+void   *ecalloc();
 void   *emalloc();
 void   *emalloc2();
 void   *erealloc();