develooper Front page | perl.perl5.porters | Postings from August 2001

RE: [PATCH] [ID 20000519.006] Malloc coredump madness - try#2

From:
Wilson, Doug
Date:
August 24, 2001 10:34
Subject:
RE: [PATCH] [ID 20000519.006] Malloc coredump madness - try#2
Message ID:
35A280DF784CD411A06B0008C7B130ADB5511C@sdex04.sd.intuit.com

With the understanding that this is still wide open for
review...

I was poking about the source code some more, realized that
some people might actually use 64bit integers :), and that
you can get in trouble whenever you do math within a New()
statement, and thought this might be better (you could also
roll the HAS_64K_LIMIT check into here, or would that be going
too far?):

--- handy.orig  Fri Aug 24 09:30:59 2001
+++ handy.h     Fri Aug 24 09:56:12 2001
@@ -202,6 +202,12 @@
 
 #endif
 
+#ifdef USE_64_BIT_ALL
+# define MEM_SIZE_MAX IV_MAX
+#else
+# define MEM_SIZE_MAX I32_MAX
+#endif
+
 /* log(2) is pretty close to  0.30103, just in case anyone is grepping for
it */
 #define BIT_DIGITS(N)   (((N)*146)/485 + 1)  /* log2(10) =~ 146/485 */
 #define TYPE_DIGITS(T)  BIT_DIGITS(sizeof(T) * 8)
@@ -575,14 +581,22 @@
 
 #ifndef LEAKTEST
 
-#define New(x,v,n,t)   (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t))))
-#define Newc(x,v,n,t,c)        (v =
(c*)safemalloc((MEM_SIZE)((n)*sizeof(t))))
-#define Newz(x,v,n,t)  (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))), \
-                       memzero((char*)(v), (n)*sizeof(t))
-#define Renew(v,n,t) \
-         (v = (t*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
-#define Renewc(v,n,t,c) \
-         (v = (c*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t))))
+#define New(x,v,n,t)   ((((n) < 0) || ((n) > (MEM_SIZE_MAX/sizeof(t)))) \
+    ? (Perl_croak_nocontext("panic: malloc"), v) \
+    : (v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))))
+#define Newc(x,v,n,t,c) ((((n) < 0) || ((n) > (MEM_SIZE_MAX/sizeof(t)))) \
+    ? (Perl_croak_nocontext("panic: malloc"), v) \
+    : (v = (c*)safemalloc((MEM_SIZE)((n)*sizeof(t)))))
+#define Newz(x,v,n,t)  ((((n) < 0) || ((n) > (MEM_SIZE_MAX/sizeof(t)))) \
+    ? (Perl_croak_nocontext("panic: malloc"), v) \
+    : ((v = (t*)safemalloc((MEM_SIZE)((n)*sizeof(t)))), \
+       memzero((char*)(v), (n)*sizeof(t))))
+#define Renew(v,n,t)   ((((n) < 0) || ((n) > (MEM_SIZE_MAX/sizeof(t)))) \
+    ? (Perl_croak_nocontext("panic: malloc"), v) \
+    : (v = (t*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))))
+#define Renewc(v,n,t,c) ((((n) < 0) || ((n) > (MEM_SIZE_MAX/sizeof(t)))) \
+    ? (Perl_croak_nocontext("panic: malloc"), v) \
+    : (v = (c*)saferealloc((Malloc_t)(v),(MEM_SIZE)((n)*sizeof(t)))))
 #define Safefree(d)    safefree((Malloc_t)(d))
 
 #else /* LEAKTEST */



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About