1*4882a593SmuzhiyunFrom 0000000000000000000000000000000000000000 Mon Sep 17
2*4882a593Smuzhiyun00:00:00 2001 From: Benjamin Marzinski <bmarzins@redhat.com> Date: Mon, 6 Nov
3*4882a593Smuzhiyun2017 21:39:28 -0600 Subject: [PATCH] RH: warn on invalid regex instead of
4*4882a593Smuzhiyunfailing
5*4882a593Smuzhiyun
6*4882a593Smuzhiyunmultipath.conf used to allow "*" as a match everything regular expression,
7*4882a593Smuzhiyuninstead of requiring ".*". Instead of erroring when the old style
8*4882a593Smuzhiyunregular expressions are used, it should print a warning and convert
9*4882a593Smuzhiyunthem.
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunSigned-off-by: Benjamin Marzinski <bmarzins@redhat.com>
12*4882a593Smuzhiyun
13*4882a593SmuzhiyunUpstream-Status: Pending
14*4882a593Smuzhiyun
15*4882a593Smuzhiyunupdate this patch to 0.8.2
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunSigned-off-by: Changqing Li <changqing.li@windriver.com>
18*4882a593Smuzhiyun---
19*4882a593Smuzhiyun libmultipath/dict.c   | 29 ++++++++++++++++++++++-------
20*4882a593Smuzhiyun libmultipath/parser.c | 13 +++++++++++++
21*4882a593Smuzhiyun libmultipath/parser.h |  1 +
22*4882a593Smuzhiyun 3 files changed, 36 insertions(+), 7 deletions(-)
23*4882a593Smuzhiyun
24*4882a593Smuzhiyundiff --git a/libmultipath/dict.c b/libmultipath/dict.c
25*4882a593Smuzhiyunindex c6eba0f..05ed3d8 100644
26*4882a593Smuzhiyun--- a/libmultipath/dict.c
27*4882a593Smuzhiyun+++ b/libmultipath/dict.c
28*4882a593Smuzhiyun@@ -59,6 +59,21 @@ set_str(vector strvec, void *ptr)
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun static int
32*4882a593Smuzhiyun+set_regex(vector strvec, void *ptr)
33*4882a593Smuzhiyun+{
34*4882a593Smuzhiyun+       char **str_ptr = (char **)ptr;
35*4882a593Smuzhiyun+
36*4882a593Smuzhiyun+       if (*str_ptr)
37*4882a593Smuzhiyun+               FREE(*str_ptr);
38*4882a593Smuzhiyun+       *str_ptr = set_regex_value(strvec);
39*4882a593Smuzhiyun+
40*4882a593Smuzhiyun+       if (!*str_ptr)
41*4882a593Smuzhiyun+               return 1;
42*4882a593Smuzhiyun+
43*4882a593Smuzhiyun+       return 0;
44*4882a593Smuzhiyun+}
45*4882a593Smuzhiyun+
46*4882a593Smuzhiyun+static int
47*4882a593Smuzhiyun set_yes_no(vector strvec, void *ptr)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	char * buff;
50*4882a593Smuzhiyun@@ -1415,8 +1430,8 @@ ble_ ## option ## _handler (struct config *conf, vector strvec)		\
51*4882a593Smuzhiyun 									\
52*4882a593Smuzhiyun 	if (!conf->option)						\
53*4882a593Smuzhiyun 		return 1;						\
54*4882a593Smuzhiyun-									\
55*4882a593Smuzhiyun-	buff = set_value(strvec);					\
56*4882a593Smuzhiyun+									\
57*4882a593Smuzhiyun+	buff = set_regex_value(strvec);					\
58*4882a593Smuzhiyun 	if (!buff)							\
59*4882a593Smuzhiyun 		return 1;						\
60*4882a593Smuzhiyun 									\
61*4882a593Smuzhiyun@@ -1432,7 +1447,7 @@ ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \
62*4882a593Smuzhiyun 	if (!conf->option)						\
63*4882a593Smuzhiyun 		return 1;						\
64*4882a593Smuzhiyun 									\
65*4882a593Smuzhiyun-	buff = set_value(strvec);					\
66*4882a593Smuzhiyun+	buff = set_regex_value(strvec);					\
67*4882a593Smuzhiyun 	if (!buff)							\
68*4882a593Smuzhiyun 		return 1;						\
69*4882a593Smuzhiyun 									\
70*4882a593Smuzhiyun@@ -1535,16 +1550,16 @@ device_handler(struct config *conf, vector strvec)
71*4882a593Smuzhiyun 	return 0;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun-declare_hw_handler(vendor, set_str)
75*4882a593Smuzhiyun+declare_hw_handler(vendor, set_regex)
76*4882a593Smuzhiyun declare_hw_snprint(vendor, print_str)
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun-declare_hw_handler(product, set_str)
79*4882a593Smuzhiyun+declare_hw_handler(product, set_regex)
80*4882a593Smuzhiyun declare_hw_snprint(product, print_str)
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun-declare_hw_handler(revision, set_str)
83*4882a593Smuzhiyun+declare_hw_handler(revision, set_regex)
84*4882a593Smuzhiyun declare_hw_snprint(revision, print_str)
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun-declare_hw_handler(bl_product, set_str)
87*4882a593Smuzhiyun+declare_hw_handler(bl_product, set_regex)
88*4882a593Smuzhiyun declare_hw_snprint(bl_product, print_str)
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun declare_hw_handler(hwhandler, set_str)
91*4882a593Smuzhiyundiff --git a/libmultipath/parser.c b/libmultipath/parser.c
92*4882a593Smuzhiyunindex e00c5ff..6ca5842 100644
93*4882a593Smuzhiyun--- a/libmultipath/parser.c
94*4882a593Smuzhiyun+++ b/libmultipath/parser.c
95*4882a593Smuzhiyun@@ -382,6 +382,19 @@ oom:
96*4882a593Smuzhiyun 	return NULL;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun+void *
100*4882a593Smuzhiyun+set_regex_value(vector strvec)
101*4882a593Smuzhiyun+{
102*4882a593Smuzhiyun+       char *buff = set_value(strvec);
103*4882a593Smuzhiyun+
104*4882a593Smuzhiyun+       if (buff && strcmp("*", buff) == 0) {
105*4882a593Smuzhiyun+               condlog(0, "Invalid regular expression \"*\" in multipath.conf. Using \".*\"");
106*4882a593Smuzhiyun+               FREE(buff);
107*4882a593Smuzhiyun+               return strdup(".*");
108*4882a593Smuzhiyun+       }
109*4882a593Smuzhiyun+       return buff;
110*4882a593Smuzhiyun+}
111*4882a593Smuzhiyun+
112*4882a593Smuzhiyun /* non-recursive configuration stream handler */
113*4882a593Smuzhiyun static int kw_level = 0;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyundiff --git a/libmultipath/parser.h b/libmultipath/parser.h
116*4882a593Smuzhiyunindex 62906e9..b791705 100644
117*4882a593Smuzhiyun--- a/libmultipath/parser.h
118*4882a593Smuzhiyun+++ b/libmultipath/parser.h
119*4882a593Smuzhiyun@@ -77,6 +77,7 @@ extern void dump_keywords(vector keydump, int level);
120*4882a593Smuzhiyun extern void free_keywords(vector keywords);
121*4882a593Smuzhiyun extern vector alloc_strvec(char *string);
122*4882a593Smuzhiyun extern void *set_value(vector strvec);
123*4882a593Smuzhiyun+extern void *set_regex_value(vector strvec);
124*4882a593Smuzhiyun extern int process_file(struct config *conf, char *conf_file);
125*4882a593Smuzhiyun extern struct keyword * find_keyword(vector keywords, vector v, char * name);
126*4882a593Smuzhiyun int snprint_keyword(char *buff, int len, char *fmt, struct keyword *kw,
127*4882a593Smuzhiyun--
128*4882a593Smuzhiyun2.7.4
129*4882a593Smuzhiyun
130