diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-02-20 19:53:12 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-02-27 12:35:10 +0100 |
commit | 955f2f036d6252b90e2bffcec521dd4a7db0a30a (patch) | |
tree | 9ebe926cffe1e80ff852ee85da7ae42b18de7c64 /sql/sql_parse.cc | |
parent | 93cb0246b8c883c4f5010468892986fa1d5ba379 (diff) | |
download | mariadb-git-955f2f036d6252b90e2bffcec521dd4a7db0a30a.tar.gz |
race-condition safe implementation of test_if_data_home_dir()
don't realpath() twice
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r-- | sql/sql_parse.cc | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 32784f6432a..c3170d04304 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7697,26 +7697,20 @@ bool check_ident_length(LEX_STRING *ident) Check if path does not contain mysql data home directory SYNOPSIS - test_if_data_home_dir() - dir directory + path_starts_from_data_home_dir() + dir directory, with all symlinks resolved RETURN VALUES 0 ok 1 error ; Given path contains data directory */ -C_MODE_START +extern "C" { -int test_if_data_home_dir(const char *dir) +int path_starts_from_data_home_dir(const char *path) { - char path[FN_REFLEN]; - int dir_len; - DBUG_ENTER("test_if_data_home_dir"); + int dir_len= strlen(path); + DBUG_ENTER("path_starts_from_data_home_dir"); - if (!dir) - DBUG_RETURN(0); - - (void) fn_format(path, dir, "", "", MY_RETURN_REAL_PATH); - dir_len= strlen(path); if (mysql_unpacked_real_data_home_len<= dir_len) { if (dir_len > mysql_unpacked_real_data_home_len && @@ -7744,7 +7738,31 @@ int test_if_data_home_dir(const char *dir) DBUG_RETURN(0); } -C_MODE_END +} + +/* + Check if path does not contain mysql data home directory + + SYNOPSIS + test_if_data_home_dir() + dir directory + + RETURN VALUES + 0 ok + 1 error ; Given path contains data directory +*/ + +int test_if_data_home_dir(const char *dir) +{ + char path[FN_REFLEN]; + DBUG_ENTER("test_if_data_home_dir"); + + if (!dir) + DBUG_RETURN(0); + + (void) fn_format(path, dir, "", "", MY_RETURN_REAL_PATH); + DBUG_RETURN(path_starts_from_data_home_dir(path)); +} /** |