summaryrefslogtreecommitdiffstats
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'config.c')
-rw-r--r--config.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/config.c b/config.c
index fd757ad..41428ae 100644
--- a/config.c
+++ b/config.c
@@ -448,6 +448,17 @@ void devline(char *line)
mddev_ident_t mddevlist = NULL;
mddev_ident_t *mddevlp = &mddevlist;
+static int is_number(char *w)
+{
+ /* check if there are 1 or more digits and nothing else */
+ int digits = 0;
+ while (*w && isdigit(*w)) {
+ digits++;
+ w++;
+ }
+ return (digits && ! *w);
+}
+
void arrayline(char *line)
{
char *w;
@@ -473,11 +484,35 @@ void arrayline(char *line)
mis.member = NULL;
for (w=dl_next(line); w!=line; w=dl_next(w)) {
- if (w[0] == '/' || strcasecmp(w, "<ignore>") == 0) {
- if (mis.devname)
- fprintf(stderr, Name ": only give one device per ARRAY line: %s and %s\n",
- mis.devname, w);
- else mis.devname = w;
+ if (w[0] == '/' || strchr(w, '=') == NULL) {
+ /* This names the device, or is '<ignore>'.
+ * The rules match those in create_mddev.
+ * 'w' must be:
+ * /dev/md/{anything}
+ * /dev/mdNN
+ * /dev/md_dNN
+ * <ignore>
+ * or anything that doesn't start '/' or '<'
+ */
+ if (strcasecmp(w, "<ignore>") == 0 ||
+ strncmp(w, "/dev/md/", 8) == 0 ||
+ (w[0] != '/' && w[0] != '<') ||
+ (strncmp(w, "/dev/md", 7) == 0 &&
+ is_number(w+7)) ||
+ (strncmp(w, "/dev/md_d", 9) == 0 &&
+ is_number(w+9))
+ ) {
+ /* This is acceptable */;
+ if (mis.devname)
+ fprintf(stderr, Name ": only give one "
+ "device per ARRAY line: %s and %s\n",
+ mis.devname, w);
+ else
+ mis.devname = w;
+ }else {
+ fprintf(stderr, Name ": %s is an invalid name for "
+ "an md device - ignored.\n", w);
+ }
} else if (strncasecmp(w, "uuid=", 5)==0 ) {
if (mis.uuid_set)
fprintf(stderr, Name ": only specify uuid once, %s ignored.\n",