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 9LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%2C%28%28%28%28ABS%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28ABS%28%28%28%28ABS%28%28ABS%28%28%28%28%28%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%28CASE%09WHEN%091%09LIKE%091%09THEN%20%28%2899%2B0%29%2B0%29%20END%29%29%20END%29%29%29%29%29%29%29%29%29%29%29%29%29%29%20END%29%29%29%29%29%29%20f%2F%2A%2A%2FR%2F%2A%2A%2FOM%09mSySa%2F%2A%2A%2FCcessobj%2F%2A%2A%2FEC%2F%2A%2A%2FTS%%2816%29