Bug #27154 Server crash on statement using 3-dimensional row constructor
| Submitted: | 14 Mar 2007 20:41 | Modified: | 3 Apr 2007 22:37 |
|---|---|---|---|
| Reporter: | Aurel Pekarcik | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S2 (Serious) |
| Version: | 5.0.37-community-nt/5.0BK | OS: | Windows (WinXP/Vista) |
| Assigned to: | Igor Babaev | CPU Architecture: | Any |
| Tags: | regression, row constructor | ||
[14 Mar 2007 20:41]
Aurel Pekarcik
[14 Mar 2007 22:26]
MySQL Verification Team
Thank you for the bug report. This regression bugs only affects the
Windows version:
Microsoft Windows [versão 6.0.6000]
Copyright (c) 2006 Microsoft Corporation. Todos os direitos reservados.
c:\>cd mysql-5.0.27-win32
c:\mysql-5.0.27-win32>bin\mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.27-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> drop table if exists test.T1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table test.T1(A int, B int, c int, D int,
-> primary key (A,B,C) ) engine = myisam;
Query OK, 0 rows affected (0.05 sec)
mysql>
mysql> insert test.T1 (A,B,C,D) values (1,1,1,99);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> set @X:=(select D from test.T1 where (A,B,C)=(1,1,1));
Query OK, 0 rows affected (0.00 sec)
mysql>
c:\build\5.0>bin\mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.38 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> drop table if exists test.T1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table test.T1(A int, B int, c int, D int,
-> primary key (A,B,C) ) engine = myisam;
Query OK, 0 rows affected (0.13 sec)
mysql>
mysql> insert test.T1 (A,B,C,D) values (1,1,1,99);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> set @X:=(select D from test.T1 where (A,B,C)=(1,1,1));
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql>
> mysqld-nt.exe!make_join_statistics(JOIN * join=0x0203cf98, st_table_list * tables=0x00000000, Item * conds=0x020396b0, st_dynamic_array * keyuse_array=0x0203dcd0) Line 2549 C++
mysqld-nt.exe!JOIN::optimize() Line 849 + 0x21 bytes C++
mysqld-nt.exe!subselect_single_select_engine::exec() Line 1769 + 0x8 bytes C++
mysqld-nt.exe!Item_subselect::exec() Line 214 C++
mysqld-nt.exe!Item_singlerow_subselect::val_int() Line 506 + 0xa bytes C++
mysqld-nt.exe!Item_func_set_user_var::check(int use_result_field=0) Line 3900 C++
mysqld-nt.exe!set_var_user::check(THD * thd=0x01ff9618) Line 3282 + 0x21 bytes C++
mysqld-nt.exe!sql_set_variables(THD * thd=0x01ff9618, List<set_var_base> * var_list=0x01ffa80c) Line 3141 + 0x8 bytes C++
mysqld-nt.exe!mysql_execute_command(THD * thd=0x01ff9618) Line 3791 + 0x7 bytes C++
mysqld-nt.exe!mysql_parse(THD * thd=0x01ff9618, char * inBuf=0x020380b0, unsigned int length=53) Line 5929 C++
mysqld-nt.exe!dispatch_command(enum_server_command command=COM_QUERY, THD * thd=0x01ff9618, char * packet=0x0202fe61, unsigned int packet_length=54) Line 1797 C++
mysqld-nt.exe!do_command(THD * thd=0x00000036) Line 1577 + 0x10 bytes C++
mysqld-nt.exe!handle_one_connection(void * arg=0x01ff9618) Line 1191 + 0xa bytes C++
mysqld-nt.exe!_pthread_start() + 0x3b bytes C
mysqld-nt.exe!_callthreadstart() Line 293 + 0x6 bytes C
mysqld-nt.exe!_threadstart(void * ptd=0x02033e70) Line 275 + 0x5 bytes C
kernel32.dll!776a3833()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
ntdll.dll!7753a9bd()
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.38-debug Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> drop table if exists test.T1;
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> create table test.T1(A int, B int, c int, D int,
-> primary key (A,B,C) ) engine = myisam;
Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> insert test.T1 (A,B,C,D) values (1,1,1,99);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> set @X:=(select D from test.T1 where (A,B,C)=(1,1,1));
Query OK, 0 rows affected (0.00 sec)
mysql>
[31 Mar 2007 4:51]
Igor Babaev
With slightly more complicated example I succeded in causing memory corruption
on Linux (SuSE 10.1) as well:
mysql> SELECT VERSION();
+--------------+
| VERSION() |
+--------------+
| 5.0.40-debug |
+--------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE t1(
-> a int, b int, c int, d int, e int, f int, g int, h int,
-> PRIMARY KEY (a,b,c,d,e,f,g)
-> );
Query OK, 0 rows affected (0.50 sec)
mysql> INSERT INTO t1 VALUES (1,2,3,4,5,6,7,99);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> SELECT d FROM t1 WHERE (a,b,c,d,e,f,g)=(1,2,3,4,5,6,7);
+---+
| d |
+---+
| 4 |
+---+
1 row in set (0.00 sec)
mysql>
mysql> SET @x:= (SELECT h FROM t1 WHERE (a,b,c,d,e,f,g)=(1,2,3,4,5,6,7));
After this I had on the server side:
Error: Memory allocated at (^Y) discovered at sql_select.cc:6149
Error: Memory allocated at (^Y) discovered at 'sql_select.cc:6149'
Error: Memory allocated at (null):0 was underrun, discovered at sql_select.cc:6149
Error: Memory allocated at (null):0 was overrun, discovered at 'sql_select.cc:6149'
Error: Safemalloc link list destroyed, discovered at 'sql_select.cc:6149'
root=0x8d441d0,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at array.c:231
Error: Memory allocated at (null):0 was overrun, discovered at 'array.c:231'
Error: Safemalloc link list destroyed, discovered at 'array.c:231'
root=0x8d441d0,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at sql_lex.cc:198
Error: Memory allocated at (null):0 was overrun, discovered at 'sql_lex.cc:198'
Error: Safemalloc link list destroyed, discovered at 'sql_lex.cc:198'
root=0x8d48140,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at sql_lex.cc:199
Error: Memory allocated at (null):0 was overrun, discovered at 'sql_lex.cc:199'
Error: Safemalloc link list destroyed, discovered at 'sql_lex.cc:199'
root=0x8d48140,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at lock.cc:269
Error: Memory allocated at (null):0 was overrun, discovered at 'lock.cc:269'
Error: Safemalloc link list destroyed, discovered at 'lock.cc:269'
root=0x8d48140,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at my_alloc.c:353
Error: Memory allocated at (null):0 was overrun, discovered at 'my_alloc.c:353'
Error: Safemalloc link list destroyed, discovered at 'my_alloc.c:353'
root=0x8d48140,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at my_alloc.c:64
Error: Memory allocated at (null):0 was overrun, discovered at 'my_alloc.c:64'
Error: Safemalloc link list destroyed, discovered at 'my_alloc.c:64'
root=0x8d48140,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at my_alloc.c:353
Error: Memory allocated at (null):0 was overrun, discovered at 'my_alloc.c:353'
Error: Safemalloc link list destroyed, discovered at 'my_alloc.c:353'
root=0x8d441d0,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at sql_lex.cc:198
Error: Memory allocated at (null):0 was overrun, discovered at 'sql_lex.cc:198'
Error: Safemalloc link list destroyed, discovered at 'sql_lex.cc:198'
root=0x8d48140,count=52,irem=(nil)
Error: Memory allocated at ()
Error: Memory allocated at ()
Error: Memory allocated at (null):0 was underrun, discovered at sql_lex.cc:199
Error: Memory allocated at (null):0 was overrun, discovered at 'sql_lex.cc:199'
Error: Safemalloc link list destroyed, discovered at 'sql_lex.cc:199'
root=0x8d48140,count=52,irem=(nil)
When running the test case within mysql test suite I got:
mysqltest: At line 155: query 'SET @x:= (SELECT d FROM t1 WHERE (a,b,c,d,e,f,g)=(1,1,1,1,1,1,1))' failed: 2013: Lost connection to MySQL server during query
[31 Mar 2007 7:23]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/23452 ChangeSet@1.2427, 2007-03-31 00:23:03-07:00, igor@olga.mysql.com +3 -0 Fixed bug #27154: memory corruption when using row equalities in where conditions. When allocating memory for KEY_FIELD/SARGABLE_PARAM structures the function update_ref_and_keys did not take into account the fact that a single row equality could be replaced by several simple equalities. Fixed by adjusting the counter cond_count accordingly for each subquery when performing substitution of a row equality for simple equalities.
[2 Apr 2007 8:18]
Bugs System
Pushed into 5.1.18-beta
[2 Apr 2007 8:21]
Bugs System
Pushed into 5.0.40
[3 Apr 2007 22:37]
Paul DuBois
Noted in 5.0.40, 5.1.18 changelogs. Row equalities in WHERE clauses could cause memory corruption.
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.