Skip to content

Commit 74fa943

Browse files
authored
Merge pull request #1790 from stefanrueger/libavrdude_exit
Remove calls to exit() from libavrdude library functions
2 parents 272ec60 + f5d9615 commit 74fa943

File tree

9 files changed

+113
-114
lines changed

9 files changed

+113
-114
lines changed

src/avr.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ int avr_read_mem(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *mem, con
471471
if (mem_is_signature(mem)) {
472472
if (pgm->read_sig_bytes) {
473473
int rc = pgm->read_sig_bytes(pgm, p, mem);
474-
if (rc < 0)
474+
if (rc < 0 && rc != LIBAVRDUDE_EXIT)
475475
led_set(pgm, LED_ERR);
476476
led_clr(pgm, LED_PGM);
477477
return rc;
@@ -1236,13 +1236,13 @@ int avr_signature(const PROGRAMMER *pgm, const AVRPART *p) {
12361236
if(verbose > 1)
12371237
report_progress(0, 1, "Reading");
12381238
rc = avr_read(pgm, p, "signature", 0);
1239-
if (rc < LIBAVRDUDE_SUCCESS) {
1239+
if (rc < LIBAVRDUDE_SUCCESS && rc != LIBAVRDUDE_EXIT) {
12401240
pmsg_error("unable to read signature data for part %s, rc=%d\n", p->desc, rc);
12411241
return rc;
12421242
}
12431243
report_progress(1, 1, NULL);
12441244

1245-
return LIBAVRDUDE_SUCCESS;
1245+
return rc < LIBAVRDUDE_SUCCESS? LIBAVRDUDE_EXIT: LIBAVRDUDE_SUCCESS;
12461246
}
12471247

12481248

src/avrftdi.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,10 +1208,9 @@ static void avrftdi_setup(PROGRAMMER * pgm) {
12081208
pdata->mpsse_pins[i] = valid_mpsse_pins[i];
12091209

12101210
pdata->ftdic = ftdi_new();
1211-
if(!pdata->ftdic)
1212-
{
1213-
pmsg_error("failed to allocate memory in ftdi_new()\n");
1214-
exit(1);
1211+
if(!pdata->ftdic) {
1212+
pmsg_ext_error("ftdi_new() failed to allocate memory\n");
1213+
exit(1); // pgm->setup() should return an int, but it doesn't
12151214
}
12161215
E_VOID(ftdi_init(pdata->ftdic), pdata->ftdic);
12171216

src/avrpart.c

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,21 @@
3333
***/
3434

3535
OPCODE *avr_new_opcode(void) {
36-
return (OPCODE *) cfg_malloc("avr_new_opcode()", sizeof(OPCODE));
36+
return (OPCODE *) mmt_malloc(sizeof(OPCODE));
3737
}
3838

3939
static OPCODE *avr_dup_opcode(const OPCODE *op) {
4040
if(op == NULL) // Caller wants NULL if op == NULL
4141
return NULL;
4242

43-
OPCODE *m = (OPCODE *) cfg_malloc("avr_dup_opcode()", sizeof(*m));
43+
OPCODE *m = (OPCODE *) mmt_malloc(sizeof(*m));
4444
memcpy(m, op, sizeof(*m));
4545

4646
return m;
4747
}
4848

4949
void avr_free_opcode(OPCODE *op) {
50-
if(op)
51-
free(op);
50+
mmt_free(op);
5251
}
5352

5453

@@ -296,7 +295,7 @@ int avr_get_output_index(const OPCODE *op) {
296295
***/
297296

298297
AVRMEM *avr_new_mem(void) {
299-
AVRMEM *m = (AVRMEM *) cfg_malloc("avr_new_mem()", sizeof(*m));
298+
AVRMEM *m = (AVRMEM *) mmt_malloc(sizeof(*m));
300299
m->desc = cache_string("");
301300
m->page_size = 1; // Ensure not 0
302301
m->initval = -1; // Unknown value represented as -1
@@ -306,7 +305,7 @@ AVRMEM *avr_new_mem(void) {
306305
}
307306

308307
AVRMEM_ALIAS *avr_new_memalias(void) {
309-
AVRMEM_ALIAS *m = (AVRMEM_ALIAS *) cfg_malloc("avr_new_memalias()", sizeof*m);
308+
AVRMEM_ALIAS *m = (AVRMEM_ALIAS *) mmt_malloc(sizeof *m);
310309
m->desc = cache_string("");
311310
return m;
312311
}
@@ -322,8 +321,8 @@ int avr_initmem(const AVRPART *p) {
322321

323322
for (LNODEID ln=lfirst(p->mem); ln; ln=lnext(ln)) {
324323
AVRMEM *m = ldata(ln);
325-
m->buf = (unsigned char *) cfg_malloc("avr_initmem()", m->size);
326-
m->tags = (unsigned char *) cfg_malloc("avr_initmem()", m->size);
324+
m->buf = mmt_malloc(m->size);
325+
m->tags = mmt_malloc(m->size);
327326
}
328327

329328
return 0;
@@ -337,12 +336,12 @@ AVRMEM *avr_dup_mem(const AVRMEM *m) {
337336
*n = *m;
338337

339338
if(m->buf) {
340-
n->buf = (unsigned char *) cfg_malloc("avr_dup_mem()", n->size);
339+
n->buf = mmt_malloc(n->size);
341340
memcpy(n->buf, m->buf, n->size);
342341
}
343342

344343
if(m->tags) {
345-
n->tags = (unsigned char *) cfg_malloc("avr_dup_mem()", n->size);
344+
n->tags = (unsigned char *) mmt_malloc(n->size);
346345
memcpy(n->tags, m->tags, n->size);
347346
}
348347

@@ -367,11 +366,11 @@ void avr_free_mem(AVRMEM * m) {
367366
return;
368367

369368
if(m->buf) {
370-
free(m->buf);
369+
mmt_free(m->buf);
371370
m->buf = NULL;
372371
}
373372
if(m->tags) {
374-
free(m->tags);
373+
mmt_free(m->tags);
375374
m->tags = NULL;
376375
}
377376
for(size_t i=0; i<sizeof(m->op)/sizeof(m->op[0]); i++) {
@@ -380,12 +379,11 @@ void avr_free_mem(AVRMEM * m) {
380379
m->op[i] = NULL;
381380
}
382381
}
383-
free(m);
382+
mmt_free(m);
384383
}
385384

386385
void avr_free_memalias(AVRMEM_ALIAS *m) {
387-
if(m)
388-
free(m);
386+
mmt_free(m);
389387
}
390388

391389
AVRMEM_ALIAS *avr_locate_memalias(const AVRPART *p, const char *desc) {
@@ -602,7 +600,7 @@ const Register_file_t *avr_locate_register(const Register_file_t *rgf, int nr, c
602600
const Register_file_t **avr_locate_registerlist(const Register_file_t *rgf, int nr, const char *reg,
603601
int (*match)(const char *, const char*)) {
604602

605-
const Register_file_t **ret = cfg_malloc(__func__, sizeof rgf*(nr>0? nr+1: 1)), **r = ret;
603+
const Register_file_t **ret = mmt_malloc(sizeof rgf*(nr>0? nr+1: 1)), **r = ret;
606604
int eqmatch = match == str_eq;
607605

608606
if(rgf && reg && match)
@@ -617,7 +615,7 @@ const Register_file_t **avr_locate_registerlist(const Register_file_t *rgf, int
617615
return ret;
618616
}
619617
if(!eqmatch && str_eq(p, reg)) { // reg same as segment: switch to str_eq() match
620-
free(ret);
618+
mmt_free(ret);
621619
return avr_locate_registerlist(rgf, nr, reg, str_eq);
622620
}
623621
if(!reg_matched++) // Record a matching register only once
@@ -668,7 +666,7 @@ const Configitem_t *avr_locate_config(const Configitem_t *cfg, int nc, const cha
668666
const Configitem_t **avr_locate_configlist(const Configitem_t *cfg, int nc, const char *name,
669667
int (*match)(const char *, const char*)) {
670668

671-
const Configitem_t **ret = cfg_malloc(__func__, sizeof cfg*(nc>0? nc+1: 1)), **r = ret;
669+
const Configitem_t **ret = mmt_malloc(sizeof cfg*(nc>0? nc+1: 1)), **r = ret;
672670

673671
if(cfg && name && match) {
674672
for(int i = 0; i < nc; i++)
@@ -774,7 +772,7 @@ static char *print_num(const char *fmt, int n) {
774772
static int num_len(const char *fmt, int n) {
775773
char *p = print_num(fmt, n);
776774
int ret = strlen(p);
777-
free(p);
775+
mmt_free(p);
778776

779777
return ret;
780778
}
@@ -848,15 +846,15 @@ void avr_mem_display(FILE *f, const AVRPART *p, const char *prefix) {
848846
m_char_max[1], m->size,
849847
m_char_max[2], m->page_size,
850848
m_char_max[3], m_offset);
851-
free(m_offset);
849+
mmt_free(m_offset);
852850
} else {
853851
fprintf(f, "%s%-*s %*d %*d\n",
854852
prefix,
855853
m_char_max[0], m_desc_str,
856854
m_char_max[1], m->size,
857855
m_char_max[2], m->page_size);
858856
}
859-
free(m_desc_str);
857+
mmt_free(m_desc_str);
860858
}
861859
}
862860

@@ -922,7 +920,7 @@ int avr_variants_display(FILE *f, const AVRPART *p, const char *prefix) {
922920
*/
923921

924922
AVRPART *avr_new_part(void) {
925-
AVRPART *p = (AVRPART *) cfg_malloc("avr_new_part()", sizeof(AVRPART));
923+
AVRPART *p = (AVRPART *) mmt_malloc(sizeof(AVRPART));
926924
const char *nulp = cache_string("");
927925

928926
memset(p, 0, sizeof(*p));
@@ -986,13 +984,12 @@ AVRPART *avr_dup_part(const AVRPART *d) {
986984
return p;
987985
}
988986

989-
void avr_free_part(AVRPART * d)
990-
{
991-
ldestroy_cb(d->mem, (void(*)(void *))avr_free_mem);
987+
void avr_free_part(AVRPART * d) {
988+
ldestroy_cb(d->mem, (void(*)(void *)) avr_free_mem);
992989
d->mem = NULL;
993-
ldestroy_cb(d->mem_alias, (void(*)(void *))avr_free_memalias);
990+
ldestroy_cb(d->mem_alias, (void(*)(void *)) avr_free_memalias);
994991
d->mem_alias = NULL;
995-
ldestroy_cb(d->variants, free);
992+
ldestroy_cb(d->variants, cfg_free);
996993
d->variants = NULL;
997994

998995
/* do not free d->parent_id and d->config_file */
@@ -1002,7 +999,7 @@ void avr_free_part(AVRPART * d)
1002999
d->op[i] = NULL;
10031000
}
10041001
}
1005-
free(d);
1002+
mmt_free(d);
10061003
}
10071004

10081005
AVRPART *locate_part(const LISTID parts, const char *partdesc) {
@@ -1159,7 +1156,7 @@ char *cmdbitstr(CMDBIT cb) {
11591156
else
11601157
space[1] = 0;
11611158

1162-
return cfg_strdup("cmdbitstr()", space);
1159+
return mmt_strdup(space);
11631160
}
11641161

11651162

@@ -1201,7 +1198,7 @@ char *opcode2str(const OPCODE *op, int opnum, int detailed) {
12011198
int compact = 1, printbit;
12021199

12031200
if(!op)
1204-
return cfg_strdup("opcode2str()", "NULL");
1201+
return mmt_strdup("NULL");
12051202

12061203
// Can the opcode be printed in a compact way? Only if i, o and a bits are systematic.
12071204
for(int i=31; i >= 0; i--)
@@ -1245,7 +1242,7 @@ char *opcode2str(const OPCODE *op, int opnum, int detailed) {
12451242
*sp++ = '"';
12461243
*sp = 0;
12471244

1248-
return cfg_strdup("opcode2str()", space);
1245+
return mmt_strdup(space);
12491246
}
12501247

12511248

src/config.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ char *cfg_strdup(const char *funcname, const char *s) {
217217
}
218218

219219

220+
void cfg_free(void *ptr) {
221+
mmt_free(ptr);
222+
}
223+
224+
220225
int yywrap()
221226
{
222227
return 1;

0 commit comments

Comments
 (0)