From 4ba4c76081dea4d72fe22d1e203ddd3132faf75c Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Wed, 3 Jun 2020 17:27:38 +0200 Subject: [PATCH] added a loadEML_safe fct --- client/src/fileutils.c | 92 +++++++++++++++++++++++++++++++++++++++++- client/src/fileutils.h | 2 + 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/client/src/fileutils.c b/client/src/fileutils.c index 9fc8d5f95..3d3175859 100644 --- a/client/src/fileutils.c +++ b/client/src/fileutils.c @@ -737,6 +737,9 @@ out: } int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen) { + return loadFile_safeEx(preferredName, suffix, pdata, datalen, true); +} +int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, size_t *datalen, bool verbose) { char *path; int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, suffix, false); @@ -782,7 +785,8 @@ int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, s *datalen = bytes_read; - PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, preferredName); + if (verbose) + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from binary file " _YELLOW_("%s"), bytes_read, preferredName); return PM3_SUCCESS; } @@ -848,6 +852,92 @@ out: return retval; } +int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen) { + char *path; + int res = searchFile(&path, RESOURCES_SUBDIR, preferredName, "", false); + if (res != PM3_SUCCESS) { + return PM3_EFILE; + } + + FILE *f = fopen(path, "r"); + if (!f) { + PrintAndLogEx(WARNING, "file not found or locked. '" _YELLOW_("%s")"'", path); + free(path); + return PM3_EFILE; + } + free(path); + + // get filesize in order to malloc memory + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + if (fsize <= 0) { + PrintAndLogEx(FAILED, "error, when getting filesize"); + fclose(f); + return PM3_EFILE; + } + + *pdata = calloc(fsize, sizeof(uint8_t)); + if (!*pdata) { + PrintAndLogEx(FAILED, "error, cannot allocate memory"); + fclose(f); + return PM3_EMALLOC; + } + + // 128 + 2 newline chars + 1 null terminator + char line[131]; + memset(line, 0, sizeof(line)); + uint8_t buf[64] = {0x00}; + size_t counter = 0; + int retval = PM3_SUCCESS, hexlen = 0; + + uint8_t *tmp = (uint8_t *)*pdata; + + while (!feof(f)) { + + memset(line, 0, sizeof(line)); + + if (fgets(line, sizeof(line), f) == NULL) { + if (feof(f)) + break; + + fclose(f); + PrintAndLogEx(FAILED, "File reading error."); + return PM3_EFILE; + } + + if (line[0] == '#') + continue; + + strcleanrn(line, sizeof(line)); + + res = param_gethex_to_eol(line, 0, buf, sizeof(buf), &hexlen); + if (res == 0) { + memcpy( tmp + counter, buf, hexlen); + counter += hexlen; + } else { + retval = PM3_ESOFT; + } + } + fclose(f); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " bytes from text file " _YELLOW_("%s"), counter, preferredName); + + + uint8_t *newdump = realloc(*pdata, counter); + if (newdump == NULL) { + free(*pdata); + return PM3_EMALLOC; + } else { + *pdata = newdump; + } + + if (datalen) + *datalen = counter; + + return retval; +} + int loadFileJSON(const char *preferredName, void *data, size_t maxdatalen, size_t *datalen, void (*callback)(json_t *)) { return loadFileJSONex(preferredName, data, maxdatalen, datalen, true, callback); } diff --git a/client/src/fileutils.h b/client/src/fileutils.h index 96170a440..d3d757408 100644 --- a/client/src/fileutils.h +++ b/client/src/fileutils.h @@ -177,6 +177,7 @@ int loadFile(const char *preferredName, const char *suffix, void *data, size_t m * @return PM3_SUCCESS for ok, PM3_E* for failz */ int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, size_t *datalen); +int loadFile_safeEx(const char *preferredName, const char *suffix, void **pdata, size_t *datalen, bool verbose); /** * @brief Utility function to load data from a textfile (EML). This method takes a preferred name. * E.g. dumpdata-15.txt @@ -187,6 +188,7 @@ int loadFile_safe(const char *preferredName, const char *suffix, void **pdata, s * @return 0 for ok, 1 for failz */ int loadFileEML(const char *preferredName, void *data, size_t *datalen); +int loadFileEML_safe(const char *preferredName, void **pdata, size_t *datalen); /** * @brief Utility function to load data from a JSON textfile. This method takes a preferred name.