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