- Made sure some changed behavior is documented in CHANGES.
 - Moved the handling of compile-time defaults from crypto.h to
   mem_dbg.c, since it doesn't make sense for the library users to try
   to affect this without recompiling libcrypto.
 - Made sure V_CRYPTO_MDEBUG_TIME and V_CRYPTO_MDEBUG_THREAD had clear
   and constant definitions.
 - Aesthetic correction.
diff --git a/CHANGES b/CHANGES
index e158dcd..c71f74a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,12 @@
      memory debugging code.  OpenSSL already comes with code that finds
      memory leaks, but this gives people a chance to debug other memory
      problems.
+
+     This change means that a call `CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON)'
+     is no longer dependent on if the macro CRYPTO_MDEBUG or friends were
+     used when the OpenSSL libcrypto was built.  This is under debate and
+     may change back, but with another option to still get debugging even
+     if the library wasn't compiled that way.
      [Richard Levitte]
 
   *) Some S/MIME fixes. The OID for SMIMECapabilities was wrong, the
diff --git a/crypto/crypto.h b/crypto/crypto.h
index 0a76c77..863b4e9 100644
--- a/crypto/crypto.h
+++ b/crypto/crypto.h
@@ -149,6 +149,14 @@
 #define CRYPTO_MEM_CHECK_ENABLE	0x2	/* a bit */
 #define CRYPTO_MEM_CHECK_DISABLE 0x3	/* an enume */
 
+/* The following are bit values to turn on or off options connected to the
+ * malloc checking functionality */
+
+/* Adds time to the memory checking information */
+#define V_CRYPTO_MDEBUG_TIME	0x1 /* a bit */
+/* Adds thread number to the memory checking information */
+#define V_CRYPTO_MDEBUG_THREAD	0x2 /* a bit */
+
 /*
 typedef struct crypto_mem_st
 	{
@@ -196,35 +204,13 @@
 #define CRYPTO_EX_INDEX_X509_STORE	4
 #define CRYPTO_EX_INDEX_X509_STORE_CTX	5
 
+
 /* This is the default callbacks, but we can have others as well */
 #define CRYPTO_malloc_init()	CRYPTO_set_mem_functions(\
 	(char *(*)())malloc,\
 	(char *(*)())realloc,\
 	(void (*)())free)
 
-
-
-#ifdef CRYPTO_MDEBUG_ALL
-# ifndef CRYPTO_MDEBUG_TIME
-#  define CRYPTO_MDEBUG_TIME
-# endif
-# ifndef CRYPTO_MDEBUG_THREAD
-#  define CRYPTO_MDEBUG_THREAD
-# endif
-#endif
-
-/* Magic to make sure we get correct values */
-#ifdef CRYPTO_MDEBUG_TIME
-#define V_CRYPTO_MDEBUG_TIME 1
-#else
-#define V_CRYPTO_MDEBUG_TIME 0
-#endif
-#ifdef CRYPTO_MDEBUG_THREAD
-#define V_CRYPTO_MDEBUG_THREAD 2
-#else
-#define V_CRYPTO_MDEBUG_THREAD 0
-#endif
-
 #define CRYPTO_malloc_debug_init()	do {\
 	CRYPTO_set_mem_debug_functions(\
 		(void (*)())CRYPTO_dbg_malloc,\
@@ -232,10 +218,9 @@
 		(void (*)())CRYPTO_dbg_free,\
 		(void (*)())CRYPTO_dbg_set_options,\
 		(void (*)())CRYPTO_dbg_get_options);\
-	CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_TIME|V_CRYPTO_MDEBUG_THREAD);\
 	} while(0);
 
-#if defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD
+#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD
 # ifndef CRYPTO_MDEBUG /* avoid duplicate #define */
 #  define CRYPTO_MDEBUG
 # endif
@@ -329,7 +314,7 @@
  */
 void CRYPTO_dbg_malloc(void *addr,int num,const char *file,int line,int before_p);
 void CRYPTO_dbg_realloc(void *addr1,void *addr2,int num,const char *file,int line,int before_p);
-void CRYPTO_dbg_free(void *,int before_p);
+void CRYPTO_dbg_free(void *addr,int before_p);
 
 /* Tell the debugging code about options.  By default, the following values
  * apply:
diff --git a/crypto/mem_dbg.c b/crypto/mem_dbg.c
index 3465ec2..4bddbe0 100644
--- a/crypto/mem_dbg.c
+++ b/crypto/mem_dbg.c
@@ -106,7 +106,29 @@
 	APP_INFO *app_info;
 	} MEM;
 
-static int options = V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD;
+
+#ifdef CRYPTO_MDEBUG_ALL
+# ifndef CRYPTO_MDEBUG_TIME
+#  define CRYPTO_MDEBUG_TIME
+# endif
+# ifndef CRYPTO_MDEBUG_THREAD
+#  define CRYPTO_MDEBUG_THREAD
+# endif
+#endif
+
+/* Get defaults that will depend on some macros defined elsewhere */
+#ifdef CRYPTO_MDEBUG_TIME
+#define DEF_V_CRYPTO_MDEBUG_TIME V_CRYPTO_MDEBUG_TIME
+#else
+#define DEF_V_CRYPTO_MDEBUG_TIME 0
+#endif
+#ifdef CRYPTO_MDEBUG_THREAD
+#define DEF_V_CRYPTO_MDEBUG_THREAD V_CRYPTO_MDEBUG_THREAD
+#else
+#define DEF_V_CRYPTO_MDEBUG_THREAD 0
+#endif
+
+static int options = DEF_V_CRYPTO_MDEBUG_TIME | DEF_V_CRYPTO_MDEBUG_THREAD;
 
 
 int CRYPTO_mem_ctrl(int mode)