new (better) checker for incoming COUNTER or DERIVED data. thanks Florian!
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 14 Jan 2010 13:01:43 +0000 (13:01 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Thu, 14 Jan 2010 13:01:43 +0000 (13:01 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@2001 a5681a0c-68f1-0310-ab6d-d61299d08faa

src/rrd_update.c

index 8efd493..ec1e5fd 100644 (file)
@@ -1043,24 +1043,22 @@ static int update_pdp_prep(
             switch (dst_idx) {
             case DST_COUNTER:
             case DST_DERIVE:
-                if ( (   updvals[ds_idx + 1][0] < '0'
-                      || updvals[ds_idx + 1][0] > '9' )
-                     && updvals[ds_idx + 1][0] != '-'
-                     && updvals[ds_idx + 1][0] != 'U'
-                   ) {
-                    rrd_set_error("not a simple integer: '%s'",
-                                  updvals[ds_idx + 1]);
-                    return -1;
-                }
-                for (ii = 1; updvals[ds_idx + 1][ii] != '\0'; ii++) {
-                    if (    updvals[ds_idx + 1][ii] < '0'
-                         || updvals[ds_idx + 1][ii] > '9'
-                       ) {
-                        rrd_set_error("not a simple integer: '%s'",
-                                      updvals[ds_idx + 1]);
+                /* Check if this is a valid integer. `U' is already handled in
+                 * another branch. */
+                for (ii = 0; updvals[ds_idx + 1][ii] != 0; ii++) {
+                    if ((ii == 0) && (dst_idx == DST_DERIVE)
+                            && (updvals[ds_idx + 1][ii] == '-'))
+                        continue;
+
+                    if ((updvals[ds_idx + 1][ii] < '0')
+                            || (updvals[ds_idx + 1][ii] > '9')) {
+                        rrd_set_error("not a simple %s integer: '%s'",
+                                (dst_idx == DST_DERIVE) ? "signed" : "unsigned",
+                                updvals[ds_idx + 1]);
                         return -1;
                     }
-                }
+                } /* for (ii = 0; updvals[ds_idx + 1][ii] != 0; ii++) */
+
                 if (rrd->pdp_prep[ds_idx].last_ds[0] != 'U') {
                     pdp_new[ds_idx] =
                         rrd_diff(updvals[ds_idx + 1],