diff --git a/src/pike_memory.c b/src/pike_memory.c
index a97b599f4d67c7cf398433f0b2bee2fa5ff046df..929a8d12a682939e5b65be3e7f42acd6d500139c 100644
--- a/src/pike_memory.c
+++ b/src/pike_memory.c
@@ -9,7 +9,7 @@
 #include "pike_macros.h"
 #include "gc.h"
 
-RCSID("$Id: pike_memory.c,v 1.23 1998/04/17 17:17:39 hubbe Exp $");
+RCSID("$Id: pike_memory.c,v 1.24 1998/04/24 00:02:45 hubbe Exp $");
 
 /* strdup() is used by several modules, so let's provide it */
 #ifndef HAVE_STRDUP
@@ -461,6 +461,7 @@ static struct memhdr *find_memhdr(void *p);
 
 int verbose_debug_malloc = 0;
 int verbose_debug_exit = 1;
+int debug_malloc_check_all = 0;
 
 #define HSIZE 1109891
 #define LHSIZE 1109891
@@ -510,7 +511,7 @@ static struct memhdr no_leak_memlocs;
 static int file_location_number=0;
 
 #if DEBUG_MALLOC_PAD - 0 > 0
-char *do_pad(char *mem, size_t size)
+char *do_pad(char *mem, long size)
 {
   long q,e;
   mem+=DEBUG_MALLOC_PAD;
@@ -529,18 +530,22 @@ char *do_pad(char *mem, size_t size)
   return mem;
 }
 
-void check_pad(struct memhdr *mh)
+void check_pad(struct memhdr *mh, int freeok)
 {
   long q,e;
   char *mem=mh->data;
-  size_t size;
-  if(mh->size < 0)
+  long size=mh->size;
+  if(size < 0)
   {
-    fprintf(stderr,"Freeing block %p twice (size %ld)!\n",mem, ~mh->size);
-    dump_memhdr_locations(mh, 0);
-    abort();
+    if(!freeok)
+    {
+      fprintf(stderr,"Access to free block: %p (size %ld)!\n",mem, ~mh->size);
+      dump_memhdr_locations(mh, 0);
+      abort();
+    }else{
+      size = ~size;
+    }
   }
-  size=mh->size;
   q= (((long)mem) ^ 0x555555) + (size * 9248339);
 
 /*  fprintf(stderr,"Checking %p(%d) %ld\n",mem, size, q);  */
@@ -551,13 +556,13 @@ void check_pad(struct memhdr *mh)
     q=(q<<13) ^ ~(q>>5);
     if(mem[e-DEBUG_MALLOC_PAD] != tmp)
     {
-      fprintf(stderr,"Pre-padding overwritten for block at %p (size %d) (e=%ld %d!=%d)!\n",mem, size, e, tmp, mem[e-DEBUG_MALLOC_PAD]);
+      fprintf(stderr,"Pre-padding overwritten for block at %p (size %ld) (e=%ld %d!=%d)!\n",mem, size, e, tmp, mem[e-DEBUG_MALLOC_PAD]);
       dump_memhdr_locations(mh, 0);
       abort();
     }
     if(mem[size+e] != tmp)
     {
-      fprintf(stderr,"Post-padding overwritten for block at %p (size %d) (e=%ld %d!=%d)!\n",mem, size, e, tmp, mem[e-DEBUG_MALLOC_PAD]);
+      fprintf(stderr,"Post-padding overwritten for block at %p (size %ld) (e=%ld %d!=%d)!\n",mem, size, e, tmp, mem[e-DEBUG_MALLOC_PAD]);
       dump_memhdr_locations(mh, 0);
       abort();
     }
@@ -566,7 +571,7 @@ void check_pad(struct memhdr *mh)
 }
 #else
 #define do_pad(X,Y) (X)
-#define check_pad(M)
+#define check_pad(M,X)
 #endif
 
 static int location_number(const char *file, int line)
@@ -660,7 +665,22 @@ BLOCK_ALLOC(memhdr,16382)
 static struct memhdr *find_memhdr(void *p)
 {
   struct memhdr *mh,**prev;
-  unsigned long h=(long)p;
+  unsigned long h;
+
+#if DEBUG_MALLOC_PAD - 0 > 0
+  if(debug_malloc_check_all)
+  {
+    for(h=0;h<HSIZE;h++)
+    {
+      for(mh=hash[h]; mh; mh=mh->next)
+      {
+	check_pad(mh,1);
+      }
+    }
+  }
+#endif
+
+  h=(long)p;
   h%=HSIZE;
   for(prev=hash+h; (mh=*prev); prev=&mh->next)
   {
@@ -669,7 +689,7 @@ static struct memhdr *find_memhdr(void *p)
       *prev=mh->next;
       mh->next=hash[h];
       hash[h]=mh;
-      check_pad(mh);
+      check_pad(mh,0);
       return mh;
     }
   }
@@ -760,7 +780,7 @@ static int remove_memhdr(void *p, int already_gone)
     if(mh->data==p)
     {
       if(mh->size < 0) mh->size=~mh->size;
-      if(!already_gone) check_pad(mh);
+      if(!already_gone) check_pad(mh,0);
 
       *prev=mh->next;
       low_add_marks_to_memhdr(&no_leak_memlocs, mh);