]> git.pld-linux.org Git - packages/mysql.git/blob - bug-73834.patch
ac741c1fceb1842fb8addc080466126299356b54
[packages/mysql.git] / bug-73834.patch
1 From feac5e02ab298a5c3329ab63ee6db7d9f52bf28d Mon Sep 17 00:00:00 2001
2 From: Murthy Narkedimilli <murthy.narkedimilli@oracle.com>
3 Date: Mon, 8 Sep 2014 11:33:55 +0200
4 Subject: [PATCH] Adding patch for security bug 19471516
5
6 ---
7  mysql-test/suite/innodb/r/foreign-keys.result | 16 ++++++++++++++++
8  mysql-test/suite/innodb/t/foreign-keys.test   | 26 ++++++++++++++++++++++++++
9  storage/innobase/dict/dict0dict.c             | 10 ++++++++++
10  3 files changed, 52 insertions(+)
11  create mode 100644 mysql-test/suite/innodb/r/foreign-keys.result
12  create mode 100644 mysql-test/suite/innodb/t/foreign-keys.test
13
14 diff --git a/mysql-test/suite/innodb/r/foreign-keys.result b/mysql-test/suite/innodb/r/foreign-keys.result
15 new file mode 100644
16 index 0000000..be8d27b
17 --- /dev/null
18 +++ b/mysql-test/suite/innodb/r/foreign-keys.result
19 @@ -0,0 +1,16 @@
20 +#
21 +# Bug #19471516 SERVER CRASHES WHEN EXECUTING ALTER TABLE
22 +# ADD FOREIGN KEY
23 +#
24 +CREATE TABLE `department` (`department_id` INT, `department_people_fk` INT,
25 +PRIMARY KEY (`department_id`)) engine=innodb;
26 +CREATE TABLE `title` (`title_id` INT, `title_manager_fk` INT,
27 +`title_reporter_fk` INT, PRIMARY KEY (`title_id`));
28 +CREATE TABLE `people` (`people_id` INT, PRIMARY KEY (`people_id`));
29 +ALTER TABLE `department` ADD FOREIGN KEY (`department_people_fk`) REFERENCES
30 +`people` (`people_id`);
31 +ALTER TABLE `title` ADD FOREIGN KEY (`title_manager_fk`) REFERENCES `people`
32 +(`people_id`);
33 +ALTER TABLE `title` ADD FOREIGN KEY (`title_reporter_fk`) REFERENCES `people`
34 +(`people_id`);
35 +drop table title, department, people;
36 diff --git a/mysql-test/suite/innodb/t/foreign-keys.test b/mysql-test/suite/innodb/t/foreign-keys.test
37 new file mode 100644
38 index 0000000..45642cf
39 --- /dev/null
40 +++ b/mysql-test/suite/innodb/t/foreign-keys.test
41 @@ -0,0 +1,26 @@
42 +--source include/have_innodb.inc
43 +--source include/have_debug.inc
44 +
45 +--echo #
46 +--echo # Bug #19471516 SERVER CRASHES WHEN EXECUTING ALTER TABLE
47 +--echo # ADD FOREIGN KEY
48 +--echo #
49 +
50 +CREATE TABLE `department` (`department_id` INT, `department_people_fk` INT,
51 +PRIMARY KEY (`department_id`)) engine=innodb;
52 +
53 +CREATE TABLE `title` (`title_id` INT, `title_manager_fk` INT,
54 +`title_reporter_fk` INT, PRIMARY KEY (`title_id`));
55 +
56 +CREATE TABLE `people` (`people_id` INT, PRIMARY KEY (`people_id`));
57 +
58 +ALTER TABLE `department` ADD FOREIGN KEY (`department_people_fk`) REFERENCES
59 +`people` (`people_id`);
60 +
61 +ALTER TABLE `title` ADD FOREIGN KEY (`title_manager_fk`) REFERENCES `people`
62 +(`people_id`);
63 +
64 +ALTER TABLE `title` ADD FOREIGN KEY (`title_reporter_fk`) REFERENCES `people`
65 +(`people_id`);
66 +
67 +drop table title, department, people;
68 diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c
69 index e225966..0e46916 100644
70 --- a/storage/innobase/dict/dict0dict.c
71 +++ b/storage/innobase/dict/dict0dict.c
72 @@ -1123,6 +1123,11 @@ dict_table_rename_in_cache(
73                 /* The id will be changed.  So remove old one */
74                 rbt_delete(foreign->foreign_table->foreign_rbt, foreign->id);
75  
76 +               if (foreign->referenced_table) {
77 +                       rbt_delete(foreign->referenced_table->referenced_rbt,
78 +                                  foreign->id);
79 +               }
80 +
81                 if (ut_strlen(foreign->foreign_table_name)
82                     < ut_strlen(table->name)) {
83                         /* Allocate a longer name buffer;
84 @@ -1273,6 +1278,11 @@ dict_table_rename_in_cache(
85                 rbt_insert(foreign->foreign_table->foreign_rbt,
86                            foreign->id, &foreign);
87  
88 +               if (foreign->referenced_table) {
89 +                       rbt_insert(foreign->referenced_table->referenced_rbt,
90 +                                  foreign->id, &foreign);
91 +               }
92 +
93                 foreign = UT_LIST_GET_NEXT(foreign_list, foreign);
94         }
95  
This page took 0.133606 seconds and 2 git commands to generate.