Bug #10975 Prepared statements: crash if function deallocates

Submitted: 30 May 2005 20:38 Modified: 10 Jun 2005 18:27
Reporter: Peter Gulutzan Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server Severity:S3 (Non-critical)
Version:5.0.7-beta-debug OS:Linux (SUSE 9.2)
Assigned to: Konstantin Osipov CPU Architecture:Any

[30 May 2005 20:38] Peter Gulutzan
Description:
If I execute a statement which calls a function which deallocates the statement,
the server crashes.

How to repeat:
mysql> create table t11 (s1 int, s2 int)//
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values (1,1)//
Query OK, 1 row affected (0.00 sec)

mysql> create function f11 () returns int begin return 5; end//
Query OK, 0 rows affected (0.01 sec)

mysql> prepare stmt1 from 'select f11() from t11'//
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> drop function f11//
Query OK, 0 rows affected (0.00 sec)

mysql> create function f11 () returns int begin deallocate prepare stmt11; return 5; end//
Query OK, 0 rows affected (0.01 sec)

mysql> execute stmt1//
ERROR 2013 (HY000): Lost connection to MySQL server during query
[30 May 2005 20:46] MySQL Verification Team
Thank you for the bug report.
Call stack:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 229391 (LWP 14962)]
0x081ee0f6 in check_access (thd=0x8e95d18, want_access=262144,
    db=0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>, save_priv=0xbddfe2f8,
    dont_check_global_grants=false, no_errors=false) at sql_parse.cc:4696
4696      if ((!db || !db[0]) && !thd->db && !dont_check_global_grants)
(gdb) backtrace full
#0  0x081ee0f6 in check_access (thd=0x8e95d18, want_access=262144,
    db=0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>, save_priv=0xbddfe2f8,
    dont_check_global_grants=false, no_errors=false) at sql_parse.cc:4696
        db_access = 1
        db_is_pattern = false
        dummy = 3185566212
        _db_func_ = 0x0
        _db_file_ = 0x1 <Address 0x1 out of bounds>
        _db_level_ = 0
        _db_framep_ = (char **) 0x40188b11
#1  0x081ee8fd in check_routine_access (thd=0x8e95d18, want_access=262144,
    db=0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>, name=0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>,
    is_proc=false, no_errors=false) at sql_parse.cc:4861
        tables = {{next_local = 0x0, next_global = 0x0, prev_global = 0x0,
    db = 0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>,
    alias = 0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>,
    table_name = 0x8f8f8f8f <Address 0x8f8f8f8f out of bounds>, schema_table_name = 0x0, option = 0x0,
    on_expr = 0x0, prep_on_expr = 0x0, cond_equal = 0x0, natural_join = 0x0, use_index = 0x0,
    ignore_index = 0x0, table = 0x0, derived_result = 0x0, correspondent_table = 0x0, derived = 0x0,
    schema_table = 0x0, schema_select_lex = 0x0, schema_table_reformed = false, schema_table_param = 0x0,
    select_lex = 0x0, view = 0x0, field_translation = 0x0, ancestor = 0x0, belong_to_view = 0x0,
    next_leaf = 0x0, where = 0x0, check_option = 0x0, query = {str = 0x0, length = 0}, md5 = {str = 0x0,
      length = 0}, source = {str = 0x0, length = 0}, view_db = {str = 0x0, length = 0}, view_name = {
      str = 0x0, length = 0}, timestamp = {str = 0x0, length = 0}, file_version = 0, updatable_view = 0,
    revision = 0, algorithm = 0, with_check = 0, effective_with_check = 0 '\0', effective_algorithm = 0,
    privilege_backup = 0, grant = {grant_table = 0x0, version = 0, privilege = 0, want_privilege = 0},
    engine_data = 0, callback_func = 0, lock_type = TL_UNLOCK, outer_join = 0, shared = 0, db_length = 0,
    table_name_length = 0, updatable = false, straight = false, updating = false, force_index = false,
    ignore_leaves = false, no_where_clause = false, dep_tables = 0, on_expr_dep_tables = 0,
    nested_join = 0x0, embedding = 0x0, join_list = 0x0, cacheable_table = false,
    table_in_first_from_clause = false, skip_temporary = false, contain_auto_increment = false,
---Type <return> to continue, or q <return> to quit---
    multitable_view = false, required_type = FRMTYPE_ERROR, timestamp_buffer = '\0' <repeats 19 times>,
    prelocking_placeholder = false}}
#2  0x0816d78e in Item_func_sp::execute (this=0x8e97ea0, itp=0xbddfe474) at item_func.cc:4782
        _db_func_ = 0x9 <Address 0x9 out of bounds>
        _db_file_ = 0x9 <Address 0x9 out of bounds>
        _db_level_ = 0
        _db_framep_ = (char **) 0xbddfe444
        thd = (class THD *) 0x8e95d18
        old_client_capabilites = 239245
        res = -1109400504
        save_ctx = {changed = 143, master_access = 2408550287, db_access = 2408550287, priv_user = 0x0,
  priv_host = "\000\000\000\000\217\217\217\217\000\206é\bp\177é\b", '¥' <repeats 12 times>, "\217\217\217\217\000\206é\b", '¥' <repeats 16 times>, "\000\000\000\000\\äß½)",
  user = 0x8ea7db8 '\217' <repeats 200 times>..., host = 0xb <Address 0xb out of bounds>,
  ip = 0x8e98600 "f11()"}
        nsok = 0 '\0'
        save_options = 3185566720
#3  0x0816d54f in Item_func_sp::execute (this=0x8e97ea0, flp=0x8e97f18) at item_func.cc:4735
        it = (class Item *) 0xbddfe490
        f = (class Field *) 0xbddfe48c
#4  0x08171493 in Item_func_sp::val_str (this=0x8e97ea0, str=0xbddfe584) at item_func.h:1346
No locals.
#5  0x08149d6f in Item::send (this=0x8e97ea0, protocol=0x8e9671c, buffer=0xbddfe584) at item.cc:3833
        res = (String *) 0x8e985f8
        result = false
        type = MYSQL_TYPE_VARCHAR
#6  0x081bde87 in select_send::send_data (this=0x8e987a0, items=@0x8e94308) at sql_class.cc:873
        li = {<base_list_iterator> = {list = 0x8e94308, el = 0x8e985f8, prev = 0x0,
    current = 0x0}, <No data fields>}
        protocol = (class Protocol *) 0x8e9671c
        buff = "\000>é\b\230©ê\b\000\000\000\000\000\000\000\000\001\000\000\000Ðåß½üåß½z\005\024\b°¨ê\bøåß---Type <return> to continue, or q <return> to quit---
½ôåß½ðåß½ôåß½ðåß½,æß½öóZ\bÚ\000\000\000\034æß½\030æß½\024æß½\030æß½\024æß½\020æß½\214)*\b,]é\bÐ\035é\bx.é\bx-é\b", '\0' <repeats 16 times>, "°¨ê\b|/é\bà/é\bà/é\b,]é\b\000\000\000\000¼æß½>Á\"\b\000\023\000\000\204æß½\200æß½|æß½\200æß½|æß½xæß½\000\000\000\000h\001\000\000\020,é\bx.é\b\000\000"...
        buffer = {Ptr = 0xbddfe5a4 "", str_length = 766, Alloced_length = 766, alloced = false,
  str_charset = 0x87f2b80}
        _db_func_ = 0x0
        _db_file_ = 0x8e97968 "þþ\a\001"
        _db_level_ = 3185567120
        _db_framep_ = (char **) 0xbddfe594
        item = (class Item *) 0x8e97ea0
#7  0x08237870 in end_send (join=0x8e91e30, join_tab=0x8e92fe0, end_of_records=false)
    at sql_select.cc:10021
        error = 0
        _db_func_ = 0x823774e "U\211å\203ìh\213E\020\210Eÿ\215Eì\211D$\030\215Eð\211D$\024\215Eô\211D$\020\215Eø\211D$\fÇD$\b\033'"
        _db_file_ = 0x2bb4 <Address 0x2bb4 out of bounds>
        _db_level_ = 1
        _db_framep_ = (char **) 0x0
#8  0x0823591b in do_select (join=0x8e91e30, fields=0x8e94308, table=0x0, procedure=0x0)
    at sql_select.cc:8991
        end_select = 0x823774e <end_send>
        rc = 0
        error = NESTED_LOOP_OK
        join_tab = (JOIN_TAB *) 0x8e92fe0
        _db_func_ = 0x8e94308 "ø\205é\bø\205é\b\001"
        _db_file_ = 0x8e9671c "èæa\b\030]é\b\220gé\b¤gé\b"
        _db_level_ = 136043844
        _db_framep_ = (char **) 0xbddfe98c
#9  0x08223edc in JOIN::exec (this=0x8e91e30) at sql_select.cc:1658
        tmp_error = -1834726912
        _db_func_ = 0x8e94308 "ø\205é\bø\205é\b\001"
---Type <return> to continue, or q <return> to quit---
        _db_file_ = 0x8e95d18 "HÖa\bèÙ\177\bìÙ\177\bXÖa\b"
        _db_level_ = 149495344
        _db_framep_ = (char **) 0x8e94298
        curr_join = (JOIN *) 0x8e91e30
        curr_all_fields = (List<Item> *) 0x8e92b5c
        curr_fields_list = (List<Item> *) 0x8e94308
        curr_tmp_table = (TABLE *) 0x0
#10 0x08224e6b in mysql_select (thd=0x8e95d18, rref_pointer_array=0x8e943a8, tables=0x8e98638,
    wild_num=0, fields=@0x8e94308, conds=0x0, og_num=0, order=0x0, group=0x0, having=0x0, proc_param=0x0,
    select_options=2460240384, result=0x8e987a0, unit=0x8e940b4, select_lex=0x8e94298)
    at sql_select.cc:2052
        err = false
        free_join = true
        _db_func_ = 0x8e94298 "\2103_\b"
        _db_file_ = 0xbddfeacc "\230Bé\b\230Bé\b´@é\b"
        _db_level_ = 4294967295
        _db_framep_ = (char **) 0xffffffff
        join = (JOIN *) 0x8e91e30
#11 0x0821f2c4 in handle_select (thd=0x8e95d18, lex=0x8e940a4, result=0x8e987a0,
    setup_tables_done_option=0) at sql_select.cc:242
        unit = (SELECT_LEX_UNIT *) 0x8e940b4
        res = false
        select_lex = (SELECT_LEX *) 0x8e94298
        _db_func_ = 0x0
        _db_file_ = 0x0
        _db_level_ = 149521976
        _db_framep_ = (char **) 0x0
#12 0x081e707a in mysql_execute_command (thd=0x8e95d18) at sql_parse.cc:2400
        result = (class select_result *) 0x8e987a0
        res = false
        result = 0
---Type <return> to continue, or q <return> to quit---
        lex = (LEX *) 0x8e940a4
        select_lex = (SELECT_LEX *) 0x8e94298
        slave_fake_lock = false
        fake_prev_lock = (MYSQL_LOCK *) 0x0
        first_table = (TABLE_LIST *) 0x8e98638
        all_tables = (TABLE_LIST *) 0x8e98638
        unit = (SELECT_LEX_UNIT *) 0x8e940b4
        _db_func_ = 0xbddff05c ""
        _db_file_ = 0x40188008 "]\213\200¸\001"
        _db_level_ = 3185569852
        _db_framep_ = (char **) 0x4018dd00
#13 0x0824dabe in execute_stmt (thd=0x8e95d18, stmt=0x8e94070, expanded_query=0xbddff0f4)
    at sql_prepare.cc:2179
        _db_func_ = 0x8e95d24 "XÖa\b"
        _db_file_ = 0x0
        _db_level_ = 0
        _db_framep_ = (char **) 0x8e91e20
#14 0x0824d978 in mysql_sql_stmt_execute (thd=0x8e95d18, stmt_name=0x8e96390) at sql_prepare.cc:2138
        stmt = (Prepared_statement *) 0x8e94070
        expanded_query = {Ptr = 0x0, str_length = 0, Alloced_length = 0, alloced = false,
  str_charset = 0x87f2b80}
        _db_func_ = 0x0
        _db_file_ = 0x0
        _db_level_ = 0
        _db_framep_ = (char **) 0x0
#15 0x081e74ac in mysql_execute_command (thd=0x8e95d18) at sql_parse.cc:2490
        res = false
        result = 0
        lex = (LEX *) 0x8e95d58
        select_lex = (SELECT_LEX *) 0x8e95f4c
        slave_fake_lock = false
---Type <return> to continue, or q <return> to quit---
        fake_prev_lock = (MYSQL_LOCK *) 0x0
        first_table = (TABLE_LIST *) 0x0
        all_tables = (TABLE_LIST *) 0x0
        unit = (SELECT_LEX_UNIT *) 0x8e95d68
        _db_func_ = 0x0
        _db_file_ = 0x0
        _db_level_ = 0
        _db_framep_ = (char **) 0x8e95d58
#16 0x081ef82b in mysql_parse (thd=0x8e95d18, inBuf=0x8e91de0 "execute stmt1", length=13)
    at sql_parse.cc:5260
        lex = (LEX *) 0x8e95d58
        _db_func_ = 0x8e8ddb6 ""
        _db_file_ = 0x0
        _db_level_ = 3185571576
        _db_framep_ = (char **) 0x0
#17 0x081e5196 in dispatch_command (command=COM_QUERY, thd=0x8e95d18, packet=0x8e8dda9 "",
    packet_length=14) at sql_parse.cc:1653
        packet_end = 0x8e91ded ""
        net = (NET *) 0x8e9648c
        error = false
        _db_func_ = 0x0
        _db_file_ = 0x0
        _db_level_ = 0
        _db_framep_ = (char **) 0x0
#18 0x081e49a6 in do_command (thd=0x8e95d18) at sql_parse.cc:1456
        packet = 0x8e8dda8 "\001"
        old_timeout = 30
        packet_length = 14
        net = (NET *) 0x8e9648c
        command = COM_QUERY
        _db_func_ = 0x8e974d8 "ÿÿÿÿ\024"
---Type <return> to continue, or q <return> to quit---
        _db_file_ = 0x81bbeb0 "ÉÃU\211å\203ì(\213E\b\211\004$è¡"
        _db_level_ = 3185572332
        _db_framep_ = (char **) 0x1010
#19 0x081e3afb in handle_one_connection (arg=0x8e95d18) at sql_parse.cc:1114
        error = 0
        net = (NET *) 0x8e9648c
        thd = (class THD *) 0x8e95d18
        launch_time = 0
        set = {__val = {0 <repeats 32 times>}}
#20 0x40184e51 in pthread_start_thread () from /lib/libpthread.so.0
No symbol table info available.
#21 0x40184ecf in pthread_start_thread_event () from /lib/libpthread.so.0
No symbol table info available.
#22 0x4030c65a in clone () from /lib/libc.so.6
No symbol table info available.
(gdb)
[8 Jun 2005 20:44] Konstantin Osipov
Will be fixed by disallowing dynamic SQL in SP.
[8 Jun 2005 21:55] Konstantin Osipov
The patch is pushed into 5.0.8 tree.
Subject: bk commit - 5.0 tree (konstantin:1.1958) BUG#10605
ChangeSet
  1.1958 05/06/09 01:09:05 konstantin@mysql.com +3 -0
  Disable dynamic SQL in stored routines.
  This is to close Bug#10975, Bug#7115, Bug#10605
  This feature will be implemented in a future release.
[10 Jun 2005 18:27] Paul DuBois
Noted in 5.0.8 changelog.  Added note to prepared
statement section that SQL PS cannot be used in
stored routines.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.043 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.