Skip to content

Commit

Permalink
mtr: Disable execution_constants in ASAN
Browse files Browse the repository at this point in the history
Summary:
After bumping the thread stack size to 10MB for ASAN, this test started
failing because the Bison parser ran out of stack before the thread did.

This test deliberately tries to cause a thread stack overflow by
generating an arbitrarily deeply nested SQL query to exercise the
`check_stack_overrun` logic. Because our thread stack is so large in
ASAN, we hit the Bison "stack" instead first.

From the error log:
```
CURRENT_TEST: main.execution_constants
mysqltest: At line 42: Query '$query_head 0 $query_tail' failed with wrong error 3950: 'Out of memory', should have failed with any of '0,1436' errors.
```

Parser OOM Stack:
```
(lldb) bt
* thread #42, name = 'connection', stop reason = breakpoint 1.1
  * frame #0: 0x000000000a33ea53 mysqld`my_error(nr=<unavailable>, MyFlags=<unavailable>) at my_error.cc:217:3
    frame #1: 0x0000000008065a21 mysqld`MYSQLerror(location=<unavailable>, thd=<unavailable>, (null)=<unavailable>, s=<unavailable>) (.__uniq.242601085889238811981650692569837157750) at sql_yacc.yy:302:5 [artificial]
    frame #2: 0x0000000008034304 mysqld`MYSQLparse(YYTHD=<unavailable>, parse_tree=<unavailable>) at sql_yacc.cc:25323:9
    frame #3: 0x0000000008009085 mysqld`THD::sql_parser(this=<unavailable>) at sql_class.cc:3811:7
    frame #4: 0x00000000082b1f4c mysqld`parse_sql(thd=0x0000628000300100, parser_state=<unavailable>, creation_ctx=<unavailable>) at sql_parse.cc:7963:34
    frame #5: 0x00000000082a060d mysqld`dispatch_sql_command(thd=<unavailable>, parser_state=<unavailable>, last_timer=<unavailable>) at sql_parse.cc:5993:11
    frame #6: 0x000000000829bd7b mysqld`dispatch_command(thd=<unavailable>, com_data=<unavailable>, command=<unavailable>) at sql_parse.cc:2445:7
    frame #7: 0x000000000829e5e9 mysqld`do_command(thd=<unavailable>) at sql_parse.cc:1636:18
    frame #8: 0x00000000086c5e34 mysqld`handle_connection(arg=0x00006030001e0940) (.__uniq.188644437719200549207133117087266310382) at connection_handler_per_thread.cc:307:13
    frame #9: 0x000000000b3e123b mysqld`pfs_spawn_thread(arg=0x000061600044f4a0) (.__uniq.322994040891040637281203315118403052672) at pfs.cc:2983:3
    frame #10: 0x00007ffff7c9abaf libc.so.6`start_thread(arg=<unavailable>) at pthread_create.c:434:8
    frame #11: 0x00007ffff7d2d17c libc.so.6`__clone3 at clone3.S:81
```

sql/sql_yacc.yy:
```
static
void MYSQLerror(YYLTYPE *location, THD *thd, Parse_tree_root **, const char *s)
{
  if (strcmp(s, "syntax error") == 0) {
    thd->syntax_error_at(*location);
  } else if (strcmp(s, "memory exhausted") == 0) {
    my_error(ER_DA_OOM, MYF(0));
...
```
mysql-fork/_build-8.0-ASanDebug/sql/sql_yacc.cc:
```
        yyoverflow (YY_("memory exhausted"),
                    &yyss1, yysize * YYSIZEOF (*yyssp),
                    &yyvs1, yysize * YYSIZEOF (*yyvsp),
                    &yyls1, yysize * YYSIZEOF (*yylsp),
                    &yystacksize);
```

Differential Revision: D51233935

fbshipit-source-id: 04391603e7baef0c6e6fa4f308de0aad545474c2
  • Loading branch information
alexbudfb authored and facebook-github-bot committed Nov 11, 2023
1 parent 476a454 commit 8e638a5
Showing 1 changed file with 4 additions and 1 deletion.
5 changes: 4 additions & 1 deletion mysql-test/t/execution_constants.test
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# ER_STACK_OVERRUN_NEED_MORE does not currenly work well with TSan
# ER_STACK_OVERRUN_NEED_MORE does not currenly work well with TSan or ASan.
# In ASan we bump the thread stack size significantly (to 10MB) and thus the
# Bison parser stack is exceeded far sooner than the thread's stack.
--source include/not_tsan.inc
--source include/not_asan.inc

#
# Bug#21476: Lost Database Connection During Query
Expand Down

0 comments on commit 8e638a5

Please sign in to comment.