diff options
-rw-r--r-- | avr/ihex.c | 29 |
1 files changed, 21 insertions, 8 deletions
@@ -90,25 +90,34 @@ ihex_t ihex_get_record() { uint8_t *p; int k; if ((rec.data = malloc(rec.len)) == 0) return rec; + for (p=rec.data, k=rec.len; k; k--) { if ((i = get_hexbyte()) < 0) break; sum += i; *p++ = i; } + if (k) { free(rec.data); rec.data = 0; return rec; } } - if ((i = get_hexbyte()) < 0) /* Check sum */ - return rec; - sum += i; - if (sum) { - free(rec.data); rec.data = 0; - rec.status = IHX_CHKSUMERR; - } else - rec.status = IHX_OK; + + i = get_hexbyte(); /* Check sum */ + + if (i >= 0) { + sum += i; + if (sum == 0) + rec.status = IHX_OK; + else + rec.status = IHX_CHKSUMERR; + } + + if (rec.status != IHX_OK) { + free(rec.data); + rec.data = 0; + } return rec; } @@ -176,6 +185,10 @@ command_ret_t do_loadihex(cmd_tbl_t *cmdtp, int flag, int argc, char * const arg } else done = true; + + free(rec.data); + rec.data = 0; + } switch (rec.status) { |