Code

fix freeing order when generating error messages. found by Dmitry V. Krivenok
[rrdtool.git] / src / rrd_restore.c
index 56b8e7ad282c204699248779c08775b2675a0a40..c5cbcd2dffae485242236e9bd7793dd45054a604 100644 (file)
@@ -108,14 +108,14 @@ static int get_long_from_node(
 
     end_ptr = NULL;
     temp = strtol(str_ptr, &end_ptr, 0);
-    xmlFree(str_ptr);
 
     if (str_ptr == end_ptr) {
         rrd_set_error("get_long_from_node: Cannot parse buffer as long: %s",
                       str_ptr);
+        xmlFree(str_ptr);
         return (-1);
     }
-
+    xmlFree(str_ptr);
     *value = temp;
 
     return (0);
@@ -138,14 +138,15 @@ static int get_ulong_from_node(
 
     end_ptr = NULL;
     temp = strtoul(str_ptr, &end_ptr, 0);
-    xmlFree(str_ptr);
 
     if (str_ptr == end_ptr) {
         rrd_set_error("get_ulong_from_node: Cannot parse buffer as unsigned long: %s",
                       str_ptr);
+        xmlFree(str_ptr);
         return (-1);
     }
-
+    xmlFree(str_ptr);
     *value = temp;
 
     return (0);
@@ -178,14 +179,14 @@ static int get_llong_from_node(
 
     end_ptr = NULL;
     temp = strtoll(str_ptr, &end_ptr, 10);
-    xmlFree(str_ptr);
 
     if (str_ptr == end_ptr) {
         rrd_set_error("get_llong_from_node: Cannot parse buffer as unsigned long long: %s",
                       str_ptr);
+        xmlFree(str_ptr);
         return (-1);
     }
-
+    xmlFree(str_ptr);
     *value = temp;
 
     return (0);
@@ -215,15 +216,15 @@ static int get_double_from_node(
 
     end_ptr = NULL;
     temp = strtod(str_ptr, &end_ptr);
-    xmlFree(str_ptr);
 
     if (str_ptr == end_ptr) {
         rrd_set_error
             ("get_double_from_node: Cannot parse buffer as double: %s",
              str_ptr);
+        xmlFree(str_ptr);
         return (-1);
     }
-
+    xmlFree(str_ptr);           
     *value = temp;
 
     return (0);
@@ -957,17 +958,19 @@ static int parse_tag_rrd(
         else if (xmlStrcmp(child->name, (const xmlChar *) "step") == 0)
             status = get_ulong_from_node(doc, child,
                                         &rrd->stat_head->pdp_step);
-        else if (xmlStrcmp(child->name, (const xmlChar *) "lastupdate") == 0)
+        else if (xmlStrcmp(child->name, (const xmlChar *) "lastupdate") == 0) {
             if (sizeof(time_t) == sizeof(long)) {
                status = get_long_from_node(doc, child, (long *)&rrd->live_head->last_up);
             }
-            else if (sizeof(time_t) == sizeof(long long)) {
-               status = get_llong_from_node(doc, child, (long long *)&rrd->live_head->last_up);
-            }
-            else {
-               rrd_set_error("can't convert to time_t ...", child->name);
-               status = -1;    
+            else { if (sizeof(time_t) == sizeof(long long)) {
+                       status = get_llong_from_node(doc, child, (long long *)&rrd->live_head->last_up);
+                    }
+                    else {
+                       rrd_set_error("can't convert to time_t ...", child->name);
+                       status = -1;    
+                    }
             }
+        }
         else if (xmlStrcmp(child->name, (const xmlChar *) "ds") == 0)
             status = parse_tag_ds(doc, child, rrd);
         else if (xmlStrcmp(child->name, (const xmlChar *) "rra") == 0)