From dec6bc095081e19024a6045241ac5847880c8b70 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Fri, 1 Nov 2019 13:06:21 +0000 Subject: [PATCH] avoid potential out-of-bounds array access (undefined behaviour) + add c++ `C-array` size implementation --- src/text/scrptrun.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/text/scrptrun.cpp b/src/text/scrptrun.cpp index 750998764..bc16cb811 100644 --- a/src/text/scrptrun.cpp +++ b/src/text/scrptrun.cpp @@ -21,8 +21,13 @@ #pragma GCC diagnostic pop #include +#include -#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) +template +constexpr std::size_t ARRAY_SIZE(const T (&array)[N]) noexcept +{ + return N; +} const char ScriptRun::fgClassID=0; @@ -156,7 +161,8 @@ UBool ScriptRun::next() // characters above it on the stack will be poped. if (pairIndex >= 0) { if ((pairIndex & 1) == 0) { - parenStack[++parenSP].pairIndex = pairIndex; + parenSP = (++parenSP) % ARRAY_SIZE(parenStack); // avoid out-of-bounds access + parenStack[parenSP].pairIndex = pairIndex; parenStack[parenSP].scriptCode = scriptCode; } else if (parenSP >= 0) { int32_t pi = pairIndex & ~1;