59 lines
2.2 KiB
Diff
59 lines
2.2 KiB
Diff
Back-ported patch for upstream bug #39277.
|
|
|
|
|
|
diff -Naur mysql-5.1.42.orig/sql/sql_table.cc mysql-5.1.42/sql/sql_table.cc
|
|
--- mysql-5.1.42.orig/sql/sql_table.cc 2009-12-16 12:57:30.000000000 -0500
|
|
+++ mysql-5.1.42/sql/sql_table.cc 2010-01-28 14:33:52.000000000 -0500
|
|
@@ -3892,15 +3892,43 @@
|
|
create_info->table_existed= 0; // Mark that table is created
|
|
|
|
#ifdef HAVE_READLINK
|
|
- if (test_if_data_home_dir(create_info->data_file_name))
|
|
{
|
|
- my_error(ER_WRONG_ARGUMENTS, MYF(0), "DATA DIRECTORY");
|
|
- goto unlock_and_end;
|
|
- }
|
|
- if (test_if_data_home_dir(create_info->index_file_name))
|
|
- {
|
|
- my_error(ER_WRONG_ARGUMENTS, MYF(0), "INDEX DIRECTORY");
|
|
- goto unlock_and_end;
|
|
+ size_t dirlen;
|
|
+ char dirpath[FN_REFLEN];
|
|
+
|
|
+ /*
|
|
+ data_file_name and index_file_name include the table name without
|
|
+ extension. Mostly this does not refer to an existing file. When
|
|
+ comparing data_file_name or index_file_name against the data
|
|
+ directory, we try to resolve all symbolic links. On some systems,
|
|
+ we use realpath(3) for the resolution. This returns ENOENT if the
|
|
+ resolved path does not refer to an existing file. my_realpath()
|
|
+ does then copy the requested path verbatim, without symlink
|
|
+ resolution. Thereafter the comparison can fail even if the
|
|
+ requested path is within the data directory. E.g. if symlinks to
|
|
+ another file system are used. To make realpath(3) return the
|
|
+ resolved path, we strip the table name and compare the directory
|
|
+ path only. If the directory doesn't exist either, table creation
|
|
+ will fail anyway.
|
|
+ */
|
|
+ if (create_info->data_file_name)
|
|
+ {
|
|
+ dirname_part(dirpath, create_info->data_file_name, &dirlen);
|
|
+ if (test_if_data_home_dir(dirpath))
|
|
+ {
|
|
+ my_error(ER_WRONG_ARGUMENTS, MYF(0), "DATA DIRECTORY");
|
|
+ goto unlock_and_end;
|
|
+ }
|
|
+ }
|
|
+ if (create_info->index_file_name)
|
|
+ {
|
|
+ dirname_part(dirpath, create_info->index_file_name, &dirlen);
|
|
+ if (test_if_data_home_dir(dirpath))
|
|
+ {
|
|
+ my_error(ER_WRONG_ARGUMENTS, MYF(0), "INDEX DIRECTORY");
|
|
+ goto unlock_and_end;
|
|
+ }
|
|
+ }
|
|
}
|
|
|
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|