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 <wildcard>/[*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);