Commit da357f72 authored by tsmith/mysqldev@mysql.com/production.mysql.com's avatar tsmith/mysqldev@mysql.com/production.mysql.com
Browse files

Bug #32219: too many hosts in default grant tables 6.0.3

Fix is to remove any references to the current hostname when running
mysql_install_db --cross-bootstrap.  (The dist-hook make target makes
this call, and the resulting data directory is included in the source
distribution as win/data/*.)

Also, a few other clean-ups to mysql_install_db while there.
parent 003f5640
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ dist-hook:
	rm -rf `find $(distdir) -type d -name SCCS -print`
	rm -f  `find $(distdir) -type l -print`
	mkdir -p $(distdir)/win
	scripts/mysql_install_db --no-defaults --windows \
	scripts/mysql_install_db --no-defaults --cross-bootstrap \
		--basedir=$(top_builddir) \
		--datadir=$(distdir)/win/data \
		--srcdir=$(top_srcdir)
+37 −29
Original line number Diff line number Diff line
@@ -30,13 +30,15 @@ user=""
force=0
in_rpm=0
ip_only=0
windows=0
cross_bootstrap=0

usage()
{
  cat <<EOF
Usage: $0 [OPTIONS]
  --basedir=path       The path to the MySQL installation directory.
  --cross-bootstrap    For internal use.  Used when building the MySQL system
                       tables on a different host than the target.
  --datadir=path       The path to the MySQL data directory.
  --force              Causes mysql_install_db to run even if DNS does not
                       work.  In that case, grant table entries that normally
@@ -56,8 +58,6 @@ Usage: $0 [OPTIONS]
                       user.  You must be root to use this option.  By default
                       mysqld runs using your current login name and files and
                       directories that it creates will be owned by you.
  --windows            For internal use.  This option is used for creating
                       Windows distributions.

All other options are passed to the mysqld program

@@ -67,7 +67,7 @@ EOF

s_echo()
{
  if test "$in_rpm" -eq 0 -a "$windows" -eq 0
  if test "$in_rpm" -eq 0 -a "$cross_bootstrap" -eq 0
  then
    echo "$1"
  fi
@@ -109,16 +109,17 @@ parse_arguments()
      --no-defaults|--defaults-file=*|--defaults-extra-file=*)
        defaults="$arg" ;;

      --windows)
	# This is actually a "cross bootstrap" argument used when
        # building the MySQL system tables on a different host
        # than the target. The platform independent
        # files that are created in --datadir on the host can
        # be copied to the target system, the most common use for
        # this feature is in the windows installer which will take
        # the files from datadir and include them as part of the install
        # package.
         windows=1 ;;
      --cross-bootstrap|--windows)
        # Used when building the MySQL system tables on a different host than
        # the target. The platform-independent files that are created in
        # --datadir on the host can be copied to the target system.
        #
        # The most common use for this feature is in the Windows installer
        # which will take the files from datadir and include them as part of
        # the install package.  See top-level 'dist-hook' make target.
        #
        # --windows is a deprecated alias
         cross_bootstrap=1 ;;

      *)
        if test -n "$pick_args"
@@ -213,8 +214,8 @@ then
  pkgdatadir="@pkgdatadir@"
else
  bindir="$basedir/bin"
  # We set up bootstrap-specific paths later, so skip this for --windows
  if test "$windows" -eq 0
  # We set up bootstrap-specific paths later, so skip this for now
  if test "$cross_bootstrap" -eq 0
  then
    pkgdatadir=`find_in_basedir --dir fill_help_tables.sql share share/mysql`
    if test -z "$pkgdatadir"
@@ -256,8 +257,8 @@ do
  fi
done

# Set up Windows-specific paths
if test "$windows" -eq 1
# Set up bootstrap-specific paths
if test "$cross_bootstrap" -eq 1
then
  mysqld="./sql/mysqld"
  if test -n "$srcdir" -a -f "$srcdir/sql/share/english/errmsg.sys"
@@ -280,7 +281,7 @@ fi
hostname=`@HOSTNAME@`

# Check if hostname is valid
if test "$windows" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0
then
  resolved=`$bindir/resolveip $hostname 2>&1`
  if [ $? -ne 0 ]
@@ -329,6 +330,16 @@ then
  args="$args --user=$user"
fi

# When doing a "cross bootstrap" install, no reference to the current
# host should be added to the system tables.  So we filter out any
# lines which contain the current host name.
if test $cross_bootstrap -eq 1
then
  filter_cmd_line="sed -e '/@current_hostname/d'"
else
  filter_cmd_line="cat"
fi

# Peform the install of system tables
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
@@ -337,15 +348,14 @@ mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \

# Pipe mysql_system_tables.sql to "mysqld --bootstrap"
s_echo "Installing MySQL system tables..."
if `(echo "use mysql;"; cat $create_system_tables $fill_system_tables) | $mysqld_install_cmd_line`
if { echo "use mysql;"; cat $create_system_tables $fill_system_tables; } | eval "$filter_cmd_line" | $mysqld_install_cmd_line > /dev/null
then
  s_echo "OK"

  s_echo "Filling help tables..."
  # Pipe fill_help_tables.sql to "mysqld --bootstrap"
  if `(echo "use mysql;"; cat $fill_help_tables) | $mysqld_install_cmd_line`
  if { echo "use mysql;"; cat $fill_help_tables; } | $mysqld_install_cmd_line > /dev/null
  then
    # Fill suceeded
    s_echo "OK"
  else
    echo
@@ -359,14 +369,12 @@ then
  s_echo "support-files/mysql.server to the right place for your system"
  s_echo

  if test "$windows" -eq 0
  if test "$cross_bootstrap" -eq 0
  then
    # A root password should of course also be set on Windows!
    # The reason for not displaying these prompts here is that when
    # executing this script with the --windows argument the script
    # is used to generate system tables mainly used by the
    # windows installer. And thus the password should not be set until
    # those files has been copied to the target system
    # This is not a true installation on a running system.  The end user must
    # set a password after installing the data files on the real host system.
    # At this point, there is no end user, so it does not make sense to print
    # this reminder.
    echo "PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !"
    echo "To do so, start the server, then issue the following commands:"
    echo "$bindir/mysqladmin -u root password 'new-password'"
+8 −3
Original line number Diff line number Diff line
@@ -2,6 +2,12 @@
-- The inital data for system tables of MySQL Server
--

-- When setting up a "cross bootstrap" database (e.g., creating data on a Unix
-- host which will later be included in a Windows zip file), any lines
-- containing "@current_hostname" are filtered out by mysql_install_db.
set @current_hostname= @@hostname;


-- Fill "db" table with default grants for anyone to
-- access database 'test' and 'test_%' if "db" table didn't exist
CREATE TEMPORARY TABLE tmp_db LIKE db;
@@ -15,10 +21,9 @@ DROP TABLE tmp_db;
-- from local machine if "users" table didn't exist before
CREATE TEMPORARY TABLE tmp_user LIKE user;
INSERT INTO tmp_user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
set @hostname= @@hostname;
REPLACE INTO tmp_user VALUES (@hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
REPLACE INTO tmp_user VALUES (@current_hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
REPLACE INTO tmp_user VALUES ('127.0.0.1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
INSERT INTO tmp_user (host,user) VALUES ('localhost','');
INSERT INTO tmp_user (host,user) VALUES (@@hostname,'');
INSERT INTO tmp_user (host,user) VALUES (@current_hostname,'');
INSERT INTO user SELECT * FROM tmp_user WHERE @had_user_table=0;
DROP TABLE tmp_user;