From d3c085c3009417c30da4c0c92a25140811654437 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 9 Sep 2022 19:52:36 +0100 Subject: [PATCH] Added an out-of-bounds check --- source/interpreter.c | 18 +++++++++++++++++- source/lib_builtin.c | 14 +++++++++++++- source/literal_array.c | 2 ++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/source/interpreter.c b/source/interpreter.c index 3833a14..007a9c4 100644 --- a/source/interpreter.c +++ b/source/interpreter.c @@ -1606,7 +1606,23 @@ static bool execIndexAssign(Interpreter* interpreter) { //call the function NativeFn fn = (NativeFn)AS_FUNCTION(func).bytecode; - fn(interpreter, &arguments); + if (fn(interpreter, &arguments) == -1) { + //clean up + freeLiteral(assign); + freeLiteral(third); + freeLiteral(second); + freeLiteral(first); + freeLiteral(compound); + if (freeIdn) { + freeLiteral(idn); + } + freeLiteral(func); + freeLiteral(key); + freeLiteral(op); + freeLiteralArray(&arguments); + + return false; + } //save the result (assume top of the interpreter stack is the new compound value) Literal result = popLiteralArray(&interpreter->stack); diff --git a/source/lib_builtin.c b/source/lib_builtin.c index 31a532b..2a95271 100644 --- a/source/lib_builtin.c +++ b/source/lib_builtin.c @@ -495,7 +495,19 @@ int _index(Interpreter* interpreter, LiteralArray* arguments) { if (IS_NULL(second)) { //set the "first" within the array, then skip out - setLiteralArray(AS_ARRAY(compound), first, assign); + if (!setLiteralArray(AS_ARRAY(compound), first, assign)) { + interpreter->errorOutput("Index assignment out of bounds\n"); + + freeLiteral(op); + freeLiteral(assign); + freeLiteral(third); + freeLiteral(second); + freeLiteral(first); + freeLiteral(compound); + freeLiteral(value); + + return -1; + } pushLiteralArray(&interpreter->stack, compound); diff --git a/source/literal_array.c b/source/literal_array.c index 8df5b7c..3c97302 100644 --- a/source/literal_array.c +++ b/source/literal_array.c @@ -77,6 +77,8 @@ bool setLiteralArray(LiteralArray* array, Literal index, Literal value) { return false; } + //TODO: implicit push when referencing one-past-the-end? + freeLiteral(array->literals[idx]); array->literals[idx] = copyLiteral(value);