parse: ensure strings are pre-terminated when using strncpy()
[fio.git] / parse.c
diff --git a/parse.c b/parse.c
index 42096471f021b804cbb8eccb9a781d25cada4334..7912212ecda47594bac999e8abbecdacaf81aeb1 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -272,53 +272,6 @@ extern int evaluate_arithmetic_expression(const char *buffer, long long *ival,
                                          double *dval, double implied_units,
                                          int is_time);
 
-#ifdef CONFIG_ARITHMETIC
-/*
- * These two verification functions are just to gain confidence that
- * the arithmetic processing code is always getting the same answer as the
- * original number parsing code.  Once sufficiently sure that the arithmetic
- * code is always getting the right answers, these can be removed.
- */
-static void verify_exp_parser_float(const char *str, double implied_units, int is_time)
-{
-       long long ival;
-       double dval, tmpval;
-
-       if (sscanf(str, "%lf", &tmpval) != 1)
-               return;
-
-       if (evaluate_arithmetic_expression(str, &ival, &dval, implied_units, is_time) != 0) {
-               log_info("Arithmetic failed on '%s'\n", str);
-               return;
-       }
-       if (dval != tmpval) {
-               log_info("Arithmetic failed on: '%s' got %lf, expected %lf\n",
-                               str, dval, tmpval);
-       }
-}
-
-static void verify_exp_parser_decimal(const char *str, long long val, int kilo, int is_seconds,
-                                     int is_time)
-{
-       int rc;
-       long long ival;
-       double dval;
-       double implied_units = 1.0;
-
-       if (is_seconds)
-               implied_units = 1000000.0;
-
-       rc = evaluate_arithmetic_expression(str, &ival, &dval, implied_units, is_time);
-       if (!rc) {
-               if (ival != val)
-                       log_info("Arithmetic failed on '%s', expected %lld, got %lld\n",
-                               str, val, ival);
-       } else {
-               log_info("Arithmetic failed on '%s'\n", str);
-       }
-}
-#endif
-
 /*
  * Convert string into a floating number. Return 1 for success and 0 otherwise.
  */
@@ -335,8 +288,6 @@ int str_to_float(const char *str, double *val, int is_time)
                        *val = dval;
                        return 1;
                }
-       } else {
-               verify_exp_parser_float(str, 1.0, is_time);
        }
 #endif
        return 1 == sscanf(str, "%lf", val);
@@ -395,9 +346,7 @@ int str_to_decimal(const char *str, long long *val, int kilo, void *data,
                        *val *= mult;
        } else
                *val *= get_mult_time(str, len, is_seconds);
-#ifdef CONFIG_ARITHMETIC
-       verify_exp_parser_decimal(str, *val, kilo, is_seconds, is_time);
-#endif
+
        return 0;
 }
 
@@ -557,6 +506,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                if (!is_time && o->is_time)
                        is_time = o->is_time;
 
+               tmp[sizeof(tmp) - 1] = '\0';
                strncpy(tmp, ptr, sizeof(tmp) - 1);
                p = strchr(tmp, ',');
                if (p)
@@ -756,6 +706,7 @@ static int __handle_option(struct fio_option *o, const char *ptr, void *data,
                char tmp[128];
                char *p1, *p2;
 
+               tmp[sizeof(tmp) - 1] = '\0';
                strncpy(tmp, ptr, sizeof(tmp) - 1);
 
                /* Handle bsrange with separate read,write values: */
@@ -1068,7 +1019,7 @@ int parse_option(char *opt, const char *input,
  * Option match, levenshtein distance. Handy for not quite remembering what
  * the option name is.
  */
-static int string_distance(const char *s1, const char *s2)
+int string_distance(const char *s1, const char *s2)
 {
        unsigned int s1_len = strlen(s1);
        unsigned int s2_len = strlen(s2);
@@ -1279,8 +1230,6 @@ void option_init(struct fio_option *o)
        if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE ||
            o->type == FIO_OPT_STR_MULTI)
                return;
-       if (o->cb && (o->off1 || o->off2 || o->off3 || o->off4))
-               log_err("Option %s: both cb and offset given\n", o->name);
 }
 
 /*