From 8ef50277fc5530f60a910badd8d46478f6fd160e Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Jan 2007 17:51:21 +0100 Subject: [PATCH 1/2] For Linux systems running RHEL 4 (which includes SE-Linux), we need to provide additional files that specify some actions which are allowed to the MySQL binaries. Create a new subdirectory "supportfiles/RHEL4-SElinux" for them, and process it. This fixes bug#12676. configure.in: New "support-files/RHEL4-SElinux/Makefile.am" must be processed by "automake" etc. support-files/Makefile.am: For Linux systems running RHEL 4 (which includes SE-Linux), we need to provide additional files that specify some actions which are allowed to the MySQL binaries. Create a new subdirectory "supportfiles/RHEL4-SElinux" for them, and process it. support-files/RHEL4-SElinux/Makefile.am: BitKeeper file /MySQL/M50/bug12676-5.0/support-files/RHEL4-SElinux/Makefile.am support-files/RHEL4-SElinux/mysql.fc: BitKeeper file /MySQL/M50/bug12676-5.0/support-files/RHEL4-SElinux/mysql.fc support-files/RHEL4-SElinux/mysql.te: BitKeeper file /MySQL/M50/bug12676-5.0/support-files/RHEL4-SElinux/mysql.te --- configure.in | 3 +- support-files/Makefile.am | 4 +- support-files/RHEL4-SElinux/Makefile.am | 23 +++++ support-files/RHEL4-SElinux/mysql.fc | 25 +++++ support-files/RHEL4-SElinux/mysql.te | 132 ++++++++++++++++++++++++ 5 files changed, 184 insertions(+), 3 deletions(-) create mode 100644 support-files/RHEL4-SElinux/Makefile.am create mode 100644 support-files/RHEL4-SElinux/mysql.fc create mode 100644 support-files/RHEL4-SElinux/mysql.te diff --git a/configure.in b/configure.in index e3bb541c9ec..80638e6ae98 100644 --- a/configure.in +++ b/configure.in @@ -2860,7 +2860,8 @@ AC_CONFIG_FILES(Makefile extra/Makefile mysys/Makefile dnl include/Makefile sql-bench/Makefile dnl server-tools/Makefile server-tools/instance-manager/Makefile dnl tests/Makefile Docs/Makefile support-files/Makefile dnl - support-files/MacOSX/Makefile mysql-test/Makefile dnl + support-files/MacOSX/Makefile support-files/RHEL4-SElinux/Makefile dnl + mysql-test/Makefile dnl netware/Makefile dnl include/mysql_version.h dnl cmd-line-utils/Makefile dnl diff --git a/support-files/Makefile.am b/support-files/Makefile.am index da8c25ccb1e..f2533100117 100644 --- a/support-files/Makefile.am +++ b/support-files/Makefile.am @@ -30,13 +30,13 @@ EXTRA_DIST = mysql.spec.sh \ MySQL-shared-compat.spec.sh \ ndb-config-2-node.ini.sh -SUBDIRS = MacOSX +SUBDIRS = MacOSX RHEL4-SElinux pkgdata_DATA = my-small.cnf \ my-medium.cnf \ my-large.cnf \ my-huge.cnf \ - my-innodb-heavy-4G.cnf \ + my-innodb-heavy-4G.cnf \ mysql-log-rotate \ binary-configure \ ndb-config-2-node.ini diff --git a/support-files/RHEL4-SElinux/Makefile.am b/support-files/RHEL4-SElinux/Makefile.am new file mode 100644 index 00000000000..52292136877 --- /dev/null +++ b/support-files/RHEL4-SElinux/Makefile.am @@ -0,0 +1,23 @@ +# Copyright (C) 2000-2001, 2003-2006 MySQL AB +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; version 2 +# of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free +# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +# MA 02111-1307, USA + +## Process this file with automake to create Makefile.in + +EXTRA_DIST = mysql.fc mysql.te + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/support-files/RHEL4-SElinux/mysql.fc b/support-files/RHEL4-SElinux/mysql.fc new file mode 100644 index 00000000000..0db0ccf6e68 --- /dev/null +++ b/support-files/RHEL4-SElinux/mysql.fc @@ -0,0 +1,25 @@ +# MySQL Database Server + +# +# /etc +# +/etc/my\.cnf -- gen_context(system_u:object_r:mysqld_etc_t,s0) +/etc/mysql(/.*)? gen_context(system_u:object_r:mysqld_etc_t,s0) + +# +# /usr +# Red Hat compatibility +/usr/libexec/mysqld -- gen_context(system_u:object_r:mysqld_exec_t,s0) + +# MySQL AB compatibility +/usr/sbin/mysqld(-max)? -- gen_context(system_u:object_r:mysqld_exec_t,s0) + +# +# /var +# +/var/lib/mysql(/.*)? gen_context(system_u:object_r:mysqld_db_t,s0) +/var/lib/mysql/mysql\.sock -s gen_context(system_u:object_r:mysqld_var_run_t,s0) + +/var/log/mysql.* -- gen_context(system_u:object_r:mysqld_log_t,s0) + +/var/run/mysqld(/.*)? gen_context(system_u:object_r:mysqld_var_run_t,s0) diff --git a/support-files/RHEL4-SElinux/mysql.te b/support-files/RHEL4-SElinux/mysql.te new file mode 100644 index 00000000000..b050fa7b1a6 --- /dev/null +++ b/support-files/RHEL4-SElinux/mysql.te @@ -0,0 +1,132 @@ + +policy_module(mysql,1.0.0) + +######################################## +# +# Declarations +# + +type mysqld_t; +type mysqld_exec_t; +init_daemon_domain(mysqld_t,mysqld_exec_t) + +type mysqld_var_run_t; +files_pid_file(mysqld_var_run_t) + +type mysqld_db_t; +files_type(mysqld_db_t) + +type mysqld_etc_t alias etc_mysqld_t; +files_config_file(mysqld_etc_t) + +type mysqld_log_t; +logging_log_file(mysqld_log_t) + +type mysqld_tmp_t; +files_tmp_file(mysqld_tmp_t) + +######################################## +# +# Local policy +# + +allow mysqld_t self:capability { dac_override setgid setuid sys_resource net_bind_service }; +dontaudit mysqld_t self:capability sys_tty_config; +allow mysqld_t self:process { setsched getsched setrlimit signal_perms rlimitinh }; +allow mysqld_t self:fifo_file { read write }; +allow mysqld_t self:unix_stream_socket create_stream_socket_perms; +allow mysqld_t self:tcp_socket create_stream_socket_perms; +allow mysqld_t self:udp_socket create_socket_perms; + +allow mysqld_t mysqld_db_t:dir create_dir_perms; +allow mysqld_t mysqld_db_t:file create_file_perms; +allow mysqld_t mysqld_db_t:lnk_file create_lnk_perms; +files_var_lib_filetrans(mysqld_t,mysqld_db_t,{ dir file }) + +allow mysqld_t mysqld_etc_t:file { getattr read }; +allow mysqld_t mysqld_etc_t:lnk_file { getattr read }; +allow mysqld_t mysqld_etc_t:dir list_dir_perms; + +allow mysqld_t mysqld_log_t:file create_file_perms; +logging_log_filetrans(mysqld_t,mysqld_log_t,file) + +allow mysqld_t mysqld_tmp_t:dir create_dir_perms; +allow mysqld_t mysqld_tmp_t:file create_file_perms; +files_tmp_filetrans(mysqld_t, mysqld_tmp_t, { file dir }) + +allow mysqld_t mysqld_var_run_t:dir rw_dir_perms; +allow mysqld_t mysqld_var_run_t:sock_file create_file_perms; +allow mysqld_t mysqld_var_run_t:file create_file_perms; +files_pid_filetrans(mysqld_t,mysqld_var_run_t,file) + +kernel_read_system_state(mysqld_t) +kernel_read_kernel_sysctls(mysqld_t) + +corenet_non_ipsec_sendrecv(mysqld_t) +corenet_tcp_sendrecv_all_if(mysqld_t) +corenet_udp_sendrecv_all_if(mysqld_t) +corenet_tcp_sendrecv_all_nodes(mysqld_t) +corenet_udp_sendrecv_all_nodes(mysqld_t) +corenet_tcp_sendrecv_all_ports(mysqld_t) +corenet_udp_sendrecv_all_ports(mysqld_t) +corenet_tcp_bind_all_nodes(mysqld_t) +corenet_tcp_bind_mysqld_port(mysqld_t) +corenet_tcp_connect_mysqld_port(mysqld_t) +corenet_sendrecv_mysqld_client_packets(mysqld_t) +corenet_sendrecv_mysqld_server_packets(mysqld_t) + +dev_read_sysfs(mysqld_t) + +fs_getattr_all_fs(mysqld_t) +fs_search_auto_mountpoints(mysqld_t) + +term_dontaudit_use_console(mysqld_t) + +domain_use_interactive_fds(mysqld_t) + +files_getattr_var_lib_dirs(mysqld_t) +files_read_etc_runtime_files(mysqld_t) +files_read_etc_files(mysqld_t) +files_read_usr_files(mysqld_t) +files_search_var_lib(mysqld_t) + +auth_use_nsswitch(mysqld_t) + +init_use_fds(mysqld_t) +init_use_script_ptys(mysqld_t) + +libs_use_ld_so(mysqld_t) +libs_use_shared_libs(mysqld_t) + +logging_send_syslog_msg(mysqld_t) + +miscfiles_read_localization(mysqld_t) + +sysnet_read_config(mysqld_t) + +userdom_dontaudit_use_unpriv_user_fds(mysqld_t) +# for /root/.my.cnf - should not be needed: +userdom_read_sysadm_home_content_files(mysqld_t) + +ifdef(`distro_redhat',` + # because Fedora has the sock_file in the database directory + type_transition mysqld_t mysqld_db_t:sock_file mysqld_var_run_t; +') + +ifdef(`targeted_policy',` + term_dontaudit_use_unallocated_ttys(mysqld_t) + term_dontaudit_use_generic_ptys(mysqld_t) + files_dontaudit_read_root_files(mysqld_t) +') + +optional_policy(` + daemontools_service_domain(mysqld_t, mysqld_exec_t) +') + +optional_policy(` + seutil_sigchld_newrole(mysqld_t) +') + +optional_policy(` + udev_read_db(mysqld_t) +') From 7a71303c900dc0fa8e06428dd406426b88becbad Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 31 Jan 2007 15:25:56 +0100 Subject: [PATCH 2/2] Fix bug#23293 "readline detection broken on NetBSD": Its root cause is a difference between the "readline" and "libedit" (header files) definitions of "rl_completion_entry_function", where the "libedit" one is wrong anyway: This variable is used as a pointer to a function returning "char *", but "libedit" declares it as returning "int" and then adds casts on usage. Change it to "CPFunction *" and get rid of the casts. client/mysql.cc: Fix bug#23293 "readline detection broken on NetBSD": Now that the "libedit" header files declares "rl_completion_entry_function" correctly, it need not be cast on usage, and "no_completion()" can be declared to return "char *". cmd-line-utils/libedit/readline.c: Fix bug#23293 "readline detection broken on NetBSD": Now that the "libedit" header files declares "rl_completion_entry_function" correctly, it need not be cast on usage, and "complet_func()" is a "CPFunction *" as well. cmd-line-utils/libedit/readline/readline.h: Fix bug#23293 "readline detection broken on NetBSD": Declare "rl_completion_entry_function()" to be a "CPFunction *", this avoids casts and brings "libedit" in sync with "readline". --- client/mysql.cc | 6 +++--- cmd-line-utils/libedit/readline.c | 11 +++++------ cmd-line-utils/libedit/readline/readline.h | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index 4e479f3ff70..75dae284b61 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1420,7 +1420,7 @@ static char **new_mysql_completion (const char *text, int start, int end); #if defined(USE_NEW_READLINE_INTERFACE) || defined(USE_LIBEDIT_INTERFACE) char *no_completion(const char*,int) #else -int no_completion() +char *no_completion() #endif { return 0; /* No filename completion */ @@ -1508,10 +1508,10 @@ static void initialize_readline (char *name) setlocale(LC_ALL,""); /* so as libedit use isprint */ #endif rl_attempted_completion_function= (CPPFunction*)&new_mysql_completion; - rl_completion_entry_function= (Function*)&no_completion; + rl_completion_entry_function= &no_completion; #else rl_attempted_completion_function= (CPPFunction*)&new_mysql_completion; - rl_completion_entry_function= (Function*)&no_completion; + rl_completion_entry_function= &no_completion; #endif } diff --git a/cmd-line-utils/libedit/readline.c b/cmd-line-utils/libedit/readline.c index 8c09a6f39d5..004fcf7d183 100644 --- a/cmd-line-utils/libedit/readline.c +++ b/cmd-line-utils/libedit/readline.c @@ -112,7 +112,7 @@ int rl_attempted_completion_over = 0; char *rl_basic_word_break_characters = break_chars; char *rl_completer_word_break_characters = NULL; char *rl_completer_quote_characters = NULL; -Function *rl_completion_entry_function = NULL; +CPFunction *rl_completion_entry_function = NULL; CPPFunction *rl_attempted_completion_function = NULL; Function *rl_pre_input_hook = NULL; Function *rl_startup1_hook = NULL; @@ -1724,7 +1724,7 @@ rl_display_match_list (matches, len, max) static int _rl_complete_internal(int what_to_do) { - Function *complet_func; + CPFunction *complet_func; const LineInfo *li; char *temp, **matches; const char *ctemp; @@ -1737,7 +1737,7 @@ _rl_complete_internal(int what_to_do) complet_func = rl_completion_entry_function; if (!complet_func) - complet_func = (Function *)(void *)filename_completion_function; + complet_func = filename_completion_function; /* We now look backwards for the start of a filename/variable word */ li = el_line(e); @@ -1764,7 +1764,7 @@ _rl_complete_internal(int what_to_do) } else matches = 0; if (!rl_attempted_completion_function || !matches) - matches = completion_matches(temp, (CPFunction *)complet_func); + matches = completion_matches(temp, complet_func); if (matches) { int i, retval = CC_REFRESH; @@ -1789,8 +1789,7 @@ _rl_complete_internal(int what_to_do) * object is a directory. */ size_t alen = strlen(matches[0]); - if ((complet_func != - (Function *)filename_completion_function + if ((complet_func != filename_completion_function || (alen > 0 && (matches[0])[alen - 1] != '/')) && rl_completion_append_character) { char buf[2]; diff --git a/cmd-line-utils/libedit/readline/readline.h b/cmd-line-utils/libedit/readline/readline.h index c43f71fb51d..6b1fa186512 100644 --- a/cmd-line-utils/libedit/readline/readline.h +++ b/cmd-line-utils/libedit/readline/readline.h @@ -102,7 +102,7 @@ extern int max_input_history; extern char *rl_basic_word_break_characters; extern char *rl_completer_word_break_characters; extern char *rl_completer_quote_characters; -extern Function *rl_completion_entry_function; +extern CPFunction *rl_completion_entry_function; extern CPPFunction *rl_attempted_completion_function; extern int rl_completion_type; extern int rl_completion_query_items;