diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index 6e2d6723c..1dab49959 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -98,9 +98,9 @@ static int colin_currfline; static int colin_curlline; static int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, uint8_t keyCount, const uint8_t *datain, uint64_t *key); static int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype); -static void saMifareMakeTag(void); +static void __attribute__((noinline)) saMifareMakeTag(void); static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, const uint8_t *datain); -static void WriteTagToFlash(uint32_t uid, size_t size); +static void __attribute__((noinline)) WriteTagToFlash(uint32_t uid, size_t size); // TODO : Implement fast read of KEYS like in RFIdea // also http://ext.delaat.net/rp/2015-2016/p04/report.pdf @@ -261,7 +261,7 @@ static char *ReadSchemasFromSPIFFS(char *filename) { return (char *)mem; } -static void add_schemas_from_json_in_spiffs(char *filename) { +static void __attribute__((noinline)) add_schemas_from_json_in_spiffs(char *filename) { const char *jsonfile = ReadSchemasFromSPIFFS((char *)filename); @@ -281,7 +281,7 @@ static void add_schemas_from_json_in_spiffs(char *filename) { } } -static void ReadLastTagFromFlash(void) { +static void __attribute__((noinline)) ReadLastTagFromFlash(void) { SpinOff(0); LED_A_ON(); LED_B_ON(); @@ -307,7 +307,7 @@ static void ReadLastTagFromFlash(void) { return; } -static void WriteTagToFlash(uint32_t uid, size_t size) { +static void __attribute__((noinline)) WriteTagToFlash(uint32_t uid, size_t size) { SpinOff(0); LED_A_ON(); LED_B_ON(); @@ -315,7 +315,17 @@ static void WriteTagToFlash(uint32_t uid, size_t size) { LED_D_ON(); uint32_t len = size; - uint8_t data[(size * (16 * 64)) / 1024]; + + // this used to be a VLA - `uint8_t data[(size * (16 * 64)) / 1024]` - which put + // another `size` bytes (1024 at the only call site) on top of RunMod's already + // 2.5 kB frame, and did not show up in -fstack-usage as anything but "dynamic". + uint8_t *data = BigBuf_calloc((size * (16 * 64)) / 1024); + if (data == NULL) { + DbprintfEx(FLAG_NEWLINE, "[!!] out of memory, tag NOT written to flash"); + cjSetCursLeft(); + SpinOff(0); + return; + } emlGetMem_xt(data, 0, (size * 64) / 1024, MIFARE_BLOCK_SIZE); @@ -864,7 +874,7 @@ static int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTr return retval; } -static void saMifareMakeTag(void) { +static void __attribute__((noinline)) saMifareMakeTag(void) { uint8_t cfail = 0; cjSetCursLeft(); cjTabulize();