Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
10.5
Description
After update to latest GCC 10, I see the aforementioned test failing. I use -flto that enables cross module inlining and I investigated that stack overflow detection does not work in `check_stack_overrun` function in sql_parse.cc. It's very likely caused by optimized out the allocation of buf argument of the function, which is a stack variable in a caller frame.
I'm suggesting the following patch:
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
|
index a8e66d2a..9cbf23d7 100644 |
--- a/sql/sql_parse.cc
|
+++ b/sql/sql_parse.cc
|
@@ -7229,10 +7229,14 @@ long max_stack_used; |
corresponding exec. (Thus we only have to check in fix_fields.)
|
- Passing to check_stack_overrun() prevents the compiler from removing it.
|
*/
|
-bool check_stack_overrun(THD *thd, long margin, |
- uchar *buf __attribute__((unused)))
|
+bool check_stack_overrun(THD *thd, long margin, uchar *buf) |
{
|
long stack_used; |
+ /* |
+ Take address of the buf argument in order to prevent
|
+ the stack allocation made this function caller.
|
+ */
|
+ static volatile uchar *buf_ptr = buf; |
DBUG_ASSERT(thd == current_thd);
|
if ((stack_used= available_stack_size(thd->thread_stack, &stack_used)) >= |
(long) (my_thread_stack_size - margin)) |