From 54949ca827c8d8054c16ed9dad5d28aac1c49593 Mon Sep 17 00:00:00 2001 From: oetiker Date: Thu, 11 Nov 2010 16:06:55 +0000 Subject: [PATCH] Here is a patch that fixes a serious endless loop problem on 32 bit architectures near the timestamp 2^31 (oh yes - y2k038 is showing its ugly face) when using the graph command(s). Once the endtime of a graph is above the mentioned timestamp, mktime always returns -1 (and correctly so), causing some loops to loop forever. The patch fixes this, causing some strange output, but there is no other sane way to handle this (expect by switching to a 64 bit platform). -- Peter Stamfest git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.4@2146 a5681a0c-68f1-0310-ab6d-d61299d08faa --- program/src/rrd_graph.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/program/src/rrd_graph.c b/program/src/rrd_graph.c index def9c9cc..16e8d45f 100644 --- a/program/src/rrd_graph.c +++ b/program/src/rrd_graph.c @@ -1463,6 +1463,13 @@ time_t find_next_time( localtime_r(¤t, &tm); + int limit = 2; + switch (baseint) { + case TMT_SECOND: limit = 7200; break; + case TMT_MINUTE: limit = 120; break; + case TMT_HOUR: limit = 2; break; + default: limit = 2; break; + } do { switch (baseint) { case TMT_SECOND: @@ -1493,7 +1500,7 @@ time_t find_next_time( tm. tm_year += basestep; } madetime = mktime(&tm); - } while (madetime == -1); /* this is necessary to skip impssible times + } while (madetime == -1 && limit-- >= 0); /* this is necessary to skip impossible times like the daylight saving time skips */ return madetime; @@ -2490,19 +2497,20 @@ void vertical_grid( mgridtm, im->xlab_user. mgridst); - ti < im->end; + ti < im->end && ti != -1; ti = find_next_time(ti, im->xlab_user.gridtm, im->xlab_user.gridst) ) { /* are we inside the graph ? */ if (ti < im->start || ti > im->end) continue; - while (timajor < ti) { + while (timajor < ti && timajor != -1) { timajor = find_next_time(timajor, im-> xlab_user. mgridtm, im->xlab_user.mgridst); } + if (timajor == -1) break; /* fail in case of problems with time increments */ if (ti == timajor) continue; /* skip as falls on major grid line */ X0 = xtr(im, ti); @@ -2526,7 +2534,7 @@ void vertical_grid( im-> xlab_user. mgridst); - ti < im->end; + ti < im->end && ti != -1; ti = find_next_time(ti, im->xlab_user.mgridtm, im->xlab_user.mgridst) ) { /* are we inside the graph ? */ @@ -2552,9 +2560,9 @@ void vertical_grid( labtm, im->xlab_user. labst); - ti <= + (ti <= im->end - - im->xlab_user.precis / 2; + im->xlab_user.precis / 2) && ti != -1; ti = find_next_time(ti, im->xlab_user.labtm, im->xlab_user.labst) ) { tilab = ti + im->xlab_user.precis / 2; /* correct time for the label */ -- 2.30.2