From 6b51c5aadce3a536068e71eafb0c397c74772094 Mon Sep 17 00:00:00 2001 From: vrld Date: Thu, 29 Aug 2013 08:31:58 +0200 Subject: [PATCH] Fix issue #724: Bezier curve rendering/eval crashes with empty curves. --- src/modules/math/BezierCurve.cpp | 4 ++++ src/modules/math/wrap_BezierCurve.cpp | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/modules/math/BezierCurve.cpp b/src/modules/math/BezierCurve.cpp index f120e5705..0eda1228f 100644 --- a/src/modules/math/BezierCurve.cpp +++ b/src/modules/math/BezierCurve.cpp @@ -162,6 +162,8 @@ Vector BezierCurve::eval(double t) const { if (t < 0 || t > 1) throw Exception("Invalid evaluation parameter: must be between 0 and 1"); + if (controlPoints.size() < 2) + throw Exception("Invalid Bezier curve: Not enough control points."); // de casteljau vector points(controlPoints); @@ -174,6 +176,8 @@ Vector BezierCurve::eval(double t) const vector BezierCurve::render(size_t accuracy) const { + if (controlPoints.size() < 2) + throw Exception("Invalid Bezier curve: Not enough control points."); vector vertices(controlPoints); subdivide(vertices, accuracy); return vertices; diff --git a/src/modules/math/wrap_BezierCurve.cpp b/src/modules/math/wrap_BezierCurve.cpp index 040432130..9b7b7db35 100644 --- a/src/modules/math/wrap_BezierCurve.cpp +++ b/src/modules/math/wrap_BezierCurve.cpp @@ -168,7 +168,15 @@ int w_BezierCurve_render(lua_State *L) BezierCurve *curve = luax_checkbeziercurve(L, 1); int accuracy = luaL_optinteger(L, 2, 5); - std::vector points = curve->render(accuracy); + std::vector points; + try + { + points = curve->render(accuracy); + } + catch (Exception &e) + { + return luaL_error(L, e.what()); + } lua_createtable(L, points.size()*2, 0); for (size_t i = 0; i < points.size(); ++i)