Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37419965
en ru br
Репозитории 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
www.altlinux.org/Changes

Группа :: Базы Данных
Пакет: 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)
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin