From: Peter Stamfest Date: Sun, 16 Mar 2014 16:36:23 +0000 (+0100) Subject: Fix all usages of setlocale: setlocale might (and on linux DOES) X-Git-Tag: v1.5.0-rc1~117^2~2^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0e1608b77ca017b24917877488eacbbf2167c375;p=thirdparty%2Frrdtool-1.x.git Fix all usages of setlocale: setlocale might (and on linux DOES) return a pointer to memory handled internally by libc, calling setlocale twice and using the data returned from the first call later on causes access to already free'd memory. This was clearly seen through valgrind. Eg. use TESTS_STYLE=valgrind ./tests/tune2 with this cs backed-out and you will see valgrind problems related to setlocale. --- diff --git a/src/rrd_create.c b/src/rrd_create.c index 93570476..b00b0bd8 100644 --- a/src/rrd_create.c +++ b/src/rrd_create.c @@ -644,8 +644,7 @@ void parseGENERIC_DS( &(rrd -> ds_def[ds_idx].par[DS_mrhb_cnt].u_cnt), minstr,maxstr); */ - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); if (sscanf(def, "%lu:%18[^:]:%18[^:]", &(ds_def->par[DS_mrhb_cnt].u_cnt), diff --git a/src/rrd_dump.c b/src/rrd_dump.c index bdd8a526..1887b284 100644 --- a/src/rrd_dump.c +++ b/src/rrd_dump.c @@ -103,9 +103,7 @@ int rrd_dump_cb_r( return (-1); } - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); - + old_locale = setlocale(LC_NUMERIC, "C"); if (opt_header == 1) { CB_PUTS("\n"); diff --git a/src/rrd_graph.c b/src/rrd_graph.c index 9662231b..0990edb1 100644 --- a/src/rrd_graph.c +++ b/src/rrd_graph.c @@ -4166,8 +4166,7 @@ rrd_info_t *rrd_graph_v( char *old_locale; rrd_graph_init(&im); /* a dummy surface so that we can measure text sizes for placements */ - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); rrd_graph_options(argc, argv, &im); if (rrd_test_error()) { setlocale(LC_NUMERIC, old_locale); /* reenable locale */ diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c index cb4ac9c9..90a90890 100644 --- a/src/rrd_graph_helper.c +++ b/src/rrd_graph_helper.c @@ -142,12 +142,12 @@ int getDouble(const char* v, double *val,char**extra) { /* NOTE that this may be a bit different from the original parser */ char *old_locale; *extra=NULL; - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); errno = 0; *val = strtod(v,extra); if (errno > 0) { rrd_set_error("converting '%s' to float: %s", v, rrd_strerror(errno)); + setlocale(LC_NUMERIC, old_locale); return -1; }; setlocale(LC_NUMERIC, old_locale); diff --git a/src/rrd_modify.c b/src/rrd_modify.c index d3ff7e19..360f56fc 100644 --- a/src/rrd_modify.c +++ b/src/rrd_modify.c @@ -1091,8 +1091,7 @@ static int rrd_modify_r(const char *infilename, rrd_file_t *rrd_file = NULL; char *old_locale = NULL; - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); rrd_clear_error(); // reset error diff --git a/src/rrd_rpncalc.c b/src/rrd_rpncalc.c index 0da4b071..aba6042f 100644 --- a/src/rrd_rpncalc.c +++ b/src/rrd_rpncalc.c @@ -302,8 +302,7 @@ rpnp_t *rpn_parse( char vname[MAX_VNAME_LEN + 10]; char *old_locale; - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); rpnp = NULL; expr = (char *) expr_const; diff --git a/src/rrd_tune.c b/src/rrd_tune.c index 5d31366c..0c2a998b 100644 --- a/src/rrd_tune.c +++ b/src/rrd_tune.c @@ -106,20 +106,16 @@ int rrd_tune( {"daemon", required_argument, 0, 'D'}, {0, 0, 0, 0} }; - char *old_locale = NULL; + char *old_locale = setlocale(LC_NUMERIC, "C"); optind = 0; opterr = 0; /* initialize getopt */ - rrd_init(&rrd); rrd_file = rrd_open(argv[1], &rrd, RRD_READWRITE); if (rrd_file == NULL) { - rrd_free(&rrd); - return -1; + goto done; } - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); while (1) { int option_index = 0; diff --git a/src/rrd_update.c b/src/rrd_update.c index 5c4a6fb6..e9db085e 100644 --- a/src/rrd_update.c +++ b/src/rrd_update.c @@ -997,8 +997,7 @@ static int get_time_from_reading( *current_time = tmp_time.tv_sec; *current_time_usec = tmp_time.tv_usec; } else { - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); errno = 0; tmp = strtod(updvals[0], 0); if (errno > 0) { @@ -1110,8 +1109,7 @@ static int update_pdp_prep( } break; case DST_ABSOLUTE: - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); errno = 0; pdp_new[ds_idx] = strtod(updvals[ds_idx + 1], &endptr); if (errno > 0) { @@ -1129,8 +1127,7 @@ static int update_pdp_prep( rate = pdp_new[ds_idx] / interval; break; case DST_GAUGE: - old_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "C"); + old_locale = setlocale(LC_NUMERIC, "C"); errno = 0; pdp_new[ds_idx] = strtod(updvals[ds_idx + 1], &endptr) * interval; diff --git a/src/rrd_xport.c b/src/rrd_xport.c index 22efe735..57ed991f 100644 --- a/src/rrd_xport.c +++ b/src/rrd_xport.c @@ -409,8 +409,7 @@ int rrd_graph_xport(image_desc_t *im) { grinfo_push(im, sprintf_alloc("graph_step"), RD_I_CNT, info); /* set locale */ - char *old_locale = setlocale(LC_NUMERIC,NULL); - setlocale(LC_NUMERIC, "C"); + char *old_locale = setlocale(LC_NUMERIC, "C"); /* format it for output */ int r=0; diff --git a/tests/valgrind-supressions b/tests/valgrind-supressions index d8fbf348..e69de29b 100644 --- a/tests/valgrind-supressions +++ b/tests/valgrind-supressions @@ -1,8 +0,0 @@ -{ - setlocale - Memcheck:Addr1 - ... - fun:setlocale - ... - fun:main -}