@cryptotaxi247 / netdata-1 / commits / c0cf5bbbc

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;