--- include/dmraid/misc.h | 1 + lib/format/ataraid/isw.c | 7 ++++++- lib/format/ddf/ddf1.c | 1 + lib/misc/misc.c | 14 ++++++++++++++ 4 files changed, 22 insertions(+), 1 deletion(-) --- 1.0.0.rc16.orig/include/dmraid/misc.h +++ 1.0.0.rc16/include/dmraid/misc.h @@ -18,6 +18,7 @@ extern void libdmraid_exit(struct lib_co extern void sysfs_workaround(struct lib_context *lc); extern void mk_alpha(struct lib_context *lc, char *str, size_t len); +extern void mk_alphanum(struct lib_context *lc, char *str, size_t len); extern char *get_basename(struct lib_context *lc, char *str); extern char *get_dirname(struct lib_context *lc, char *str); extern char *remove_white_space(struct lib_context *lc, char *str, size_t len); --- 1.0.0.rc16.orig/lib/format/ataraid/isw.c +++ 1.0.0.rc16/lib/format/ataraid/isw.c @@ -169,6 +169,7 @@ static size_t _name(struct lib_context *lc, struct isw *isw, char *str, size_t len, enum name_type nt, int num, struct isw_dev *dev, struct raid_dev *rd) { + int n; struct { const char *fmt, *what; } formats[] = { @@ -189,7 +190,11 @@ _name(struct lib_context *lc, struct isw f += (is_raid10(dev) ? 1 : 0); } - return snprintf(str, len, f->fmt, isw->family_num, f->what, num); + n = snprintf(str, len, f->fmt, isw->family_num, f->what, num); + /* As '->volume' could contain anything, we need to sanitise the name */ + if (str) + mk_alphanum(lc, str, n); + return n; } static char * --- 1.0.0.rc16.orig/lib/format/ddf/ddf1.c +++ 1.0.0.rc16/lib/format/ddf/ddf1.c @@ -689,6 +689,7 @@ name(struct lib_context *lc, struct ddf1 i = prefix + 16; while (!isgraph(buf[--i])); buf[i + 1] = 0; + mk_alphanum(lc, buf, i); } else { char *b; --- 1.0.0.rc16.orig/lib/misc/misc.c +++ 1.0.0.rc16/lib/misc/misc.c @@ -66,6 +66,20 @@ mk_alpha(struct lib_context *lc, char *s } } +/* Convert a string to only have alphanum or '-' or '_'. + * All others become '_' + */ +void +mk_alphanum(struct lib_context *lc, char *str, size_t len) +{ + for (; len && *str; len--, str++) { + if (!isalnum(*str) && + *str != '-' && + *str != '_') + *str = '_'; + } +} + /* Remove any whitespace from a string. */ char * remove_white_space(struct lib_context *lc, char *str, size_t size)