X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/aeb128e2bb62d6a2e8fdb571d99c6ac8f9c6ff27..3f5bcc3b927e4a132e9e87b864ba7342c4423b37:/client/cmdhflegic.c

diff --git a/client/cmdhflegic.c b/client/cmdhflegic.c
index da1b20b1..91682581 100644
--- a/client/cmdhflegic.c
+++ b/client/cmdhflegic.c
@@ -527,8 +527,7 @@ int CmdLegicRfRawWrite(const char *Cmd) {
 		PrintAndLog("# changing the DCF is irreversible  #");
 		PrintAndLog("#####################################");
 		PrintAndLog("do youe really want to continue? y(es) n(o)");		
-		scanf(" %c", &answer);
-		if (answer == 'y' || answer == 'Y') {
+		if (scanf(" %c", &answer) > 0 && (answer == 'y' || answer == 'Y')) {
 			SendCommand(&c);
 			return 0;
 		}
@@ -571,20 +570,36 @@ int CmdLegicCalcCrc8(const char *Cmd){
 	uint8_t cmdp = 0, uidcrc = 0, type=0;
 	bool errors = false;
 	int len = 0;
+	int bg, en;
 	
 	while(param_getchar(Cmd, cmdp) != 0x00) {
 		switch(param_getchar(Cmd, cmdp)) {
 		case 'b':
 		case 'B':
-			data = malloc(len);
+			// peek at length of the input string so we can
+			// figure out how many elements to malloc in "data"
+			bg=en=0;
+			param_getptr(Cmd, &bg, &en, cmdp+1);
+			len = (en - bg + 1);
+
+			// check that user entered even number of characters
+			// for hex data string
+			if (len & 1) {
+				errors = true;
+				break;
+			}
+
+			// it's possible for user to accidentally enter "b" parameter
+			// more than once - we have to clean previous malloc
+			if (data) free(data);
+			data = malloc(len >> 1);
 			if ( data == NULL ) {
 				PrintAndLog("Can't allocate memory. exiting");
 				errors = true;
 				break;
-			}			
-			param_gethex_ex(Cmd, cmdp+1, data, &len);
-			// if odd symbols, (hexbyte must be two symbols)
-			if ( len & 1 ) errors = true;
+			}
+			
+			param_gethex(Cmd, cmdp+1, data, len);
 
 			len >>= 1;	
 			cmdp += 2;