diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 7445f3759..47c8ef910 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -564,7 +564,11 @@ static int Cmdmandecoderaw(const char *Cmd) { return PM3_ESOFT; } - uint8_t bits[MAX_DEMOD_BUF_LEN] = {0}; + uint8_t *bits = calloc(MAX_DEMOD_BUF_LEN, sizeof(uint8_t)); + if (bits == NULL) { + PrintAndLogEx(FAILED, "failed to allocate memory"); + return PM3_EMALLOC; + } // make sure its just binary data 0|1|7 in buffer int high = 0, low = 0; @@ -579,6 +583,7 @@ static int Cmdmandecoderaw(const char *Cmd) { if (high > 7 || low < 0) { PrintAndLogEx(ERR, "Error: please first raw demod then manchester raw decode"); + free(bits); return PM3_ESOFT; } @@ -587,6 +592,7 @@ static int Cmdmandecoderaw(const char *Cmd) { uint16_t err_cnt = manrawdecode(bits, &size, invert, &offset); if (err_cnt > max_err) { PrintAndLogEx(ERR, "Too many errors attempting to decode " _RED_("%i"), err_cnt); + free(bits); return PM3_ESOFT; } @@ -611,6 +617,7 @@ static int Cmdmandecoderaw(const char *Cmd) { } setDemodBuff(bits, size, 0); setClockGrid(g_DemodClock * 2, g_DemodStartIdx); + free(bits); return PM3_SUCCESS; } @@ -651,17 +658,27 @@ static int CmdBiphaseDecodeRaw(const char *Cmd) { return PM3_ESOFT; } - uint8_t bits[MAX_DEMOD_BUF_LEN] = {0}; - size_t size = sizeof(bits); - if (!getDemodBuff(bits, &size)) return PM3_ESOFT; + uint8_t *bits = calloc(MAX_DEMOD_BUF_LEN, sizeof(uint8_t)); + if (bits == NULL) { + PrintAndLogEx(FAILED, "failed to allocate memory"); + return PM3_EMALLOC; + } + + size_t size = MAX_DEMOD_BUF_LEN; + if (!getDemodBuff(bits, &size)) { + free(bits); + return PM3_ESOFT; + } int err_cnt = BiphaseRawDecode(bits, &size, &offset, invert); if (err_cnt < 0) { PrintAndLogEx(ERR, "Error during decode " _RED_("%i"), err_cnt); + free(bits); return PM3_ESOFT; } if (err_cnt > max_err) { PrintAndLogEx(ERR, "Too many errors attempting to decode " _RED_("%i"), err_cnt); + free(bits); return PM3_ESOFT; } @@ -674,6 +691,7 @@ static int CmdBiphaseDecodeRaw(const char *Cmd) { setDemodBuff(bits, size, 0); setClockGrid(g_DemodClock * 2, g_DemodStartIdx + g_DemodClock * offset); + free(bits); return PM3_SUCCESS; } @@ -681,10 +699,16 @@ static int CmdBiphaseDecodeRaw(const char *Cmd) { int ASKbiphaseDemod(int offset, int clk, int invert, int maxErr, bool verbose) { //ask raw demod g_GraphBuffer first - uint8_t bs[MAX_DEMOD_BUF_LEN]; - size_t size = getFromGraphBuf(bs); + uint8_t *bs = calloc(MAX_DEMOD_BUF_LEN, sizeof(uint8_t)); + if (bs == NULL) { + PrintAndLogEx(FAILED, "failed to allocate memory"); + return PM3_EMALLOC; + } + + size_t size = getFromGraphBufEx(bs, MAX_DEMOD_BUF_LEN); if (size == 0) { PrintAndLogEx(DEBUG, "DEBUG: no data in graphbuf"); + free(bs); return PM3_ESOFT; } int startIdx = 0; @@ -692,6 +716,7 @@ int ASKbiphaseDemod(int offset, int clk, int invert, int maxErr, bool verbose) { int errCnt = askdemod_ext(bs, &size, &clk, &invert, maxErr, 0, 0, &startIdx); if (errCnt < 0 || errCnt > maxErr) { PrintAndLogEx(DEBUG, "DEBUG: no data or error found %d, clock: %d", errCnt, clk); + free(bs); return PM3_ESOFT; } @@ -699,10 +724,12 @@ int ASKbiphaseDemod(int offset, int clk, int invert, int maxErr, bool verbose) { errCnt = BiphaseRawDecode(bs, &size, &offset, invert); if (errCnt < 0) { if (g_debugMode || verbose) PrintAndLogEx(DEBUG, "DEBUG: Error BiphaseRawDecode: %d", errCnt); + free(bs); return PM3_ESOFT; } if (errCnt > maxErr) { if (g_debugMode || verbose) PrintAndLogEx(DEBUG, "DEBUG: Error BiphaseRawDecode too many errors: %d", errCnt); + free(bs); return PM3_ESOFT; } @@ -716,6 +743,7 @@ int ASKbiphaseDemod(int offset, int clk, int invert, int maxErr, bool verbose) { PrintAndLogEx(DEBUG, "Biphase Decoded using offset %d | clock %d | #errors %d | start index %d\ndata\n", offset, clk, errCnt, (startIdx + clk * offset / 2)); printDemodBuff(offset, false, false, false); } + free(bs); return PM3_SUCCESS; } diff --git a/client/src/graph.c b/client/src/graph.c index 851e49d5a..8b97dcfad 100644 --- a/client/src/graph.c +++ b/client/src/graph.c @@ -113,12 +113,19 @@ void setGraphBuf(const uint8_t *src, size_t size) { RepaintGraphWindow(); } +// This function assumes that the length of dest array >= g_GraphTraceLen. +// If the length of dest array is less than g_GraphTraceLen, use getFromGraphBufEx(dest, maxLen) instead. size_t getFromGraphBuf(uint8_t *dest) { + return getFromGraphBufEx(dest, g_GraphTraceLen); +} + +size_t getFromGraphBufEx(uint8_t *dest, size_t maxLen) { if (dest == NULL) return 0; if (g_GraphTraceLen == 0) return 0; size_t i; - for (i = 0; i < g_GraphTraceLen; ++i) { + maxLen = (maxLen < g_GraphTraceLen) ? maxLen : g_GraphTraceLen; + for (i = 0; i < maxLen; ++i) { //trim if (g_GraphBuffer[i] > 127) g_GraphBuffer[i] = 127; if (g_GraphBuffer[i] < -127) g_GraphBuffer[i] = -127; @@ -387,4 +394,3 @@ bool fskClocks(uint8_t *fc1, uint8_t *fc2, uint8_t *rf1, int *firstClockEdge) { } return true; } - diff --git a/client/src/graph.h b/client/src/graph.h index 4963fb2b1..3a05dd8eb 100644 --- a/client/src/graph.h +++ b/client/src/graph.h @@ -31,6 +31,7 @@ bool HasGraphData(void); void setGraphBuf(const uint8_t *src, size_t size); void save_restoreGB(uint8_t saveOpt); size_t getFromGraphBuf(uint8_t *dest); +size_t getFromGraphBufEx(uint8_t *dest, size_t maxLen); void convertGraphFromBitstream(void); void convertGraphFromBitstreamEx(int hi, int low); bool isGraphBitstream(void);