diff --git a/src/server.c b/src/server.c index 78f3c8bfb..6b65a460c 100644 --- a/src/server.c +++ b/src/server.c @@ -3451,7 +3451,10 @@ int processCommand(client *c) { /* Save out_of_memory result at script start, otherwise if we check OOM * until first write within script, memory used by lua stack and * arguments might interfere. */ - if (c->cmd->proc == evalCommand || c->cmd->proc == evalShaCommand) { + if (c->cmd->proc == evalCommand || + c->cmd->proc == evalShaCommand || + c->cmd->proc == fcallCommand) + { server.script_oom = out_of_memory; } } diff --git a/tests/unit/scripting.tcl b/tests/unit/scripting.tcl index 0b5b261f2..970cab992 100644 --- a/tests/unit/scripting.tcl +++ b/tests/unit/scripting.tcl @@ -36,6 +36,20 @@ if {$is_eval == 1} { start_server {tags {"scripting"}} { + test {Script - disallow write on OOM} { + r FUNCTION create lua f1 replace { return redis.call('set', 'x', '1') } + + r config set maxmemory 1 + + catch {[r fcall f1 1 k]} e + assert_match {*command not allowed when used memory*} $e + + catch {[r eval "redis.call('set', 'x', 1)" 0]} e + assert_match {*command not allowed when used memory*} $e + + r config set maxmemory 0 + } + test {EVAL - Does Lua interpreter replies to our requests?} { run_script {return 'hello'} 0 } {hello}