diff -urpN 179-a/src/MSCHAPv2_fmt_plug.c john-1.7.9-a/src/MSCHAPv2_fmt_plug.c
--- 179-a/src/MSCHAPv2_fmt_plug.c	2011-11-29 22:26:42.318500000 +0000
+++ john-1.7.9-a/src/MSCHAPv2_fmt_plug.c	2011-11-30 14:32:55.724750000 +0000
@@ -89,7 +89,6 @@ static uchar (*saved_key)[21];
 static uchar (*output)[PARTIAL_BINARY_SIZE];
 static uchar *challenge;
 static int keys_prepared;
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 #include "unicode.h"
 
@@ -107,15 +106,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_calloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_calloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
 	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	setzero(saved_plain);
-	setzero(saved_len);
-	setzero(saved_key);
-	setzero(output);
-
 }
 
 static int mschapv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETLM_fmt_plug.c john-1.7.9-a/src/NETLM_fmt_plug.c
--- 179-a/src/NETLM_fmt_plug.c	2011-11-29 22:26:42.334125000 +0000
+++ john-1.7.9-a/src/NETLM_fmt_plug.c	2011-11-30 14:33:38.006000000 +0000
@@ -88,7 +88,6 @@ static uchar (*saved_key)[21];
 static uchar (*saved_plain)[PLAINTEXT_LENGTH + 1];
 static uchar (*output)[PARTIAL_BINARY_SIZE];
 static uchar *challenge;
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 static void init(struct fmt_main *pFmt)
 {
@@ -104,12 +103,9 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	setzero(saved_key);
-	setzero(saved_plain);
-	setzero(output);
+	saved_key = mem_calloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_calloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int netlm_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETLMv2_fmt_plug.c john-1.7.9-a/src/NETLMv2_fmt_plug.c
--- 179-a/src/NETLMv2_fmt_plug.c	2011-11-29 22:26:42.334125000 +0000
+++ john-1.7.9-a/src/NETLMv2_fmt_plug.c	2011-11-30 14:33:57.537250000 +0000
@@ -98,7 +98,6 @@ static uchar (*output)[BINARY_SIZE];
 static HMACMD5Context (*saved_ctx);
 static int keys_prepared;
 static unsigned char *challenge;
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
 #if (SIZEOF_SHORT == 4)
@@ -132,14 +131,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	setzero(saved_plain);
-	setzero(saved_len);
-	setzero(output);
-	setzero(saved_ctx);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_calloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_calloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_calloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int netlmv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETNTLM_fmt_plug.c john-1.7.9-a/src/NETNTLM_fmt_plug.c
--- 179-a/src/NETNTLM_fmt_plug.c	2011-11-29 22:26:42.349750000 +0000
+++ john-1.7.9-a/src/NETNTLM_fmt_plug.c	2011-11-30 14:34:09.693500000 +0000
@@ -102,7 +102,6 @@ static uchar (*output)[PARTIAL_BINARY_SI
 static uchar (*saved_key)[21]; // NT hash
 static uchar *challenge;
 static int keys_prepared;
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 static void init(struct fmt_main *pFmt)
 {
@@ -118,14 +117,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	setzero(saved_plain);
-	setzero(saved_len);
-	setzero(output);
-	setzero(saved_key);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_calloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_calloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_key = mem_calloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
 }
 
 static int netntlm_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETNTLMv2_fmt_plug.c john-1.7.9-a/src/NETNTLMv2_fmt_plug.c
--- 179-a/src/NETNTLMv2_fmt_plug.c	2011-11-29 22:26:42.365375000 +0000
+++ john-1.7.9-a/src/NETNTLMv2_fmt_plug.c	2011-11-30 14:34:23.709125000 +0000
@@ -105,7 +105,6 @@ static uchar (*output)[BINARY_SIZE];
 static HMACMD5Context (*saved_ctx);
 static uchar *challenge;
 static int keys_prepared;
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 #if !defined(uint16) && !defined(HAVE_UINT16_FROM_RPC_RPC_H)
 #if (SIZEOF_SHORT == 4)
@@ -139,14 +138,10 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	setzero(saved_plain);
-	setzero(saved_len);
-	setzero(output);
-	setzero(saved_ctx);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_len = mem_calloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_calloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_calloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int netntlmv2_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/NETSPLITLM_fmt_plug.c john-1.7.9-a/src/NETSPLITLM_fmt_plug.c
--- 179-a/src/NETSPLITLM_fmt_plug.c	2011-11-29 22:26:42.365375000 +0000
+++ john-1.7.9-a/src/NETSPLITLM_fmt_plug.c	2011-11-30 14:34:33.552875000 +0000
@@ -67,7 +67,6 @@ static uchar (*saved_plain)[PLAINTEXT_LE
 static uchar (*saved_pre)[8];
 static uchar (*output)[BINARY_SIZE];
 static uchar *challenge;
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
 
 
 static void init(struct fmt_main *pFmt)
@@ -84,12 +83,9 @@ static void init(struct fmt_main *pFmt)
 		n = MAX_KEYS_PER_CRYPT;
 	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	saved_pre = mem_alloc_tiny(sizeof(*saved_pre) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	output = mem_alloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	setzero(saved_plain);
-	setzero(saved_pre);
-	setzero(output);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	saved_pre = mem_calloc_tiny(sizeof(*saved_pre) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
+	output = mem_calloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
 }
 
 static int nethalflm_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/XSHA512_fmt.c john-1.7.9-a/src/XSHA512_fmt.c
--- 179-a/src/XSHA512_fmt.c	2011-11-29 22:26:42.381000000 +0000
+++ john-1.7.9-a/src/XSHA512_fmt.c	2011-11-30 14:38:59.787250000 +0000
@@ -49,20 +49,20 @@ static struct fmt_tests tests[] = {
 };
 
 static char (*saved_key)[PLAINTEXT_LENGTH + 1];
-static int saved_key_length[MAX_KEYS_PER_CRYPT];
-#define setzero(var) memset(var, 0, sizeof(*var) * pFmt->params.max_keys_per_crypt)
+static int (*saved_key_length);
+static ARCH_WORD_32 (*crypt_out)[16];
 
 #ifdef PRECOMPUTE_CTX_FOR_SALT
 static SHA512_CTX ctx_salt;
 #else
 static ARCH_WORD_32 saved_salt;
 #endif
-static ARCH_WORD_32 crypt_out[MAX_KEYS_PER_CRYPT][16];
 
 static void init(struct fmt_main *pFmt)
 {
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_NONE);
-	setzero(saved_key);
+	saved_key = mem_calloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	saved_key_length = mem_calloc_tiny(sizeof(*saved_key_length) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	crypt_out = mem_calloc_tiny(sizeof(*crypt_out) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
 }
 
 static int valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/memory.c john-1.7.9-a/src/memory.c
--- 179-a/src/memory.c	2011-11-29 19:25:41.256000000 +0000
+++ john-1.7.9-a/src/memory.c	2011-11-30 14:30:21.552875000 +0000
@@ -88,6 +88,12 @@ void *mem_alloc_tiny(size_t size, size_t
 	return (void *)start;
 }
 
+void *mem_calloc_tiny(size_t size, size_t align) {
+	char *cp = (char*) mem_alloc_tiny(size, align);
+	memset(cp, 0, size);
+	return cp;
+}
+
 void *mem_alloc_copy(size_t size, size_t align, void *src)
 {
 	return memcpy(mem_alloc_tiny(size, align), src, size);
diff -urpN 179-a/src/memory.h john-1.7.9-a/src/memory.h
--- 179-a/src/memory.h	2011-11-29 19:25:41.256000000 +0000
+++ john-1.7.9-a/src/memory.h	2011-11-30 14:30:25.256000000 +0000
@@ -71,6 +71,11 @@ extern void *mem_alloc(size_t size);
  * This one is used to reduce the overhead.
  */
 extern void *mem_alloc_tiny(size_t size, size_t align);
+/*
+ * this version same as mem_alloc_tiny, but initialized the memory
+ * to NULL bytes, like CALLOC(3) function does
+ */
+extern void *mem_calloc_tiny(size_t size, size_t align);
 
 /*
  * Uses mem_alloc_tiny() to allocate the memory, and copies src in there.
diff -urpN 179-a/src/mscash1_fmt_plug.c john-1.7.9-a/src/mscash1_fmt_plug.c
--- 179-a/src/mscash1_fmt_plug.c	2011-11-29 20:05:31.459125000 +0000
+++ john-1.7.9-a/src/mscash1_fmt_plug.c	2011-11-30 14:32:31.787250000 +0000
@@ -125,17 +125,11 @@ static void init(struct fmt_main *pFmt)
 	fmt_mscash.params.max_keys_per_crypt = nmax;
 #endif
 
-	ms_buffer1x = mem_alloc_tiny(sizeof(ms_buffer1x[0]) * 16*MS_NUM_KEYS, MEM_ALIGN_NONE);
-	output1x    = mem_alloc_tiny(sizeof(output1x[0])    * 4*MS_NUM_KEYS, MEM_ALIGN_NONE);
-	crypt       = mem_alloc_tiny(sizeof(crypt[0])       * 4*MS_NUM_KEYS, MEM_ALIGN_NONE);
-	last        = mem_alloc_tiny(sizeof(last[0])        * 4*MS_NUM_KEYS, MEM_ALIGN_NONE);
-	last_i      = mem_alloc_tiny(sizeof(last_i[0])      *   MS_NUM_KEYS, MEM_ALIGN_NONE);
-	memset(output1x,0,sizeof(output1x[0])*4*MS_NUM_KEYS);
-	memset(crypt,0,sizeof(crypt[0])*4*MS_NUM_KEYS);
-	memset(last,0,sizeof(last[0])*4*MS_NUM_KEYS);
-
-	memset(ms_buffer1x,0,sizeof(ms_buffer1x[0])*16*MS_NUM_KEYS);
-	memset(last_i,0,sizeof(last_i[0])*MS_NUM_KEYS);
+	ms_buffer1x = mem_calloc_tiny(sizeof(ms_buffer1x[0]) * 16*MS_NUM_KEYS, MEM_ALIGN_WORD);
+	output1x    = mem_calloc_tiny(sizeof(output1x[0])    *  4*MS_NUM_KEYS, MEM_ALIGN_WORD);
+	crypt       = mem_calloc_tiny(sizeof(crypt[0])       *  4*MS_NUM_KEYS, MEM_ALIGN_WORD);
+	last        = mem_calloc_tiny(sizeof(last[0])        *  4*MS_NUM_KEYS, MEM_ALIGN_WORD);
+	last_i      = mem_calloc_tiny(sizeof(last_i[0])      *    MS_NUM_KEYS, MEM_ALIGN_WORD);
 
 	new_key=1;
 
diff -urpN 179-a/src/mskrb5_fmt_plug.c john-1.7.9-a/src/mskrb5_fmt_plug.c
--- 179-a/src/mskrb5_fmt_plug.c	2011-11-29 22:26:42.396625000 +0000
+++ john-1.7.9-a/src/mskrb5_fmt_plug.c	2011-11-30 14:33:22.068500000 +0000
@@ -97,14 +97,12 @@ static char (*saved_plain)[(PLAINTEXT_LE
 static int (*saved_len);
 static char (*output)[CRYPT_BINARY_SIZE];
 static HMACMD5Context (*saved_ctx);
-#define setzero(var) memset(var, 0, sizeof(*var) * fmt_mskrb5.params.max_keys_per_crypt)
 
 static int keys_prepared;
 static unsigned char *saltblob = NULL;
 #define CHECKSUM  saltblob
 #define TIMESTAMP &saltblob[CHECKSUM_SIZE]
 
-extern struct fmt_main fmt_mskrb5;
 static void init(struct fmt_main *pFmt)
 {
 #ifdef _OPENMP
@@ -113,20 +111,16 @@ static void init(struct fmt_main *pFmt)
 		n = MIN_KEYS_PER_CRYPT;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_mskrb5.params.min_keys_per_crypt = n;
+	pFmt->params.min_keys_per_crypt = n;
 	n = n * (n << 1) * THREAD_RATIO;
 	if (n > MAX_KEYS_PER_CRYPT)
 		n = MAX_KEYS_PER_CRYPT;
-	fmt_mskrb5.params.max_keys_per_crypt = n;
+	pFmt->params.max_keys_per_crypt = n;
 #endif
-	saved_plain = mem_alloc_tiny(sizeof(*saved_plain) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_len = mem_alloc_tiny(sizeof(*saved_len) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	output = mem_alloc_tiny(sizeof(*output) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	saved_ctx = mem_alloc_tiny(sizeof(*saved_ctx) * fmt_mskrb5.params.max_keys_per_crypt, MEM_ALIGN_WORD);
-	setzero(saved_plain);
-	setzero(saved_len);
-	setzero(output);
-	setzero(saved_ctx);
+	saved_plain = mem_calloc_tiny(sizeof(*saved_plain) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_len = mem_calloc_tiny(sizeof(*saved_len) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	output = mem_calloc_tiny(sizeof(*output) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
+	saved_ctx = mem_calloc_tiny(sizeof(*saved_ctx) * pFmt->params.max_keys_per_crypt, MEM_ALIGN_WORD);
 
 	if (options.utf8) {
 		tests[1].plaintext = "\xC3\xBC"; // German u-umlaut in UTF-8
diff -urpN 179-a/src/sapB_fmt_plug.c john-1.7.9-a/src/sapB_fmt_plug.c
--- 179-a/src/sapB_fmt_plug.c	2011-11-29 19:25:30.537250000 +0000
+++ john-1.7.9-a/src/sapB_fmt_plug.c	2011-11-30 14:34:46.599750000 +0000
@@ -82,21 +82,16 @@ static char (*saved_key)[PLAINTEXT_LENGT
 static ARCH_WORD_32 (*crypt_key)[BINARY_SIZE/sizeof(ARCH_WORD_32)];
 static char (*pwConverted)[PLAINTEXT_LENGTH+1];
 static int (*strlenPW);
-#define setzero(var) memset(var, 0, sizeof(*var) * MAX_KEYS_PER_CRYPT)
 
 static char unConverted[SALT_SIZE+1];
 static int strlenUN;
 
 static void sapbcode_init(struct fmt_main *pFmt)
 {
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
-	crypt_key = mem_alloc_tiny(sizeof(*crypt_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
-	pwConverted = mem_alloc_tiny(sizeof(*pwConverted) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
-	strlenPW = mem_alloc_tiny(sizeof(*strlenPW) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
-	setzero(saved_key);
-	setzero(crypt_key);
-	setzero(pwConverted);
-	setzero(strlenPW);
+	saved_key = mem_calloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	crypt_key = mem_calloc_tiny(sizeof(*crypt_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	pwConverted = mem_calloc_tiny(sizeof(*pwConverted) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	strlenPW = mem_calloc_tiny(sizeof(*strlenPW) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
 }
 
 static int sapbcode_valid(char *ciphertext, struct fmt_main *pFmt)
diff -urpN 179-a/src/sapG_fmt_plug.c john-1.7.9-a/src/sapG_fmt_plug.c
--- 179-a/src/sapG_fmt_plug.c	2011-11-29 19:25:30.552875000 +0000
+++ john-1.7.9-a/src/sapG_fmt_plug.c	2011-11-30 14:34:59.443500000 +0000
@@ -71,21 +71,16 @@ static char (*saved_key)[PLAINTEXT_LENGT
 static UTF8 (*trPassword)[PLAINTEXT_LENGTH + 1];
 static int (*pwLen);
 static ARCH_WORD_32 (*crypt_key)[BINARY_SIZE / sizeof(ARCH_WORD_32)];
-#define setzero(var) memset(var, 0, sizeof(*var) * MAX_KEYS_PER_CRYPT)
 
 static char theSalt[SALT_SIZE];
 static unsigned int unLen;
 
 static void sapcodvng_init(struct fmt_main *pFmt)
 {
-	saved_key = mem_alloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
-	trPassword = mem_alloc_tiny(sizeof(*trPassword) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
-	pwLen = mem_alloc_tiny(sizeof(*pwLen) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
-	crypt_key = mem_alloc_tiny(sizeof(*crypt_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
-	setzero(saved_key);
-	setzero(trPassword);
-	setzero(pwLen);
-	setzero(crypt_key);
+	saved_key = mem_calloc_tiny(sizeof(*saved_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	trPassword = mem_calloc_tiny(sizeof(*trPassword) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_NONE);
+	pwLen = mem_calloc_tiny(sizeof(*pwLen) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
+	crypt_key = mem_calloc_tiny(sizeof(*crypt_key) * MAX_KEYS_PER_CRYPT, MEM_ALIGN_WORD);
 }
 
 static int sapcodvng_valid(char *ciphertext, struct fmt_main *pFmt)
