diff mbox

dmraid: Handle spaces in names stored in vendor metadata.

Message ID 19331.16297.375514.579107@notabene.brown (mailing list archive)
State Accepted, archived
Headers show

Commit Message

NeilBrown Feb. 23, 2010, 2:38 a.m. UTC
None
diff mbox

Patch

--- dmraid.orig/include/dmraid/misc.h
+++ dmraid/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);
--- dmraid.orig/lib/format/ataraid/isw.c
+++ dmraid/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 *
--- dmraid.orig/lib/format/ddf/ddf1.c
+++ dmraid/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;
 
--- dmraid.orig/lib/misc/misc.c
+++ dmraid/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)