]> git.ipfire.org Git - thirdparty/rrdtool-1.x.git/commitdiff
Fix all usages of setlocale: setlocale might (and on linux DOES)
authorPeter Stamfest <peter@stamfest.at>
Sun, 16 Mar 2014 16:36:23 +0000 (17:36 +0100)
committerPeter Stamfest <peter@stamfest.at>
Sun, 16 Mar 2014 16:54:46 +0000 (17:54 +0100)
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.

src/rrd_create.c
src/rrd_dump.c
src/rrd_graph.c
src/rrd_graph_helper.c
src/rrd_modify.c
src/rrd_rpncalc.c
src/rrd_tune.c
src/rrd_update.c
src/rrd_xport.c
tests/valgrind-supressions

index 9357047600b3bc8a88b94e21a49a64726540355c..b00b0bd8048299c47b5c0e986e8f0aa061993cd5 100644 (file)
@@ -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),
index bdd8a526460489d13329c3b0b14aa341357eb1d4..1887b284d1ab0454ce7f8142ebcc127718b0a60b 100644 (file)
@@ -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("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
index 9662231b4daedeabee4fb4a0cbb96172b0806e35..0990edb1f83d377cf456bb5e2b516c2f8b66403b 100644 (file)
@@ -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 */
index cb4ac9c9acf91b2276d94f9038d72f1eca3cb03e..90a9089035c10fe03373a839a2f37f908fa6a51e 100644 (file)
@@ -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);
index d3ff7e197ea61a252ef77015cdea9308545c1a56..360f56fc93b9de126661a1e76c26c9ecbd09f692 100644 (file)
@@ -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
 
index 0da4b071bc7a5771ab75cfae2a8ab350b6f9cadf..aba6042fe10462c41687100331da99dbd7978881 100644 (file)
@@ -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;
index 5d31366cf6799e87c2d472833944d9f4c31f044c..0c2a998b13b05bde427da733c3fe72982f86f4f9 100644 (file)
@@ -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;
index 5c4a6fb6f7242264fab63bc4c0dd5762ef782957..e9db085e66db154736c99715c52a0178bfa9a7ec 100644 (file)
@@ -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;
index 22efe73538d2ece85275c1b00d831f40b501cfec..57ed991fa7ead2d019fb37b0782a8138f6ea05bb 100644 (file)
@@ -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;
index d8fbf3481fdb091dccec4d1bb08583351663d198..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,8 +0,0 @@
-{
-   setlocale
-   Memcheck:Addr1
-   ...
-   fun:setlocale
-   ...
-   fun:main
-}