mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
race-condition safe implementation of test_if_data_home_dir()
don't realpath() twice
This commit is contained in:
@ -7267,7 +7267,7 @@ static int mysql_init_variables(void)
|
|||||||
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
|
mysql_home[0]= pidfile_name[0]= log_error_file[0]= 0;
|
||||||
#if defined(HAVE_REALPATH) && !defined(HAVE_valgrind) && !defined(HAVE_BROKEN_REALPATH)
|
#if defined(HAVE_REALPATH) && !defined(HAVE_valgrind) && !defined(HAVE_BROKEN_REALPATH)
|
||||||
/* We can only test for sub paths if my_symlink.c is using realpath */
|
/* We can only test for sub paths if my_symlink.c is using realpath */
|
||||||
mysys_test_invalid_symlink= test_if_data_home_dir;
|
mysys_test_invalid_symlink= path_starts_from_data_home_dir;
|
||||||
#endif
|
#endif
|
||||||
opt_log= opt_slow_log= 0;
|
opt_log= opt_slow_log= 0;
|
||||||
opt_bin_log= opt_bin_log_used= 0;
|
opt_bin_log= opt_bin_log_used= 0;
|
||||||
|
@ -7697,26 +7697,20 @@ bool check_ident_length(LEX_STRING *ident)
|
|||||||
Check if path does not contain mysql data home directory
|
Check if path does not contain mysql data home directory
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
test_if_data_home_dir()
|
path_starts_from_data_home_dir()
|
||||||
dir directory
|
dir directory, with all symlinks resolved
|
||||||
|
|
||||||
RETURN VALUES
|
RETURN VALUES
|
||||||
0 ok
|
0 ok
|
||||||
1 error ; Given path contains data directory
|
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= strlen(path);
|
||||||
int dir_len;
|
DBUG_ENTER("path_starts_from_data_home_dir");
|
||||||
DBUG_ENTER("test_if_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 (mysql_unpacked_real_data_home_len<= dir_len)
|
||||||
{
|
{
|
||||||
if (dir_len > mysql_unpacked_real_data_home_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);
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,7 +33,8 @@ enum enum_mysql_completiontype {
|
|||||||
COMMIT_RELEASE=-1, COMMIT=0, COMMIT_AND_CHAIN=6
|
COMMIT_RELEASE=-1, COMMIT=0, COMMIT_AND_CHAIN=6
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C" int test_if_data_home_dir(const char *dir);
|
extern "C" int path_starts_from_data_home_dir(const char *dir);
|
||||||
|
int test_if_data_home_dir(const char *dir);
|
||||||
|
|
||||||
bool multi_update_precheck(THD *thd, TABLE_LIST *tables);
|
bool multi_update_precheck(THD *thd, TABLE_LIST *tables);
|
||||||
bool multi_delete_precheck(THD *thd, TABLE_LIST *tables);
|
bool multi_delete_precheck(THD *thd, TABLE_LIST *tables);
|
||||||
|
Reference in New Issue
Block a user