From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Thu, 11 Nov 2021 17:37:05 -0600 Subject: [PATCH] libmultipath: don't return error on invalid values do_set_int and set_uint return 1 for invalid values. This can cause multipath to fail completely, while reading the config. The config handlers should only return a non-zero value if there is an internal error, not if there is just an invalid value. Signed-off-by: Benjamin Marzinski --- libmultipath/dict.c | 64 ++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 39 deletions(-) diff --git a/libmultipath/dict.c b/libmultipath/dict.c index b255322e..5a0255b0 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -29,7 +29,7 @@ #include "mpath_cmd.h" #include "dict.h" -static int +static void do_set_int(vector strvec, void *ptr, int min, int max, const char *file, int line_nr, char *buff) { @@ -44,7 +44,7 @@ do_set_int(vector strvec, void *ptr, int min, int max, const char *file, if (*buff == '\0' || *eptr != '\0') { condlog(1, "%s line %d, invalid value for %s: \"%s\"", file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); - return 1; + return; } if (res > max || res < min) { res = (res > max) ? max : min; @@ -53,7 +53,7 @@ do_set_int(vector strvec, void *ptr, int min, int max, const char *file, (res == max)? "large" : "small", res); } *int_ptr = res; - return 0; + return; } static int @@ -61,16 +61,15 @@ set_int(vector strvec, void *ptr, int min, int max, const char *file, int line_nr) { char *buff; - int rc; buff = set_value(strvec); if (!buff) return 1; - rc = do_set_int(strvec, ptr, min, max, file, line_nr, buff); + do_set_int(strvec, ptr, min, max, file, line_nr, buff); FREE(buff); - return rc; + return 0; } static int @@ -79,7 +78,6 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr) unsigned int *uint_ptr = (unsigned int *)ptr; char *buff, *eptr, *p; unsigned long res; - int rc; buff = set_value(strvec); if (!buff) @@ -92,17 +90,14 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr) if (eptr > buff) while (isspace(*eptr)) eptr++; - if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) { + if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) condlog(1, "%s line %d, invalid value for %s: \"%s\"", file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); - rc = 1; - } else { - rc = 0; + else *uint_ptr = res; - } FREE(buff); - return rc; + return 0; } static int @@ -990,7 +985,6 @@ declare_mp_attr_snprint(gid, print_gid) static int set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) { - int rc = 0; char * buff; int *int_ptr = (int *)ptr; @@ -1000,11 +994,10 @@ set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) if (strcmp(buff, "off") == 0) *int_ptr = UOZ_OFF; - else - rc = do_set_int(strvec, int_ptr, 0, INT_MAX, file, line_nr, - buff); - if (rc == 0 && *int_ptr == 0) + else if (strcmp(buff, "0") == 0) *int_ptr = UOZ_ZERO; + else + do_set_int(strvec, int_ptr, 1, INT_MAX, file, line_nr, buff); FREE(buff); return 0; @@ -1151,28 +1144,24 @@ max_fds_handler(struct config *conf, vector strvec, const char *file, int line_nr) { char * buff; - int r = 0, max_fds; + int max_fds; buff = set_value(strvec); if (!buff) return 1; - r = get_sys_max_fds(&max_fds); - if (r) { - /* Assume safe limit */ - max_fds = 4096; - } - if (!strcmp(buff, "max")) { + if (get_sys_max_fds(&max_fds) != 0) + max_fds = 4096; /* Assume safe limit */ + if (!strcmp(buff, "max")) conf->max_fds = max_fds; - r = 0; - } else - r = do_set_int(strvec, &conf->max_fds, 0, max_fds, file, - line_nr, buff); + else + do_set_int(strvec, &conf->max_fds, 0, max_fds, file, line_nr, + buff); FREE(buff); - return r; + return 0; } static int @@ -1238,7 +1227,6 @@ declare_mp_snprint(rr_weight, print_rr_weight) static int set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) { - int rc = 0; int *int_ptr = (int *)ptr; char * buff; @@ -1253,11 +1241,11 @@ set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) else if (strlen(buff) == 10 && !strcmp(buff, "followover")) *int_ptr = -FAILBACK_FOLLOWOVER; else - rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); + do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); FREE(buff); - return rc; + return 0; } int @@ -1289,7 +1277,6 @@ declare_mp_snprint(pgfailback, print_pgfailback) static int no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) { - int rc = 0; int *int_ptr = (int *)ptr; char * buff; @@ -1302,10 +1289,10 @@ no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) else if (!strcmp(buff, "queue")) *int_ptr = NO_PATH_RETRY_QUEUE; else - rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); + do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); FREE(buff); - return rc; + return 0; } int @@ -1453,7 +1440,6 @@ snprint_mp_reservation_key (struct config *conf, char * buff, int len, static int set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) { - int rc =0; int *int_ptr = (int *)ptr; char * buff; @@ -1464,10 +1450,10 @@ set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) if (!strcmp(buff, "no") || !strcmp(buff, "0")) *int_ptr = NU_NO; else - rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); + do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); FREE(buff); - return rc; + return 0; } int