From 25945dc5395a03cab069ff0e6470ba8d59b03978 Mon Sep 17 00:00:00 2001
From: kwolekr <kwolekr@minetest.net>
Date: Sat, 29 Nov 2014 16:50:18 -0500
Subject: [PATCH] noise: Throw exception on noise allocation failure

---
 src/exceptions.h               | 12 ++++++++++++
 src/noise.cpp                  | 25 +++++++++++++++++++------
 src/script/lua_api/l_noise.cpp | 10 +++++++---
 3 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/src/exceptions.h b/src/exceptions.h
index 6d6ad333a..abd8c68ae 100644
--- a/src/exceptions.h
+++ b/src/exceptions.h
@@ -125,6 +125,18 @@ class ClientStateError : public BaseException {
 	Some "old-style" interrupts:
 */
 
+class InvalidNoiseParamsException : public BaseException {
+public:
+	InvalidNoiseParamsException():
+		BaseException("One or more noise parameters were invalid or require "
+			"too much memory")
+	{}
+
+	InvalidNoiseParamsException(const std::string &s):
+		BaseException(s)
+	{}
+};
+
 class InvalidPositionException : public BaseException
 {
 public:
diff --git a/src/noise.cpp b/src/noise.cpp
index c0249a437..2d1b8d624 100644
--- a/src/noise.cpp
+++ b/src/noise.cpp
@@ -29,6 +29,7 @@
 #include <string.h> // memset
 #include "debug.h"
 #include "util/numeric.h"
+#include "exceptions.h"
 
 #define NOISE_MAGIC_X    1619
 #define NOISE_MAGIC_Y    31337
@@ -336,8 +337,12 @@ Noise::Noise(NoiseParams *np, int seed, int sx, int sy, int sz)
 	this->noisebuf = NULL;
 	resizeNoiseBuf(sz > 1);
 
-	this->buf    = new float[sx * sy * sz];
-	this->result = new float[sx * sy * sz];
+	try {
+		this->buf    = new float[sx * sy * sz];
+		this->result = new float[sx * sy * sz];
+	} catch (std::bad_alloc &e) {
+		throw InvalidNoiseParamsException();
+	}
 }
 
 
@@ -360,8 +365,12 @@ void Noise::setSize(int sx, int sy, int sz)
 
 	delete[] buf;
 	delete[] result;
-	this->buf    = new float[sx * sy * sz];
-	this->result = new float[sx * sy * sz];
+	try {
+		this->buf    = new float[sx * sy * sz];
+		this->result = new float[sx * sy * sz];
+	} catch (std::bad_alloc &e) {
+		throw InvalidNoiseParamsException();
+	}
 }
 
 
@@ -399,7 +408,11 @@ void Noise::resizeNoiseBuf(bool is3d)
 
 	if (noisebuf)
 		delete[] noisebuf;
-	noisebuf = new float[nlx * nly * nlz];
+	try {
+		noisebuf = new float[nlx * nly * nlz];
+	} catch (std::bad_alloc &e) {
+		throw InvalidNoiseParamsException();
+	}
 }
 
 
@@ -615,7 +628,7 @@ float *Noise::perlinMap2DModulated(float x, float y, float *persist_map)
 
 		f *= 2.0;
 	}
-	
+
 	delete[] g;
 	return result;
 }
diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp
index 4f230b76e..96ed93643 100644
--- a/src/script/lua_api/l_noise.cpp
+++ b/src/script/lua_api/l_noise.cpp
@@ -171,7 +171,7 @@ int LuaPerlinNoiseMap::l_get2dMap_flat(lua_State *L)
 	n->perlinMap2D(p.X, p.Y);
 
 	int maplen = n->sx * n->sy;
-	
+
 	lua_newtable(L);
 	for (int i = 0; i != maplen; i++) {
 		float noiseval = n->np->offset + n->np->scale * n->result[i];
@@ -220,7 +220,7 @@ int LuaPerlinNoiseMap::l_get3dMap_flat(lua_State *L)
 
 
 	int maplen = n->sx * n->sy * n->sz;
-	
+
 	lua_newtable(L);
 	for (int i = 0; i != maplen; i++) {
 		float noiseval = n->np->offset + n->np->scale * n->result[i];
@@ -231,7 +231,11 @@ int LuaPerlinNoiseMap::l_get3dMap_flat(lua_State *L)
 }
 
 LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *np, int seed, v3s16 size) {
-	noise = new Noise(np, seed, size.X, size.Y, size.Z);
+	try {
+		noise = new Noise(np, seed, size.X, size.Y, size.Z);
+	} catch (InvalidNoiseParamsException &e) {
+		throw LuaError(e.what());
+	}
 }
 
 LuaPerlinNoiseMap::~LuaPerlinNoiseMap()
-- 
GitLab