Fix segmentation fault

This commit is contained in:
wh201906 2023-11-30 13:39:59 +08:00
commit 45df618b7c
No known key found for this signature in database
3 changed files with 43 additions and 8 deletions

View file

@ -564,7 +564,11 @@ static int Cmdmandecoderaw(const char *Cmd) {
return PM3_ESOFT; 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 // make sure its just binary data 0|1|7 in buffer
int high = 0, low = 0; int high = 0, low = 0;
@ -579,6 +583,7 @@ static int Cmdmandecoderaw(const char *Cmd) {
if (high > 7 || low < 0) { if (high > 7 || low < 0) {
PrintAndLogEx(ERR, "Error: please first raw demod then manchester raw decode"); PrintAndLogEx(ERR, "Error: please first raw demod then manchester raw decode");
free(bits);
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -587,6 +592,7 @@ static int Cmdmandecoderaw(const char *Cmd) {
uint16_t err_cnt = manrawdecode(bits, &size, invert, &offset); uint16_t err_cnt = manrawdecode(bits, &size, invert, &offset);
if (err_cnt > max_err) { if (err_cnt > max_err) {
PrintAndLogEx(ERR, "Too many errors attempting to decode " _RED_("%i"), err_cnt); PrintAndLogEx(ERR, "Too many errors attempting to decode " _RED_("%i"), err_cnt);
free(bits);
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -611,6 +617,7 @@ static int Cmdmandecoderaw(const char *Cmd) {
} }
setDemodBuff(bits, size, 0); setDemodBuff(bits, size, 0);
setClockGrid(g_DemodClock * 2, g_DemodStartIdx); setClockGrid(g_DemodClock * 2, g_DemodStartIdx);
free(bits);
return PM3_SUCCESS; return PM3_SUCCESS;
} }
@ -651,17 +658,27 @@ static int CmdBiphaseDecodeRaw(const char *Cmd) {
return PM3_ESOFT; return PM3_ESOFT;
} }
uint8_t bits[MAX_DEMOD_BUF_LEN] = {0}; uint8_t *bits = calloc(MAX_DEMOD_BUF_LEN, sizeof(uint8_t));
size_t size = sizeof(bits); if (bits == NULL) {
if (!getDemodBuff(bits, &size)) return PM3_ESOFT; 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); int err_cnt = BiphaseRawDecode(bits, &size, &offset, invert);
if (err_cnt < 0) { if (err_cnt < 0) {
PrintAndLogEx(ERR, "Error during decode " _RED_("%i"), err_cnt); PrintAndLogEx(ERR, "Error during decode " _RED_("%i"), err_cnt);
free(bits);
return PM3_ESOFT; return PM3_ESOFT;
} }
if (err_cnt > max_err) { if (err_cnt > max_err) {
PrintAndLogEx(ERR, "Too many errors attempting to decode " _RED_("%i"), err_cnt); PrintAndLogEx(ERR, "Too many errors attempting to decode " _RED_("%i"), err_cnt);
free(bits);
return PM3_ESOFT; return PM3_ESOFT;
} }
@ -674,6 +691,7 @@ static int CmdBiphaseDecodeRaw(const char *Cmd) {
setDemodBuff(bits, size, 0); setDemodBuff(bits, size, 0);
setClockGrid(g_DemodClock * 2, g_DemodStartIdx + g_DemodClock * offset); setClockGrid(g_DemodClock * 2, g_DemodStartIdx + g_DemodClock * offset);
free(bits);
return PM3_SUCCESS; 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) { int ASKbiphaseDemod(int offset, int clk, int invert, int maxErr, bool verbose) {
//ask raw demod g_GraphBuffer first //ask raw demod g_GraphBuffer first
uint8_t bs[MAX_DEMOD_BUF_LEN]; uint8_t *bs = calloc(MAX_DEMOD_BUF_LEN, sizeof(uint8_t));
size_t size = getFromGraphBuf(bs); if (bs == NULL) {
PrintAndLogEx(FAILED, "failed to allocate memory");
return PM3_EMALLOC;
}
size_t size = getFromGraphBufEx(bs, MAX_DEMOD_BUF_LEN);
if (size == 0) { if (size == 0) {
PrintAndLogEx(DEBUG, "DEBUG: no data in graphbuf"); PrintAndLogEx(DEBUG, "DEBUG: no data in graphbuf");
free(bs);
return PM3_ESOFT; return PM3_ESOFT;
} }
int startIdx = 0; 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); int errCnt = askdemod_ext(bs, &size, &clk, &invert, maxErr, 0, 0, &startIdx);
if (errCnt < 0 || errCnt > maxErr) { if (errCnt < 0 || errCnt > maxErr) {
PrintAndLogEx(DEBUG, "DEBUG: no data or error found %d, clock: %d", errCnt, clk); PrintAndLogEx(DEBUG, "DEBUG: no data or error found %d, clock: %d", errCnt, clk);
free(bs);
return PM3_ESOFT; 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); errCnt = BiphaseRawDecode(bs, &size, &offset, invert);
if (errCnt < 0) { if (errCnt < 0) {
if (g_debugMode || verbose) PrintAndLogEx(DEBUG, "DEBUG: Error BiphaseRawDecode: %d", errCnt); if (g_debugMode || verbose) PrintAndLogEx(DEBUG, "DEBUG: Error BiphaseRawDecode: %d", errCnt);
free(bs);
return PM3_ESOFT; return PM3_ESOFT;
} }
if (errCnt > maxErr) { if (errCnt > maxErr) {
if (g_debugMode || verbose) PrintAndLogEx(DEBUG, "DEBUG: Error BiphaseRawDecode too many errors: %d", errCnt); if (g_debugMode || verbose) PrintAndLogEx(DEBUG, "DEBUG: Error BiphaseRawDecode too many errors: %d", errCnt);
free(bs);
return PM3_ESOFT; 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)); 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); printDemodBuff(offset, false, false, false);
} }
free(bs);
return PM3_SUCCESS; return PM3_SUCCESS;
} }

View file

@ -113,12 +113,19 @@ void setGraphBuf(const uint8_t *src, size_t size) {
RepaintGraphWindow(); 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) { 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 (dest == NULL) return 0;
if (g_GraphTraceLen == 0) return 0; if (g_GraphTraceLen == 0) return 0;
size_t i; size_t i;
for (i = 0; i < g_GraphTraceLen; ++i) { maxLen = (maxLen < g_GraphTraceLen) ? maxLen : g_GraphTraceLen;
for (i = 0; i < maxLen; ++i) {
//trim //trim
if (g_GraphBuffer[i] > 127) g_GraphBuffer[i] = 127; if (g_GraphBuffer[i] > 127) g_GraphBuffer[i] = 127;
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; return true;
} }

View file

@ -31,6 +31,7 @@ bool HasGraphData(void);
void setGraphBuf(const uint8_t *src, size_t size); void setGraphBuf(const uint8_t *src, size_t size);
void save_restoreGB(uint8_t saveOpt); void save_restoreGB(uint8_t saveOpt);
size_t getFromGraphBuf(uint8_t *dest); size_t getFromGraphBuf(uint8_t *dest);
size_t getFromGraphBufEx(uint8_t *dest, size_t maxLen);
void convertGraphFromBitstream(void); void convertGraphFromBitstream(void);
void convertGraphFromBitstreamEx(int hi, int low); void convertGraphFromBitstreamEx(int hi, int low);
bool isGraphBitstream(void); bool isGraphBitstream(void);