From a7b5ac7542c835f0703db519a6bb24cf0518a5a8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Tue, 25 Feb 2014 14:30:15 +0100
Subject: [PATCH] Graphics.Graph: Fixed some infinite loops.

The step when assigning the axis lables could be smaller than the
mantissa allows, which caused infinite cpu and memory consumption.

This state is now detected and the loops terminated.

Fixes [LysLysKOM 20708162].
---
 .../Graphics.pmod/Graph.pmod/create_graph.pike | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/lib/modules/Graphics.pmod/Graph.pmod/create_graph.pike b/lib/modules/Graphics.pmod/Graph.pmod/create_graph.pike
index 756ecdc014..5729f96e38 100755
--- a/lib/modules/Graphics.pmod/Graph.pmod/create_graph.pike
+++ b/lib/modules/Graphics.pmod/Graph.pmod/create_graph.pike
@@ -1037,8 +1037,15 @@ mapping(string:mixed) create_graph(mapping diagram_data)
     start=diagram_data->xspace*ceil((start)/diagram_data->xspace);
     diagram_data->values_for_xnames=({start});
     while(diagram_data->values_for_xnames[-1]
-	  <= diagram_data->xmaxvalue-diagram_data->xspace)
+	  <= diagram_data->xmaxvalue-diagram_data->xspace) {
       diagram_data->values_for_xnames+=({start+=diagram_data->xspace});
+      if (diagram_data->values_for_xnames[-1] <=
+	  diagram_data->values_for_xnames[-2]) {
+	// Step smaller than mantissa or negative.
+	diagram_data->values_for_xnames = diagram_data->values_for_xnames[..<1];
+	break;
+      }
+    }
   }
   if (!(diagram_data->values_for_ynames))
   {
@@ -1051,8 +1058,15 @@ mapping(string:mixed) create_graph(mapping diagram_data)
     start=diagram_data->yspace*ceil((start)/diagram_data->yspace);
     diagram_data->values_for_ynames=({start});
     while(diagram_data->values_for_ynames[-1]
-	  <= diagram_data->ymaxvalue-diagram_data->yspace)
+	  <= diagram_data->ymaxvalue-diagram_data->yspace) {
       diagram_data->values_for_ynames+=({start+=diagram_data->yspace});
+      if (diagram_data->values_for_ynames[-1] <=
+	  diagram_data->values_for_ynames[-2]) {
+	// Step smaller than mantissa or negative.
+	diagram_data->values_for_ynames = diagram_data->values_for_ynames[..<1];
+	break;
+      }
+    }
   }
   
   //Generate the texten if it doesn't exist
-- 
GitLab