From 25945dc5395a03cab069ff0e6470ba8d59b03978 Mon Sep 17 00:00:00 2001 From: kwolekr 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 @@ public: 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 // 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()