<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hi, Max</p>
<p><br>
</p>
<p>my bad, test triggers a fixed problem.</p>
<p>Thanks for the patch! LGTM<br>
</p>
<div class="moz-cite-prefix">On 12/6/23 17:47, Maxim Kokryashkin
wrote:<br>
</div>
<blockquote type="cite"
cite="mid:1701874042.721661155@f762.i.mail.ru">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div>Hi, Sergey!</div>
<div>Thanks for the review!</div>
<div>Tested on GC64 and non-GC64, and Linux/MacOS builds — test
fails</div>
<div>before the patch everywhere.</div>
<div>Tested with API check and assertions enabled.</div>
<div data-signature-widget="container">
<div data-signature-widget="content">
<div>--<br>
Best regards,</div>
<div>Maxim Kokryashkin</div>
</div>
</div>
<div> </div>
<div> </div>
<blockquote
style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">Пятница,
24 ноября 2023, 15:34 +03:00 от Sergey Bronnikov
<a class="moz-txt-link-rfc2396E" href="mailto:sergeyb@tarantool.org"><sergeyb@tarantool.org></a>:<br>
<div id="">
<div class="js-helper js-readmsg-msg">
<div>
<div id="style_17008292741355240530_BODY">Hello, Max<br>
<br>
added testcase is passed with reverted patch<br>
<br>
Sergey<br>
<br>
On 11/22/23 17:35, Maksim Kokryashkin wrote:
<div class="mail-quote-collapse">> From: Mike Pall
<mike><br>
><br>
> (cherry-picked from commit
aa6b15c1a8922848bd6f596ba384824ca3fe0f5f)<br>
><br>
> The stack overflow error is thrown in
`lj_state_growstack` only<br>
> if the coroutine status is `OK`, however, stack
overflow can<br>
> happen on a yielded coroutine too. This patch
fixes the condition<br>
> for status, so now the error thrown on yielded
coroutines too.<br>
><br>
> Maxim Kokryashkin:<br>
> * added the description and the test for the
patch<br>
><br>
> Part of tarantool/tarantool#9145<br>
> ---<br>
> src/lj_state.c | 2 +-<br>
> .../lj-962-premature-stack-overflow.test.c | 23
+++++++++++++++++++<br>
> 2 files changed, 24 insertions(+), 1 deletion(-)<br>
><br>
> diff --git a/src/lj_state.c b/src/lj_state.c<br>
> index d8a5134c..01d4901a 100644<br>
> --- a/src/lj_state.c<br>
> +++ b/src/lj_state.c<br>
> @@ -126,7 +126,7 @@ void LJ_FASTCALL
lj_state_growstack(lua_State *L, MSize need)<br>
> if (L->stacksize > LJ_STACK_MAXEX)<br>
> lj_err_throw(L, LUA_ERRERR); /* Does not invoke
an error handler. */<br>
> /* 1. We are _at_ the limit after the last
growth. */<br>
> - if (!L->status) { /* 2. Throw 'stack
overflow'. */<br>
> + if (L->status < LUA_ERRRUN) { /* 2. Throw
'stack overflow'. */<br>
> L->status = LUA_ERRRUN; /* Prevent ending here
again for pushed msg. */<br>
> lj_err_msg(L, LJ_ERR_STKOV); /* May invoke an
error handler. */<br>
> }<br>
> diff --git
a/test/tarantool-c-tests/lj-962-premature-stack-overflow.test.c
b/test/tarantool-c-tests/lj-962-premature-stack-overflow.test.c<br>
> index 12cb9004..461e0ccc 100644<br>
> ---
a/test/tarantool-c-tests/lj-962-premature-stack-overflow.test.c<br>
> +++
b/test/tarantool-c-tests/lj-962-premature-stack-overflow.test.c<br>
> @@ -24,6 +24,20 @@ static int
fill_stack(lua_State *L)<br>
> return 0;<br>
> }<br>
><br>
> +static int immediate_yield(lua_State *L)<br>
> +{<br>
> + return lua_yield(L, 0);<br>
> +}<br>
> +<br>
> +static int overflow_suspended_coro(lua_State *L)<br>
> +{<br>
> + lua_State *newL = lua_newthread(L);<br>
> + lua_pushcfunction(newL, immediate_yield);<br>
> + lua_resume(newL, 0);<br>
> + fill_stack(newL);<br>
> + return 0;<br>
> +}<br>
> +<br>
> static int premature_stackoverflow(void
*test_state)<br>
> {<br>
> lua_State *L = test_state;<br>
> @@ -50,12 +64,21 @@ static int
stackoverflow_during_stackoverflow(void *test_state)<br>
> return TEST_EXIT_SUCCESS;<br>
> }<br>
><br>
> +static int stackoverflow_on_suspended_coro(void
*test_state)<br>
> +{<br>
> + lua_State *L = test_state;<br>
> + int status = lua_cpcall(L,
overflow_suspended_coro, NULL);<br>
> + assert_true(status == LUA_ERRRUN);<br>
> + return TEST_EXIT_SUCCESS;<br>
> +}<br>
> +<br>
> int main(void)<br>
> {<br>
> lua_State *L = utils_lua_init();<br>
> const struct test_unit tgroup[] = {<br>
> test_unit_def(premature_stackoverflow),<br>
>
test_unit_def(stackoverflow_during_stackoverflow),<br>
> + test_unit_def(stackoverflow_on_suspended_coro),<br>
> };<br>
> const int test_result = test_run_group(tgroup,
L);<br>
> utils_lua_close(L);</div>
</div>
</div>
</div>
</div>
</blockquote>
<div> </div>
</blockquote>
</body>
</html>