aboutsummaryrefslogtreecommitdiffstats
path: root/meta-oe/recipes-support/multipath-tools/files/0027-RH-warn-on-invalid-regex-instead-of-failing.patch
blob: c59edbbb277e114a77ea42db4ece59d981337261 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
From 0000000000000000000000000000000000000000 Mon Sep 17
00:00:00 2001 From: Benjamin Marzinski <bmarzins@redhat.com> Date: Mon, 6 Nov
2017 21:39:28 -0600 Subject: [PATCH] RH: warn on invalid regex instead of
failing

multipath.conf used to allow "*" as a match everything regular expression,
instead of requiring ".*". Instead of erroring when the old style
regular expressions are used, it should print a warning and convert
them.

Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>

Upstream-Status: Pending

update this patch to 0.8.2

Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
 libmultipath/dict.c   | 29 ++++++++++++++++++++++-------
 libmultipath/parser.c | 13 +++++++++++++
 libmultipath/parser.h |  1 +
 3 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/libmultipath/dict.c b/libmultipath/dict.c
index c6eba0f..05ed3d8 100644
--- a/libmultipath/dict.c
+++ b/libmultipath/dict.c
@@ -59,6 +59,21 @@ set_str(vector strvec, void *ptr)
 }
 
 static int
+set_regex(vector strvec, void *ptr)
+{
+       char **str_ptr = (char **)ptr;
+
+       if (*str_ptr)
+               FREE(*str_ptr);
+       *str_ptr = set_regex_value(strvec);
+
+       if (!*str_ptr)
+               return 1;
+
+       return 0;
+}
+
+static int
 set_yes_no(vector strvec, void *ptr)
 {
 	char * buff;
@@ -1415,8 +1430,8 @@ ble_ ## option ## _handler (struct config *conf, vector strvec)		\
 									\
 	if (!conf->option)						\
 		return 1;						\
-									\
-	buff = set_value(strvec);					\
+									\	
+	buff = set_regex_value(strvec);					\
 	if (!buff)							\
 		return 1;						\
 									\
@@ -1432,7 +1447,7 @@ ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \
 	if (!conf->option)						\
 		return 1;						\
 									\
-	buff = set_value(strvec);					\
+	buff = set_regex_value(strvec);					\
 	if (!buff)							\
 		return 1;						\
 									\
@@ -1535,16 +1550,16 @@ device_handler(struct config *conf, vector strvec)
 	return 0;
 }
 
-declare_hw_handler(vendor, set_str)
+declare_hw_handler(vendor, set_regex)
 declare_hw_snprint(vendor, print_str)
 
-declare_hw_handler(product, set_str)
+declare_hw_handler(product, set_regex)
 declare_hw_snprint(product, print_str)
 
-declare_hw_handler(revision, set_str)
+declare_hw_handler(revision, set_regex)
 declare_hw_snprint(revision, print_str)
 
-declare_hw_handler(bl_product, set_str)
+declare_hw_handler(bl_product, set_regex)
 declare_hw_snprint(bl_product, print_str)
 
 declare_hw_handler(hwhandler, set_str)
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
index e00c5ff..6ca5842 100644
--- a/libmultipath/parser.c
+++ b/libmultipath/parser.c
@@ -382,6 +382,19 @@ oom:
 	return NULL;
 }
 
+void *
+set_regex_value(vector strvec)
+{
+       char *buff = set_value(strvec);
+
+       if (buff && strcmp("*", buff) == 0) {
+               condlog(0, "Invalid regular expression \"*\" in multipath.conf. Using \".*\"");
+               FREE(buff);
+               return strdup(".*");
+       }
+       return buff;
+}
+
 /* non-recursive configuration stream handler */
 static int kw_level = 0;
 
diff --git a/libmultipath/parser.h b/libmultipath/parser.h
index 62906e9..b791705 100644
--- a/libmultipath/parser.h
+++ b/libmultipath/parser.h
@@ -77,6 +77,7 @@ extern void dump_keywords(vector keydump, int level);
 extern void free_keywords(vector keywords);
 extern vector alloc_strvec(char *string);
 extern void *set_value(vector strvec);
+extern void *set_regex_value(vector strvec);
 extern int process_file(struct config *conf, char *conf_file);
 extern struct keyword * find_keyword(vector keywords, vector v, char * name);
 int snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw,
-- 
2.7.4