MEDIUM: memory: add the ability to poison memory at run time

From time to time, some bugs are discovered that are caused by non-initialized
memory areas. It happens that most platforms return a zero-filled area upon
first malloc() thus hiding potential bugs. This patch also replaces malloc()
in pools with calloc() to ensure that all platforms exhibit the same behaviour
upon startup. In order to catch these bugs more easily, add a -dM command line
flag to enable memory poisonning. Optionally, passing -dM<byte> forces the
poisonning byte to <byte>.
diff --git a/src/haproxy.c b/src/haproxy.c
index 776f0dd..1704335 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -222,6 +222,7 @@
 		"        [ -p <pidfile> ] [ -m <max megs> ] [ -C <dir> ]\n"
 		"        -v displays version ; -vv shows known build options.\n"
 		"        -d enters debug mode ; -db only disables background mode.\n"
+		"        -dM[<byte>] poisons memory with <byte> (defaults to 0x50)\n"
 		"        -V enters verbose mode (disables quiet mode)\n"
 		"        -D goes daemon ; -C changes to <dir> before loading files.\n"
 		"        -q quiet mode : don't display messages\n"
@@ -451,6 +452,8 @@
 				arg_mode |= MODE_VERBOSE;
 			else if (*flag == 'd' && flag[1] == 'b')
 				arg_mode |= MODE_FOREGROUND;
+			else if (*flag == 'd' && flag[1] == 'M')
+				mem_poison_byte = flag[2] ? strtol(flag + 2, NULL, 0) : 'P';
 			else if (*flag == 'd')
 				arg_mode |= MODE_DEBUG;
 			else if (*flag == 'c')
diff --git a/src/memory.c b/src/memory.c
index 36db92e..128f6ef 100644
--- a/src/memory.c
+++ b/src/memory.c
@@ -19,6 +19,7 @@
 #include <proto/log.h>
 
 static struct list pools = LIST_HEAD_INIT(pools);
+char mem_poison_byte = 0;
 
 /* Try to find an existing shared pool with the same characteristics and
  * returns it, otherwise creates this one. NULL is returned if no memory
@@ -87,13 +88,15 @@
 
 	if (pool->limit && (pool->allocated >= pool->limit))
 		return NULL;
-	ret = MALLOC(pool->size);
+	ret = CALLOC(1, pool->size);
 	if (!ret) {
 		pool_gc2();
-		ret = MALLOC(pool->size);
+		ret = CALLOC(1, pool->size);
 		if (!ret)
 			return NULL;
 	}
+	if (mem_poison_byte)
+		memset(ret, mem_poison_byte, pool->size);
 	pool->allocated++;
 	pool->used++;
 	return ret;