i = 8;
wrp = data_buf[7] & 0x0F;
- wrc = (data_buf[7] & 0x07) >> 4;
+ wrc = (data_buf[7] & 0x07) >> 4; // ICEMAN 20160802, this will always be ZERO
bool hasWRC = (wrc > 0);
bool hasWRP = (wrp > wrc);
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;
+ if (param_getptr(Cmd, &bg, &en, cmdp+1)) {
+ errors = true;
+ break;
+ }
+ 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;
+ }
+
+ if (param_gethex(Cmd, cmdp+1, data, len)) {
+ errors = true;
+ break;
+ }
len >>= 1;
cmdp += 2;
}
//Validations
if (errors){
- if (data != NULL) free(data);
+ if (data) free(data);
return usage_legic_calccrc8();
}
break;
}
- if (data != NULL) free(data);
+ if (data) free(data);
return 0;
}