}
 #endif
 
+/* copy a string safely with stripping non-printable letters */
+static void safe_copy_string(void *dst, size_t max_dst_size,
+                            const void *src, size_t max_src_size)
+{
+       const unsigned char *s = src;
+       unsigned char *d = dst;
+
+       if (!max_dst_size--)
+               return;
+       for (s = src; max_dst_size && *s && max_src_size--; s++) {
+               if (!isascii(*s) || !isprint(*s))
+                       continue;
+               *d++ = *s;
+               max_dst_size--;
+       }
+       *d = 0;
+}
+
+/* append a string safely with stripping non-printable letters */
+static void safe_append_string(void *dst, size_t max_dst_size,
+                              const void *src, size_t max_src_size)
+{
+       unsigned char *d = dst;
+       size_t len = strlen(d);
+
+       safe_copy_string(d + len, max_dst_size - len, src, max_src_size);
+}
+
 static const struct snd_rawmidi_global_ops snd_ump_rawmidi_ops = {
        .dev_register = snd_ump_dev_register,
        .dev_unregister = snd_ump_dev_unregister,
                        }
                        if (!*fb->info.name)
                                continue;
-                       if (!*group->name) {
-                               /* store the first matching name */
-                               strscpy(group->name, fb->info.name,
-                                       sizeof(group->name));
-                       } else {
-                               /* when overlapping, concat names */
+                       if (*group->name)
                                strlcat(group->name, ", ", sizeof(group->name));
-                               strlcat(group->name, fb->info.name,
-                                       sizeof(group->name));
-                       }
+                       safe_append_string(group->name, sizeof(group->name),
+                                          fb->info.name, sizeof(fb->info.name));
                }
        }
 }