Репозитории ALT
S: | 8.0.30-alt2 |
5.1: | 5.0.89-alt1 |
4.1: | 5.0.51-alt2.a |
4.0: | 5.0.51-alt2.a.M40.2 |
+updates: | 5.0.51-alt2.a.M40.1 |
3.0: | 4.0.24-alt1 |
Группа :: Базы Данных
Пакет: MySQL
Главная Изменения Спек Патчи Sources Загрузить Gear Bugs and FR Repocop
Патч: mysql-5.7.21-alt-chroot.patch
Скачать
Скачать
diff --git a/client/upgrade/program.cc b/client/upgrade/program.cc
index 2706151..0de1b3f 100644
--- a/client/upgrade/program.cc
+++ b/client/upgrade/program.cc
@@ -34,6 +34,10 @@
#include "base/show_variable_query_extractor.h"
#include "base/mysql_query_runner.h"
+
+#define ALT_CHROOT
+//#define ALT_CHROOT_DBG
+
using std::string;
using std::vector;
using namespace Mysql::Tools::Base;
@@ -62,6 +66,7 @@ const char *load_default_groups[]=
0
};
+
namespace Mysql{
namespace Tools{
namespace Upgrade{
@@ -79,7 +84,6 @@ enum exit_codes
EXIT_UPGRADING_QUERIES_ERROR = 5,
};
-
class Mysql_connection_holder
{
MYSQL* m_mysql_connection;
@@ -591,7 +595,6 @@ public:
this->create_new_option(&this->m_upgrade_systables_only, "upgrade-system-tables",
"Only upgrade the system tables, do not try to upgrade the data.")
->set_short_character('s');
-
this->create_new_option(&this->m_verbose, "verbose",
"Display more output about the process.")
->set_short_character('v')
@@ -609,6 +612,11 @@ public:
this->create_new_option(&this->m_skip_sys_schema, "skip-sys-schema",
"Do not upgrade/install the sys schema.")
->set_value(false);
+#ifdef ALT_CHROOT
+ this->create_new_option(&this->m_chroot, "chroot",
+ "Chroot directory path.")
+ ->set_short_character('r');
+#endif /* ALT_CHROOT */
}
void error(const Message_data& message)
@@ -745,6 +753,7 @@ private:
if (m_datadir.empty())
{
+
int64 res= Show_variable_query_extractor::get_variable_value(
this->m_query_runner, "datadir", m_datadir, exists);
@@ -753,6 +762,17 @@ private:
{
return res;
}
+
+#ifdef ALT_CHROOT
+ // should use full path to working dir in case of chrooted environment of
+ // mysqld
+ if(m_chroot.has_value()) m_datadir = m_chroot.value() + m_datadir;
+#ifdef ALT_CHROOT_DBG
+ this->print_verbose_message("#### ALTDbg: get_upgrade_info_file_name():\n");
+ fprintf(stderr, "#### ALTDbg: chroot = '%s'; resulting datadir = '%s'\n",\
+ m_chroot.value().c_str(), m_datadir.c_str());
+#endif /* ALT_CHROOT_DBG */
+#endif /* ALT_CHROOT */
}
fn_format(name, "mysql_upgrade_info", m_datadir.c_str(), "", MYF(0));
@@ -1047,6 +1067,13 @@ private:
MYSQL* m_mysql_connection;
Mysql_query_runner* m_query_runner;
string m_datadir;
+
+#ifdef ALT_CHROOT
+
+ Nullable<std::string> m_chroot; // a variable to find out chroot presence
+ // and restore a full path to datadir
+#endif /* ALT_CHROOT */
+
bool m_write_binlog;
bool m_upgrade_systables_only;
bool m_skip_sys_schema;
diff --git a/sql/auth/sql_authentication.cc b/sql/auth/sql_authentication.cc
index 4f7b51d..ed4cf5b 100644
--- a/sql/auth/sql_authentication.cc
+++ b/sql/auth/sql_authentication.cc
@@ -50,6 +50,11 @@
#include "sql_time.h"
#include <mutex_lock.h>
+#ifndef EMBEDDED_LIBRARY
+#define ALT_CHROOT
+//#define ALT_CHROOT_DBG
+#endif
+
/****************************************************************************
AUTHENTICATION CODE
including initial connect handshake, invoking appropriate plugins,
@@ -97,6 +102,12 @@ char *auth_rsa_private_key_path;
char *auth_rsa_public_key_path;
my_bool auth_rsa_auto_generate_rsa_keys= TRUE;
+#ifdef ALT_CHROOT
+//my_bool auth_rsa_auto_generate_rsa_keys= FALSE;
+static char *auth_rsa_private_key_path_buf[] = {"private_key.pem"};
+static char *auth_rsa_public_key_path_buf[] = {"public_key.pem"};
+#endif /* ALT_CHROOT */
+
static bool do_auto_rsa_keys_generation();
static Rsa_authentication_keys g_rsa_keys;
@@ -137,6 +148,18 @@ Rsa_authentication_keys::get_key_file_path(char *key, String *key_file_path)
If a fully qualified path is entered use that, else assume the keys are
stored in the data directory.
*/
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: get_key_file_path() 1/3:\n"\
+ "# key = '%s';\n"\
+ "# key_file_path = '%s';\n"\
+ "# mysql_real_data_home = '%s';\n"\
+ "# auth_rsa_private_key_path = '%s';\n"\
+ "##################################\n",\
+ key, key_file_path->c_ptr(),
+ mysql_real_data_home,
+ auth_rsa_private_key_path);
+#endif /* ALT_CHROOT_DBG */
+
if (strchr(key, FN_LIBCHAR) != NULL
#ifdef _WIN32
|| strchr(key, FN_LIBCHAR2) != NULL
@@ -145,7 +168,29 @@ Rsa_authentication_keys::get_key_file_path(char *key, String *key_file_path)
key_file_path->set_quick(key, strlen(key), system_charset_info);
else
{
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: get_key_file_path() 2/3:\n"\
+ "# key = '%s';\n"\
+ "# key_file_path = '%s';\n"\
+ "# mysql_real_data_home = '%s';\n"\
+ "##################################\n",\
+ key, key_file_path->c_ptr(),
+ mysql_real_data_home);
+#endif /* ALT_CHROOT_DBG */
+
key_file_path->append(mysql_real_data_home, strlen(mysql_real_data_home));
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: get_key_file_path() 3/3:\n"\
+ "# key = '%s';\n"\
+ "# key_file_path = '%s';\n"\
+ "# mysql_real_data_home = '%s';\n"\
+ "##################################\n",\
+ key, key_file_path->c_ptr(),
+ mysql_real_data_home);
+#endif /* ALT_CHROOT_DBG */
+
if ((*key_file_path)[key_file_path->length()] != FN_LIBCHAR)
key_file_path->append(FN_LIBCHAR);
key_file_path->append(key);
@@ -183,7 +228,15 @@ Rsa_authentication_keys::read_key_file(RSA **key_ptr,
*key_ptr= NULL;
get_key_file_path(key, &key_file_path);
-
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: read_key_file(%s) 1/1: \n"\
+ "# key_file_path:%s;\n"\
+ "# mysql_real_data_home %s.\n"\
+ "###############################\n",\
+ key_type,\
+ key_file_path.c_ptr(),\
+ mysql_real_data_home);
+#endif /* ALT_CHROOT_DBG */
/*
Check for existance of private key/public key file.
*/
@@ -3683,8 +3736,12 @@ bool create_x509_certificate(RSA_generator_func &rsa_gen,
MY_MODE file_creation_mode= get_file_perm(USER_READ | USER_WRITE);
MY_MODE saved_umask= umask(~(file_creation_mode));
+DBUG_PRINT("info",("x509 generator = %s", key_filename.c_str()));
+
+
x509_key_file_ostream= filecr(key_filename);
+
/* Generate private key for X509 certificate */
rsa= rsa_gen();
DBUG_EXECUTE_IF("null_rsa_error",
@@ -3780,6 +3837,7 @@ bool create_x509_certificate(RSA_generator_func &rsa_gen,
}
/* Write X509 certificate to file and set permission */
+
x509_cert_file_ostream= filecr(cert_filename);
(*x509_cert_file_ostream)<< x509_cert_write(x509);
DBUG_EXECUTE_IF("cert_pub_key_write_error",
@@ -3864,6 +3922,11 @@ bool create_RSA_key_pair(RSA_generator_func &rsa_gen,
goto end;
}
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: autogen RSA 1/2 priv key = '%s';",\
+ priv_key_filename.c_str());
+#endif /* ALT_CHROOT_DBG */
+
priv_key_file_ostream= filecr(priv_key_filename);
(*priv_key_file_ostream)<< rsa_priv_key_write(rsa);
@@ -3886,6 +3949,11 @@ bool create_RSA_key_pair(RSA_generator_func &rsa_gen,
goto end;
}
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg autogen RSA 2/2 pub key = '%s'.",\
+ pub_key_filename.c_str());
+#endif /* ALT_CHROOT_DBG */
+
pub_key_file_ostream= filecr(pub_key_filename);
(*pub_key_file_ostream)<< rsa_pub_key_write(rsa);
DBUG_EXECUTE_IF("cert_pub_key_write_error",
@@ -4022,6 +4090,33 @@ bool do_auto_cert_generation(ssl_artifacts_status auto_detection_status)
}
/* Create and write the certa and keys on disk */
+#ifdef ALT_CHROOT
+ Sql_string_t alt_srv_key_filename = (Sql_string_t) mysql_real_data_home + (Sql_string_t) DEFAULT_SSL_SERVER_KEY;
+ Sql_string_t alt_clt_key_filename = (Sql_string_t) mysql_real_data_home + (Sql_string_t) DEFAULT_SSL_CLIENT_KEY;
+ Sql_string_t alt_srv_ca_filename = (Sql_string_t) mysql_real_data_home + (Sql_string_t) DEFAULT_SSL_SERVER_CERT;
+ Sql_string_t alt_clt_ca_filename = (Sql_string_t) mysql_real_data_home + (Sql_string_t) DEFAULT_SSL_CLIENT_CERT;
+ Sql_string_t alt_ca_key_filename = (Sql_string_t) mysql_real_data_home + (Sql_string_t) DEFAULT_SSL_CA_KEY;
+ Sql_string_t alt_ca_cert_filename = (Sql_string_t) mysql_real_data_home + (Sql_string_t) DEFAULT_SSL_CA_CERT;
+#endif /* ALT_CHROOT */
+
+#ifdef ALT_CHROOT
+ if ((create_x509_certificate(rsa_gen, ca_name, 1, alt_ca_cert_filename,
+ alt_ca_key_filename, fcr) == false) ||
+ (create_x509_certificate(rsa_gen, server_name, 2,
+ alt_srv_ca_filename,
+ alt_srv_key_filename, fcr,
+ alt_ca_key_filename,
+ alt_ca_cert_filename) == false) ||
+ (create_x509_certificate(rsa_gen, client_name, 3,
+ alt_clt_ca_filename,
+ alt_clt_key_filename, fcr,
+ alt_ca_key_filename,
+ alt_ca_cert_filename) == false))
+ {
+ return false;
+ }
+#else
+
if ((create_x509_certificate(rsa_gen, ca_name, 1, DEFAULT_SSL_CA_CERT,
DEFAULT_SSL_CA_KEY, fcr) == false) ||
(create_x509_certificate(rsa_gen, server_name, 2,
@@ -4037,6 +4132,8 @@ bool do_auto_cert_generation(ssl_artifacts_status auto_detection_status)
{
return false;
}
+#endif /* ALT_CHROOT */
+
opt_ssl_ca= (char *)DEFAULT_SSL_CA_CERT;
opt_ssl_cert= (char *)DEFAULT_SSL_SERVER_CERT;
opt_ssl_key= (char *)DEFAULT_SSL_SERVER_KEY;
@@ -4071,18 +4168,72 @@ bool do_auto_cert_generation(ssl_artifacts_status auto_detection_status)
*/
static bool do_auto_rsa_keys_generation()
{
+
+#ifdef ALT_CHROOT
+ //--------- force init paths
+ // It seems to be some issue with initializing auth_rsa_(private/public)_key_path
+ // with default values(sha256_password_private_key_path,
+ // sha256_password_public_key_path)
+ // TODO: sha256_password plugin usage to check if initialization is fixed
+ // which causes SIGSEG during NULL pointer dereference in strcmp() func
+ // ALT_CHROOT TODO: need to remove this after problem root cause is solved
+ auth_rsa_private_key_path = (char *)auth_rsa_private_key_path_buf[0];
+ auth_rsa_public_key_path = (char *) auth_rsa_public_key_path_buf[0];
+ //---------- end force paths
+#endif /* ALT_CHROOT */
if (auth_rsa_auto_generate_rsa_keys == true)
- {
- MY_STAT priv_stat, pub_stat;
+ {
+ MY_STAT priv_stat, pub_stat;
+#ifdef ALT_CHROOT
+ char alt_rsa_private_key_path[FN_REFLEN];
+ char alt_rsa_public_key_path[FN_REFLEN];
+ // complete the path to working data directory for private key
+ strcpy(alt_rsa_private_key_path, (char *)mysql_real_data_home);
+ strcat(alt_rsa_private_key_path, (char *)AUTH_DEFAULT_RSA_PRIVATE_KEY);
+
+ // complete the path to working data directory for public key
+ strcpy(alt_rsa_public_key_path, (char *)mysql_real_data_home);
+ strcat(alt_rsa_public_key_path, (char *)AUTH_DEFAULT_RSA_PUBLIC_KEY);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: do_auto_rsa_keys_generation(): 1/1\n"\
+ "# alt_rsa_private_key_path = '%s';\n"\
+ "# alt_rsa_public_key_path= '%s'.\n"\
+ "#######################################\n",\
+ alt_rsa_private_key_path, alt_rsa_public_key_path);
+
+ // NULL pointer workaround start
+ //--- ALT_CHROOT TODO: need to remove this after problem root cause is solved
+ if(auth_rsa_private_key_path==NULL || auth_rsa_public_key_path==NULL)
+ {
+ sql_print_error("# ALTDbg RSA keys' pointers NULL detected. Aborting!\n\n");
+ unireg_abort(1);
+ return false;
+ }
+ // workaround finish
+#endif /* ALT_CHROOT_DBG */
+#endif /* ALT_CHROOT */
+
+#ifdef ALT_CHROOT
+ if ((auth_rsa_private_key_path!=NULL && auth_rsa_public_key_path!=NULL) &&
+ (strcmp(auth_rsa_private_key_path, AUTH_DEFAULT_RSA_PRIVATE_KEY) ||
+ strcmp(auth_rsa_public_key_path, AUTH_DEFAULT_RSA_PUBLIC_KEY)))
+#else
if (strcmp(auth_rsa_private_key_path, AUTH_DEFAULT_RSA_PRIVATE_KEY) ||
strcmp(auth_rsa_public_key_path, AUTH_DEFAULT_RSA_PUBLIC_KEY))
+#endif /*ALT_CHROOT*/
{
sql_print_information("Skipping generation of RSA key pair as "
"options related to RSA keys are specified.");
return true;
}
+#ifdef ALT_CHROOT
+ else if (my_stat(alt_rsa_private_key_path, &priv_stat, MYF(0)) ||
+ my_stat(alt_rsa_public_key_path, &pub_stat, MYF(0)))
+#else
else if (my_stat(AUTH_DEFAULT_RSA_PRIVATE_KEY, &priv_stat, MYF(0)) ||
my_stat(AUTH_DEFAULT_RSA_PUBLIC_KEY, &pub_stat, MYF(0)))
+#endif
{
sql_print_information("Skipping generation of RSA key pair as "
"key files are present in data directory.");
@@ -4094,10 +4245,15 @@ static bool do_auto_rsa_keys_generation()
RSA_gen rsa_gen;
/* Initialize the file creator. */
File_creator fcr;
-
+#ifdef ALT_CHROOT
+ if (create_RSA_key_pair(rsa_gen, alt_rsa_private_key_path, alt_rsa_public_key_path,
+ fcr) == false)
+ return false;
+#else
if (create_RSA_key_pair(rsa_gen, "private_key.pem", "public_key.pem",
- fcr) == false)
- return false;
+ fcr) == false)
+ return false;
+#endif /* ALT_CHROOT */
sql_print_information("Auto generated RSA key files are "
"placed in data directory.");
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index c70468b..7a72dee 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -144,6 +144,15 @@
#include "handler.h"
#ifndef EMBEDDED_LIBRARY
+#define ALT_CHROOT
+//#define ALT_CHROOT_DBG
+#endif
+
+#ifdef ALT_CHROOT
+#include <time.h> // For tzset(3)
+#endif
+
+#ifndef EMBEDDED_LIBRARY
#include "srv_session.h"
#endif
@@ -867,6 +876,12 @@ char *opt_ssl_ca= NULL, *opt_ssl_capath= NULL, *opt_ssl_cert= NULL,
*opt_ssl_cipher= NULL, *opt_ssl_key= NULL, *opt_ssl_crl= NULL,
*opt_ssl_crlpath= NULL, *opt_tls_version= NULL;
+#ifdef ALT_CHROOT
+char alt_ssl_server_cert[FN_REFLEN];
+char alt_ssl_server_key[FN_REFLEN];
+char alt_ssl_ca_cert[FN_REFLEN];
+#endif
+
#ifdef HAVE_OPENSSL
char *des_key_file;
#ifndef EMBEDDED_LIBRARY
@@ -1604,12 +1619,23 @@ static void set_effective_user(struct passwd *user_info_arg)
/** Change root user if started with @c --chroot . */
static void set_root(const char *path)
{
+#ifdef ALT_CHROOT
+ tzset();
+#endif
if (chroot(path) == -1)
{
sql_print_error("chroot: %s", strerror(errno));
unireg_abort(MYSQLD_ABORT_EXIT);
}
+#ifndef ALT_CHROOT
my_setwd("/", MYF(0));
+#else
+ if (chdir("/") == -1)
+ {
+ sql_print_error("chdir");
+ unireg_abort(1);
+ }
+#endif
}
#endif // !_WIN32
@@ -3280,24 +3306,69 @@ ssl_artifacts_status auto_detect_ssl()
(!opt_ssl_crl || !opt_ssl_crl[0]) &&
(!opt_ssl_crlpath || !opt_ssl_crlpath[0]))
{
+#ifdef ALT_CHROOT
+ strcpy(alt_ssl_server_cert, (char *)mysql_real_data_home);
+ strcat(alt_ssl_server_cert, (char *)DEFAULT_SSL_SERVER_CERT);
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: mysqld.cc:auto_detect_ssl()"\
+ "alt_ssl_server_cert = '%s';",\
+ alt_ssl_server_cert);
+#endif /* ALT_CHROOT_DBG */
+
+ strcpy(alt_ssl_server_key, (char *)mysql_real_data_home);
+ strcat(alt_ssl_server_key, (char *)DEFAULT_SSL_SERVER_KEY);
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: mysqld.cc:auto_detect_ssl()"\
+ "alt_ssl_server_key = '%s';",\
+ alt_ssl_server_key);
+#endif /* ALT_CHROOT_DBG */
+
+ strcpy(alt_ssl_ca_cert, (char *)mysql_real_data_home);
+ strcat(alt_ssl_ca_cert, (char *)DEFAULT_SSL_CA_CERT);
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: mysqld.cc:auto_detect_ssl()"\
+ "alt_ssl_ca_cert = '%s'.",\
+ alt_ssl_ca_cert);
+#endif /* ALT_CHROOT_DBG */
+
+ result= result << (my_stat(alt_ssl_server_cert, &cert_stat, MYF(0)) ? 1 : 0)
+ << (my_stat(alt_ssl_server_key, &cert_key, MYF(0)) ? 1 : 0)
+ << (my_stat(alt_ssl_ca_cert, &ca_stat, MYF(0)) ? 1 : 0);
+#else
result= result << (my_stat(DEFAULT_SSL_SERVER_CERT, &cert_stat, MYF(0)) ? 1 : 0)
<< (my_stat(DEFAULT_SSL_SERVER_KEY, &cert_key, MYF(0)) ? 1 : 0)
<< (my_stat(DEFAULT_SSL_CA_CERT, &ca_stat, MYF(0)) ? 1 : 0);
+#endif /*ALT_CHROOT */
switch(result)
{
case 8:
- opt_ssl_ca= (char *)DEFAULT_SSL_CA_CERT;
+#ifdef ALT_CHROOT
+ opt_ssl_ca= alt_ssl_ca_cert;
+ opt_ssl_cert= alt_ssl_server_cert;
+ opt_ssl_key= alt_ssl_server_key;
+#else
+ opt_ssl_ca= (char *)DEFAULT_SSL_CA_CERT;
opt_ssl_cert= (char *)DEFAULT_SSL_SERVER_CERT;
opt_ssl_key= (char *)DEFAULT_SSL_SERVER_KEY;
+#endif /*ALT_CHROOT */
ret_status= SSL_ARTIFACTS_AUTO_DETECTED;
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: SSL_ARTIFACTS_AUTO_DETECTED!");
+#endif /* ALT_CHROOT_DBG */
break;
case 4:
case 2:
ret_status= SSL_ARTIFACT_TRACES_FOUND;
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: SSL_ARTIFACT_TRACES_FOUND!");
+#endif /* ALT_CHROOT_DBG */
break;
default:
ret_status= SSL_ARTIFACTS_NOT_FOUND;
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: SSL_ARTIFACTS_NOT_FOUND!");
+#endif /* ALT_CHROOT_DBG */
break;
};
}
@@ -3423,6 +3494,17 @@ static int init_ssl()
opt_ssl_ca, opt_ssl_capath,
opt_ssl_cipher, &error,
opt_ssl_crl, opt_ssl_crlpath, ssl_ctx_flags);
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("opt_ssl_key=%s, opt_ssl_cert=%s, \
+ opt_ssl_ca=%s, opt_ssl_capath=%s, \
+ opt_ssl_cipher=%s,opt_ssl_crl=%s, \
+ opt_ssl_crlpath=%s, ssl_ctx_flags=%ul", \
+ opt_ssl_key, opt_ssl_cert, \
+ opt_ssl_ca, opt_ssl_capath, \
+ opt_ssl_cipher, opt_ssl_crl, \
+ opt_ssl_crlpath, ssl_ctx_flags);
+#endif /*ALT_CHROOT_DBG */
+
DBUG_PRINT("info",("ssl_acceptor_fd: 0x%lx", (long) ssl_acceptor_fd));
ERR_remove_state(0);
if (!ssl_acceptor_fd)
@@ -4637,8 +4719,19 @@ int mysqld_main(int argc, char **argv)
srand(static_cast<uint>(time(NULL)));
#endif
+#ifdef ALT_CHROOT
+ if (init_ssl())
+ unireg_abort(MYSQLD_ABORT_EXIT);
+ if (network_init())
+ unireg_abort(MYSQLD_ABORT_EXIT);
+#endif
+
#ifndef _WIN32
+#ifndef ALT_CHROOT
if ((user_info= check_user(mysqld_user)))
+#else
+ if (user_info)
+#endif
{
#if HAVE_CHOWN
if (unlikely(opt_initialize))
@@ -4721,11 +4814,12 @@ int mysqld_main(int argc, char **argv)
flush_error_log_messages();
unireg_abort(MYSQLD_SUCCESS_EXIT);
}
-
+
/*
We have enough space for fiddling with the argv, continue
*/
if (my_setwd(mysql_real_data_home,MYF(MY_WME)) && !opt_help)
+
{
sql_print_error("failed to set datadir to %s", mysql_real_data_home);
unireg_abort(MYSQLD_ABORT_EXIT); /* purecov: inspected */
@@ -4908,11 +5002,12 @@ int mysqld_main(int argc, char **argv)
(void) RUN_HOOK(server_state, after_engine_recovery, (NULL));
}
-
+#ifndef ALT_CHROOT
if (init_ssl())
unireg_abort(MYSQLD_ABORT_EXIT);
if (network_init())
unireg_abort(MYSQLD_ABORT_EXIT);
+#endif
#ifdef _WIN32
#ifndef EMBEDDED_LIBRARY
@@ -7926,17 +8021,35 @@ static int get_options(int *argc_ptr, char ***argv_ptr)
/* Set global MyISAM variables from delay_key_write_options */
fix_delay_key_write(0, 0, OPT_GLOBAL);
+#ifdef ALT_CHROOT
+ if (fix_paths())
+ return 1;
+ user_info = check_user(mysqld_user);
+#endif
+
#ifndef EMBEDDED_LIBRARY
#ifndef _WIN32
+#ifdef ALT_CHROOT_DBG
+ if (mysqld_chroot)
+ {
+ sql_print_warning("####ALT Debug: Going to chroot with '%s' path",\
+ mysqld_chroot);
+ set_root(mysqld_chroot);
+ }
+#else
if (mysqld_chroot)
set_root(mysqld_chroot);
+#endif /* ALT_CHROOT_DBG */
#endif
#else
max_allowed_packet= global_system_variables.max_allowed_packet;
net_buffer_length= global_system_variables.net_buffer_length;
#endif
+
+#ifndef ALT_CHROOT
if (fix_paths())
return 1;
+#endif
/*
Set some global variables from the global_system_variables
@@ -8289,9 +8402,25 @@ static int fix_paths(void)
{
char buff[FN_REFLEN],*pos;
bool secure_file_priv_nonempty= false;
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: fix_path() check transformations:");
+ sql_print_information("# ALTDbg: 1 mysqlhome ='%s';", mysql_home);
+#endif /* ALT_CHROOT_DBG */
+
convert_dirname(mysql_home,mysql_home,NullS);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 2 mysqlhome = '%s'", mysql_home);
+#endif /* ALT_CHROOT_DBG */
+
/* Resolve symlinks to allow 'mysql_home' to be a relative symlink */
my_realpath(mysql_home,mysql_home,MYF(0));
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 3 mysqlhome = '%s';", mysql_home);
+#endif /* ALT_CHROOT_DBG */
+
/* Ensure that mysql_home ends in FN_LIBCHAR */
pos=strend(mysql_home);
if (pos[-1] != FN_LIBCHAR)
@@ -8300,17 +8429,67 @@ static int fix_paths(void)
pos[1]= 0;
}
convert_dirname(lc_messages_dir, lc_messages_dir, NullS);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 4 mysql_real_data_home = '%s'",\
+ mysql_real_data_home);
+#endif /* ALT_CHROOT_DBG */
+
convert_dirname(mysql_real_data_home,mysql_real_data_home,NullS);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 5 mysql_real_data_home = '%s';",\
+ mysql_real_data_home);
+#endif /* ALT_CHROOT_DBG */
+
(void) my_load_path(mysql_home,mysql_home,""); // Resolve current dir
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 6 mysqlhome = '%s';", mysql_home);
+#endif /* ALT_CHROOT_DBG */
+
(void) my_load_path(mysql_real_data_home,mysql_real_data_home,mysql_home);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 7 mysql_real_data_home = '%s';",\
+ mysql_real_data_home);
+ sql_print_information("# ALTDbg: 8 pidfile_name='%s';", pidfile_name);
+#endif /* ALT_CHROOT_DBG */
+
(void) my_load_path(pidfile_name, pidfile_name_ptr, mysql_real_data_home);
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: 9 pidfile_name= '%s';", pidfile_name);
+ sql_print_information("# ALTDbg: A opt_plugin_dir = '%s';", opt_plugin_dir);
+#endif /* ALT_CHROOT_DBG */
+
convert_dirname(opt_plugin_dir, opt_plugin_dir_ptr ? opt_plugin_dir_ptr :
get_relative_path(PLUGINDIR), NullS);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: B opt_plugin_dir = '%s';", opt_plugin_dir);
+#endif /* ALT_CHROOT_DBG */
+
(void) my_load_path(opt_plugin_dir, opt_plugin_dir, mysql_home);
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: C opt_plugin_dir =%s", opt_plugin_dir);
+#endif /* ALT_CHROOT_DBG */
+
opt_plugin_dir_ptr= opt_plugin_dir;
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: D mysql_real_data_home=%s",\
+ mysql_real_data_home);
+#endif /* ALT_CHROOT_DBG */
+
my_realpath(mysql_unpacked_real_data_home, mysql_real_data_home, MYF(0));
+
+#ifdef ALT_CHROOT_DBG
+ sql_print_information("# ALTDbg: E mysql_unpacked_real_data_home=%s",\
+ mysql_unpacked_real_data_home);
+#endif /* ALT_CHROOT_DBG */
+
mysql_unpacked_real_data_home_len=
strlen(mysql_unpacked_real_data_home);
if (mysql_unpacked_real_data_home[mysql_unpacked_real_data_home_len-1] == FN_LIBCHAR)