when using CDEF datasources in rrd, the rpnp in process_pdp_st (allocated in rpn_expa...
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 29 Apr 2010 05:40:59 +0000 (05:40 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 29 Apr 2010 05:40:59 +0000 (05:40 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@2073 a5681a0c-68f1-0310-ab6d-d61299d08faa

src/rrd_rpncalc.c
src/rrd_update.c

index e392a65..dca2ae1 100644 (file)
@@ -72,8 +72,10 @@ rpnp_t   *rpn_expand(
     /* DS_CDEF_MAX_RPN_NODES is small, so at the expense of some wasted
      * memory we avoid any reallocs */
     rpnp = (rpnp_t *) calloc(DS_CDEF_MAX_RPN_NODES, sizeof(rpnp_t));
-    if (rpnp == NULL)
+    if (rpnp == NULL) {
+        rrd_set_error("failed allocating rpnp array");
         return NULL;
+    }
     for (i = 0; rpnc[i].op != OP_END; ++i) {
         rpnp[i].op = rpnc[i].op;
         if (rpnp[i].op == OP_NUMBER) {
index 4016d75..0335a9e 100644 (file)
@@ -1354,6 +1354,10 @@ static int process_pdp_st(
 
         rpnp =
             rpn_expand((rpn_cdefds_t *) &(rrd->ds_def[ds_idx].par[DS_cdef]));
+        if(rpnp == NULL) {
+          rpnstack_free(&rpnstack);
+          return -1;
+        }
         /* substitute data values for OP_VARIABLE nodes */
         for (i = 0; rpnp[i].op != OP_END; i++) {
             if (rpnp[i].op == OP_VARIABLE) {
@@ -1367,6 +1371,7 @@ static int process_pdp_st(
             rpnstack_free(&rpnstack);
             return -1;
         }
+        free(rpnp);
     }
 
     /* make pdp_prep ready for the next run */