Split the code that does the actual value parsing out of set_int(), into a helper function, do_set_int(), so that it can be used by other handlers. These functions no longer set the config value at all, when they have invalid input. Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> --- libmultipath/dict.c | 92 ++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/libmultipath/dict.c b/libmultipath/dict.c index 1b4e1106..3212d14c 100644 --- a/libmultipath/dict.c +++ b/libmultipath/dict.c @@ -31,17 +31,12 @@ #include "strbuf.h" static int -set_int(vector strvec, void *ptr, int min, int max, const char *file, - int line_nr) +do_set_int(vector strvec, void *ptr, int min, int max, const char *file, + int line_nr, char *buff) { int *int_ptr = (int *)ptr; - char *buff, *eptr; + char *eptr; long res; - int rc; - - buff = set_value(strvec); - if (!buff) - return 1; res = strtol(buff, &eptr, 10); if (eptr > buff) @@ -50,17 +45,30 @@ 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); - rc = 1; - } else { - if (res > max || res < min) { - res = (res > max) ? max : min; - condlog(1, "%s line %d, value for %s too %s, capping at %ld", + return 1; + } + if (res > max || res < min) { + res = (res > max) ? max : min; + condlog(1, "%s line %d, value for %s too %s, capping at %ld", file, line_nr, (char*)VECTOR_SLOT(strvec, 0), - (res == max)? "large" : "small", res); - } - rc = 0; - *int_ptr = res; + (res == max)? "large" : "small", res); } + *int_ptr = res; + return 0; +} + +static int +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); FREE(buff); return rc; @@ -940,6 +948,7 @@ 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; @@ -949,10 +958,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 if (sscanf(buff, "%d", int_ptr) != 1 || - *int_ptr < UOZ_ZERO) - *int_ptr = UOZ_UNDEF; - else if (*int_ptr == 0) + else + rc = do_set_int(strvec, int_ptr, 0, INT_MAX, file, line_nr, + buff); + if (rc == 0 && *int_ptr == 0) *int_ptr = UOZ_ZERO; FREE(buff); @@ -1104,14 +1113,12 @@ max_fds_handler(struct config *conf, vector strvec, const char *file, /* Assume safe limit */ max_fds = 4096; } - if (strlen(buff) == 3 && - !strcmp(buff, "max")) - conf->max_fds = max_fds; - else - conf->max_fds = atoi(buff); - - if (conf->max_fds > max_fds) + 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); FREE(buff); @@ -1180,6 +1187,7 @@ 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; @@ -1194,11 +1202,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 - *int_ptr = atoi(buff); + rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); FREE(buff); - return 0; + return rc; } int @@ -1230,6 +1238,7 @@ 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; @@ -1237,15 +1246,18 @@ no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) if (!buff) return 1; - if (!strcmp(buff, "fail") || !strcmp(buff, "0")) + if (!strcmp(buff, "fail")) *int_ptr = NO_PATH_RETRY_FAIL; else if (!strcmp(buff, "queue")) *int_ptr = NO_PATH_RETRY_QUEUE; - else if ((*int_ptr = atoi(buff)) < 1) - *int_ptr = NO_PATH_RETRY_UNDEF; + else { + rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); + if (rc == 0 && *int_ptr == 0) + *int_ptr = NO_PATH_RETRY_FAIL; + } FREE(buff); - return 0; + return rc; } int @@ -1387,6 +1399,7 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff, 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; @@ -1394,13 +1407,16 @@ set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) if (!buff) return 1; - if (!strcmp(buff, "no") || !strcmp(buff, "0")) + if (!strcmp(buff, "no")) *int_ptr = NU_NO; - else if ((*int_ptr = atoi(buff)) < 1) - *int_ptr = NU_UNDEF; + else { + rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); + if (rc == 0 && *int_ptr == 0) + *int_ptr = NU_NO; + } FREE(buff); - return 0; + return rc; } int -- 2.17.2 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel