fixed a division by zero; added logging in case out of bounds range is selected
Costa Tsaousis (ktsaou) committed
Dec 2, 2015 at 14:12 UTC
c0cf5bbbc8e5b7b8d9c59e2bd7162afbe15d5a10
1 file changed
+35
src/rrd2json.c
+35
@@ -881,6 +881,7 @@ RRDR *rrd2rrdr(RRDSET *st, long points, long long after, long long before, int g
881
// check the wanted points
882
if(points < 0) points = -points;
883
if(points > available_points) points = available_points;
884
+ if(points == 0) points = available_points;
885
886
// calculate proper grouping of source data
887
long group = available_points / points;
@@ -902,6 +903,40 @@ RRDR *rrd2rrdr(RRDSET *st, long points, long long after, long long before, int g
903
time_t before_new = rrdset_slot2time(st, start_at_slot);
904
long points_new = (before_new - after_new) / st->update_every / group;
905
906
+ if(after_new < first_entry_t) {
907
+ error("after_new %u is before min %u", after_new, first_entry_t);
908
+ after_new = first_entry_t;
909
+ points_new = (before_new - after_new) / st->update_every / group;
910
+ }
911
+ if(after_new > last_entry_t) {
912
+ error("after_new %u is after max %u", after_new, last_entry_t);
913
+ after_new = last_entry_t;
914
+ points_new = (before_new - after_new) / st->update_every / group;
915
+ }
916
+ if(before_new < first_entry_t) {
917
+ error("before_new %u is before min %u", before_new, first_entry_t);
918
+ before_new = first_entry_t;
919
+ points_new = (before_new - after_new) / st->update_every / group;
920
+ }
921
+ if(before_new > last_entry_t) {
922
+ error("before_new %u is after max %u", before_new, last_entry_t);
923
+ before_new = last_entry_t;
924
+ points_new = (before_new - after_new) / st->update_every / group;
925
+ }
926
+ if(start_at_slot < 0 || start_at_slot >= st->entries) {
927
+ error("start_at_slot is invalid %ld, expected %ld to %ld", start_at_slot, 0, st->entries - 1);
928
+ start_at_slot = st->current_entry;
929
+ points_new = (before_new - after_new) / st->update_every / group;
930
+ }
931
+ if(stop_at_slot < 0 || stop_at_slot >= st->entries) {
932
+ error("stop_at_slot is invalid %ld, expected %ld to %ld", stop_at_slot, 0, st->entries - 1);
933
+ stop_at_slot = 0;
934
+ points_new = (before_new - after_new) / st->update_every / group;
935
+ }
936
+ if(points_new > (before_new - after_new) / group / st->update_every + 1) {
937
+ error("points_new %ld is more than points %ld", points_new, (before_new - after_new) / group / st->update_every + 1);
938
+ }
939
+
940
//error("SHIFT: %s: wanted %ld points, got %ld - group=%ld, wanted duration=%u, got %u - wanted %ld - %ld, got %ld - %ld", st->id, points, points_new, group, before - after, before_new - after_new, after, before, after_new, before_new);
941
942
after = after_new;