diff --git a/src/avr.c b/src/avr.c index 3a7d4a9e..eea0ad8a 100644 --- a/src/avr.c +++ b/src/avr.c @@ -1254,9 +1254,18 @@ void avr_add_mem_order(const char *str) { } int avr_mem_is_known(const char *str) { - for(size_t i=0; i < sizeof avr_mem_order/sizeof *avr_mem_order; i++) - if(avr_mem_order[i] && !strcmp(avr_mem_order[i], str)) - return 1; + if(str && *str) + for(size_t i=0; i < sizeof avr_mem_order/sizeof *avr_mem_order; i++) + if(avr_mem_order[i] && !strcmp(avr_mem_order[i], str)) + return 1; + return 0; +} + +int avr_mem_might_be_known(const char *str) { + if(str && *str) + for(size_t i=0; i < sizeof avr_mem_order/sizeof *avr_mem_order; i++) + if(avr_mem_order[i] && !strncmp(avr_mem_order[i], str, strlen(str))) + return 1; return 0; } diff --git a/src/libavrdude.h b/src/libavrdude.h index f8bdf682..a30c1402 100644 --- a/src/libavrdude.h +++ b/src/libavrdude.h @@ -822,6 +822,7 @@ int avr_put_cycle_count(PROGRAMMER * pgm, AVRPART * p, int cycles); void avr_add_mem_order(const char *str); int avr_mem_is_known(const char *str); +int avr_mem_might_be_known(const char *str); #define disable_trailing_ff_removal() avr_mem_hiaddr(NULL) int avr_mem_hiaddr(AVRMEM * mem); diff --git a/src/main.c b/src/main.c index 2984203a..9f72847f 100644 --- a/src/main.c +++ b/src/main.c @@ -751,6 +751,7 @@ int main(int argc, char * argv []) bitclock = default_bitclock; } + avrdude_message(MSG_NOTICE, "\n"); // developer option -p /[*codws] prints various aspects of part descriptions and exits @@ -918,6 +919,12 @@ int main(int argc, char * argv []) exit(1); } } + + if (!avr_mem_might_be_known(upd->memtype)) { + avrdude_message(MSG_INFO, "%s: unknown memory type %s\n", progname, upd->memtype); + exit(1); + } + // TODO: check whether filename other than "-" is readable/writable } /* diff --git a/src/update.c b/src/update.c index 78703e89..025bfb6b 100644 --- a/src/update.c +++ b/src/update.c @@ -62,12 +62,6 @@ UPDATE * parse_op(char * s) return upd; } - if (!avr_mem_is_known(buf)) { - avrdude_message(MSG_INFO, "%s: unknown memory type %s\n", progname, buf); - free(upd); - return NULL; - } - upd->memtype = (char *)malloc(strlen(buf)+1); if (upd->memtype == NULL) { avrdude_message(MSG_INFO, "%s: out of memory\n", progname);