From 79c6ce1048f058ba6417d81b76e60caa3c6428a2 Mon Sep 17 00:00:00 2001
From: magnum <magnum>
Date: Mon, 14 Nov 2011 13:54:05 +0100
Subject: [PATCH 19/19] j8: mssql formats, regression fix

---
 src/Makefile             |    3 +++
 src/mssql-old_fmt_plug.c |   13 +++++++------
 src/mssql05_fmt_plug.c   |   15 ++++++++-------
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/src/Makefile b/src/Makefile
index 1e2e1cb..0f5fb76 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1346,6 +1346,9 @@ test:
 test_full:
 	cd ../test && ./tstall
 
+test_utf8:
+	cd ../test && ./tstall utf8
+
 clean:
 	$(RM) $(PROJ) $(PROJ_DOS) $(PROJ_WIN32) $(PROJ_WIN32_MINGW)
 	$(RM) ../run/john.exe john-macosx-* *.o *.bak core
diff --git a/src/mssql-old_fmt_plug.c b/src/mssql-old_fmt_plug.c
index 6462c99..927c1e9 100644
--- a/src/mssql-old_fmt_plug.c
+++ b/src/mssql-old_fmt_plug.c
@@ -175,7 +175,7 @@ static void set_key(char *key, int index) {
 	int utf8len, orig_len;
 #ifdef MMX_COEF
 	int i;
-	strnzcpy(plain_keys[index], key, PLAINTEXT_LENGTH);
+	strnzcpy(plain_keys[index], key, PLAINTEXT_LENGTH + 1);
 #else
 	plain_keys[index] = key;
 #endif
@@ -192,7 +192,7 @@ static void set_key(char *key, int index) {
 		for (j=0; j<SHA1_SSE_PARA; j++)
 			memset(saved_key+j*4*80*MMX_COEF, 0, 60*MMX_COEF);
 #else
-		memset(saved_key, 0, 64*MMX_COEF);
+		memset(saved_key, 0, 60*MMX_COEF);
 		total_len = 0;
 #endif
 	}
@@ -219,13 +219,14 @@ static void set_key_enc(char *key, int index) {
 	int utf16len;
 
 #ifdef MMX_COEF
-	strnzcpy(plain_keys[index], key, PLAINTEXT_LENGTH*3);
+	strnzcpy(plain_keys[index], key, PLAINTEXT_LENGTH*3 + 1);
 #else
 	plain_keys[index] = key;
 #endif
 	utf16len = enc_to_utf16(utf16key_tmp, PLAINTEXT_LENGTH, (unsigned char*)key, utf8len);
 	if (utf16len <= 0) {
 		utf8len = -utf16len;
+		plain_keys[index][utf8len] = 0; // match truncation!
 		if (utf16len != 0)
 			utf16len = strlen16(utf16key_tmp);
 	}
@@ -241,7 +242,7 @@ static void set_key_enc(char *key, int index) {
 		for (j=0; j<SHA1_SSE_PARA; j++)
 			memset(saved_key+j*4*80*MMX_COEF, 0, 60*MMX_COEF);
 #else
-		memset(saved_key, 0, 64*MMX_COEF);
+		memset(saved_key, 0, 60*MMX_COEF);
 		total_len = 0;
 #endif
 	}
@@ -274,11 +275,11 @@ static void set_key_enc(char *key, int index) {
 }
 
 static char *get_key(int index) {
-	static UTF8 UC_Key[PLAINTEXT_LENGTH*3*3+1];
+	static UTF8 UC_Key[PLAINTEXT_LENGTH*3+1];
 	// Calling this will ONLY upcase characters 'valid' in the code page. There are MANY
 	// code pages which mssql WILL upcase the letter (in UCS-2), but there is no upper case value
 	// in the code page.  Thus we MUST keep the lower cased letter in this case.
-	enc_uc(UC_Key, PLAINTEXT_LENGTH*3*3, (UTF8*)plain_keys[index], strlen(plain_keys[index]));
+	enc_uc(UC_Key, PLAINTEXT_LENGTH*3, (UTF8*)plain_keys[index], strlen(plain_keys[index]));
 	return (char*)UC_Key;
 }
 
diff --git a/src/mssql05_fmt_plug.c b/src/mssql05_fmt_plug.c
index 5d1c591..3f86330 100644
--- a/src/mssql05_fmt_plug.c
+++ b/src/mssql05_fmt_plug.c
@@ -195,14 +195,14 @@ static void init(struct fmt_main *pFmt)
 
 static void set_key(char *_key, int index) {
 	unsigned char *key = (unsigned char*)_key;
-	int len;
 #ifdef MMX_COEF
+	int len;
 	int i;
-	strnzcpy(plain_keys[index], _key, PLAINTEXT_LENGTH);
+	strnzcpy(plain_keys[index], _key, PLAINTEXT_LENGTH + 1);
+	len = strlen(_key);
 #else
-	plain_keys[index] = key;
+	plain_keys[index] = _key;
 #endif
-	len = strlen(_key);
 
 #ifdef MMX_COEF
 	if(index==0)
@@ -212,7 +212,7 @@ static void set_key(char *_key, int index) {
 		for (j=0; j<SHA1_SSE_PARA; j++)
 			memset(saved_key+j*4*80*MMX_COEF, 0, 60*MMX_COEF);
 #else
-		memset(saved_key, 0, 64*MMX_COEF);
+		memset(saved_key, 0, 60*MMX_COEF);
 		total_len = 0;
 #endif
 	}
@@ -239,13 +239,14 @@ static void set_key_enc(char *key, int index) {
 	int utf16len;
 
 #ifdef MMX_COEF
-	strnzcpy(plain_keys[index], key, PLAINTEXT_LENGTH*3);
+	strnzcpy(plain_keys[index], key, PLAINTEXT_LENGTH*3 + 1);
 #else
 	plain_keys[index] = key;
 #endif
 	utf16len = enc_to_utf16(utf16key, PLAINTEXT_LENGTH, (unsigned char*)key, utf8len);
 	if (utf16len <= 0) {
 		utf8len = -utf16len;
+		plain_keys[index][utf8len] = 0; // match truncation!
 		if (utf16len != 0)
 			utf16len = strlen16(utf16key);
 	}
@@ -258,7 +259,7 @@ static void set_key_enc(char *key, int index) {
 		for (j=0; j<SHA1_SSE_PARA; j++)
 			memset(saved_key+j*4*80*MMX_COEF, 0, 60*MMX_COEF);
 #else
-		memset(saved_key, 0, 64*MMX_COEF);
+		memset(saved_key, 0, 60*MMX_COEF);
 		total_len = 0;
 #endif
 	}
-- 
1.7.5.4

