From ace26dbdfd7c53e5507c9720cbea99556b7ab8b1 Mon Sep 17 00:00:00 2001 From: marshmellow42 Date: Mon, 7 Dec 2015 21:18:30 -0500 Subject: [PATCH 1/1] Fix printdemodbuffer length tests + add length... parameter increase askdemod MaxBits fix util.c sprint_bin_break and increase buffer size (had memory overflow possible before) --- client/cmddata.c | 23 ++++++++++++++++------- client/util.c | 25 ++++++++++++++++++------- common/lfdemod.c | 2 +- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/client/cmddata.c b/client/cmddata.c index 30546f11..e8b77d1d 100644 --- a/client/cmddata.c +++ b/client/cmddata.c @@ -58,11 +58,12 @@ int CmdSetDebugMode(const char *Cmd) } int usage_data_printdemodbuf(){ - PrintAndLog("Usage: data printdemodbuffer x o "); + PrintAndLog("Usage: data printdemodbuffer x o l "); PrintAndLog("Options: "); PrintAndLog(" h This help"); PrintAndLog(" x output in hex (omit for binary output)"); PrintAndLog(" o enter offset in # of bits"); + PrintAndLog(" l enter length to print in # of bits or hex characters respectively"); return 0; } @@ -87,7 +88,8 @@ int CmdPrintDemodBuff(const char *Cmd) char hex[512]={0x00}; bool hexMode = false; bool errors = false; - uint8_t offset = 0; + uint32_t offset = 0; //could be size_t but no param_get16... + uint32_t length = 512; char cmdp = 0; while(param_getchar(Cmd, cmdp) != 0x00) { @@ -103,10 +105,16 @@ int CmdPrintDemodBuff(const char *Cmd) break; case 'o': case 'O': - offset = param_get8(Cmd, cmdp+1); + offset = param_get32ex(Cmd, cmdp+1, 0, 10); if (!offset) errors = true; cmdp += 2; break; + case 'l': + case 'L': + length = param_get32ex(Cmd, cmdp+1, 512, 10); + if (!length) errors = true; + cmdp += 2; + break; default: PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); errors = true; @@ -116,11 +124,12 @@ int CmdPrintDemodBuff(const char *Cmd) } //Validations if(errors) return usage_data_printdemodbuf(); - - int numBits = (DemodBufferLen-offset) & 0x7FC; //make sure we don't exceed our string + length = (length > (DemodBufferLen-offset)) ? DemodBufferLen-offset : length; + int numBits = (length) & 0x00FFC; //make sure we don't exceed our string if (hexMode){ char *buf = (char *) (DemodBuffer + offset); + numBits = (numBits > sizeof(hex)) ? sizeof(hex) : numBits; numBits = binarraytohex(hex, buf, numBits); if (numBits==0) return 0; PrintAndLog("DemodBuffer: %s",hex); @@ -313,7 +322,7 @@ int ASKDemod(const char *Cmd, bool verbose, bool emSearch, uint8_t askType) char amp = param_getchar(Cmd, 0); uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &); - if (!maxLen) maxLen = 512*64; + if (!maxLen) maxLen = BIGBUF_SIZE; if (invert != 0 && invert != 1) { PrintAndLog("Invalid argument: %s", Cmd); return 0; @@ -2383,7 +2392,7 @@ static command_t CommandTable[] = {"manrawdecode", Cmdmandecoderaw, 1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"}, {"norm", CmdNorm, 1, "Normalize max/min to +/-128"}, {"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"}, - {"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] -- print the data in the DemodBuffer - 'x' for hex output"}, + {"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] [l] -- print the data in the DemodBuffer - 'x' for hex output"}, {"pskindalademod", CmdIndalaDecode, 1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"}, {"psknexwatchdemod",CmdPSKNexWatch, 1, "Demodulate a NexWatch tag (nexkey, quadrakey) (PSK1) from GraphBuffer"}, {"rawdemod", CmdRawDemod, 1, "[modulation] ... -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"}, diff --git a/client/util.c b/client/util.c index 056b5676..35af3d66 100644 --- a/client/util.c +++ b/client/util.c @@ -9,11 +9,13 @@ //----------------------------------------------------------------------------- #include "util.h" +#define MAX_BIN_BREAK_LENGTH (3072+384+1) #ifndef _WIN32 #include #include + int ukbhit(void) { int cnt = 0; @@ -123,16 +125,25 @@ char *sprint_hex(const uint8_t *data, const size_t len) { } char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) { - - int maxLen = ( len > 1020) ? 1020 : len; - static char buf[1024]; - memset(buf, 0x00, 1024); + // make sure we don't go beyond our char array memory + int max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks); + static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits + //clear memory + memset(buf, 0x00, sizeof(buf)); char *tmp = buf; - for (size_t i=0; i < maxLen; ++i){ - sprintf(tmp++, "%u", data[i]); - if (breaks > 0 && !((i+1) % breaks)) + size_t in_index = 0; + // loop through the out_index to make sure we don't go too far + for (size_t out_index=0; out_index < max_len; out_index++) { + // set character + sprintf(tmp++, "%u", data[in_index]); + // check if a line break is needed + if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) { + // increment and print line break + out_index++; sprintf(tmp++, "%s","\n"); + } + in_index++; } return buf; diff --git a/common/lfdemod.c b/common/lfdemod.c index 1965a0ae..982a724a 100644 --- a/common/lfdemod.c +++ b/common/lfdemod.c @@ -300,7 +300,7 @@ int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr uint8_t midBit = 0; uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave if (*clk <= 32) tol = 1; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely - size_t MaxBits = 1024; + size_t MaxBits = 3072; lastBit = start - *clk; for (i = start; i < *size; ++i) { -- 2.39.5