diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-19 10:50:39 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-19 10:50:39 +0200 |
commit | be0301f45850ca70db0f2ec8258e73615a0ec7be (patch) | |
tree | 4342fe3532728924212e2f60ace3c0de5323c6a0 /sys/src/ape | |
parent | feb58cce49491a980012c42b9a2decc671e32f6c (diff) |
calloc: check multiplication overflow
Diffstat (limited to 'sys/src/ape')
-rw-r--r-- | sys/src/ape/lib/ap/gen/calloc.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/src/ape/lib/ap/gen/calloc.c b/sys/src/ape/lib/ap/gen/calloc.c index e52210d84..c080c7b3d 100644 --- a/sys/src/ape/lib/ap/gen/calloc.c +++ b/sys/src/ape/lib/ap/gen/calloc.c @@ -2,12 +2,14 @@ #include <string.h> void * -calloc(size_t nmemb, size_t size) +calloc(size_t n, size_t s) { - void *mp; + void *v; - nmemb = nmemb*size; - if(mp = malloc(nmemb)) - memset(mp, 0, nmemb); - return(mp); + if(n > 1 && ((size_t)-1)/n < s) + return 0; + n *= s; + if(v = malloc(n)) + memset(v, 0, n); + return v; } |