mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Merge neptunus.(none):/home/msvensson/mysql/mysql-5.1
into neptunus.(none):/home/msvensson/mysql/mysql-5.1-maint BitKeeper/etc/collapsed: auto-union BitKeeper/etc/ignore: auto-union Makefile.am: Auto merged client/mysql.cc: Auto merged client/mysqltest.c: Auto merged configure.in: Auto merged extra/yassl/taocrypt/include/algebra.hpp: Auto merged include/Makefile.am: Auto merged include/my_sys.h: Auto merged mysql-test/lib/mtr_io.pl: Auto merged mysql-test/lib/mtr_process.pl: Auto merged mysql-test/mysql-test-run.pl: Auto merged mysql-test/r/information_schema.result: Auto merged mysql-test/r/parser.result: Auto merged mysql-test/r/ps.result: Auto merged mysql-test/r/view_grant.result: Auto merged mysql-test/t/information_schema.test: Auto merged mysql-test/t/parser.test: Auto merged mysql-test/t/ps.test: Auto merged mysql-test/t/sp.test: Auto merged mysql-test/t/system_mysql_db_fix30020.test: Auto merged mysql-test/t/udf.test: Auto merged mysql-test/t/view_grant.test: Auto merged scripts/mysql_fix_privilege_tables.sql: Auto merged sql/ha_ndbcluster.cc: Auto merged sql/handler.cc: Auto merged sql/item.cc: Auto merged sql/item_create.cc: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/item_timefunc.cc: Auto merged sql/mysql_priv.h: Auto merged sql/mysqld.cc: Auto merged sql/sp.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_handler.cc: Auto merged sql/sql_lex.cc: Auto merged sql/sql_lex.h: Auto merged sql/sql_parse.cc: Auto merged sql/sql_table.cc: Auto merged sql-common/my_time.c: Auto merged sql/sql_yacc.yy: Auto merged storage/myisam/myisampack.c: Auto merged mysql-test/r/sp.result: Manual merge mysql-test/r/udf.result: Manual merge mysql-test/t/events_bugs.test: Manual merge sql/share/errmsg.txt: Manual merge support-files/mysql.spec.sh: Manual merge
This commit is contained in:
commit
dea988a048
210 changed files with 4463 additions and 1242 deletions
|
@ -384,6 +384,7 @@ client/sql_string.cpp
|
|||
client/ssl_test
|
||||
client/thimble
|
||||
client/thread_test
|
||||
client/tmp.diff
|
||||
client_debug/*
|
||||
client_release/*
|
||||
client_test
|
||||
|
@ -1330,10 +1331,12 @@ mysql-test/r/slave-running.eval
|
|||
mysql-test/r/slave-stopped.eval
|
||||
mysql-test/r/symlink.log
|
||||
mysql-test/r/system_mysql_db.log
|
||||
mysql-test/r/tmp.result
|
||||
mysql-test/r/udf.log
|
||||
mysql-test/share/mysql
|
||||
mysql-test/std_data/*.pem
|
||||
mysql-test/t/index_merge.load
|
||||
mysql-test/t/tmp.test
|
||||
mysql-test/var
|
||||
mysql-test/var/*
|
||||
mysql.kdevprj
|
||||
|
|
|
@ -16,7 +16,17 @@
|
|||
45214a07hVsIGwvwa-WrO-jpeaSwVw
|
||||
452a92d0-31-8wSzSfZi165fcGcXPA
|
||||
454a7ef8gdvE_ddMlJyghvOAkKPNOQ
|
||||
454bb488ijVLOUK_GFjcoISE0GxPUA
|
||||
454bb9a8AwlGRC_wWLS2sNMoRBMRGw
|
||||
454c946ciQoR4dfTBZ0RTBmGJKp6lw
|
||||
454f6e7eAnfLD9OCbGr5X9KiKvfKcQ
|
||||
454f704bJiJy0_Nx2drY9P5kK3uOzg
|
||||
454f8960jsVT_kMKJtZ9OCgXoba0xQ
|
||||
454fa71cxshxszXJQYa9jbo0-_hAHw
|
||||
4550b0ceIcozdgQhWFUTAtWkN196lA
|
||||
4554a95d7txO1DuO9G3nAizI3SkFAA
|
||||
4554b3722d71SbPiI2Gx-RhbZjmuIQ
|
||||
4558b3d73Cxjlb7Wv1oytdSTthxDfw
|
||||
4561b2ecZbhuAc0TTDdCdultxUYaMw
|
||||
4561bde4qWhz1I8tkItXKex5uniipA
|
||||
4562ba016dYH0JzszOqZ8p6psbKfnQ
|
||||
|
|
|
@ -65,8 +65,8 @@ TARGET_LINK_LIBRARIES(mysqldump mysqlclient mysys dbug yassl taocrypt zlib wsock
|
|||
ADD_EXECUTABLE(mysqlimport mysqlimport.c)
|
||||
TARGET_LINK_LIBRARIES(mysqlimport mysqlclient mysys dbug yassl taocrypt zlib wsock32)
|
||||
|
||||
ADD_EXECUTABLE(mysql_upgrade mysql_upgrade.c)
|
||||
TARGET_LINK_LIBRARIES(mysql_upgrade mysqlclient mysys dbug yassl taocrypt zlib wsock32)
|
||||
ADD_EXECUTABLE(mysql_upgrade mysql_upgrade.c ../mysys/my_getpagesize.c)
|
||||
TARGET_LINK_LIBRARIES(mysql_upgrade mysqlclient dbug yassl taocrypt zlib wsock32)
|
||||
|
||||
ADD_EXECUTABLE(mysqlshow mysqlshow.c)
|
||||
TARGET_LINK_LIBRARIES(mysqlshow mysqlclient mysys dbug yassl taocrypt zlib wsock32)
|
||||
|
|
|
@ -1,84 +1,102 @@
|
|||
# Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
#
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
#
|
||||
# This program 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 General Public License for more details.
|
||||
#
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
# This file is public domain and comes with NO WARRANTY of any kind
|
||||
|
||||
if HAVE_YASSL
|
||||
yassl_dummy_link_fix= $(top_srcdir)/extra/yassl/src/dummy.cpp
|
||||
else
|
||||
yassl_dummy_link_fix=
|
||||
endif
|
||||
|
||||
if THREAD_SAFE_CLIENT
|
||||
LIBMYSQLCLIENT_LA = $(top_builddir)/libmysql_r/libmysqlclient_r.la
|
||||
else
|
||||
LIBMYSQLCLIENT_LA = $(top_builddir)/libmysql/libmysqlclient.la
|
||||
endif
|
||||
|
||||
#AUTOMAKE_OPTIONS = nostdinc
|
||||
INCLUDES = -I$(top_builddir)/include \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/regex \
|
||||
$(openssl_includes)
|
||||
|
||||
LIBS = @CLIENT_LIBS@
|
||||
|
||||
LDADD= @CLIENT_EXTRA_LDFLAGS@ $(CLIENT_THREAD_LIBS) \
|
||||
$(top_builddir)/libmysql/libmysqlclient.la
|
||||
bin_PROGRAMS = mysql mysqladmin mysqlcheck mysqlshow \
|
||||
mysqldump mysqlimport mysqltest mysqlbinlog \
|
||||
mysqlslap mysql_upgrade
|
||||
|
||||
noinst_HEADERS = sql_string.h completion_hash.h my_readline.h \
|
||||
client_priv.h
|
||||
mysql_SOURCES = mysql.cc readline.cc sql_string.cc completion_hash.cc
|
||||
|
||||
EXTRA_DIST = get_password.c CMakeLists.txt
|
||||
|
||||
bin_PROGRAMS = mysql \
|
||||
mysqladmin \
|
||||
mysqlbinlog \
|
||||
mysqlcheck \
|
||||
mysqldump \
|
||||
mysqlimport \
|
||||
mysqlshow \
|
||||
mysqlslap \
|
||||
mysqltest \
|
||||
mysql_upgrade
|
||||
|
||||
mysql_SOURCES = mysql.cc readline.cc sql_string.cc \
|
||||
completion_hash.cc
|
||||
mysql_LDADD = @readline_link@ @TERMCAP_LIB@ \
|
||||
$(LDADD) $(CXXLDFLAGS)
|
||||
mysqladmin_SOURCES = mysqladmin.cc
|
||||
mysql_LDADD = @readline_link@ @TERMCAP_LIB@ $(LDADD) $(CXXLDFLAGS)
|
||||
mysqltest_SOURCES= mysqltest.c $(top_srcdir)/mysys/my_getsystime.c \
|
||||
$(yassl_dummy_link_fix)
|
||||
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD) \
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
mysqlbinlog_SOURCES = mysqlbinlog.cc $(top_srcdir)/mysys/mf_tempdir.c \
|
||||
|
||||
mysqlbinlog_SOURCES = mysqlbinlog.cc \
|
||||
$(top_srcdir)/mysys/mf_tempdir.c \
|
||||
$(top_srcdir)/mysys/my_new.cc \
|
||||
$(top_srcdir)/mysys/my_bit.c \
|
||||
$(top_srcdir)/mysys/my_bitmap.c \
|
||||
$(top_srcdir)/mysys/my_vle.c \
|
||||
$(top_srcdir)/mysys/base64.c
|
||||
mysqlbinlog_LDADD = $(LDADD) $(CXXLDFLAGS)
|
||||
mysqlslap_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \
|
||||
@CLIENT_EXTRA_LDFLAGS@ \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
|
||||
mysqldump_SOURCES= mysqldump.c \
|
||||
my_user.c \
|
||||
$(top_srcdir)/mysys/mf_getdate.c
|
||||
|
||||
mysqlimport_SOURCES= mysqlimport.c
|
||||
|
||||
mysqlimport_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \
|
||||
@CLIENT_EXTRA_LDFLAGS@ \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
mysqlcheck_SOURCES= mysqlcheck.c $(yassl_dummy_link_fix)
|
||||
mysqlshow_SOURCES= mysqlshow.c $(yassl_dummy_link_fix)
|
||||
mysqlslap_SOURCES= mysqlslap.c $(yassl_dummy_link_fix)
|
||||
mysqldump_SOURCES= mysqldump.c my_user.c \
|
||||
$(top_srcdir)/mysys/mf_getdate.c \
|
||||
$(yassl_dummy_link_fix)
|
||||
mysqlimport_SOURCES= mysqlimport.c $(yassl_dummy_link_fix)
|
||||
mysql_upgrade_SOURCES= mysql_upgrade.c $(yassl_dummy_link_fix)
|
||||
sql_src=log_event.h mysql_priv.h log_event.cc my_decimal.h my_decimal.cc
|
||||
strings_src=decimal.c
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
|
||||
mysqlshow_SOURCES= mysqlshow.c
|
||||
|
||||
mysqlslap_SOURCES= mysqlslap.c
|
||||
mysqlslap_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \
|
||||
@CLIENT_EXTRA_LDFLAGS@ \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
|
||||
mysqltest_SOURCES= mysqltest.c \
|
||||
$(top_srcdir)/mysys/my_getsystime.c \
|
||||
$(top_srcdir)/mysys/my_copy.c
|
||||
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD)
|
||||
|
||||
mysql_upgrade_SOURCES= mysql_upgrade.c \
|
||||
$(top_srcdir)/mysys/my_getpagesize.c
|
||||
|
||||
# Fix for mit-threads
|
||||
DEFS = -DUNDEF_THREADS_HACK \
|
||||
-DDEFAULT_MYSQL_HOME="\"$(prefix)\"" \
|
||||
-DDATADIR="\"$(localstatedir)\""
|
||||
EXTRA_DIST = get_password.c CMakeLists.txt
|
||||
-DDATADIR="\"$(localstatedir)\""
|
||||
|
||||
sql_src=log_event.h mysql_priv.h log_event.cc my_decimal.h my_decimal.cc
|
||||
strings_src=decimal.c
|
||||
|
||||
link_sources:
|
||||
for f in $(sql_src) ; do \
|
||||
|
@ -92,6 +110,5 @@ link_sources:
|
|||
rm -f $(srcdir)/my_user.c; \
|
||||
@LN_CP_F@ $(top_srcdir)/sql-common/my_user.c my_user.c;
|
||||
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -829,10 +829,23 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
default_charset_used= 1;
|
||||
break;
|
||||
case OPT_DELIMITER:
|
||||
if (argument == disabled_my_option)
|
||||
if (argument == disabled_my_option)
|
||||
{
|
||||
strmov(delimiter, DEFAULT_DELIMITER);
|
||||
else
|
||||
strmake(delimiter, argument, sizeof(delimiter) - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check that delimiter does not contain a backslash */
|
||||
if (!strstr(argument, "\\"))
|
||||
{
|
||||
strmake(delimiter, argument, sizeof(delimiter) - 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
put_info("DELIMITER cannot contain a backslash character", INFO_ERROR);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
delimiter_length= (uint)strlen(delimiter);
|
||||
delimiter_str= delimiter;
|
||||
break;
|
||||
|
@ -3032,6 +3045,14 @@ com_delimiter(String *buffer __attribute__((unused)), char *line)
|
|||
INFO_ERROR);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strstr(tmp, "\\"))
|
||||
{
|
||||
put_info("DELIMITER cannot contain a backslash character", INFO_ERROR);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
strmake(delimiter, tmp, sizeof(delimiter) - 1);
|
||||
delimiter_length= (int)strlen(delimiter);
|
||||
delimiter_str= delimiter;
|
||||
|
|
|
@ -31,10 +31,12 @@
|
|||
const char *mysqlcheck_name= "mysqlcheck.exe";
|
||||
const char *mysql_name= "mysql.exe";
|
||||
const char *mysqld_name= "mysqld.exe";
|
||||
#define EXTRA_CLIENT_PATHS "client/release", "client/debug"
|
||||
#else
|
||||
const char *mysqlcheck_name= "mysqlcheck";
|
||||
const char *mysql_name= "mysql";
|
||||
const char *mysqld_name= "mysqld";
|
||||
#define EXTRA_CLIENT_PATHS "client"
|
||||
#endif /*__WIN__*/
|
||||
|
||||
extern TYPELIB sql_protocol_typelib;
|
||||
|
@ -499,8 +501,9 @@ int main(int argc, char **argv)
|
|||
"mysql", NullS))
|
||||
{
|
||||
ret= 1;
|
||||
puts("Can't find data directory. Please restart with"
|
||||
" --datadir=path-to-writable-data-dir");
|
||||
fprintf(stderr,
|
||||
"Can't find data directory. Please restart with"
|
||||
" --datadir=path-to-writable-data-dir");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -543,11 +546,13 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (find_file(mysqlcheck_name, basedir, MYF(0), path, sizeof(path),
|
||||
"bin", NullS))
|
||||
"bin", EXTRA_CLIENT_PATHS, NullS))
|
||||
{
|
||||
ret= 1;
|
||||
printf("Can't find program '%s'\n", mysqlcheck_name);
|
||||
puts("Please restart with --basedir=mysql-install-directory");
|
||||
fprintf(stderr,
|
||||
"Can't find program '%s'\n"
|
||||
"Please restart with --basedir=mysql-install-directory",
|
||||
mysqlcheck_name);
|
||||
goto error;
|
||||
}
|
||||
else
|
||||
|
@ -569,7 +574,7 @@ int main(int argc, char **argv)
|
|||
ret= system(cmdline.str);
|
||||
if (ret)
|
||||
{
|
||||
printf("Error executing '%s'\n", cmdline.str);
|
||||
fprintf(stderr, "Error executing '%s'\n", cmdline.str);
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
@ -580,12 +585,13 @@ int main(int argc, char **argv)
|
|||
|
||||
fix_priv_tables:
|
||||
if (find_file(mysql_name, basedir, MYF(0), path, sizeof(path),
|
||||
"bin", NullS))
|
||||
"bin", EXTRA_CLIENT_PATHS, NullS))
|
||||
{
|
||||
ret= 1;
|
||||
puts("Could not find MySQL command-line client (mysql).\n"
|
||||
"Please use --basedir to specify the directory"
|
||||
" where MySQL is installed.");
|
||||
fprintf(stderr,
|
||||
"Could not find MySQL command-line client (mysql).\n"
|
||||
"Please use --basedir to specify the directory"
|
||||
" where MySQL is installed.");
|
||||
goto error;
|
||||
}
|
||||
else
|
||||
|
@ -593,16 +599,17 @@ fix_priv_tables:
|
|||
|
||||
if (find_file(MYSQL_FIX_PRIV_TABLES_NAME, basedir, MYF(0),
|
||||
path, sizeof(path),
|
||||
"support_files", "share/mysql", "scripts",
|
||||
"support_files", "share", "share/mysql", "scripts",
|
||||
NullS)
|
||||
&& find_file(MYSQL_FIX_PRIV_TABLES_NAME, "/usr/local/mysql", MYF(0),
|
||||
path, sizeof(path),
|
||||
"share/mysql", NullS))
|
||||
{
|
||||
ret= 1;
|
||||
puts("Could not find file " MYSQL_FIX_PRIV_TABLES_NAME "\n"
|
||||
"Please use --basedir to specify the directory"
|
||||
" where MySQL is installed");
|
||||
fprintf(stderr,
|
||||
"Could not find file " MYSQL_FIX_PRIV_TABLES_NAME "\n"
|
||||
"Please use --basedir to specify the directory"
|
||||
" where MySQL is installed");
|
||||
goto error;
|
||||
}
|
||||
else
|
||||
|
@ -623,7 +630,7 @@ fix_priv_tables:
|
|||
|
||||
ret= system(cmdline.str);
|
||||
if (ret)
|
||||
printf("Error executing '%s'\n", cmdline.str);
|
||||
fprintf(stderr, "Error executing '%s'\n", cmdline.str);
|
||||
|
||||
error:
|
||||
dynstr_free(&cmdline);
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
Holyfoot
|
||||
*/
|
||||
|
||||
#define MTEST_VERSION "3.0"
|
||||
#define MTEST_VERSION "3.1"
|
||||
|
||||
#include <my_global.h>
|
||||
#include <mysql_embed.h>
|
||||
|
@ -275,6 +275,7 @@ enum enum_commands {
|
|||
Q_DISABLE_PARSING, Q_ENABLE_PARSING,
|
||||
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
|
||||
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT,
|
||||
Q_CHMOD_FILE,
|
||||
|
||||
Q_UNKNOWN, /* Unknown command. */
|
||||
Q_COMMENT, /* Comments, ignored. */
|
||||
|
@ -357,6 +358,7 @@ const char *command_names[]=
|
|||
"die",
|
||||
/* Don't execute any more commands, compare result */
|
||||
"exit",
|
||||
"chmod",
|
||||
0
|
||||
};
|
||||
|
||||
|
@ -1811,6 +1813,46 @@ void do_copy_file(struct st_command *command)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_chmod_file
|
||||
command command handle
|
||||
|
||||
DESCRIPTION
|
||||
chmod <octal> <file>
|
||||
Change file permission of <file>
|
||||
|
||||
*/
|
||||
|
||||
void do_chmod_file(struct st_command *command)
|
||||
{
|
||||
ulong mode= 0;
|
||||
static DYNAMIC_STRING ds_mode;
|
||||
static DYNAMIC_STRING ds_file;
|
||||
const struct command_arg chmod_file_args[] = {
|
||||
"mode", ARG_STRING, TRUE, &ds_mode, "Mode of file",
|
||||
"file", ARG_STRING, TRUE, &ds_file, "Filename of file to modify"
|
||||
};
|
||||
DBUG_ENTER("do_chmod_file");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
chmod_file_args,
|
||||
sizeof(chmod_file_args)/sizeof(struct command_arg),
|
||||
' ');
|
||||
|
||||
/* Parse what mode to set */
|
||||
if (ds_mode.length != 4 ||
|
||||
str2int(ds_mode.str, 8, 0, INT_MAX, &mode) == NullS)
|
||||
die("You must write a 4 digit octal number for mode");
|
||||
|
||||
DBUG_PRINT("info", ("chmod %o %s", (uint)mode, ds_file.str));
|
||||
handle_command_error(command, chmod(ds_file.str, mode));
|
||||
dynstr_free(&ds_mode);
|
||||
dynstr_free(&ds_file);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_file_exists
|
||||
|
@ -4204,8 +4246,9 @@ void init_win_path_patterns()
|
|||
/* List of string patterns to match in order to find paths */
|
||||
const char* paths[] = { "$MYSQL_TEST_DIR",
|
||||
"$MYSQL_TMP_DIR",
|
||||
"./test/", 0 };
|
||||
int num_paths= 3;
|
||||
"$MYSQLTEST_VARDIR",
|
||||
"./test/" };
|
||||
int num_paths= sizeof(paths)/sizeof(char*);
|
||||
int i;
|
||||
char* p;
|
||||
|
||||
|
@ -4225,6 +4268,13 @@ void init_win_path_patterns()
|
|||
else
|
||||
p= my_strdup(paths[i], MYF(MY_FAE));
|
||||
|
||||
/* Don't insert zero length strings in patterns array */
|
||||
if (strlen(p) == 0)
|
||||
{
|
||||
my_free(p, MYF(0));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (insert_dynamic(&patterns, (gptr) &p))
|
||||
die(NullS);
|
||||
|
||||
|
@ -4274,7 +4324,7 @@ void fix_win_paths(const char *val, int len)
|
|||
{
|
||||
const char** pattern= dynamic_element(&patterns, i, const char**);
|
||||
DBUG_PRINT("info", ("pattern: %s", *pattern));
|
||||
if (strlen(*pattern) == 0) continue;
|
||||
|
||||
/* Search for the path in string */
|
||||
while ((p= strstr(val, *pattern)))
|
||||
{
|
||||
|
@ -5695,6 +5745,7 @@ int main(int argc, char **argv)
|
|||
case Q_FILE_EXIST: do_file_exist(command); break;
|
||||
case Q_WRITE_FILE: do_write_file(command); break;
|
||||
case Q_COPY_FILE: do_copy_file(command); break;
|
||||
case Q_CHMOD_FILE: do_chmod_file(command); break;
|
||||
case Q_PERL: do_perl(command); break;
|
||||
case Q_DELIMITER:
|
||||
do_delimiter(command);
|
||||
|
@ -6527,7 +6578,7 @@ int reg_replace(char** buf_p, int* buf_len_p, char *pattern,
|
|||
{
|
||||
my_regex_t r;
|
||||
my_regmatch_t *subs;
|
||||
char *buf_end, *replace_end;
|
||||
char *replace_end;
|
||||
char *buf= *buf_p;
|
||||
int len;
|
||||
int buf_len, need_buf_len;
|
||||
|
@ -6547,8 +6598,6 @@ int reg_replace(char** buf_p, int* buf_len_p, char *pattern,
|
|||
|
||||
SECURE_REG_BUF
|
||||
|
||||
buf_end= buf + buf_len;
|
||||
|
||||
if (icase)
|
||||
cflags|= REG_ICASE;
|
||||
|
||||
|
|
|
@ -51,7 +51,8 @@ char *batch_readline(LINE_BUFFER *line_buff)
|
|||
if (!(pos=intern_read_line(line_buff,&out_length)))
|
||||
return 0;
|
||||
if (out_length && pos[out_length-1] == '\n')
|
||||
out_length--; /* Remove '\n' */
|
||||
if (--out_length && pos[out_length-1] == '\r') /* Remove '\n' */
|
||||
out_length--; /* Remove '\r' */
|
||||
line_buff->read_length=out_length;
|
||||
pos[out_length]=0;
|
||||
return pos;
|
||||
|
|
16
configure.in
16
configure.in
|
@ -1955,7 +1955,7 @@ fi
|
|||
|
||||
# Check definition of gethostbyname_r (glibc2.0.100 is different from Solaris)
|
||||
ac_save_CXXFLAGS="$CXXFLAGS"
|
||||
AC_CACHE_CHECK([style of gethostname_r routines], mysql_cv_gethostname_style,
|
||||
AC_CACHE_CHECK([style of gethostbyname_r routines], mysql_cv_gethostbyname_style,
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
if test "$ac_cv_prog_gxx" = "yes" -a "$with_other_libc" = "no"
|
||||
|
@ -1977,10 +1977,10 @@ AC_TRY_COMPILE(
|
|||
|
||||
skr = gethostbyname_r((const char *) 0,
|
||||
(struct hostent*) 0, (char*) 0, 0, (struct hostent **) 0, &skr);],
|
||||
mysql_cv_gethostname_style=glibc2, mysql_cv_gethostname_style=other))
|
||||
mysql_cv_gethostbyname_style=glibc2, mysql_cv_gethostbyname_style=other))
|
||||
AC_LANG_RESTORE
|
||||
CXXFLAGS="$ac_save_CXXFLAGS"
|
||||
if test "$mysql_cv_gethostname_style" = "glibc2"
|
||||
if test "$mysql_cv_gethostbyname_style" = "glibc2"
|
||||
then
|
||||
AC_DEFINE([HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE], [1],
|
||||
[Solaris define gethostbyname_r with 5 arguments. glibc2 defines this with 6 arguments])
|
||||
|
@ -1988,7 +1988,7 @@ fi
|
|||
|
||||
# Check 3rd argument of getthostbyname_r
|
||||
ac_save_CXXFLAGS="$CXXFLAGS"
|
||||
AC_CACHE_CHECK([3 argument to gethostname_r routines], mysql_cv_gethostname_arg,
|
||||
AC_CACHE_CHECK([3 argument to gethostbyname_r routines], mysql_cv_gethostbyname_arg,
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
if test "$ac_cv_prog_gxx" = "yes" -a "$with_other_libc" = "no"
|
||||
|
@ -2009,13 +2009,13 @@ AC_TRY_COMPILE(
|
|||
[int skr;
|
||||
|
||||
skr = gethostbyname_r((const char *) 0, (struct hostent*) 0, (struct hostent_data*) 0);],
|
||||
mysql_cv_gethostname_arg=hostent_data, mysql_cv_gethostname_arg=char))
|
||||
mysql_cv_gethostbyname_arg=hostent_data, mysql_cv_gethostbyname_arg=char))
|
||||
AC_LANG_RESTORE
|
||||
CXXFLAGS="$ac_save_CXXFLAGS"
|
||||
if test "$mysql_cv_gethostname_arg" = "hostent_data"
|
||||
if test "$mysql_cv_gethostbyname_arg" = "hostent_data"
|
||||
then
|
||||
AC_DEFINE([HAVE_GETHOSTBYNAME_R_RETURN_INT], [1],
|
||||
[In OSF 4.0f the 3'd argument to gethostname_r is hostent_data *])
|
||||
[In OSF 4.0f the 3'd argument to gethostbyname_r is hostent_data *])
|
||||
fi
|
||||
|
||||
|
||||
|
@ -2425,7 +2425,7 @@ then
|
|||
sql_client_dirs="libmysql_r $sql_client_dirs"
|
||||
linked_client_targets="$linked_client_targets linked_libmysql_r_sources"
|
||||
AC_CONFIG_FILES(libmysql_r/Makefile)
|
||||
AC_DEFINE([THREAD_SAFE_CLIENT], [1], [Should be client be thread safe])
|
||||
AC_DEFINE([THREAD_SAFE_CLIENT], [1], [Should the client be thread safe])
|
||||
fi
|
||||
|
||||
CLIENT_LIBS="$NON_THREADED_LIBS $openssl_libs $ZLIB_LIBS $STATIC_NSS_FLAGS"
|
||||
|
|
|
@ -1,4 +1,56 @@
|
|||
yaSSL Release notes, version 1.4.0 (08/13/06)
|
||||
yaSSL Release notes, version 1.5.0 (11/09/06)
|
||||
|
||||
This release of yaSSL contains bug fixes, portability enhancements,
|
||||
and full TLS 1.1 support. Use the functions:
|
||||
|
||||
SSL_METHOD *TLSv1_1_server_method(void);
|
||||
SSL_METHOD *TLSv1_1_client_method(void);
|
||||
|
||||
or the SSLv23 versions (even though yaSSL doesn't support SSL 2.0 the v23
|
||||
means to pick the highest of SSL 3.0, TLS 1.0, or TLS 1.1.
|
||||
|
||||
|
||||
See normal build instructions below under 1.0.6.
|
||||
See libcurl build instructions below under 1.3.0.
|
||||
|
||||
|
||||
|
||||
****************yaSSL Release notes, version 1.4.5 (10/15/06)
|
||||
|
||||
|
||||
This release of yaSSL contains bug fixes, portability enhancements,
|
||||
zlib compression support, removal of assembly instructions at runtime if
|
||||
not supported, and initial TLS 1.1 support.
|
||||
|
||||
|
||||
Compression Notes: yaSSL uses zlib for compression and the compression
|
||||
should only be used if yaSSL is at both ends because the implementation
|
||||
details aren't yet standard. If you'd like to turn compression on use
|
||||
the SSL_set_compression() function on the client before calling
|
||||
SSL_connect(). If both the client and server were built with zlib support
|
||||
then the connection will use compression. If the client isn't built with
|
||||
support then SSL_set_compression() will return an error (-1).
|
||||
|
||||
To build yaSSL with zlib support on Unix simply have zlib support on your
|
||||
system and configure will find it if it's in the standard locations. If
|
||||
it's somewhere else use the option ./configure --with-zlib=DIR. If you'd
|
||||
like to disable compression support in yaSSL use ./configure --without-zlib.
|
||||
|
||||
To build yaSSL with zlib support on Windows:
|
||||
|
||||
1) download zlib from http://www.zlib.net/
|
||||
2) follow the instructions in zlib from projects/visualc6/README.txt
|
||||
for how to add the zlib project into the yaSSL workspace noting that
|
||||
you'll need to add configuration support for "Win32 Debug" and
|
||||
"Win32 Release" in note 3 under "To use:".
|
||||
3) define HAVE_LIBZ when building yaSSL
|
||||
|
||||
|
||||
See normal build instructions below under 1.0.6.
|
||||
See libcurl build instructions below under 1.3.0.
|
||||
|
||||
|
||||
********************yaSSL Release notes, version 1.4.0 (08/13/06)
|
||||
|
||||
|
||||
This release of yaSSL contains bug fixes, portability enhancements,
|
||||
|
@ -122,18 +174,6 @@ Choose (Re)Build All from the project workspace
|
|||
run Debug\testsuite.exe from yaSSL-Home\testsuite to test the build
|
||||
|
||||
|
||||
--To enable ia32 assembly for TaoCrypt ciphers and message digests
|
||||
|
||||
On MSVC this is always on
|
||||
|
||||
On GCC **, use ./configure --enable-ia32-asm
|
||||
|
||||
** This isn't on by default because of the use of intel syntax and the
|
||||
problem that olders versions of gas have with some addressing statements.
|
||||
If you enable this and get assemler errors during compilation or can't
|
||||
pass the TaoCrypt tests, please send todd@yassl.com a message and disable
|
||||
this option in the meantime.
|
||||
|
||||
|
||||
***************** yaSSL Release notes, version 1.0.5
|
||||
|
||||
|
|
|
@ -5,6 +5,35 @@
|
|||
//#define TEST_RESUME
|
||||
|
||||
|
||||
void ClientError(SSL_CTX* ctx, SSL* ssl, SOCKET_T& sockfd, const char* msg)
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys(msg);
|
||||
}
|
||||
|
||||
|
||||
#ifdef NON_BLOCKING
|
||||
void NonBlockingSSL_Connect(SSL* ssl, SSL_CTX* ctx, SOCKET_T& sockfd)
|
||||
{
|
||||
int ret = SSL_connect(ssl);
|
||||
while (ret =! SSL_SUCCESS && SSL_get_error(ssl, 0) ==
|
||||
SSL_ERROR_WANT_READ) {
|
||||
printf("... client would block\n");
|
||||
#ifdef _WIN32
|
||||
Sleep(1000);
|
||||
#else
|
||||
sleep(1);
|
||||
#endif
|
||||
ret = SSL_connect(ssl);
|
||||
}
|
||||
if (ret != SSL_SUCCESS)
|
||||
ClientError(ctx, ssl, sockfd, "SSL_connect failed");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void client_test(void* args)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
|
@ -18,6 +47,9 @@ void client_test(void* args)
|
|||
|
||||
set_args(argc, argv, *static_cast<func_args*>(args));
|
||||
tcp_connect(sockfd);
|
||||
#ifdef NON_BLOCKING
|
||||
tcp_set_nonblocking(sockfd);
|
||||
#endif
|
||||
|
||||
SSL_METHOD* method = TLSv1_client_method();
|
||||
SSL_CTX* ctx = SSL_CTX_new(method);
|
||||
|
@ -27,13 +59,13 @@ void client_test(void* args)
|
|||
|
||||
SSL_set_fd(ssl, sockfd);
|
||||
|
||||
|
||||
#ifdef NON_BLOCKING
|
||||
NonBlockingSSL_Connect(ssl, ctx, sockfd);
|
||||
#else
|
||||
if (SSL_connect(ssl) != SSL_SUCCESS)
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys("SSL_connect failed");
|
||||
}
|
||||
ClientError(ctx, ssl, sockfd, "SSL_connect failed");
|
||||
#endif
|
||||
showPeer(ssl);
|
||||
|
||||
const char* cipher = 0;
|
||||
|
@ -49,16 +81,14 @@ void client_test(void* args)
|
|||
|
||||
char msg[] = "hello yassl!";
|
||||
if (SSL_write(ssl, msg, sizeof(msg)) != sizeof(msg))
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys("SSL_write failed");
|
||||
}
|
||||
ClientError(ctx, ssl, sockfd, "SSL_write failed");
|
||||
|
||||
char reply[1024];
|
||||
reply[SSL_read(ssl, reply, sizeof(reply))] = 0;
|
||||
int input = SSL_read(ssl, reply, sizeof(reply));
|
||||
if (input > 0) {
|
||||
reply[input] = 0;
|
||||
printf("Server response: %s\n", reply);
|
||||
}
|
||||
|
||||
#ifdef TEST_RESUME
|
||||
SSL_SESSION* session = SSL_get_session(ssl);
|
||||
|
@ -75,24 +105,17 @@ void client_test(void* args)
|
|||
SSL_set_session(sslResume, session);
|
||||
|
||||
if (SSL_connect(sslResume) != SSL_SUCCESS)
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys("SSL resume failed");
|
||||
}
|
||||
ClientError(ctx, sslResume, sockfd, "SSL_resume failed");
|
||||
showPeer(sslResume);
|
||||
|
||||
if (SSL_write(sslResume, msg, sizeof(msg)) != sizeof(msg))
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys("SSL_write failed");
|
||||
}
|
||||
ClientError(ctx, sslResume, sockfd, "SSL_write failed");
|
||||
|
||||
reply[SSL_read(sslResume, reply, sizeof(reply))] = 0;
|
||||
input = SSL_read(sslResume, reply, sizeof(reply));
|
||||
if (input > 0) {
|
||||
reply[input] = 0;
|
||||
printf("Server response: %s\n", reply);
|
||||
}
|
||||
|
||||
SSL_shutdown(sslResume);
|
||||
SSL_free(sslResume);
|
||||
|
|
|
@ -3,6 +3,15 @@
|
|||
#include "../../testsuite/test.hpp"
|
||||
|
||||
|
||||
void EchoClientError(SSL_CTX* ctx, SSL* ssl, SOCKET_T& sockfd, const char* msg)
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys(msg);
|
||||
}
|
||||
|
||||
|
||||
void echoclient_test(void* args)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
|
@ -35,7 +44,7 @@ void echoclient_test(void* args)
|
|||
|
||||
tcp_connect(sockfd);
|
||||
|
||||
SSL_METHOD* method = TLSv1_client_method();
|
||||
SSL_METHOD* method = SSLv23_client_method();
|
||||
SSL_CTX* ctx = SSL_CTX_new(method);
|
||||
set_certs(ctx);
|
||||
SSL* ssl = SSL_new(ctx);
|
||||
|
@ -43,12 +52,7 @@ void echoclient_test(void* args)
|
|||
SSL_set_fd(ssl, sockfd);
|
||||
|
||||
if (SSL_connect(ssl) != SSL_SUCCESS)
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys("SSL_connect failed");
|
||||
}
|
||||
EchoClientError(ctx, ssl, sockfd, "SSL_connect failed");
|
||||
|
||||
char send[1024];
|
||||
char reply[1024];
|
||||
|
@ -57,12 +61,7 @@ void echoclient_test(void* args)
|
|||
|
||||
int sendSz = strlen(send) + 1;
|
||||
if (SSL_write(ssl, send, sendSz) != sendSz)
|
||||
{
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_free(ssl);
|
||||
tcp_close(sockfd);
|
||||
err_sys("SSL_write failed");
|
||||
}
|
||||
EchoClientError(ctx, ssl, sockfd, "SSL_write failed");
|
||||
|
||||
if (strncmp(send, "quit", 4) == 0) {
|
||||
fputs("sending server shutdown command: quit!\n", fout);
|
||||
|
|
|
@ -56,7 +56,7 @@ THREAD_RETURN YASSL_API echoserver_test(void* args)
|
|||
|
||||
tcp_listen(sockfd);
|
||||
|
||||
SSL_METHOD* method = TLSv1_server_method();
|
||||
SSL_METHOD* method = SSLv23_server_method();
|
||||
SSL_CTX* ctx = SSL_CTX_new(method);
|
||||
|
||||
set_serverCerts(ctx);
|
||||
|
@ -87,8 +87,12 @@ THREAD_RETURN YASSL_API echoserver_test(void* args)
|
|||
|
||||
SSL* ssl = SSL_new(ctx);
|
||||
SSL_set_fd(ssl, clientfd);
|
||||
if (SSL_accept(ssl) != SSL_SUCCESS)
|
||||
EchoError(ctx, ssl, sockfd, clientfd, "SSL_accept failed");
|
||||
if (SSL_accept(ssl) != SSL_SUCCESS) {
|
||||
printf("SSL_accept failed\n");
|
||||
SSL_free(ssl);
|
||||
tcp_close(clientfd);
|
||||
continue;
|
||||
}
|
||||
|
||||
char command[1024];
|
||||
int echoSz(0);
|
||||
|
@ -130,6 +134,7 @@ THREAD_RETURN YASSL_API echoserver_test(void* args)
|
|||
if (SSL_write(ssl, command, echoSz) != echoSz)
|
||||
EchoError(ctx, ssl, sockfd, clientfd, "SSL_write failed");
|
||||
}
|
||||
SSL_shutdown(ssl);
|
||||
SSL_free(ssl);
|
||||
tcp_close(clientfd);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,26 @@ void ServerError(SSL_CTX* ctx, SSL* ssl, SOCKET_T& sockfd, const char* msg)
|
|||
}
|
||||
|
||||
|
||||
#ifdef NON_BLOCKING
|
||||
void NonBlockingSSL_Accept(SSL* ssl, SSL_CTX* ctx, SOCKET_T& clientfd)
|
||||
{
|
||||
int ret = SSL_accept(ssl);
|
||||
while (ret != SSL_SUCCESS && SSL_get_error(ssl, 0) ==
|
||||
SSL_ERROR_WANT_READ) {
|
||||
printf("... server would block\n");
|
||||
#ifdef _WIN32
|
||||
Sleep(1000);
|
||||
#else
|
||||
sleep(1);
|
||||
#endif
|
||||
ret = SSL_accept(ssl);
|
||||
}
|
||||
if (ret != SSL_SUCCESS)
|
||||
ServerError(ctx, ssl, clientfd, "SSL_accept failed");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
THREAD_RETURN YASSL_API server_test(void* args)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
|
@ -33,7 +53,7 @@ THREAD_RETURN YASSL_API server_test(void* args)
|
|||
SSL_METHOD* method = TLSv1_server_method();
|
||||
SSL_CTX* ctx = SSL_CTX_new(method);
|
||||
|
||||
//SSL_CTX_set_cipher_list(ctx, "RC4-SHA");
|
||||
//SSL_CTX_set_cipher_list(ctx, "RC4-SHA:RC4-MD5");
|
||||
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0);
|
||||
set_serverCerts(ctx);
|
||||
DH* dh = set_tmpDH(ctx);
|
||||
|
@ -41,15 +61,22 @@ THREAD_RETURN YASSL_API server_test(void* args)
|
|||
SSL* ssl = SSL_new(ctx);
|
||||
SSL_set_fd(ssl, clientfd);
|
||||
|
||||
#ifdef NON_BLOCKING
|
||||
NonBlockingSSL_Accept(ssl, ctx, clientfd);
|
||||
#else
|
||||
if (SSL_accept(ssl) != SSL_SUCCESS)
|
||||
ServerError(ctx, ssl, clientfd, "SSL_accept failed");
|
||||
#endif
|
||||
|
||||
showPeer(ssl);
|
||||
printf("Using Cipher Suite: %s\n", SSL_get_cipher(ssl));
|
||||
|
||||
char command[1024];
|
||||
command[SSL_read(ssl, command, sizeof(command))] = 0;
|
||||
int input = SSL_read(ssl, command, sizeof(command));
|
||||
if (input > 0) {
|
||||
command[input] = 0;
|
||||
printf("First client command: %s\n", command);
|
||||
}
|
||||
|
||||
char msg[] = "I hear you, fa shizzle!";
|
||||
if (SSL_write(ssl, msg, sizeof(msg)) != sizeof(msg))
|
||||
|
@ -57,6 +84,7 @@ THREAD_RETURN YASSL_API server_test(void* args)
|
|||
|
||||
DH_free(dh);
|
||||
SSL_CTX_free(ctx);
|
||||
SSL_shutdown(ssl);
|
||||
SSL_free(ssl);
|
||||
|
||||
tcp_close(clientfd);
|
||||
|
@ -82,3 +110,4 @@ THREAD_RETURN YASSL_API server_test(void* args)
|
|||
}
|
||||
|
||||
#endif // NO_MAIN_DRIVER
|
||||
|
||||
|
|
|
@ -42,12 +42,7 @@
|
|||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
// VC60 workaround: it doesn't allow typename in some places
|
||||
#if defined(_MSC_VER) && (_MSC_VER < 1300)
|
||||
#define CPP_TYPENAME
|
||||
#else
|
||||
#define CPP_TYPENAME typename
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
namespace yaSSL {
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#define SSL_set_session yaSSL_set_session
|
||||
#define SSL_get_session yaSSL_get_session
|
||||
#define SSL_SESSION_set_timeout yaSSL_SESSION_set_timeout
|
||||
#define SSL_CTX_set_session_cache_mode yaSSL_CTX_set_session_cache_mode
|
||||
#define SSL_get_peer_certificate yaSSL_get_peer_certificate
|
||||
#define SSL_get_verify_result yaSSL_get_verify_result
|
||||
#define SSL_CTX_set_verify yaSSL_CTX_set_verify
|
||||
|
@ -98,6 +99,8 @@
|
|||
#define SSLv3_client_method yaSSLv3_client_method
|
||||
#define TLSv1_server_method yaTLSv1_server_method
|
||||
#define TLSv1_client_method yaTLSv1_client_method
|
||||
#define TLSv1_1_server_method yaTLSv1_1_server_method
|
||||
#define TLSv1_1_client_method yaTLSv1_1_client_method
|
||||
#define SSLv23_server_method yaSSLv23_server_method
|
||||
#define SSL_CTX_use_certificate_file yaSSL_CTX_use_certificate_file
|
||||
#define SSL_CTX_use_PrivateKey_file yaSSL_CTX_use_PrivateKey_file
|
||||
|
@ -159,3 +162,4 @@
|
|||
#define MD5_Init yaMD5_Init
|
||||
#define MD5_Update yaMD5_Update
|
||||
#define MD5_Final yaMD5_Final
|
||||
#define SSL_set_compression yaSSL_set_compression
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
#include "rsa.h"
|
||||
|
||||
|
||||
#define YASSL_VERSION "1.4.3"
|
||||
#define YASSL_VERSION "1.5.0"
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
@ -228,6 +228,7 @@ void SSL_load_error_strings(void);
|
|||
int SSL_set_session(SSL *ssl, SSL_SESSION *session);
|
||||
SSL_SESSION* SSL_get_session(SSL* ssl);
|
||||
long SSL_SESSION_set_timeout(SSL_SESSION*, long);
|
||||
long SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long mode);
|
||||
X509* SSL_get_peer_certificate(SSL*);
|
||||
long SSL_get_verify_result(SSL*);
|
||||
|
||||
|
@ -361,6 +362,8 @@ SSL_METHOD *SSLv3_server_method(void);
|
|||
SSL_METHOD *SSLv3_client_method(void);
|
||||
SSL_METHOD *TLSv1_server_method(void);
|
||||
SSL_METHOD *TLSv1_client_method(void);
|
||||
SSL_METHOD *TLSv1_1_server_method(void);
|
||||
SSL_METHOD *TLSv1_1_client_method(void);
|
||||
SSL_METHOD *SSLv23_server_method(void);
|
||||
|
||||
int SSL_CTX_use_certificate_file(SSL_CTX*, const char*, int);
|
||||
|
@ -531,6 +534,10 @@ void MD5_Final(unsigned char*, MD5_CTX*);
|
|||
#define SSL_DEFAULT_CIPHER_LIST "" /* default all */
|
||||
|
||||
|
||||
/* yaSSL adds */
|
||||
int SSL_set_compression(SSL*); /* turn on yaSSL zlib compression */
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(__cplusplus) && !defined(YASSL_MYSQL_COMPATIBLE)
|
||||
|
|
|
@ -70,8 +70,8 @@ typedef unsigned char byte;
|
|||
// Wraps Windows Sockets and BSD Sockets
|
||||
class Socket {
|
||||
socket_t socket_; // underlying socket descriptor
|
||||
bool wouldBlock_; // for non-blocking data
|
||||
bool blocking_; // is option set
|
||||
bool wouldBlock_; // if non-blocking data, for last read
|
||||
bool nonBlocking_; // is option set
|
||||
public:
|
||||
explicit Socket(socket_t s = INVALID_SOCKET);
|
||||
~Socket();
|
||||
|
@ -85,7 +85,7 @@ public:
|
|||
|
||||
bool wait();
|
||||
bool WouldBlock() const;
|
||||
bool IsBlocking() const;
|
||||
bool IsNonBlocking() const;
|
||||
|
||||
void closeSocket();
|
||||
void shutDown(int how = SD_SEND);
|
||||
|
|
|
@ -56,7 +56,10 @@ enum YasslError {
|
|||
receive_error = 114,
|
||||
certificate_error = 115,
|
||||
privateKey_error = 116,
|
||||
badVersion_error = 117
|
||||
badVersion_error = 117,
|
||||
compress_error = 118,
|
||||
decompress_error = 119,
|
||||
pms_version_error = 120
|
||||
|
||||
// !!!! add error message to .cpp !!!!
|
||||
|
||||
|
|
|
@ -132,7 +132,6 @@ class Data : public Message {
|
|||
public:
|
||||
Data();
|
||||
Data(uint16 len, opaque* b);
|
||||
Data(uint16 len, const opaque* w);
|
||||
|
||||
friend output_buffer& operator<<(output_buffer&, const Data&);
|
||||
|
||||
|
@ -141,9 +140,9 @@ public:
|
|||
|
||||
ContentType get_type() const;
|
||||
uint16 get_length() const;
|
||||
const opaque* get_buffer() const;
|
||||
void set_length(uint16 l);
|
||||
opaque* set_buffer();
|
||||
void SetData(uint16, const opaque*);
|
||||
void Process(input_buffer&, SSL&);
|
||||
private:
|
||||
Data(const Data&); // hide copy
|
||||
|
@ -232,11 +231,11 @@ public:
|
|||
void Process(input_buffer&, SSL&);
|
||||
|
||||
const opaque* get_random() const;
|
||||
friend void buildClientHello(SSL&, ClientHello&, CompressionMethod);
|
||||
friend void buildClientHello(SSL&, ClientHello&);
|
||||
friend void ProcessOldClientHello(input_buffer& input, SSL& ssl);
|
||||
|
||||
ClientHello();
|
||||
explicit ClientHello(ProtocolVersion pv);
|
||||
ClientHello(ProtocolVersion pv, bool useCompression);
|
||||
private:
|
||||
ClientHello(const ClientHello&); // hide copy
|
||||
ClientHello& operator=(const ClientHello&); // and assign
|
||||
|
@ -253,7 +252,7 @@ class ServerHello : public HandShakeBase {
|
|||
opaque cipher_suite_[SUITE_LEN];
|
||||
CompressionMethod compression_method_;
|
||||
public:
|
||||
explicit ServerHello(ProtocolVersion pv);
|
||||
ServerHello(ProtocolVersion pv, bool useCompression);
|
||||
ServerHello();
|
||||
|
||||
friend input_buffer& operator>>(input_buffer&, ServerHello&);
|
||||
|
@ -629,8 +628,11 @@ struct Connection {
|
|||
bool send_server_key_; // server key exchange?
|
||||
bool master_clean_; // master secret clean?
|
||||
bool TLS_; // TLSv1 or greater
|
||||
bool TLSv1_1_; // TLSv1.1 or greater
|
||||
bool sessionID_Set_; // do we have a session
|
||||
ProtocolVersion version_;
|
||||
bool compression_; // zlib compression?
|
||||
ProtocolVersion version_; // negotiated version
|
||||
ProtocolVersion chVersion_; // client hello version
|
||||
RandomPool& random_;
|
||||
|
||||
Connection(ProtocolVersion v, RandomPool& ran);
|
||||
|
@ -640,6 +642,7 @@ struct Connection {
|
|||
void CleanPreMaster();
|
||||
void CleanMaster();
|
||||
void TurnOffTLS();
|
||||
void TurnOffTLS1_1();
|
||||
private:
|
||||
Connection(const Connection&); // hide copy
|
||||
Connection& operator=(const Connection&); // and assign
|
||||
|
|
|
@ -431,6 +431,7 @@ private:
|
|||
DH_Parms dhParms_;
|
||||
pem_password_cb passwordCb_;
|
||||
void* userData_;
|
||||
bool sessionCacheOff_;
|
||||
Stats stats_;
|
||||
Mutex mutex_; // for Stats
|
||||
public:
|
||||
|
@ -445,6 +446,7 @@ public:
|
|||
const Stats& GetStats() const;
|
||||
pem_password_cb GetPasswordCb() const;
|
||||
void* GetUserData() const;
|
||||
bool GetSessionCacheOff() const;
|
||||
|
||||
void setVerifyPeer();
|
||||
void setVerifyNone();
|
||||
|
@ -453,6 +455,7 @@ public:
|
|||
bool SetDH(const DH&);
|
||||
void SetPasswordCb(pem_password_cb cb);
|
||||
void SetUserData(void*);
|
||||
void SetSessionCacheOff();
|
||||
|
||||
void IncrementStats(StatsField);
|
||||
void AddCA(x509* ca);
|
||||
|
@ -600,6 +603,7 @@ public:
|
|||
const Socket& getSocket() const;
|
||||
YasslError GetError() const;
|
||||
bool GetMultiProtocol() const;
|
||||
bool CompressionOn() const;
|
||||
|
||||
Crypto& useCrypto();
|
||||
Security& useSecurity();
|
||||
|
@ -617,9 +621,12 @@ public:
|
|||
void set_preMaster(const opaque*, uint);
|
||||
void set_masterSecret(const opaque*);
|
||||
void SetError(YasslError);
|
||||
int SetCompression();
|
||||
void UnSetCompression();
|
||||
|
||||
// helpers
|
||||
bool isTLS() const;
|
||||
bool isTLSv1_1() const;
|
||||
void order_error();
|
||||
void makeMasterSecret();
|
||||
void makeTLSMasterSecret();
|
||||
|
@ -653,6 +660,10 @@ private:
|
|||
};
|
||||
|
||||
|
||||
// compression
|
||||
int Compress(const byte*, int, input_buffer&);
|
||||
int DeCompress(input_buffer&, int, input_buffer&);
|
||||
|
||||
|
||||
// conversion functions
|
||||
void c32to24(uint32, uint24&);
|
||||
|
|
|
@ -211,6 +211,7 @@ const int FINISHED_LABEL_SZ = 15; // TLS finished lable length
|
|||
const int SEED_LEN = RAN_LEN * 2; // TLS seed, client + server random
|
||||
const int DEFAULT_TIMEOUT = 500; // Default Session timeout in seconds
|
||||
const int MAX_RECORD_SIZE = 16384; // 2^14, max size by standard
|
||||
const int COMPRESS_EXTRA = 1024; // extra compression possible addition
|
||||
|
||||
|
||||
typedef uint8 Cipher; // first byte is always 0x00 for SSLv3 & TLS
|
||||
|
@ -222,7 +223,7 @@ typedef opaque* DistinguishedName;
|
|||
typedef bool IsExportable;
|
||||
|
||||
|
||||
enum CompressionMethod { no_compression = 0 };
|
||||
enum CompressionMethod { no_compression = 0, zlib = 221 };
|
||||
|
||||
enum CipherType { stream, block };
|
||||
|
||||
|
|
|
@ -40,9 +40,11 @@ namespace yaSSL {
|
|||
|
||||
|
||||
// Build a client hello message from cipher suites and compression method
|
||||
void buildClientHello(SSL& ssl, ClientHello& hello,
|
||||
CompressionMethod compression = no_compression)
|
||||
void buildClientHello(SSL& ssl, ClientHello& hello)
|
||||
{
|
||||
// store for pre master secret
|
||||
ssl.useSecurity().use_connection().chVersion_ = hello.client_version_;
|
||||
|
||||
ssl.getCrypto().get_random().Fill(hello.random_, RAN_LEN);
|
||||
if (ssl.getSecurity().get_resuming()) {
|
||||
hello.id_len_ = ID_LEN;
|
||||
|
@ -55,7 +57,6 @@ void buildClientHello(SSL& ssl, ClientHello& hello,
|
|||
memcpy(hello.cipher_suites_, ssl.getSecurity().get_parms().suites_,
|
||||
hello.suite_len_);
|
||||
hello.comp_len_ = 1;
|
||||
hello.compression_methods_ = compression;
|
||||
|
||||
hello.set_length(sizeof(ProtocolVersion) +
|
||||
RAN_LEN +
|
||||
|
@ -83,7 +84,7 @@ void buildServerHello(SSL& ssl, ServerHello& hello)
|
|||
|
||||
hello.cipher_suite_[0] = ssl.getSecurity().get_parms().suite_[0];
|
||||
hello.cipher_suite_[1] = ssl.getSecurity().get_parms().suite_[1];
|
||||
hello.compression_method_ = no_compression;
|
||||
hello.compression_method_ = hello.compression_method_;
|
||||
|
||||
hello.set_length(sizeof(ProtocolVersion) + RAN_LEN + ID_LEN +
|
||||
sizeof(hello.id_len_) + SUITE_LEN + SIZEOF_ENUM);
|
||||
|
@ -151,12 +152,18 @@ void buildHeaders(SSL& ssl, HandShakeHeader& hsHeader,
|
|||
|
||||
|
||||
// add handshake from buffer into md5 and sha hashes, exclude record header
|
||||
void hashHandShake(SSL& ssl, const output_buffer& output)
|
||||
void hashHandShake(SSL& ssl, const output_buffer& output, bool removeIV = false)
|
||||
{
|
||||
uint sz = output.get_size() - RECORD_HEADER;
|
||||
|
||||
const opaque* buffer = output.get_buffer() + RECORD_HEADER;
|
||||
|
||||
if (removeIV) { // TLSv1_1 IV
|
||||
uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
sz -= blockSz;
|
||||
buffer += blockSz;
|
||||
}
|
||||
|
||||
ssl.useHashes().use_MD5().update(buffer, sz);
|
||||
ssl.useHashes().use_SHA().update(buffer, sz);
|
||||
}
|
||||
|
@ -229,6 +236,18 @@ void decrypt_message(SSL& ssl, input_buffer& input, uint sz)
|
|||
ssl.useCrypto().use_cipher().decrypt(plain.get_buffer(), cipher, sz);
|
||||
memcpy(cipher, plain.get_buffer(), sz);
|
||||
ssl.useSecurity().use_parms().encrypt_size_ = sz;
|
||||
|
||||
if (ssl.isTLSv1_1()) // IV
|
||||
input.set_current(input.get_current() +
|
||||
ssl.getCrypto().get_cipher().get_blockSize());
|
||||
}
|
||||
|
||||
|
||||
// output operator for input_buffer
|
||||
output_buffer& operator<<(output_buffer& output, const input_buffer& input)
|
||||
{
|
||||
output.write(input.get_buffer(), input.get_size());
|
||||
return output;
|
||||
}
|
||||
|
||||
|
||||
|
@ -239,9 +258,12 @@ void cipherFinished(SSL& ssl, Finished& fin, output_buffer& output)
|
|||
uint finishedSz = ssl.isTLS() ? TLS_FINISHED_SZ : FINISHED_SZ;
|
||||
uint sz = RECORD_HEADER + HANDSHAKE_HEADER + finishedSz + digestSz;
|
||||
uint pad = 0;
|
||||
uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
|
||||
if (ssl.getSecurity().get_parms().cipher_type_ == block) {
|
||||
if (ssl.isTLSv1_1())
|
||||
sz += blockSz; // IV
|
||||
sz += 1; // pad byte
|
||||
uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
pad = (sz - RECORD_HEADER) % blockSz;
|
||||
pad = blockSz - pad;
|
||||
sz += pad;
|
||||
|
@ -252,14 +274,21 @@ void cipherFinished(SSL& ssl, Finished& fin, output_buffer& output)
|
|||
buildHeaders(ssl, hsHeader, rlHeader, fin);
|
||||
rlHeader.length_ = sz - RECORD_HEADER; // record header includes mac
|
||||
// and pad, hanshake doesn't
|
||||
input_buffer iv;
|
||||
if (ssl.isTLSv1_1() && ssl.getSecurity().get_parms().cipher_type_== block){
|
||||
iv.allocate(blockSz);
|
||||
ssl.getCrypto().get_random().Fill(iv.get_buffer(), blockSz);
|
||||
iv.add_size(blockSz);
|
||||
}
|
||||
uint ivSz = iv.get_size();
|
||||
output.allocate(sz);
|
||||
output << rlHeader << hsHeader << fin;
|
||||
output << rlHeader << iv << hsHeader << fin;
|
||||
|
||||
hashHandShake(ssl, output);
|
||||
hashHandShake(ssl, output, ssl.isTLSv1_1() ? true : false);
|
||||
opaque digest[SHA_LEN]; // max size
|
||||
if (ssl.isTLS())
|
||||
TLS_hmac(ssl, digest, output.get_buffer() + RECORD_HEADER,
|
||||
output.get_size() - RECORD_HEADER, handshake);
|
||||
TLS_hmac(ssl, digest, output.get_buffer() + RECORD_HEADER + ivSz,
|
||||
output.get_size() - RECORD_HEADER - ivSz, handshake);
|
||||
else
|
||||
hmac(ssl, digest, output.get_buffer() + RECORD_HEADER,
|
||||
output.get_size() - RECORD_HEADER, handshake);
|
||||
|
@ -282,9 +311,12 @@ void buildMessage(SSL& ssl, output_buffer& output, const Message& msg)
|
|||
uint digestSz = ssl.getCrypto().get_digest().get_digestSize();
|
||||
uint sz = RECORD_HEADER + msg.get_length() + digestSz;
|
||||
uint pad = 0;
|
||||
uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
|
||||
if (ssl.getSecurity().get_parms().cipher_type_ == block) {
|
||||
if (ssl.isTLSv1_1()) // IV
|
||||
sz += blockSz;
|
||||
sz += 1; // pad byte
|
||||
uint blockSz = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
pad = (sz - RECORD_HEADER) % blockSz;
|
||||
pad = blockSz - pad;
|
||||
sz += pad;
|
||||
|
@ -294,13 +326,21 @@ void buildMessage(SSL& ssl, output_buffer& output, const Message& msg)
|
|||
buildHeader(ssl, rlHeader, msg);
|
||||
rlHeader.length_ = sz - RECORD_HEADER; // record header includes mac
|
||||
// and pad, hanshake doesn't
|
||||
input_buffer iv;
|
||||
if (ssl.isTLSv1_1() && ssl.getSecurity().get_parms().cipher_type_== block){
|
||||
iv.allocate(blockSz);
|
||||
ssl.getCrypto().get_random().Fill(iv.get_buffer(), blockSz);
|
||||
iv.add_size(blockSz);
|
||||
}
|
||||
|
||||
uint ivSz = iv.get_size();
|
||||
output.allocate(sz);
|
||||
output << rlHeader << msg;
|
||||
output << rlHeader << iv << msg;
|
||||
|
||||
opaque digest[SHA_LEN]; // max size
|
||||
if (ssl.isTLS())
|
||||
TLS_hmac(ssl, digest, output.get_buffer() + RECORD_HEADER,
|
||||
output.get_size() - RECORD_HEADER, msg.get_type());
|
||||
TLS_hmac(ssl, digest, output.get_buffer() + RECORD_HEADER + ivSz,
|
||||
output.get_size() - RECORD_HEADER - ivSz, msg.get_type());
|
||||
else
|
||||
hmac(ssl, digest, output.get_buffer() + RECORD_HEADER,
|
||||
output.get_size() - RECORD_HEADER, msg.get_type());
|
||||
|
@ -456,6 +496,10 @@ void buildSHA_CertVerify(SSL& ssl, byte* digest)
|
|||
// some clients still send sslv2 client hello
|
||||
void ProcessOldClientHello(input_buffer& input, SSL& ssl)
|
||||
{
|
||||
if (input.get_remaining() < 2) {
|
||||
ssl.SetError(bad_input);
|
||||
return;
|
||||
}
|
||||
byte b0 = input[AUTO];
|
||||
byte b1 = input[AUTO];
|
||||
|
||||
|
@ -721,6 +765,7 @@ int DoProcessReply(SSL& ssl)
|
|||
// each message in record, can be more than 1 if not encrypted
|
||||
if (ssl.getSecurity().get_parms().pending_ == false) // cipher on
|
||||
decrypt_message(ssl, buffer, hdr.length_);
|
||||
|
||||
mySTL::auto_ptr<Message> msg(mf.CreateObject(hdr.type_));
|
||||
if (!msg.get()) {
|
||||
ssl.SetError(factory_error);
|
||||
|
@ -744,13 +789,13 @@ void processReply(SSL& ssl)
|
|||
|
||||
if (DoProcessReply(ssl))
|
||||
// didn't complete process
|
||||
if (!ssl.getSocket().IsBlocking()) {
|
||||
// keep trying now
|
||||
if (!ssl.getSocket().IsNonBlocking()) {
|
||||
// keep trying now, blocking ok
|
||||
while (!ssl.GetError())
|
||||
if (DoProcessReply(ssl) == 0) break;
|
||||
}
|
||||
else
|
||||
// user will have try again later
|
||||
// user will have try again later, non blocking
|
||||
ssl.SetError(YasslError(SSL_ERROR_WANT_READ));
|
||||
}
|
||||
|
||||
|
@ -761,7 +806,8 @@ void sendClientHello(SSL& ssl)
|
|||
ssl.verifyState(serverNull);
|
||||
if (ssl.GetError()) return;
|
||||
|
||||
ClientHello ch(ssl.getSecurity().get_connection().version_);
|
||||
ClientHello ch(ssl.getSecurity().get_connection().version_,
|
||||
ssl.getSecurity().get_connection().compression_);
|
||||
RecordLayerHeader rlHeader;
|
||||
HandShakeHeader hsHeader;
|
||||
output_buffer out;
|
||||
|
@ -859,6 +905,7 @@ void sendFinished(SSL& ssl, ConnectionEnd side, BufferOutput buffer)
|
|||
buildFinished(ssl, ssl.useHashes().use_verify(), client); // client
|
||||
}
|
||||
else {
|
||||
if (!ssl.getSecurity().GetContext()->GetSessionCacheOff())
|
||||
GetSessions().add(ssl); // store session
|
||||
if (side == client_end)
|
||||
buildFinished(ssl, ssl.useHashes().use_verify(), server); // server
|
||||
|
@ -885,7 +932,20 @@ int sendData(SSL& ssl, const void* buffer, int sz)
|
|||
for (;;) {
|
||||
int len = min(sz - sent, MAX_RECORD_SIZE);
|
||||
output_buffer out;
|
||||
const Data data(len, static_cast<const opaque*>(buffer) + sent);
|
||||
input_buffer tmp;
|
||||
|
||||
Data data;
|
||||
|
||||
if (ssl.CompressionOn()) {
|
||||
if (Compress(static_cast<const opaque*>(buffer) + sent, len,
|
||||
tmp) == -1) {
|
||||
ssl.SetError(compress_error);
|
||||
return -1;
|
||||
}
|
||||
data.SetData(tmp.get_size(), tmp.get_buffer());
|
||||
}
|
||||
else
|
||||
data.SetData(len, static_cast<const opaque*>(buffer) + sent);
|
||||
|
||||
buildMessage(ssl, out, data);
|
||||
ssl.Send(out.get_buffer(), out.get_size());
|
||||
|
@ -947,7 +1007,8 @@ void sendServerHello(SSL& ssl, BufferOutput buffer)
|
|||
ssl.verifyState(clientHelloComplete);
|
||||
if (ssl.GetError()) return;
|
||||
|
||||
ServerHello sh(ssl.getSecurity().get_connection().version_);
|
||||
ServerHello sh(ssl.getSecurity().get_connection().version_,
|
||||
ssl.getSecurity().get_connection().compression_);
|
||||
RecordLayerHeader rlHeader;
|
||||
HandShakeHeader hsHeader;
|
||||
mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
REM quick and dirty build file for testing different MSDEVs
|
||||
setlocal
|
||||
|
||||
set myFLAGS= /I../include /I../mySTL /I../taocrypt/include /W3 /c /ZI
|
||||
set myFLAGS= /I../include /I../taocrypt/mySTL /I../taocrypt/include /W3 /c /ZI
|
||||
|
||||
cl %myFLAGS% buffer.cpp
|
||||
cl %myFLAGS% cert_wrapper.cpp
|
||||
|
|
|
@ -63,7 +63,7 @@ namespace yaSSL {
|
|||
|
||||
|
||||
Socket::Socket(socket_t s)
|
||||
: socket_(s), wouldBlock_(false), blocking_(false)
|
||||
: socket_(s), wouldBlock_(false), nonBlocking_(false)
|
||||
{}
|
||||
|
||||
|
||||
|
@ -148,8 +148,8 @@ uint Socket::receive(byte* buf, unsigned int sz, int flags)
|
|||
if (recvd == -1) {
|
||||
if (get_lastError() == SOCKET_EWOULDBLOCK ||
|
||||
get_lastError() == SOCKET_EAGAIN) {
|
||||
wouldBlock_ = true;
|
||||
blocking_ = true; // socket can block, only way to tell for win32
|
||||
wouldBlock_ = true; // would have blocked this time only
|
||||
nonBlocking_ = true; // socket nonblocking, win32 only way to tell
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -191,9 +191,9 @@ bool Socket::WouldBlock() const
|
|||
}
|
||||
|
||||
|
||||
bool Socket::IsBlocking() const
|
||||
bool Socket::IsNonBlocking() const
|
||||
{
|
||||
return blocking_;
|
||||
return nonBlocking_;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -184,10 +184,22 @@ SSL_METHOD* TLSv1_client_method()
|
|||
}
|
||||
|
||||
|
||||
SSL_METHOD* TLSv1_1_server_method()
|
||||
{
|
||||
return NEW_YS SSL_METHOD(server_end, ProtocolVersion(3,2));
|
||||
}
|
||||
|
||||
|
||||
SSL_METHOD* TLSv1_1_client_method()
|
||||
{
|
||||
return NEW_YS SSL_METHOD(client_end, ProtocolVersion(3,2));
|
||||
}
|
||||
|
||||
|
||||
SSL_METHOD* SSLv23_server_method()
|
||||
{
|
||||
// compatibility only, no version 2 support, but does SSL 3 and TLS 1
|
||||
return NEW_YS SSL_METHOD(server_end, ProtocolVersion(3,1), true);
|
||||
return NEW_YS SSL_METHOD(server_end, ProtocolVersion(3,2), true);
|
||||
}
|
||||
|
||||
|
||||
|
@ -196,7 +208,7 @@ SSL_METHOD* SSLv23_client_method()
|
|||
// compatibility only, no version 2 support, but does SSL 3 and TLS 1
|
||||
// though it sends TLS1 hello not SSLv2 so SSLv3 only servers will decline
|
||||
// TODO: maybe add support to send SSLv2 hello ???
|
||||
return NEW_YS SSL_METHOD(client_end, ProtocolVersion(3,1), true);
|
||||
return NEW_YS SSL_METHOD(client_end, ProtocolVersion(3,2), true);
|
||||
}
|
||||
|
||||
|
||||
|
@ -407,7 +419,6 @@ int SSL_shutdown(SSL* ssl)
|
|||
Alert alert(warning, close_notify);
|
||||
sendAlert(*ssl, alert);
|
||||
ssl->useLog().ShowTCP(ssl->getSocket().get_fd(), true);
|
||||
ssl->useSocket().closeSocket();
|
||||
|
||||
GetErrors().Remove();
|
||||
|
||||
|
@ -415,8 +426,21 @@ int SSL_shutdown(SSL* ssl)
|
|||
}
|
||||
|
||||
|
||||
/* on by default but allow user to turn off */
|
||||
long SSL_CTX_set_session_cache_mode(SSL_CTX* ctx, long mode)
|
||||
{
|
||||
if (mode == SSL_SESS_CACHE_OFF)
|
||||
ctx->SetSessionCacheOff();
|
||||
|
||||
return SSL_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
SSL_SESSION* SSL_get_session(SSL* ssl)
|
||||
{
|
||||
if (ssl->getSecurity().GetContext()->GetSessionCacheOff())
|
||||
return 0;
|
||||
|
||||
return GetSessions().lookup(
|
||||
ssl->getSecurity().get_connection().sessionID_);
|
||||
}
|
||||
|
@ -424,6 +448,9 @@ SSL_SESSION* SSL_get_session(SSL* ssl)
|
|||
|
||||
int SSL_set_session(SSL* ssl, SSL_SESSION* session)
|
||||
{
|
||||
if (ssl->getSecurity().GetContext()->GetSessionCacheOff())
|
||||
return SSL_FAILURE;
|
||||
|
||||
ssl->set_session(session);
|
||||
return SSL_SUCCESS;
|
||||
}
|
||||
|
@ -512,6 +539,19 @@ int SSL_get_error(SSL* ssl, int /*previous*/)
|
|||
}
|
||||
|
||||
|
||||
|
||||
/* turn on yaSSL zlib compression
|
||||
returns 0 for success, else error (not built in)
|
||||
only need to turn on for client, becuase server on by default if built in
|
||||
but calling for server will tell you whether it's available or not
|
||||
*/
|
||||
int SSL_set_compression(SSL* ssl)
|
||||
{
|
||||
return ssl->SetCompression();
|
||||
}
|
||||
|
||||
|
||||
|
||||
X509* SSL_get_peer_certificate(SSL* ssl)
|
||||
{
|
||||
return ssl->getCrypto().get_certManager().get_peerX509();
|
||||
|
@ -1359,6 +1399,56 @@ int SSL_pending(SSL* ssl)
|
|||
}
|
||||
|
||||
|
||||
void SSL_CTX_set_default_passwd_cb(SSL_CTX* ctx, pem_password_cb cb)
|
||||
{
|
||||
ctx->SetPasswordCb(cb);
|
||||
}
|
||||
|
||||
|
||||
int SSLeay_add_ssl_algorithms() // compatibility only
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void ERR_remove_state(unsigned long)
|
||||
{
|
||||
GetErrors().Remove();
|
||||
}
|
||||
|
||||
|
||||
int ERR_GET_REASON(int l)
|
||||
{
|
||||
return l & 0xfff;
|
||||
}
|
||||
|
||||
|
||||
unsigned long err_helper(bool peek = false)
|
||||
{
|
||||
int ysError = GetErrors().Lookup(peek);
|
||||
|
||||
// translate cert error for libcurl, it uses OpenSSL hex code
|
||||
switch (ysError) {
|
||||
case TaoCrypt::SIG_OTHER_E:
|
||||
return CERTFICATE_ERROR;
|
||||
break;
|
||||
default :
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unsigned long ERR_peek_error()
|
||||
{
|
||||
return err_helper(true);
|
||||
}
|
||||
|
||||
|
||||
unsigned long ERR_get_error()
|
||||
{
|
||||
return err_helper();
|
||||
}
|
||||
|
||||
|
||||
// functions for stunnel
|
||||
|
||||
|
@ -1477,13 +1567,6 @@ int SSL_pending(SSL* ssl)
|
|||
}
|
||||
|
||||
|
||||
long SSL_CTX_set_session_cache_mode(SSL_CTX*, long)
|
||||
{
|
||||
// TDOD:
|
||||
return SSL_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
long SSL_CTX_set_timeout(SSL_CTX*, long)
|
||||
{
|
||||
// TDOD:
|
||||
|
@ -1498,12 +1581,6 @@ int SSL_pending(SSL* ssl)
|
|||
}
|
||||
|
||||
|
||||
void SSL_CTX_set_default_passwd_cb(SSL_CTX* ctx, pem_password_cb cb)
|
||||
{
|
||||
ctx->SetPasswordCb(cb);
|
||||
}
|
||||
|
||||
|
||||
int SSL_CTX_use_RSAPrivateKey_file(SSL_CTX*, const char*, int)
|
||||
{
|
||||
// TDOD:
|
||||
|
@ -1555,49 +1632,6 @@ int SSL_pending(SSL* ssl)
|
|||
}
|
||||
|
||||
|
||||
int SSLeay_add_ssl_algorithms() // compatibility only
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
void ERR_remove_state(unsigned long)
|
||||
{
|
||||
GetErrors().Remove();
|
||||
}
|
||||
|
||||
|
||||
int ERR_GET_REASON(int l)
|
||||
{
|
||||
return l & 0xfff;
|
||||
}
|
||||
|
||||
unsigned long err_helper(bool peek = false)
|
||||
{
|
||||
int ysError = GetErrors().Lookup(peek);
|
||||
|
||||
// translate cert error for libcurl, it uses OpenSSL hex code
|
||||
switch (ysError) {
|
||||
case TaoCrypt::SIG_OTHER_E:
|
||||
return CERTFICATE_ERROR;
|
||||
break;
|
||||
default :
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unsigned long ERR_peek_error()
|
||||
{
|
||||
return err_helper(true);
|
||||
}
|
||||
|
||||
|
||||
unsigned long ERR_get_error()
|
||||
{
|
||||
return err_helper();
|
||||
}
|
||||
|
||||
|
||||
// end stunnel needs
|
||||
|
||||
|
|
|
@ -133,6 +133,18 @@ void SetErrorString(YasslError error, char* buffer)
|
|||
strncpy(buffer, "protocl version mismatch", max);
|
||||
break;
|
||||
|
||||
case compress_error :
|
||||
strncpy(buffer, "compression error", max);
|
||||
break;
|
||||
|
||||
case decompress_error :
|
||||
strncpy(buffer, "decompression error", max);
|
||||
break;
|
||||
|
||||
case pms_version_error :
|
||||
strncpy(buffer, "bad PreMasterSecret version error", max);
|
||||
break;
|
||||
|
||||
// openssl errors
|
||||
case SSL_ERROR_WANT_READ :
|
||||
strncpy(buffer, "the read operation would block", max);
|
||||
|
|
|
@ -87,7 +87,7 @@ void EncryptedPreMasterSecret::build(SSL& ssl)
|
|||
opaque tmp[SECRET_LEN];
|
||||
memset(tmp, 0, sizeof(tmp));
|
||||
ssl.getCrypto().get_random().Fill(tmp, SECRET_LEN);
|
||||
ProtocolVersion pv = ssl.getSecurity().get_connection().version_;
|
||||
ProtocolVersion pv = ssl.getSecurity().get_connection().chVersion_;
|
||||
tmp[0] = pv.major_;
|
||||
tmp[1] = pv.minor_;
|
||||
ssl.set_preMaster(tmp, SECRET_LEN);
|
||||
|
@ -233,6 +233,10 @@ void EncryptedPreMasterSecret::read(SSL& ssl, input_buffer& input)
|
|||
rsa.decrypt(preMasterSecret, secret_, length_,
|
||||
ssl.getCrypto().get_random());
|
||||
|
||||
ProtocolVersion pv = ssl.getSecurity().get_connection().chVersion_;
|
||||
if (pv.major_ != preMasterSecret[0] || pv.minor_ != preMasterSecret[1])
|
||||
ssl.SetError(pms_version_error); // continue deriving for timing attack
|
||||
|
||||
ssl.set_preMaster(preMasterSecret, SECRET_LEN);
|
||||
ssl.makeMasterSecret();
|
||||
}
|
||||
|
@ -437,6 +441,7 @@ Parameters::Parameters(ConnectionEnd ce, const Ciphers& ciphers,
|
|||
ProtocolVersion pv, bool haveDH) : entity_(ce)
|
||||
{
|
||||
pending_ = true; // suite not set yet
|
||||
strncpy(cipher_name_, "NONE", 5);
|
||||
|
||||
if (ciphers.setSuites_) { // use user set list
|
||||
suites_size_ = ciphers.suiteSz_;
|
||||
|
@ -445,6 +450,7 @@ Parameters::Parameters(ConnectionEnd ce, const Ciphers& ciphers,
|
|||
}
|
||||
else
|
||||
SetSuites(pv, ce == server_end && !haveDH); // defaults
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -613,14 +619,18 @@ output_buffer& operator<<(output_buffer& output, const HandShakeHeader& hdr)
|
|||
void HandShakeHeader::Process(input_buffer& input, SSL& ssl)
|
||||
{
|
||||
ssl.verifyState(*this);
|
||||
if (ssl.GetError()) return;
|
||||
const HandShakeFactory& hsf = ssl.getFactory().getHandShake();
|
||||
mySTL::auto_ptr<HandShakeBase> hs(hsf.CreateObject(type_));
|
||||
if (!hs.get()) {
|
||||
ssl.SetError(factory_error);
|
||||
return;
|
||||
}
|
||||
hashHandShake(ssl, input, c24to32(length_));
|
||||
|
||||
uint len = c24to32(length_);
|
||||
hashHandShake(ssl, input, len);
|
||||
|
||||
hs->set_length(len);
|
||||
input >> *hs;
|
||||
hs->Process(input, ssl);
|
||||
}
|
||||
|
@ -849,11 +859,17 @@ void Alert::Process(input_buffer& input, SSL& ssl)
|
|||
opaque mac[SHA_LEN];
|
||||
input.read(mac, digestSz);
|
||||
|
||||
if (ssl.getSecurity().get_parms().cipher_type_ == block) {
|
||||
int ivExtra = 0;
|
||||
opaque fill;
|
||||
int padSz = ssl.getSecurity().get_parms().encrypt_size_ - aSz -
|
||||
digestSz;
|
||||
|
||||
if (ssl.isTLSv1_1())
|
||||
ivExtra = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
int padSz = ssl.getSecurity().get_parms().encrypt_size_ - ivExtra -
|
||||
aSz - digestSz;
|
||||
for (int i = 0; i < padSz; i++)
|
||||
fill = input[AUTO];
|
||||
}
|
||||
|
||||
// verify
|
||||
if (memcmp(mac, verify, digestSz)) {
|
||||
|
@ -879,9 +895,13 @@ Data::Data(uint16 len, opaque* b)
|
|||
{}
|
||||
|
||||
|
||||
Data::Data(uint16 len, const opaque* w)
|
||||
: length_(len), buffer_(0), write_buffer_(w)
|
||||
{}
|
||||
void Data::SetData(uint16 len, const opaque* buffer)
|
||||
{
|
||||
assert(write_buffer_ == 0);
|
||||
|
||||
length_ = len;
|
||||
write_buffer_ = buffer;
|
||||
}
|
||||
|
||||
input_buffer& Data::set(input_buffer& in)
|
||||
{
|
||||
|
@ -907,17 +927,12 @@ uint16 Data::get_length() const
|
|||
}
|
||||
|
||||
|
||||
const opaque* Data::get_buffer() const
|
||||
{
|
||||
return write_buffer_;
|
||||
}
|
||||
|
||||
|
||||
void Data::set_length(uint16 l)
|
||||
{
|
||||
length_ = l;
|
||||
}
|
||||
|
||||
|
||||
opaque* Data::set_buffer()
|
||||
{
|
||||
return buffer_;
|
||||
|
@ -937,27 +952,42 @@ void Data::Process(input_buffer& input, SSL& ssl)
|
|||
{
|
||||
int msgSz = ssl.getSecurity().get_parms().encrypt_size_;
|
||||
int pad = 0, padByte = 0;
|
||||
int ivExtra = 0;
|
||||
|
||||
if (ssl.getSecurity().get_parms().cipher_type_ == block) {
|
||||
pad = *(input.get_buffer() + input.get_current() + msgSz - 1);
|
||||
if (ssl.isTLSv1_1()) // IV
|
||||
ivExtra = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
pad = *(input.get_buffer() + input.get_current() + msgSz -ivExtra - 1);
|
||||
padByte = 1;
|
||||
}
|
||||
int digestSz = ssl.getCrypto().get_digest().get_digestSize();
|
||||
int dataSz = msgSz - digestSz - pad - padByte;
|
||||
int dataSz = msgSz - ivExtra - digestSz - pad - padByte;
|
||||
opaque verify[SHA_LEN];
|
||||
|
||||
const byte* rawData = input.get_buffer() + input.get_current();
|
||||
|
||||
// read data
|
||||
if (dataSz) {
|
||||
if (dataSz) { // could be compressed
|
||||
if (ssl.CompressionOn()) {
|
||||
input_buffer tmp;
|
||||
if (DeCompress(input, dataSz, tmp) == -1) {
|
||||
ssl.SetError(decompress_error);
|
||||
return;
|
||||
}
|
||||
ssl.addData(NEW_YS input_buffer(tmp.get_size(),
|
||||
tmp.get_buffer(), tmp.get_size()));
|
||||
}
|
||||
else {
|
||||
input_buffer* data;
|
||||
ssl.addData(data = NEW_YS input_buffer(dataSz));
|
||||
input.read(data->get_buffer(), dataSz);
|
||||
data->add_size(dataSz);
|
||||
}
|
||||
|
||||
if (ssl.isTLS())
|
||||
TLS_hmac(ssl, verify, data->get_buffer(), dataSz, application_data,
|
||||
true);
|
||||
TLS_hmac(ssl, verify, rawData, dataSz, application_data, true);
|
||||
else
|
||||
hmac(ssl, verify, data->get_buffer(), dataSz, application_data,
|
||||
true);
|
||||
hmac(ssl, verify, rawData, dataSz, application_data, true);
|
||||
}
|
||||
|
||||
// read mac and fill
|
||||
|
@ -1220,6 +1250,13 @@ void ServerHello::Process(input_buffer&, SSL& ssl)
|
|||
if (ssl.isTLS() && server_version_.minor_ < 1)
|
||||
// downgrade to SSLv3
|
||||
ssl.useSecurity().use_connection().TurnOffTLS();
|
||||
else if (ssl.isTLSv1_1() && server_version_.minor_ == 1)
|
||||
// downdrage to TLSv1
|
||||
ssl.useSecurity().use_connection().TurnOffTLS1_1();
|
||||
}
|
||||
else if (ssl.isTLSv1_1() && server_version_.minor_ < 2) {
|
||||
ssl.SetError(badVersion_error);
|
||||
return;
|
||||
}
|
||||
else if (ssl.isTLS() && server_version_.minor_ < 1) {
|
||||
ssl.SetError(badVersion_error);
|
||||
|
@ -1252,6 +1289,10 @@ void ServerHello::Process(input_buffer&, SSL& ssl)
|
|||
ssl.useSecurity().set_resuming(false);
|
||||
ssl.useLog().Trace("server denied resumption");
|
||||
}
|
||||
|
||||
if (ssl.CompressionOn() && !compression_method_)
|
||||
ssl.UnSetCompression(); // server isn't supporting yaSSL zlib request
|
||||
|
||||
ssl.useStates().useClient() = serverHelloComplete;
|
||||
}
|
||||
|
||||
|
@ -1263,8 +1304,9 @@ ServerHello::ServerHello()
|
|||
}
|
||||
|
||||
|
||||
ServerHello::ServerHello(ProtocolVersion pv)
|
||||
: server_version_(pv)
|
||||
ServerHello::ServerHello(ProtocolVersion pv, bool useCompression)
|
||||
: server_version_(pv),
|
||||
compression_method_(useCompression ? zlib : no_compression)
|
||||
{
|
||||
memset(random_, 0, RAN_LEN);
|
||||
memset(session_id_, 0, ID_LEN);
|
||||
|
@ -1341,6 +1383,8 @@ opaque* ClientKeyBase::get_clientKey() const
|
|||
// input operator for Client Hello
|
||||
input_buffer& operator>>(input_buffer& input, ClientHello& hello)
|
||||
{
|
||||
uint begin = input.get_current(); // could have extensions at end
|
||||
|
||||
// Protocol
|
||||
hello.client_version_.major_ = input[AUTO];
|
||||
hello.client_version_.minor_ = input[AUTO];
|
||||
|
@ -1361,8 +1405,19 @@ input_buffer& operator>>(input_buffer& input, ClientHello& hello)
|
|||
|
||||
// Compression
|
||||
hello.comp_len_ = input[AUTO];
|
||||
while (hello.comp_len_--) // ignore for now
|
||||
hello.compression_methods_ = CompressionMethod(input[AUTO]);
|
||||
hello.compression_methods_ = no_compression;
|
||||
while (hello.comp_len_--) {
|
||||
CompressionMethod cm = CompressionMethod(input[AUTO]);
|
||||
if (cm == zlib)
|
||||
hello.compression_methods_ = zlib;
|
||||
}
|
||||
|
||||
uint read = input.get_current() - begin;
|
||||
uint expected = hello.get_length();
|
||||
|
||||
// ignore client hello extensions for now
|
||||
if (read < expected)
|
||||
input.set_current(input.get_current() + expected - read);
|
||||
|
||||
return input;
|
||||
}
|
||||
|
@ -1400,6 +1455,13 @@ output_buffer& operator<<(output_buffer& output, const ClientHello& hello)
|
|||
// Client Hello processing handler
|
||||
void ClientHello::Process(input_buffer&, SSL& ssl)
|
||||
{
|
||||
// store version for pre master secret
|
||||
ssl.useSecurity().use_connection().chVersion_ = client_version_;
|
||||
|
||||
if (client_version_.major_ != 3) {
|
||||
ssl.SetError(badVersion_error);
|
||||
return;
|
||||
}
|
||||
if (ssl.GetMultiProtocol()) { // SSLv23 support
|
||||
if (ssl.isTLS() && client_version_.minor_ < 1) {
|
||||
// downgrade to SSLv3
|
||||
|
@ -1407,20 +1469,29 @@ void ClientHello::Process(input_buffer&, SSL& ssl)
|
|||
ProtocolVersion pv = ssl.getSecurity().get_connection().version_;
|
||||
ssl.useSecurity().use_parms().SetSuites(pv); // reset w/ SSL suites
|
||||
}
|
||||
else if (ssl.isTLSv1_1() && client_version_.minor_ == 1)
|
||||
// downgrade to TLSv1, but use same suites
|
||||
ssl.useSecurity().use_connection().TurnOffTLS1_1();
|
||||
}
|
||||
else if (ssl.isTLSv1_1() && client_version_.minor_ < 2) {
|
||||
ssl.SetError(badVersion_error);
|
||||
return;
|
||||
}
|
||||
else if (ssl.isTLS() && client_version_.minor_ < 1) {
|
||||
ssl.SetError(badVersion_error);
|
||||
return;
|
||||
}
|
||||
else if (!ssl.isTLS() && (client_version_.major_ == 3 &&
|
||||
client_version_.minor_ >= 1)) {
|
||||
else if (!ssl.isTLS() && client_version_.minor_ >= 1) {
|
||||
ssl.SetError(badVersion_error);
|
||||
return;
|
||||
}
|
||||
|
||||
ssl.set_random(random_, client_end);
|
||||
|
||||
while (id_len_) { // trying to resume
|
||||
SSL_SESSION* session = GetSessions().lookup(session_id_);
|
||||
SSL_SESSION* session = 0;
|
||||
if (!ssl.getSecurity().GetContext()->GetSessionCacheOff())
|
||||
session = GetSessions().lookup(session_id_);
|
||||
if (!session) {
|
||||
ssl.useLog().Trace("session lookup failed");
|
||||
break;
|
||||
|
@ -1444,6 +1515,9 @@ void ClientHello::Process(input_buffer&, SSL& ssl)
|
|||
ssl.matchSuite(cipher_suites_, suite_len_);
|
||||
ssl.set_pending(ssl.getSecurity().get_parms().suite_[1]);
|
||||
|
||||
if (compression_methods_ == zlib)
|
||||
ssl.SetCompression();
|
||||
|
||||
ssl.useStates().useServer() = clientHelloComplete;
|
||||
}
|
||||
|
||||
|
@ -1478,8 +1552,9 @@ ClientHello::ClientHello()
|
|||
}
|
||||
|
||||
|
||||
ClientHello::ClientHello(ProtocolVersion pv)
|
||||
: client_version_(pv)
|
||||
ClientHello::ClientHello(ProtocolVersion pv, bool useCompression)
|
||||
: client_version_(pv),
|
||||
compression_methods_(useCompression ? zlib : no_compression)
|
||||
{
|
||||
memset(random_, 0, RAN_LEN);
|
||||
}
|
||||
|
@ -1943,8 +2018,13 @@ void Finished::Process(input_buffer& input, SSL& ssl)
|
|||
int digestSz = ssl.getCrypto().get_digest().get_digestSize();
|
||||
input.read(mac, digestSz);
|
||||
|
||||
uint ivExtra = 0;
|
||||
if (ssl.getSecurity().get_parms().cipher_type_ == block)
|
||||
if (ssl.isTLSv1_1())
|
||||
ivExtra = ssl.getCrypto().get_cipher().get_blockSize();
|
||||
|
||||
opaque fill;
|
||||
int padSz = ssl.getSecurity().get_parms().encrypt_size_ -
|
||||
int padSz = ssl.getSecurity().get_parms().encrypt_size_ - ivExtra -
|
||||
HANDSHAKE_HEADER - finishedSz - digestSz;
|
||||
for (int i = 0; i < padSz; i++)
|
||||
fill = input[AUTO];
|
||||
|
@ -2018,7 +2098,9 @@ void clean(volatile opaque* p, uint sz, RandomPool& ran)
|
|||
Connection::Connection(ProtocolVersion v, RandomPool& ran)
|
||||
: pre_master_secret_(0), sequence_number_(0), peer_sequence_number_(0),
|
||||
pre_secret_len_(0), send_server_key_(false), master_clean_(false),
|
||||
TLS_(v.major_ >= 3 && v.minor_ >= 1), version_(v), random_(ran)
|
||||
TLS_(v.major_ >= 3 && v.minor_ >= 1),
|
||||
TLSv1_1_(v.major_ >= 3 && v.minor_ >= 2), compression_(false),
|
||||
version_(v), random_(ran)
|
||||
{
|
||||
memset(sessionID_, 0, sizeof(sessionID_));
|
||||
}
|
||||
|
@ -2043,6 +2125,13 @@ void Connection::TurnOffTLS()
|
|||
}
|
||||
|
||||
|
||||
void Connection::TurnOffTLS1_1()
|
||||
{
|
||||
TLSv1_1_ = false;
|
||||
version_.minor_ = 1;
|
||||
}
|
||||
|
||||
|
||||
// wipeout master secret
|
||||
void Connection::CleanMaster()
|
||||
{
|
||||
|
|
|
@ -38,6 +38,11 @@
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
#include "zlib.h"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef YASSL_PURE_C
|
||||
|
||||
void* operator new(size_t sz, yaSSL::new_t)
|
||||
|
@ -727,6 +732,32 @@ void SSL::set_preMaster(const opaque* pre, uint sz)
|
|||
}
|
||||
|
||||
|
||||
// set yaSSL zlib type compression
|
||||
int SSL::SetCompression()
|
||||
{
|
||||
#ifdef HAVE_LIBZ
|
||||
secure_.use_connection().compression_ = true;
|
||||
return 0;
|
||||
#else
|
||||
return -1; // not built in
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// unset yaSSL zlib type compression
|
||||
void SSL::UnSetCompression()
|
||||
{
|
||||
secure_.use_connection().compression_ = false;
|
||||
}
|
||||
|
||||
|
||||
// is yaSSL zlib compression on
|
||||
bool SSL::CompressionOn() const
|
||||
{
|
||||
return secure_.get_connection().compression_;
|
||||
}
|
||||
|
||||
|
||||
// store master secret
|
||||
void SSL::set_masterSecret(const opaque* sec)
|
||||
{
|
||||
|
@ -1109,6 +1140,11 @@ void SSL::verifyState(const RecordLayerHeader& rlHeader)
|
|||
{
|
||||
if (GetError()) return;
|
||||
|
||||
if (rlHeader.version_.major_ != 3 || rlHeader.version_.minor_ > 2) {
|
||||
SetError(badVersion_error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (states_.getRecord() == recordNotReady ||
|
||||
(rlHeader.type_ == application_data && // data and handshake
|
||||
states_.getHandShake() != handShakeReady) ) // isn't complete yet
|
||||
|
@ -1247,6 +1283,9 @@ void SSL::matchSuite(const opaque* peer, uint length)
|
|||
|
||||
void SSL::set_session(SSL_SESSION* s)
|
||||
{
|
||||
if (getSecurity().GetContext()->GetSessionCacheOff())
|
||||
return;
|
||||
|
||||
if (s && GetSessions().lookup(s->GetID(), &secure_.use_resume())) {
|
||||
secure_.set_resuming(true);
|
||||
crypto_.use_certManager().setPeerX509(s->GetPeerX509());
|
||||
|
@ -1344,6 +1383,12 @@ bool SSL::isTLS() const
|
|||
}
|
||||
|
||||
|
||||
bool SSL::isTLSv1_1() const
|
||||
{
|
||||
return secure_.get_connection().TLSv1_1_;
|
||||
}
|
||||
|
||||
|
||||
void SSL::addData(input_buffer* data)
|
||||
{
|
||||
buffers_.useData().push_back(data);
|
||||
|
@ -1703,7 +1748,7 @@ bool SSL_METHOD::multipleProtocol() const
|
|||
|
||||
SSL_CTX::SSL_CTX(SSL_METHOD* meth)
|
||||
: method_(meth), certificate_(0), privateKey_(0), passwordCb_(0),
|
||||
userData_(0)
|
||||
userData_(0), sessionCacheOff_(false)
|
||||
{}
|
||||
|
||||
|
||||
|
@ -1784,12 +1829,24 @@ void* SSL_CTX::GetUserData() const
|
|||
}
|
||||
|
||||
|
||||
bool SSL_CTX::GetSessionCacheOff() const
|
||||
{
|
||||
return sessionCacheOff_;
|
||||
}
|
||||
|
||||
|
||||
void SSL_CTX::SetUserData(void* data)
|
||||
{
|
||||
userData_ = data;
|
||||
}
|
||||
|
||||
|
||||
void SSL_CTX::SetSessionCacheOff()
|
||||
{
|
||||
sessionCacheOff_ = true;
|
||||
}
|
||||
|
||||
|
||||
void SSL_CTX::setVerifyPeer()
|
||||
{
|
||||
method_->setVerifyPeer();
|
||||
|
@ -2312,9 +2369,110 @@ ASN1_STRING* StringHolder::GetString()
|
|||
}
|
||||
|
||||
|
||||
#ifdef HAVE_LIBZ
|
||||
|
||||
void* myAlloc(void* /* opaque */, unsigned int item, unsigned int size)
|
||||
{
|
||||
return NEW_YS unsigned char[item * size];
|
||||
}
|
||||
|
||||
|
||||
void myFree(void* /* opaque */, void* memory)
|
||||
{
|
||||
unsigned char* ptr = static_cast<unsigned char*>(memory);
|
||||
yaSSL::ysArrayDelete(ptr);
|
||||
}
|
||||
|
||||
|
||||
// put size in front of compressed data
|
||||
int Compress(const byte* in, int sz, input_buffer& buffer)
|
||||
{
|
||||
byte tmp[LENGTH_SZ];
|
||||
z_stream c_stream; /* compression stream */
|
||||
|
||||
buffer.allocate(sz + sizeof(uint16) + COMPRESS_EXTRA);
|
||||
|
||||
c_stream.zalloc = myAlloc;
|
||||
c_stream.zfree = myFree;
|
||||
c_stream.opaque = (voidpf)0;
|
||||
|
||||
c_stream.next_in = const_cast<byte*>(in);
|
||||
c_stream.avail_in = sz;
|
||||
c_stream.next_out = buffer.get_buffer() + sizeof(tmp);
|
||||
c_stream.avail_out = buffer.get_capacity() - sizeof(tmp);
|
||||
|
||||
if (deflateInit(&c_stream, 8) != Z_OK) return -1;
|
||||
int err = deflate(&c_stream, Z_FINISH);
|
||||
deflateEnd(&c_stream);
|
||||
if (err != Z_OK && err != Z_STREAM_END) return -1;
|
||||
|
||||
c16toa(sz, tmp);
|
||||
memcpy(buffer.get_buffer(), tmp, sizeof(tmp));
|
||||
buffer.add_size(c_stream.total_out + sizeof(tmp));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// get uncompressed size in front
|
||||
int DeCompress(input_buffer& in, int sz, input_buffer& out)
|
||||
{
|
||||
byte tmp[LENGTH_SZ];
|
||||
|
||||
in.read(tmp, sizeof(tmp));
|
||||
|
||||
uint16 len;
|
||||
ato16(tmp, len);
|
||||
|
||||
out.allocate(len);
|
||||
|
||||
z_stream d_stream; /* decompression stream */
|
||||
|
||||
d_stream.zalloc = myAlloc;
|
||||
d_stream.zfree = myFree;
|
||||
d_stream.opaque = (voidpf)0;
|
||||
|
||||
d_stream.next_in = in.get_buffer() + in.get_current();
|
||||
d_stream.avail_in = sz - sizeof(tmp);
|
||||
d_stream.next_out = out.get_buffer();
|
||||
d_stream.avail_out = out.get_capacity();
|
||||
|
||||
if (inflateInit(&d_stream) != Z_OK) return -1;
|
||||
int err = inflate(&d_stream, Z_FINISH);
|
||||
inflateEnd(&d_stream);
|
||||
if (err != Z_OK && err != Z_STREAM_END) return -1;
|
||||
|
||||
out.add_size(d_stream.total_out);
|
||||
in.set_current(in.get_current() + sz - sizeof(tmp));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#else // LIBZ
|
||||
|
||||
// these versions should never get called
|
||||
int Compress(const byte* in, int sz, input_buffer& buffer)
|
||||
{
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int DeCompress(input_buffer& in, int sz, input_buffer& out)
|
||||
{
|
||||
assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#endif // LIBZ
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
|
||||
|
||||
extern "C" void yaSSL_CleanUp()
|
||||
{
|
||||
TaoCrypt::CleanUp();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
REM quick and dirty build file for testing different MSDEVs
|
||||
setlocal
|
||||
|
||||
set myFLAGS= /I../include /I../../mySTL /c /W3 /G6 /O2
|
||||
set myFLAGS= /I../include /I../mySTL /c /W3 /G6 /O2
|
||||
|
||||
cl %myFLAGS% benchmark.cpp
|
||||
|
||||
|
|
|
@ -34,6 +34,12 @@
|
|||
#include "modes.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_AES_ASM
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
|
@ -46,15 +52,14 @@ public:
|
|||
enum { BLOCK_SIZE = AES_BLOCK_SIZE };
|
||||
|
||||
AES(CipherDir DIR, Mode MODE)
|
||||
: Mode_BASE(BLOCK_SIZE), dir_(DIR), mode_(MODE) {}
|
||||
: Mode_BASE(BLOCK_SIZE, DIR, MODE) {}
|
||||
|
||||
#ifdef DO_AES_ASM
|
||||
void Process(byte*, const byte*, word32);
|
||||
#endif
|
||||
void SetKey(const byte* key, word32 sz, CipherDir fake = ENCRYPTION);
|
||||
void SetIV(const byte* iv) { memcpy(r_, iv, BLOCK_SIZE); }
|
||||
private:
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
static const word32 rcon_[];
|
||||
|
||||
word32 rounds_;
|
||||
|
|
|
@ -75,7 +75,8 @@ public:
|
|||
typedef Integer Element;
|
||||
|
||||
AbstractRing() : AbstractGroup() {m_mg.m_pRing = this;}
|
||||
AbstractRing(const AbstractRing &source) :AbstractGroup() {m_mg.m_pRing = this;}
|
||||
AbstractRing(const AbstractRing &source) : AbstractGroup()
|
||||
{m_mg.m_pRing = this;}
|
||||
AbstractRing& operator=(const AbstractRing &source) {return *this;}
|
||||
|
||||
virtual bool IsUnit(const Element &a) const =0;
|
||||
|
|
|
@ -46,7 +46,6 @@ public:
|
|||
ARC4() {}
|
||||
|
||||
void Process(byte*, const byte*, word32);
|
||||
void AsmProcess(byte*, const byte*, word32);
|
||||
void SetKey(const byte*, word32);
|
||||
private:
|
||||
byte x_;
|
||||
|
@ -55,6 +54,8 @@ private:
|
|||
|
||||
ARC4(const ARC4&); // hide copy
|
||||
const ARC4 operator=(const ARC4&); // and assign
|
||||
|
||||
void AsmProcess(byte*, const byte*, word32);
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -34,7 +34,11 @@
|
|||
#include "misc.hpp"
|
||||
#include "block.hpp"
|
||||
#include "error.hpp"
|
||||
#include STL_LIST_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <list>
|
||||
#else
|
||||
#include "list.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
|
|
@ -34,7 +34,12 @@
|
|||
#include "misc.hpp"
|
||||
#include <string.h> // memcpy
|
||||
#include <stddef.h> // ptrdiff_t
|
||||
#include STL_ALGORITHM_FILE
|
||||
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
|
|
@ -32,12 +32,21 @@
|
|||
|
||||
#include "misc.hpp"
|
||||
#include "modes.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_BLOWFISH_ASM
|
||||
#endif
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
enum { BLOWFISH_BLOCK_SIZE = 8 };
|
||||
|
@ -49,15 +58,14 @@ public:
|
|||
enum { BLOCK_SIZE = BLOWFISH_BLOCK_SIZE, ROUNDS = 16 };
|
||||
|
||||
Blowfish(CipherDir DIR, Mode MODE)
|
||||
: Mode_BASE(BLOCK_SIZE), dir_(DIR), mode_(MODE) {}
|
||||
: Mode_BASE(BLOCK_SIZE, DIR, MODE) {}
|
||||
|
||||
#ifdef DO_BLOWFISH_ASM
|
||||
void Process(byte*, const byte*, word32);
|
||||
#endif
|
||||
void SetKey(const byte* key, word32 sz, CipherDir fake = ENCRYPTION);
|
||||
void SetIV(const byte* iv) { memcpy(r_, iv, BLOCK_SIZE); }
|
||||
private:
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
static const word32 p_init_[ROUNDS + 2];
|
||||
static const word32 s_init_[4 * 256];
|
||||
|
||||
|
|
|
@ -34,6 +34,12 @@
|
|||
#include "misc.hpp"
|
||||
#include "modes.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_DES_ASM
|
||||
#endif
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
|
@ -53,13 +59,9 @@ protected:
|
|||
class DES : public Mode_BASE, public BasicDES {
|
||||
public:
|
||||
DES(CipherDir DIR, Mode MODE)
|
||||
: Mode_BASE(DES_BLOCK_SIZE), dir_(DIR), mode_(MODE) {}
|
||||
: Mode_BASE(DES_BLOCK_SIZE, DIR, MODE) {}
|
||||
|
||||
void Process(byte*, const byte*, word32);
|
||||
private:
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
void ProcessAndXorBlock(const byte*, const byte*, byte*) const;
|
||||
|
||||
DES(const DES&); // hide copy
|
||||
|
@ -71,14 +73,10 @@ private:
|
|||
class DES_EDE2 : public Mode_BASE {
|
||||
public:
|
||||
DES_EDE2(CipherDir DIR, Mode MODE)
|
||||
: Mode_BASE(DES_BLOCK_SIZE), dir_(DIR), mode_(MODE) {}
|
||||
: Mode_BASE(DES_BLOCK_SIZE, DIR, MODE) {}
|
||||
|
||||
void SetKey(const byte*, word32, CipherDir dir);
|
||||
void Process(byte*, const byte*, word32);
|
||||
private:
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
BasicDES des1_;
|
||||
BasicDES des2_;
|
||||
|
||||
|
@ -94,15 +92,14 @@ private:
|
|||
class DES_EDE3 : public Mode_BASE {
|
||||
public:
|
||||
DES_EDE3(CipherDir DIR, Mode MODE)
|
||||
: Mode_BASE(DES_BLOCK_SIZE), dir_(DIR), mode_(MODE) {}
|
||||
: Mode_BASE(DES_BLOCK_SIZE, DIR, MODE) {}
|
||||
|
||||
void SetKey(const byte*, word32, CipherDir dir);
|
||||
void SetIV(const byte* iv) { memcpy(r_, iv, DES_BLOCK_SIZE); }
|
||||
#ifdef DO_DES_ASM
|
||||
void Process(byte*, const byte*, word32);
|
||||
#endif
|
||||
private:
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
BasicDES des1_;
|
||||
BasicDES des2_;
|
||||
BasicDES des3_;
|
||||
|
|
|
@ -45,7 +45,11 @@
|
|||
#include "random.hpp"
|
||||
#include "file.hpp"
|
||||
#include <string.h>
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef TAOCRYPT_X86ASM_AVAILABLE
|
||||
|
@ -67,7 +71,8 @@
|
|||
#endif
|
||||
|
||||
// SSE2 intrinsics work in GCC 3.3 or later
|
||||
#if defined(__SSE2__) && (__GNUC_MAJOR__ > 3 || __GNUC_MINOR__ > 2)
|
||||
#if defined(__SSE2__) && (__GNUC__ == 4 || __GNUC_MAJOR__ > 3 || \
|
||||
__GNUC_MINOR__ > 2)
|
||||
#define SSE2_INTRINSICS_AVAILABLE
|
||||
#endif
|
||||
|
||||
|
@ -106,7 +111,6 @@ namespace TaoCrypt {
|
|||
#endif
|
||||
};
|
||||
|
||||
template class TAOCRYPT_DLL AlignedAllocator<word>;
|
||||
typedef Block<word, AlignedAllocator<word> > AlignedWordBlock;
|
||||
#else
|
||||
typedef WordBlock AlignedWordBlock;
|
||||
|
|
|
@ -31,6 +31,11 @@
|
|||
|
||||
#include "hash.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_MD5_ASM
|
||||
#endif
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
|
@ -49,7 +54,9 @@ public:
|
|||
MD5(const MD5&);
|
||||
MD5& operator= (const MD5&);
|
||||
|
||||
#ifdef DO_MD5_ASM
|
||||
void Update(const byte*, word32);
|
||||
#endif
|
||||
|
||||
void Init();
|
||||
void Swap(MD5&);
|
||||
|
|
|
@ -151,6 +151,17 @@ void CleanUp();
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef TAOCRYPT_X86ASM_AVAILABLE
|
||||
bool HaveCpuId();
|
||||
bool IsPentium();
|
||||
void CpuId(word32 input, word32 *output);
|
||||
|
||||
extern bool isMMX;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
// Turn on ia32 ASM for Ciphers and Message Digests
|
||||
// Seperate define since these are more complex, use member offsets
|
||||
// and user may want to turn off while leaving Big Integer optos on
|
||||
|
@ -200,17 +211,9 @@ void CleanUp();
|
|||
|
||||
#ifdef USE_SYS_STL
|
||||
// use system STL
|
||||
#define STL_VECTOR_FILE <vector>
|
||||
#define STL_LIST_FILE <list>
|
||||
#define STL_ALGORITHM_FILE <algorithm>
|
||||
#define STL_MEMORY_FILE <memory>
|
||||
#define STL_NAMESPACE std
|
||||
#else
|
||||
// use mySTL
|
||||
#define STL_VECTOR_FILE "vector.hpp"
|
||||
#define STL_LIST_FILE "list.hpp"
|
||||
#define STL_ALGORITHM_FILE "algorithm.hpp"
|
||||
#define STL_MEMORY_FILE "memory.hpp"
|
||||
#define STL_NAMESPACE mySTL
|
||||
#endif
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ namespace TaoCrypt {
|
|||
enum Mode { ECB, CBC };
|
||||
|
||||
|
||||
|
||||
// BlockCipher abstraction
|
||||
template<CipherDir DIR, class T, Mode MODE>
|
||||
class BlockCipher {
|
||||
|
@ -63,14 +64,16 @@ class Mode_BASE : public virtual_base {
|
|||
public:
|
||||
enum { MaxBlockSz = 16 };
|
||||
|
||||
explicit Mode_BASE(int sz)
|
||||
explicit Mode_BASE(int sz, CipherDir dir, Mode mode)
|
||||
: blockSz_(sz), reg_(reinterpret_cast<byte*>(r_)),
|
||||
tmp_(reinterpret_cast<byte*>(t_))
|
||||
tmp_(reinterpret_cast<byte*>(t_)), dir_(dir), mode_(mode)
|
||||
{
|
||||
assert(sz <= MaxBlockSz);
|
||||
}
|
||||
virtual ~Mode_BASE() {}
|
||||
|
||||
virtual void Process(byte*, const byte*, word32);
|
||||
|
||||
void SetIV(const byte* iv) { memcpy(reg_, iv, blockSz_); }
|
||||
protected:
|
||||
int blockSz_;
|
||||
|
@ -80,6 +83,9 @@ protected:
|
|||
word32 r_[MaxBlockSz / sizeof(word32)]; // align reg_ on word32
|
||||
word32 t_[MaxBlockSz / sizeof(word32)]; // align tmp_ on word32
|
||||
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
void ECB_Process(byte*, const byte*, word32);
|
||||
void CBC_Encrypt(byte*, const byte*, word32);
|
||||
void CBC_Decrypt(byte*, const byte*, word32);
|
||||
|
@ -92,6 +98,18 @@ private:
|
|||
};
|
||||
|
||||
|
||||
inline void Mode_BASE::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
|
||||
// ECB Process blocks
|
||||
inline void Mode_BASE::ECB_Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
|
|
|
@ -31,6 +31,11 @@
|
|||
|
||||
#include "hash.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_RIPEMD_ASM
|
||||
#endif
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
|
@ -49,7 +54,9 @@ public:
|
|||
RIPEMD160(const RIPEMD160&);
|
||||
RIPEMD160& operator= (const RIPEMD160&);
|
||||
|
||||
#ifdef DO_RIPEMD_ASM
|
||||
void Update(const byte*, word32);
|
||||
#endif
|
||||
void Init();
|
||||
void Swap(RIPEMD160&);
|
||||
private:
|
||||
|
|
|
@ -239,7 +239,8 @@ bool RSA_Encryptor<Pad>::SSL_Verify(const byte* message, word32 sz,
|
|||
const byte* sig)
|
||||
{
|
||||
ByteBlock plain(PK_Lengths(key_.GetModulus()).FixedMaxPlaintextLength());
|
||||
SSL_Decrypt(key_, sig, plain.get_buffer());
|
||||
if (SSL_Decrypt(key_, sig, plain.get_buffer()) != sz)
|
||||
return false; // not right justified or bad padding
|
||||
|
||||
if ( (memcmp(plain.get_buffer(), message, sz)) == 0)
|
||||
return true;
|
||||
|
|
|
@ -31,6 +31,11 @@
|
|||
|
||||
#include "hash.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_SHA_ASM
|
||||
#endif
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
|
@ -46,7 +51,9 @@ public:
|
|||
word32 getDigestSize() const { return DIGEST_SIZE; }
|
||||
word32 getPadSize() const { return PAD_SIZE; }
|
||||
|
||||
#ifdef DO_SHA_ASM
|
||||
void Update(const byte* data, word32 len);
|
||||
#endif
|
||||
void Init();
|
||||
|
||||
SHA(const SHA&);
|
||||
|
|
|
@ -32,12 +32,20 @@
|
|||
|
||||
#include "misc.hpp"
|
||||
#include "modes.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_TWOFISH_ASM
|
||||
#endif
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
enum { TWOFISH_BLOCK_SIZE = 16 };
|
||||
|
@ -49,15 +57,14 @@ public:
|
|||
enum { BLOCK_SIZE = TWOFISH_BLOCK_SIZE };
|
||||
|
||||
Twofish(CipherDir DIR, Mode MODE)
|
||||
: Mode_BASE(BLOCK_SIZE), dir_(DIR), mode_(MODE) {}
|
||||
: Mode_BASE(BLOCK_SIZE, DIR, MODE) {}
|
||||
|
||||
#ifdef DO_TWOFISH_ASM
|
||||
void Process(byte*, const byte*, word32);
|
||||
#endif
|
||||
void SetKey(const byte* key, word32 sz, CipherDir fake = ENCRYPTION);
|
||||
void SetIV(const byte* iv) { memcpy(r_, iv, BLOCK_SIZE); }
|
||||
private:
|
||||
CipherDir dir_;
|
||||
Mode mode_;
|
||||
|
||||
static const byte q_[2][256];
|
||||
static const word32 mds_[4][256];
|
||||
|
||||
|
|
|
@ -34,33 +34,19 @@
|
|||
#include "aes.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_AES_ASM
|
||||
#endif
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
#if !defined(DO_AES_ASM)
|
||||
|
||||
// Generic Version
|
||||
void AES::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
#else
|
||||
#if defined(DO_AES_ASM)
|
||||
|
||||
// ia32 optimized version
|
||||
void AES::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (!isMMX) {
|
||||
Mode_BASE::Process(out, in, sz);
|
||||
return;
|
||||
}
|
||||
|
||||
word32 blocks = sz / BLOCK_SIZE;
|
||||
|
||||
if (mode_ == ECB)
|
||||
|
|
|
@ -29,7 +29,11 @@
|
|||
|
||||
#include "runtime.hpp"
|
||||
#include "algebra.hpp"
|
||||
#include STL_VECTOR_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <vector>
|
||||
#else
|
||||
#include "vector.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
|
|
@ -80,12 +80,18 @@ inline unsigned int MakeByte(word32& x, word32& y, byte* s)
|
|||
} // namespace
|
||||
|
||||
|
||||
#ifndef DO_ARC4_ASM
|
||||
|
||||
void ARC4::Process(byte* out, const byte* in, word32 length)
|
||||
{
|
||||
if (length == 0) return;
|
||||
|
||||
#ifdef DO_ARC4_ASM
|
||||
if (isMMX) {
|
||||
AsmProcess(out, in, length);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
byte *const s = state_;
|
||||
word32 x = x_;
|
||||
word32 y = y_;
|
||||
|
@ -100,13 +106,16 @@ void ARC4::Process(byte* out, const byte* in, word32 length)
|
|||
y_ = y;
|
||||
}
|
||||
|
||||
#else // DO_ARC4_ASM
|
||||
|
||||
|
||||
#ifdef DO_ARC4_ASM
|
||||
|
||||
#ifdef _MSC_VER
|
||||
__declspec(naked)
|
||||
#else
|
||||
__attribute__ ((noinline))
|
||||
#endif
|
||||
void ARC4::Process(byte* out, const byte* in, word32 length)
|
||||
void ARC4::AsmProcess(byte* out, const byte* in, word32 length)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
#define AS1(x) asm(#x);
|
||||
|
|
|
@ -37,34 +37,21 @@
|
|||
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_BLOWFISH_ASM
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
#if !defined(DO_BLOWFISH_ASM)
|
||||
|
||||
// Generic Version
|
||||
void Blowfish::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
#else
|
||||
#if defined(DO_BLOWFISH_ASM)
|
||||
|
||||
// ia32 optimized version
|
||||
void Blowfish::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (!isMMX) {
|
||||
Mode_BASE::Process(out, in, sz);
|
||||
return;
|
||||
}
|
||||
|
||||
word32 blocks = sz / BLOCK_SIZE;
|
||||
|
||||
if (mode_ == ECB)
|
||||
|
|
|
@ -34,16 +34,16 @@
|
|||
|
||||
#include "runtime.hpp"
|
||||
#include "des.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_DES_ASM
|
||||
#endif
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
@ -357,18 +357,6 @@ void BasicDES::RawProcessBlock(word32& lIn, word32& rIn) const
|
|||
}
|
||||
|
||||
|
||||
void DES::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
|
||||
|
||||
typedef BlockGetAndPut<word32, BigEndian> Block;
|
||||
|
||||
|
@ -386,17 +374,6 @@ void DES::ProcessAndXorBlock(const byte* in, const byte* xOr, byte* out) const
|
|||
}
|
||||
|
||||
|
||||
void DES_EDE2::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
void DES_EDE2::SetKey(const byte* key, word32 sz, CipherDir dir)
|
||||
{
|
||||
des1_.SetKey(key, sz, dir);
|
||||
|
@ -429,25 +406,16 @@ void DES_EDE3::SetKey(const byte* key, word32 sz, CipherDir dir)
|
|||
|
||||
|
||||
|
||||
#if !defined(DO_DES_ASM)
|
||||
|
||||
// Generic Version
|
||||
void DES_EDE3::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
#else
|
||||
#if defined(DO_DES_ASM)
|
||||
|
||||
// ia32 optimized version
|
||||
void DES_EDE3::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (!isMMX) {
|
||||
Mode_BASE::Process(out, in, sz);
|
||||
return;
|
||||
}
|
||||
|
||||
word32 blocks = sz / DES_BLOCK_SIZE;
|
||||
|
||||
if (mode_ == CBC)
|
||||
|
|
|
@ -55,12 +55,15 @@ extern "C" word myUMULH(word, word);
|
|||
#pragma intrinsic (myUMULH)
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef SSE2_INTRINSICS_AVAILABLE
|
||||
#ifdef __GNUC__
|
||||
#include <xmmintrin.h>
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#ifdef TAOCRYPT_MEMALIGN_AVAILABLE
|
||||
#include <malloc.h>
|
||||
#else
|
||||
|
@ -1015,44 +1018,20 @@ void Portable::Multiply8Bottom(word *R, const word *A, const word *B)
|
|||
|
||||
// ************** x86 feature detection ***************
|
||||
|
||||
static bool s_sse2Enabled = true;
|
||||
|
||||
static void CpuId(word32 input, word32 *output)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__asm__
|
||||
(
|
||||
// save ebx in case -fPIC is being used
|
||||
"push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx"
|
||||
: "=a" (output[0]), "=D" (output[1]), "=c" (output[2]), "=d"(output[3])
|
||||
: "a" (input)
|
||||
);
|
||||
#else
|
||||
__asm
|
||||
{
|
||||
mov eax, input
|
||||
cpuid
|
||||
mov edi, output
|
||||
mov [edi], eax
|
||||
mov [edi+4], ebx
|
||||
mov [edi+8], ecx
|
||||
mov [edi+12], edx
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef SSE2_INTRINSICS_AVAILABLE
|
||||
|
||||
#ifndef _MSC_VER
|
||||
static jmp_buf s_env;
|
||||
static void SigIllHandler(int)
|
||||
{
|
||||
static jmp_buf s_env;
|
||||
static void SigIllHandler(int)
|
||||
{
|
||||
longjmp(s_env, 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool HasSSE2()
|
||||
{
|
||||
if (!s_sse2Enabled)
|
||||
if (!IsPentium())
|
||||
return false;
|
||||
|
||||
word32 cpuid[4];
|
||||
|
@ -1081,23 +1060,22 @@ static bool HasSSE2()
|
|||
if (setjmp(s_env))
|
||||
result = false;
|
||||
else
|
||||
__asm __volatile ("xorps %xmm0, %xmm0");
|
||||
__asm __volatile ("xorpd %xmm0, %xmm0");
|
||||
|
||||
signal(SIGILL, oldHandler);
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif // SSE2_INTRINSICS_AVAILABLE
|
||||
|
||||
|
||||
static bool IsP4()
|
||||
{
|
||||
word32 cpuid[4];
|
||||
|
||||
CpuId(0, cpuid);
|
||||
STL::swap(cpuid[2], cpuid[3]);
|
||||
if (memcmp(cpuid+1, "GenuineIntel", 12) != 0)
|
||||
if (!IsPentium())
|
||||
return false;
|
||||
|
||||
word32 cpuid[4];
|
||||
|
||||
CpuId(1, cpuid);
|
||||
return ((cpuid[0] >> 8) & 0xf) == 0xf;
|
||||
}
|
||||
|
@ -1147,7 +1125,12 @@ static PMul s_pMul4, s_pMul8, s_pMul8B;
|
|||
|
||||
static void SetPentiumFunctionPointers()
|
||||
{
|
||||
if (IsP4())
|
||||
if (!IsPentium())
|
||||
{
|
||||
s_pAdd = &Portable::Add;
|
||||
s_pSub = &Portable::Subtract;
|
||||
}
|
||||
else if (IsP4())
|
||||
{
|
||||
s_pAdd = &P4Optimized::Add;
|
||||
s_pSub = &P4Optimized::Subtract;
|
||||
|
@ -1159,7 +1142,13 @@ static void SetPentiumFunctionPointers()
|
|||
}
|
||||
|
||||
#ifdef SSE2_INTRINSICS_AVAILABLE
|
||||
if (HasSSE2())
|
||||
if (!IsPentium())
|
||||
{
|
||||
s_pMul4 = &Portable::Multiply4;
|
||||
s_pMul8 = &Portable::Multiply8;
|
||||
s_pMul8B = &Portable::Multiply8Bottom;
|
||||
}
|
||||
else if (HasSSE2())
|
||||
{
|
||||
s_pMul4 = &P4Optimized::Multiply4;
|
||||
s_pMul8 = &P4Optimized::Multiply8;
|
||||
|
@ -1177,11 +1166,6 @@ static void SetPentiumFunctionPointers()
|
|||
static const char s_RunAtStartupSetPentiumFunctionPointers =
|
||||
(SetPentiumFunctionPointers(), 0);
|
||||
|
||||
void DisableSSE2()
|
||||
{
|
||||
s_sse2Enabled = false;
|
||||
SetPentiumFunctionPointers();
|
||||
}
|
||||
|
||||
class LowLevel : public PentiumOptimized
|
||||
{
|
||||
|
@ -3984,6 +3968,9 @@ Integer CRT(const Integer &xp, const Integer &p, const Integer &xq,
|
|||
template hword DivideThreeWordsByTwo<hword, Word>(hword*, hword, hword, Word*);
|
||||
#endif
|
||||
template word DivideThreeWordsByTwo<word, DWord>(word*, word, word, DWord*);
|
||||
#ifdef SSE2_INTRINSICS_AVAILABLE
|
||||
template class AlignedAllocator<word>;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
REM quick and dirty build file for testing different MSDEVs
|
||||
setlocal
|
||||
|
||||
set myFLAGS= /I../include /I../../mySTL /c /W3 /G6 /O2
|
||||
set myFLAGS= /I../include /I../mySTL /c /W3 /G6 /O2
|
||||
|
||||
cl %myFLAGS% aes.cpp
|
||||
cl %myFLAGS% aestables.cpp
|
||||
|
@ -21,6 +21,7 @@ cl %myFLAGS% file.cpp
|
|||
cl %myFLAGS% hash.cpp
|
||||
cl %myFLAGS% integer.cpp
|
||||
cl %myFLAGS% md2.cpp
|
||||
cl %myFLAGS% md4.cpp
|
||||
cl %myFLAGS% md5.cpp
|
||||
|
||||
cl %myFLAGS% misc.cpp
|
||||
|
@ -33,5 +34,5 @@ cl %myFLAGS% template_instnt.cpp
|
|||
cl %myFLAGS% tftables.cpp
|
||||
cl %myFLAGS% twofish.cpp
|
||||
|
||||
link.exe -lib /out:taocrypt.lib aes.obj aestables.obj algebra.obj arc4.obj asn.obj bftables.obj blowfish.obj coding.obj des.obj dh.obj dsa.obj file.obj hash.obj integer.obj md2.obj md5.obj misc.obj random.obj ripemd.obj rsa.obj sha.obj template_instnt.obj tftables.obj twofish.obj
|
||||
link.exe -lib /out:taocrypt.lib aes.obj aestables.obj algebra.obj arc4.obj asn.obj bftables.obj blowfish.obj coding.obj des.obj dh.obj dsa.obj file.obj hash.obj integer.obj md2.obj md4.obj md5.obj misc.obj random.obj ripemd.obj rsa.obj sha.obj template_instnt.obj tftables.obj twofish.obj
|
||||
|
||||
|
|
|
@ -28,7 +28,11 @@
|
|||
|
||||
#include "runtime.hpp"
|
||||
#include "md4.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
|
|
@ -28,15 +28,16 @@
|
|||
|
||||
#include "runtime.hpp"
|
||||
#include "md5.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_MD5_ASM
|
||||
#endif
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
@ -84,10 +85,17 @@ void MD5::Swap(MD5& other)
|
|||
}
|
||||
|
||||
|
||||
// Update digest with data of size len, do in blocks
|
||||
#ifdef DO_MD5_ASM
|
||||
|
||||
// Update digest with data of size len
|
||||
void MD5::Update(const byte* data, word32 len)
|
||||
{
|
||||
byte* local = (byte*)buffer_;
|
||||
if (!isMMX) {
|
||||
HASHwithTransform::Update(data, len);
|
||||
return;
|
||||
}
|
||||
|
||||
byte* local = reinterpret_cast<byte*>(buffer_);
|
||||
|
||||
// remove buffered data if possible
|
||||
if (buffLen_) {
|
||||
|
@ -99,27 +107,14 @@ void MD5::Update(const byte* data, word32 len)
|
|||
len -= add;
|
||||
|
||||
if (buffLen_ == BLOCK_SIZE) {
|
||||
ByteReverseIf(local, local, BLOCK_SIZE, LittleEndianOrder);
|
||||
Transform();
|
||||
AddLength(BLOCK_SIZE);
|
||||
buffLen_ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// do block size transforms or all at once for asm
|
||||
// at once for asm
|
||||
if (buffLen_ == 0) {
|
||||
#ifndef DO_MD5_ASM
|
||||
while (len >= BLOCK_SIZE) {
|
||||
memcpy(&local[0], data, BLOCK_SIZE);
|
||||
|
||||
data += BLOCK_SIZE;
|
||||
len -= BLOCK_SIZE;
|
||||
|
||||
ByteReverseIf(local, local, BLOCK_SIZE, LittleEndianOrder);
|
||||
Transform();
|
||||
AddLength(BLOCK_SIZE);
|
||||
}
|
||||
#else
|
||||
word32 times = len / BLOCK_SIZE;
|
||||
if (times) {
|
||||
AsmTransform(data, times);
|
||||
|
@ -128,7 +123,6 @@ void MD5::Update(const byte* data, word32 len)
|
|||
len -= add;
|
||||
data += add;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// cache any data left
|
||||
|
@ -139,7 +133,6 @@ void MD5::Update(const byte* data, word32 len)
|
|||
}
|
||||
|
||||
|
||||
#ifdef DO_MD5_ASM
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -30,6 +30,20 @@
|
|||
#include "misc.hpp"
|
||||
|
||||
|
||||
#ifdef __GNUC__
|
||||
#include <signal.h>
|
||||
#include <setjmp.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#ifdef YASSL_PURE_C
|
||||
|
||||
void* operator new(size_t sz, TaoCrypt::new_t)
|
||||
|
@ -156,5 +170,129 @@ unsigned long Crop(unsigned long value, unsigned int size)
|
|||
}
|
||||
|
||||
|
||||
|
||||
#ifdef TAOCRYPT_X86ASM_AVAILABLE
|
||||
|
||||
#ifndef _MSC_VER
|
||||
static jmp_buf s_env;
|
||||
static void SigIllHandler(int)
|
||||
{
|
||||
longjmp(s_env, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bool HaveCpuId()
|
||||
{
|
||||
#ifdef _MSC_VER
|
||||
__try
|
||||
{
|
||||
__asm
|
||||
{
|
||||
mov eax, 0
|
||||
cpuid
|
||||
}
|
||||
}
|
||||
__except (1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else
|
||||
typedef void (*SigHandler)(int);
|
||||
|
||||
SigHandler oldHandler = signal(SIGILL, SigIllHandler);
|
||||
if (oldHandler == SIG_ERR)
|
||||
return false;
|
||||
|
||||
bool result = true;
|
||||
if (setjmp(s_env))
|
||||
result = false;
|
||||
else
|
||||
__asm__ __volatile
|
||||
(
|
||||
// save ebx in case -fPIC is being used
|
||||
"push %%ebx; mov $0, %%eax; cpuid; pop %%ebx"
|
||||
:
|
||||
:
|
||||
: "%eax", "%ecx", "%edx"
|
||||
);
|
||||
|
||||
signal(SIGILL, oldHandler);
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void CpuId(word32 input, word32 *output)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__asm__
|
||||
(
|
||||
// save ebx in case -fPIC is being used
|
||||
"push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx"
|
||||
: "=a" (output[0]), "=D" (output[1]), "=c" (output[2]), "=d"(output[3])
|
||||
: "a" (input)
|
||||
);
|
||||
#else
|
||||
__asm
|
||||
{
|
||||
mov eax, input
|
||||
cpuid
|
||||
mov edi, output
|
||||
mov [edi], eax
|
||||
mov [edi+4], ebx
|
||||
mov [edi+8], ecx
|
||||
mov [edi+12], edx
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
bool IsPentium()
|
||||
{
|
||||
if (!HaveCpuId())
|
||||
return false;
|
||||
|
||||
word32 cpuid[4];
|
||||
|
||||
CpuId(0, cpuid);
|
||||
STL::swap(cpuid[2], cpuid[3]);
|
||||
if (memcmp(cpuid+1, "GenuineIntel", 12) != 0)
|
||||
return false;
|
||||
|
||||
CpuId(1, cpuid);
|
||||
byte family = ((cpuid[0] >> 8) & 0xf);
|
||||
if (family < 5)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static bool IsMmx()
|
||||
{
|
||||
if (!IsPentium())
|
||||
return false;
|
||||
|
||||
word32 cpuid[4];
|
||||
|
||||
CpuId(1, cpuid);
|
||||
if ((cpuid[3] & (1 << 23)) == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool isMMX = IsMmx();
|
||||
|
||||
|
||||
#endif // TAOCRYPT_X86ASM_AVAILABLE
|
||||
|
||||
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
|
|
|
@ -50,8 +50,11 @@ namespace TaoCrypt {
|
|||
RandomNumberGenerator::RandomNumberGenerator()
|
||||
{
|
||||
byte key[32];
|
||||
byte junk[256];
|
||||
|
||||
seed_.GenerateSeed(key, sizeof(key));
|
||||
cipher_.SetKey(key, sizeof(key));
|
||||
GenerateBlock(junk, sizeof(junk)); // rid initial state
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -28,15 +28,16 @@
|
|||
|
||||
#include "runtime.hpp"
|
||||
#include "ripemd.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_RIPEMD_ASM
|
||||
#endif
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
@ -86,10 +87,17 @@ void RIPEMD160::Swap(RIPEMD160& other)
|
|||
}
|
||||
|
||||
|
||||
// Update digest with data of size len, do in blocks
|
||||
#ifdef DO_RIPEMD_ASM
|
||||
|
||||
// Update digest with data of size len
|
||||
void RIPEMD160::Update(const byte* data, word32 len)
|
||||
{
|
||||
byte* local = (byte*)buffer_;
|
||||
if (!isMMX) {
|
||||
HASHwithTransform::Update(data, len);
|
||||
return;
|
||||
}
|
||||
|
||||
byte* local = reinterpret_cast<byte*>(buffer_);
|
||||
|
||||
// remove buffered data if possible
|
||||
if (buffLen_) {
|
||||
|
@ -101,27 +109,14 @@ void RIPEMD160::Update(const byte* data, word32 len)
|
|||
len -= add;
|
||||
|
||||
if (buffLen_ == BLOCK_SIZE) {
|
||||
ByteReverseIf(local, local, BLOCK_SIZE, LittleEndianOrder);
|
||||
Transform();
|
||||
AddLength(BLOCK_SIZE);
|
||||
buffLen_ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// do block size transforms or all at once for asm
|
||||
// all at once for asm
|
||||
if (buffLen_ == 0) {
|
||||
#ifndef DO_RIPEMD_ASM
|
||||
while (len >= BLOCK_SIZE) {
|
||||
memcpy(&local[0], data, BLOCK_SIZE);
|
||||
|
||||
data += BLOCK_SIZE;
|
||||
len -= BLOCK_SIZE;
|
||||
|
||||
ByteReverseIf(local, local, BLOCK_SIZE, LittleEndianOrder);
|
||||
Transform();
|
||||
AddLength(BLOCK_SIZE);
|
||||
}
|
||||
#else
|
||||
word32 times = len / BLOCK_SIZE;
|
||||
if (times) {
|
||||
AsmTransform(data, times);
|
||||
|
@ -130,7 +125,6 @@ void RIPEMD160::Update(const byte* data, word32 len)
|
|||
len -= add;
|
||||
data += add;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// cache any data left
|
||||
|
@ -140,6 +134,8 @@ void RIPEMD160::Update(const byte* data, word32 len)
|
|||
}
|
||||
}
|
||||
|
||||
#endif // DO_RIPEMD_ASM
|
||||
|
||||
|
||||
// for all
|
||||
#define F(x, y, z) (x ^ y ^ z)
|
||||
|
|
|
@ -28,16 +28,16 @@
|
|||
#include "runtime.hpp"
|
||||
#include <string.h>
|
||||
#include "sha.hpp"
|
||||
#include STL_ALGORITHM_FILE
|
||||
#ifdef USE_SYS_STL
|
||||
#include <algorithm>
|
||||
#else
|
||||
#include "algorithm.hpp"
|
||||
#endif
|
||||
|
||||
|
||||
namespace STL = STL_NAMESPACE;
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_SHA_ASM
|
||||
#endif
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
@ -108,10 +108,18 @@ void SHA::Swap(SHA& other)
|
|||
}
|
||||
|
||||
|
||||
// Update digest with data of size len, do in blocks
|
||||
|
||||
#ifdef DO_SHA_ASM
|
||||
|
||||
// Update digest with data of size len
|
||||
void SHA::Update(const byte* data, word32 len)
|
||||
{
|
||||
byte* local = (byte*)buffer_;
|
||||
if (!isMMX) {
|
||||
HASHwithTransform::Update(data, len);
|
||||
return;
|
||||
}
|
||||
|
||||
byte* local = reinterpret_cast<byte*>(buffer_);
|
||||
|
||||
// remove buffered data if possible
|
||||
if (buffLen_) {
|
||||
|
@ -123,27 +131,15 @@ void SHA::Update(const byte* data, word32 len)
|
|||
len -= add;
|
||||
|
||||
if (buffLen_ == BLOCK_SIZE) {
|
||||
ByteReverseIf(local, local, BLOCK_SIZE, BigEndianOrder);
|
||||
ByteReverse(local, local, BLOCK_SIZE);
|
||||
Transform();
|
||||
AddLength(BLOCK_SIZE);
|
||||
buffLen_ = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// do block size transforms or all at once for asm
|
||||
// all at once for asm
|
||||
if (buffLen_ == 0) {
|
||||
#ifndef DO_SHA_ASM
|
||||
while (len >= BLOCK_SIZE) {
|
||||
memcpy(&local[0], data, BLOCK_SIZE);
|
||||
|
||||
data += BLOCK_SIZE;
|
||||
len -= BLOCK_SIZE;
|
||||
|
||||
ByteReverseIf(local, local, BLOCK_SIZE, BigEndianOrder);
|
||||
Transform();
|
||||
AddLength(BLOCK_SIZE);
|
||||
}
|
||||
#else
|
||||
word32 times = len / BLOCK_SIZE;
|
||||
if (times) {
|
||||
AsmTransform(data, times);
|
||||
|
@ -152,7 +148,6 @@ void SHA::Update(const byte* data, word32 len)
|
|||
len -= add;
|
||||
data += add;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// cache any data left
|
||||
|
@ -162,6 +157,8 @@ void SHA::Update(const byte* data, word32 len)
|
|||
}
|
||||
}
|
||||
|
||||
#endif // DO_SHA_ASM
|
||||
|
||||
|
||||
void SHA::Transform()
|
||||
{
|
||||
|
|
|
@ -35,33 +35,20 @@
|
|||
#include "twofish.hpp"
|
||||
|
||||
|
||||
#if defined(TAOCRYPT_X86ASM_AVAILABLE) && defined(TAO_ASM)
|
||||
#define DO_TWOFISH_ASM
|
||||
#endif
|
||||
|
||||
|
||||
namespace TaoCrypt {
|
||||
|
||||
|
||||
#if !defined(DO_TWOFISH_ASM)
|
||||
|
||||
// Generic Version
|
||||
void Twofish::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (mode_ == ECB)
|
||||
ECB_Process(out, in, sz);
|
||||
else if (mode_ == CBC)
|
||||
if (dir_ == ENCRYPTION)
|
||||
CBC_Encrypt(out, in, sz);
|
||||
else
|
||||
CBC_Decrypt(out, in, sz);
|
||||
}
|
||||
|
||||
#else
|
||||
#if defined(DO_TWOFISH_ASM)
|
||||
|
||||
// ia32 optimized version
|
||||
void Twofish::Process(byte* out, const byte* in, word32 sz)
|
||||
{
|
||||
if (!isMMX) {
|
||||
Mode_BASE::Process(out, in, sz);
|
||||
return;
|
||||
}
|
||||
|
||||
word32 blocks = sz / BLOCK_SIZE;
|
||||
|
||||
if (mode_ == ECB)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
REM quick and dirty build file for testing different MSDEVs
|
||||
setlocal
|
||||
|
||||
set myFLAGS= /I../include /I../../mySTL /c /W3 /G6 /O2
|
||||
set myFLAGS= /I../include /I../mySTL /c /W3 /G6 /O2
|
||||
|
||||
cl %myFLAGS% test.cpp
|
||||
|
||||
|
|
|
@ -247,6 +247,8 @@ void taocrypt_test(void* args)
|
|||
args.argv = argv;
|
||||
|
||||
taocrypt_test(&args);
|
||||
TaoCrypt::CleanUp();
|
||||
|
||||
return args.return_code;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
REM quick and dirty build file for testing different MSDEVs
|
||||
setlocal
|
||||
|
||||
set myFLAGS= /I../include /I../taocrypt/include /I../mySTL /c /W3 /G6 /O2 /MT /D"WIN32" /D"NO_MAIN_DRIVER"
|
||||
set myFLAGS= /I../include /I../taocrypt/include /I../taocrypt/mySTL /c /W3 /G6 /O2 /MT /D"WIN32" /D"NO_MAIN_DRIVER"
|
||||
|
||||
cl %myFLAGS% testsuite.cpp
|
||||
cl %myFLAGS% ../examples/client/client.cpp
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
//#define NON_BLOCKING // test server and client example (not echos)
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winsock2.h>
|
||||
#include <process.h>
|
||||
|
@ -23,16 +25,17 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <pthread.h>
|
||||
#ifdef NON_BLOCKING
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#define SOCKET_T int
|
||||
#endif /* _WIN32 */
|
||||
|
||||
|
||||
#if !defined(_SOCKLEN_T) && defined(_WIN32)
|
||||
#if !defined(_SOCKLEN_T) && \
|
||||
(defined(_WIN32) || defined(__NETWARE__) || defined(__APPLE__))
|
||||
typedef int socklen_t;
|
||||
#endif
|
||||
#if !defined(_SOCKLEN_T) && defined(__NETWARE__)
|
||||
typedef size_t socklen_t;
|
||||
#endif
|
||||
|
||||
|
||||
// Check type of third arg to accept
|
||||
|
@ -262,6 +265,20 @@ inline void set_args(int& argc, char**& argv, func_args& args)
|
|||
}
|
||||
|
||||
|
||||
inline void tcp_set_nonblocking(SOCKET_T& sockfd)
|
||||
{
|
||||
#ifdef NON_BLOCKING
|
||||
#ifdef _WIN32
|
||||
unsigned long blocking = 1;
|
||||
int ret = ioctlsocket(sockfd, FIONBIO, &blocking);
|
||||
#else
|
||||
int flags = fcntl(sockfd, F_GETFL, 0);
|
||||
int ret = fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
inline void tcp_socket(SOCKET_T& sockfd, sockaddr_in& addr)
|
||||
{
|
||||
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
|
@ -289,8 +306,7 @@ inline void tcp_connect(SOCKET_T& sockfd)
|
|||
sockaddr_in addr;
|
||||
tcp_socket(sockfd, addr);
|
||||
|
||||
if (connect(sockfd, (const sockaddr*)&addr, sizeof(addr)) != 0)
|
||||
{
|
||||
if (connect(sockfd, (const sockaddr*)&addr, sizeof(addr)) != 0) {
|
||||
tcp_close(sockfd);
|
||||
err_sys("tcp connect failed");
|
||||
}
|
||||
|
@ -302,19 +318,18 @@ inline void tcp_listen(SOCKET_T& sockfd)
|
|||
sockaddr_in addr;
|
||||
tcp_socket(sockfd, addr);
|
||||
|
||||
if (bind(sockfd, (const sockaddr*)&addr, sizeof(addr)) != 0)
|
||||
{
|
||||
if (bind(sockfd, (const sockaddr*)&addr, sizeof(addr)) != 0) {
|
||||
tcp_close(sockfd);
|
||||
err_sys("tcp bind failed");
|
||||
}
|
||||
if (listen(sockfd, 3) != 0)
|
||||
{
|
||||
if (listen(sockfd, 3) != 0) {
|
||||
tcp_close(sockfd);
|
||||
err_sys("tcp listen failed");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
inline void tcp_accept(SOCKET_T& sockfd, SOCKET_T& clientfd, func_args& args)
|
||||
{
|
||||
tcp_listen(sockfd);
|
||||
|
@ -333,11 +348,14 @@ inline void tcp_accept(SOCKET_T& sockfd, SOCKET_T& clientfd, func_args& args)
|
|||
|
||||
clientfd = accept(sockfd, (sockaddr*)&client, (ACCEPT_THIRD_T)&client_len);
|
||||
|
||||
if (clientfd == -1)
|
||||
{
|
||||
if (clientfd == -1) {
|
||||
tcp_close(sockfd);
|
||||
err_sys("tcp accept failed");
|
||||
}
|
||||
|
||||
#ifdef NON_BLOCKING
|
||||
tcp_set_nonblocking(clientfd);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -363,25 +381,30 @@ inline void showPeer(SSL* ssl)
|
|||
|
||||
inline DH* set_tmpDH(SSL_CTX* ctx)
|
||||
{
|
||||
static unsigned char dh512_p[] =
|
||||
static unsigned char dh1024_p[] =
|
||||
{
|
||||
0xDA,0x58,0x3C,0x16,0xD9,0x85,0x22,0x89,0xD0,0xE4,0xAF,0x75,
|
||||
0x6F,0x4C,0xCA,0x92,0xDD,0x4B,0xE5,0x33,0xB8,0x04,0xFB,0x0F,
|
||||
0xED,0x94,0xEF,0x9C,0x8A,0x44,0x03,0xED,0x57,0x46,0x50,0xD3,
|
||||
0x69,0x99,0xDB,0x29,0xD7,0x76,0x27,0x6B,0xA2,0xD3,0xD4,0x12,
|
||||
0xE2,0x18,0xF4,0xDD,0x1E,0x08,0x4C,0xF6,0xD8,0x00,0x3E,0x7C,
|
||||
0x47,0x74,0xE8,0x33,
|
||||
0xE6, 0x96, 0x9D, 0x3D, 0x49, 0x5B, 0xE3, 0x2C, 0x7C, 0xF1, 0x80, 0xC3,
|
||||
0xBD, 0xD4, 0x79, 0x8E, 0x91, 0xB7, 0x81, 0x82, 0x51, 0xBB, 0x05, 0x5E,
|
||||
0x2A, 0x20, 0x64, 0x90, 0x4A, 0x79, 0xA7, 0x70, 0xFA, 0x15, 0xA2, 0x59,
|
||||
0xCB, 0xD5, 0x23, 0xA6, 0xA6, 0xEF, 0x09, 0xC4, 0x30, 0x48, 0xD5, 0xA2,
|
||||
0x2F, 0x97, 0x1F, 0x3C, 0x20, 0x12, 0x9B, 0x48, 0x00, 0x0E, 0x6E, 0xDD,
|
||||
0x06, 0x1C, 0xBC, 0x05, 0x3E, 0x37, 0x1D, 0x79, 0x4E, 0x53, 0x27, 0xDF,
|
||||
0x61, 0x1E, 0xBB, 0xBE, 0x1B, 0xAC, 0x9B, 0x5C, 0x60, 0x44, 0xCF, 0x02,
|
||||
0x3D, 0x76, 0xE0, 0x5E, 0xEA, 0x9B, 0xAD, 0x99, 0x1B, 0x13, 0xA6, 0x3C,
|
||||
0x97, 0x4E, 0x9E, 0xF1, 0x83, 0x9E, 0xB5, 0xDB, 0x12, 0x51, 0x36, 0xF7,
|
||||
0x26, 0x2E, 0x56, 0xA8, 0x87, 0x15, 0x38, 0xDF, 0xD8, 0x23, 0xC6, 0x50,
|
||||
0x50, 0x85, 0xE2, 0x1F, 0x0D, 0xD5, 0xC8, 0x6B,
|
||||
};
|
||||
|
||||
static unsigned char dh512_g[] =
|
||||
static unsigned char dh1024_g[] =
|
||||
{
|
||||
0x02,
|
||||
};
|
||||
|
||||
DH* dh;
|
||||
if ( (dh = DH_new()) ) {
|
||||
dh->p = BN_bin2bn(dh512_p, sizeof(dh512_p), 0);
|
||||
dh->g = BN_bin2bn(dh512_g, sizeof(dh512_g), 0);
|
||||
dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), 0);
|
||||
dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), 0);
|
||||
}
|
||||
if (!dh->p || !dh->g) {
|
||||
DH_free(dh);
|
||||
|
|
|
@ -70,6 +70,7 @@ abi_check: $(HEADERS_ABI) mysql_version.h mysql_h.ic
|
|||
if [ @ICHECK@ != no ] ; then \
|
||||
@ICHECK@ --canonify --skip-from-re /usr/ -o $@.ic mysql.h; \
|
||||
@ICHECK@ --compare mysql_h.ic $@.ic; \
|
||||
$(RM) -f $@.ic; \
|
||||
fi; \
|
||||
touch abi_check;
|
||||
|
||||
|
|
|
@ -857,12 +857,6 @@ extern int my_getncpus();
|
|||
#else
|
||||
#define my_mmap(a,b,c,d,e,f) mmap(a,b,c,d,e,f)
|
||||
#endif
|
||||
#ifdef HAVE_GETPAGESIZE
|
||||
#define my_getpagesize() getpagesize()
|
||||
#else
|
||||
/* qnx ? */
|
||||
#define my_getpagesize() 8192
|
||||
#endif
|
||||
#define my_munmap(a,b) munmap((a),(b))
|
||||
|
||||
#else
|
||||
|
@ -880,16 +874,17 @@ extern int my_getncpus();
|
|||
#define HAVE_MMAP
|
||||
#endif
|
||||
|
||||
#ifndef __NETWARE__
|
||||
int my_getpagesize(void);
|
||||
#else
|
||||
#define my_getpagesize() 8192
|
||||
#endif
|
||||
|
||||
void *my_mmap(void *, size_t, int, int, int, my_off_t);
|
||||
int my_munmap(void *, size_t);
|
||||
#endif
|
||||
|
||||
/* my_getpagesize */
|
||||
#ifdef HAVE_GETPAGESIZE
|
||||
#define my_getpagesize() getpagesize()
|
||||
#else
|
||||
int my_getpagesize(void);
|
||||
#endif
|
||||
|
||||
int my_msync(int, void *, size_t, int);
|
||||
|
||||
/* character sets */
|
||||
|
|
|
@ -66,6 +66,7 @@ dist-hook:
|
|||
$(INSTALL_DATA) $(srcdir)/std_data/des_key_file $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.frm $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.MY* $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.cnf $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup50/BACKUP* $(distdir)/std_data/ndb_backup50
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51/BACKUP* $(distdir)/std_data/ndb_backup51
|
||||
|
@ -107,6 +108,7 @@ install-data-local:
|
|||
$(INSTALL_DATA) $(srcdir)/std_data/Moscow_leap $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.pem $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.frm $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.MY* $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.cnf $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup50/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup50
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup51
|
||||
|
|
|
@ -101,7 +101,7 @@ show slave status;
|
|||
|
||||
# Now we repeat 2), but with BEGIN in the same relay log as
|
||||
# COMMIT (to see if seeking into hot log is ok).
|
||||
|
||||
set @my_max_relay_log_size= @@global.max_relay_log_size;
|
||||
set global max_relay_log_size=0;
|
||||
|
||||
# This is really copy-paste of 2) of above
|
||||
|
@ -126,5 +126,6 @@ show slave status;
|
|||
connection master;
|
||||
drop table t1,t2,t3,t4;
|
||||
sync_slave_with_master;
|
||||
set global max_relay_log_size= @my_max_relay_log_size;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -34,6 +34,7 @@ reset slave;
|
|||
--echo # Test 1
|
||||
--echo #
|
||||
|
||||
set @my_max_binlog_size= @@global.max_binlog_size;
|
||||
set global max_binlog_size=8192;
|
||||
set global max_relay_log_size=8192-1; # mapped to 4096
|
||||
select @@global.max_relay_log_size;
|
||||
|
@ -130,6 +131,10 @@ flush logs;
|
|||
-- replace_column 3 <Binlog_Ignore_DB>
|
||||
show master status;
|
||||
|
||||
# Restore max_binlog_size
|
||||
connection slave;
|
||||
set global max_binlog_size= @my_max_binlog_size;
|
||||
|
||||
--echo #
|
||||
--echo # End of 4.1 tests
|
||||
--echo #
|
||||
|
|
|
@ -593,6 +593,10 @@ sub mtr_options_from_test_file($$) {
|
|||
|
||||
while ( my $line= <$F> )
|
||||
{
|
||||
|
||||
# Skip line if it start's with #
|
||||
next if ( $line =~ /^#/ );
|
||||
|
||||
# Match this line against tag in "tags" array
|
||||
foreach my $tag (@tags)
|
||||
{
|
||||
|
|
|
@ -13,6 +13,8 @@ sub mtr_tofile ($@);
|
|||
sub mtr_tonewfile($@);
|
||||
sub mtr_lastlinefromfile($);
|
||||
sub mtr_appendfile_to_file ($$);
|
||||
sub mtr_grab_file($);
|
||||
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
|
@ -129,6 +131,7 @@ sub unspace {
|
|||
return "$quote$string$quote";
|
||||
}
|
||||
|
||||
# Read a whole file, stripping leading and trailing whitespace.
|
||||
sub mtr_fromfile ($) {
|
||||
my $file= shift;
|
||||
|
||||
|
@ -182,5 +185,16 @@ sub mtr_appendfile_to_file ($$) {
|
|||
close TOFILE;
|
||||
}
|
||||
|
||||
# Read a whole file verbatim.
|
||||
sub mtr_grab_file($) {
|
||||
my $file= shift;
|
||||
open(FILE, '<', $file)
|
||||
or return undef;
|
||||
local $/= undef;
|
||||
my $data= scalar(<FILE>);
|
||||
close FILE;
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
|
|
@ -708,7 +708,7 @@ sub mtr_wait_blocking($) {
|
|||
}
|
||||
}
|
||||
|
||||
# Start "mysqladmin shutdown" for a specific mysqld
|
||||
# Start "mysqladmin <command>" for a specific mysqld
|
||||
sub mtr_mysqladmin_start($$$) {
|
||||
my $srv= shift;
|
||||
my $command= shift;
|
||||
|
@ -738,9 +738,8 @@ sub mtr_mysqladmin_start($$$) {
|
|||
# Shutdown time must be high as slave may be in reconnect
|
||||
mtr_add_arg($args, "--shutdown_timeout=$adm_shutdown_tmo");
|
||||
mtr_add_arg($args, "$command");
|
||||
my $path_mysqladmin_log= "$::opt_vardir/log/mysqladmin.log";
|
||||
my $pid= mtr_spawn($::exe_mysqladmin, $args,
|
||||
"", $path_mysqladmin_log, $path_mysqladmin_log, "",
|
||||
"", "", "", "",
|
||||
{ append_log_file => 1 });
|
||||
mtr_verbose("mtr_mysqladmin_start, pid: $pid");
|
||||
return $pid;
|
||||
|
|
|
@ -34,7 +34,12 @@ sub mtr_verbose (@);
|
|||
# We can't use diff -u or diff -a as these are not portable
|
||||
|
||||
sub mtr_show_failed_diff ($) {
|
||||
my $tname= shift;
|
||||
my $result_file_name= shift;
|
||||
|
||||
# The reject and log files have been dumped to
|
||||
# to filenames based on the result_file's name
|
||||
my $tname= basename($result_file_name);
|
||||
$tname=~ s/\..*$//;
|
||||
|
||||
my $reject_file= "r/$tname.reject";
|
||||
my $result_file= "r/$tname.result";
|
||||
|
|
|
@ -103,7 +103,6 @@ our $glob_mysql_bench_dir= undef;
|
|||
our $glob_hostname= undef;
|
||||
our $glob_scriptname= undef;
|
||||
our $glob_timers= undef;
|
||||
our $glob_use_running_server= 0;
|
||||
our $glob_use_running_ndbcluster= 0;
|
||||
our $glob_use_running_ndbcluster_slave= 0;
|
||||
our $glob_use_embedded_server= 0;
|
||||
|
@ -141,6 +140,7 @@ our $opt_verbose= 0; # Verbose output, enable with --verbose
|
|||
our $exe_master_mysqld;
|
||||
our $exe_mysql;
|
||||
our $exe_mysqladmin;
|
||||
our $exe_mysql_upgrade;
|
||||
our $exe_mysqlbinlog;
|
||||
our $exe_mysql_client_test;
|
||||
our $exe_mysqld;
|
||||
|
@ -150,6 +150,7 @@ our $exe_mysqlslap;
|
|||
our $exe_mysqlimport;
|
||||
our $exe_mysqlshow;
|
||||
our $exe_mysql_fix_system_tables;
|
||||
our $file_mysql_fix_privilege_tables;
|
||||
our $exe_mysqltest;
|
||||
our $exe_ndbd;
|
||||
our $exe_ndb_mgmd;
|
||||
|
@ -162,7 +163,7 @@ our $exe_libtool;
|
|||
|
||||
our $opt_bench= 0;
|
||||
our $opt_small_bench= 0;
|
||||
our $opt_big_test= 0; # Send --big-test to mysqltest
|
||||
our $opt_big_test= 0;
|
||||
|
||||
our @opt_extra_mysqld_opt;
|
||||
|
||||
|
@ -179,7 +180,10 @@ our $opt_debug;
|
|||
our $opt_do_test;
|
||||
our @opt_cases; # The test cases names in argv
|
||||
our $opt_embedded_server;
|
||||
our $opt_extern;
|
||||
|
||||
our $opt_extern= 0;
|
||||
our $opt_socket;
|
||||
|
||||
our $opt_fast;
|
||||
our $opt_force;
|
||||
our $opt_reorder= 0;
|
||||
|
@ -224,8 +228,8 @@ our $opt_ndbcluster_port_slave;
|
|||
our $opt_ndbconnectstring_slave;
|
||||
|
||||
our $opt_record;
|
||||
my $opt_report_features;
|
||||
our $opt_check_testcases;
|
||||
my $opt_report_features;
|
||||
|
||||
our $opt_skip;
|
||||
our $opt_skip_rpl;
|
||||
|
@ -236,17 +240,11 @@ our $opt_skip_im;
|
|||
|
||||
our $opt_sleep;
|
||||
|
||||
our $opt_sleep_time_after_restart= 1;
|
||||
our $opt_sleep_time_for_delete= 10;
|
||||
our $opt_testcase_timeout;
|
||||
our $opt_suite_timeout;
|
||||
my $default_testcase_timeout= 15; # 15 min max
|
||||
my $default_suite_timeout= 180; # 3 hours max
|
||||
|
||||
our $opt_socket;
|
||||
|
||||
our $opt_source_dist;
|
||||
|
||||
our $opt_start_and_exit;
|
||||
our $opt_start_dirty;
|
||||
our $opt_start_from;
|
||||
|
@ -256,7 +254,6 @@ our $opt_strace_client;
|
|||
our $opt_timer= 1;
|
||||
|
||||
our $opt_user;
|
||||
our $opt_user_test;
|
||||
|
||||
our $opt_valgrind= 0;
|
||||
our $opt_valgrind_mysqld= 0;
|
||||
|
@ -278,7 +275,6 @@ our $opt_stress_test_file= "";
|
|||
|
||||
our $opt_wait_for_master;
|
||||
our $opt_wait_for_slave;
|
||||
our $opt_wait_timeout= 10;
|
||||
|
||||
our $opt_warnings;
|
||||
|
||||
|
@ -308,6 +304,8 @@ our $glob_tot_real_time= 0;
|
|||
|
||||
our %mysqld_variables;
|
||||
|
||||
my $source_dist= 0;
|
||||
|
||||
|
||||
######################################################################
|
||||
#
|
||||
|
@ -319,11 +317,12 @@ sub main ();
|
|||
sub initial_setup ();
|
||||
sub command_line_setup ();
|
||||
sub set_mtr_build_thread_ports($);
|
||||
sub datadir_setup ();
|
||||
sub datadir_list_setup ();
|
||||
sub executable_setup ();
|
||||
sub environment_setup ();
|
||||
sub kill_running_servers ();
|
||||
sub cleanup_stale_files ();
|
||||
sub remove_stale_vardir ();
|
||||
sub setup_vardir ();
|
||||
sub check_ssl_support ($);
|
||||
sub check_running_as_root();
|
||||
sub check_ndbcluster_support ($);
|
||||
|
@ -467,6 +466,15 @@ sub command_line_setup () {
|
|||
$im_port= 9312;
|
||||
$im_mysqld1_port= 9313;
|
||||
$im_mysqld2_port= 9314;
|
||||
|
||||
# If so requested, we try to avail ourselves of a unique build thread number.
|
||||
if ( $ENV{'MTR_BUILD_THREAD'} ) {
|
||||
if ( lc($ENV{'MTR_BUILD_THREAD'}) eq 'auto' ) {
|
||||
print "Requesting build thread... ";
|
||||
$ENV{'MTR_BUILD_THREAD'} = mtr_require_unique_id_and_wait("/tmp/mysql-test-ports", 200, 299);
|
||||
print "got ".$ENV{'MTR_BUILD_THREAD'}."\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ( $ENV{'MTR_BUILD_THREAD'} )
|
||||
{
|
||||
|
@ -574,7 +582,7 @@ sub command_line_setup () {
|
|||
'tmpdir=s' => \$opt_tmpdir,
|
||||
'vardir=s' => \$opt_vardir,
|
||||
'benchdir=s' => \$glob_mysql_bench_dir,
|
||||
'mem:s' => \$opt_mem,
|
||||
'mem' => \$opt_mem,
|
||||
|
||||
# Misc
|
||||
'report-features' => \$opt_report_features,
|
||||
|
@ -591,9 +599,7 @@ sub command_line_setup () {
|
|||
'start-and-exit' => \$opt_start_and_exit,
|
||||
'timer!' => \$opt_timer,
|
||||
'unified-diff|udiff' => \$opt_udiff,
|
||||
'user-test=s' => \$opt_user_test,
|
||||
'user=s' => \$opt_user,
|
||||
'wait-timeout=i' => \$opt_wait_timeout,
|
||||
'testcase-timeout=i' => \$opt_testcase_timeout,
|
||||
'suite-timeout=i' => \$opt_suite_timeout,
|
||||
'warnings|log-warnings' => \$opt_warnings,
|
||||
|
@ -625,7 +631,7 @@ sub command_line_setup () {
|
|||
|
||||
if ( -d "../sql" )
|
||||
{
|
||||
$opt_source_dist= 1;
|
||||
$source_dist= 1;
|
||||
}
|
||||
|
||||
$glob_hostname= mtr_short_hostname();
|
||||
|
@ -649,7 +655,7 @@ sub command_line_setup () {
|
|||
# directory. And we install "/usr/share/mysql-test". Moving up one
|
||||
# more directory relative to "mysql-test" gives us a usable base
|
||||
# directory for RPM installs.
|
||||
if ( ! $opt_source_dist and ! -d "$glob_basedir/bin" )
|
||||
if ( ! $source_dist and ! -d "$glob_basedir/bin" )
|
||||
{
|
||||
$glob_basedir= dirname($glob_basedir);
|
||||
}
|
||||
|
@ -661,7 +667,7 @@ sub command_line_setup () {
|
|||
unless -d $glob_mysql_bench_dir;
|
||||
|
||||
$path_my_basedir=
|
||||
$opt_source_dist ? $glob_mysql_test_dir : $glob_basedir;
|
||||
$source_dist ? $glob_mysql_test_dir : $glob_basedir;
|
||||
|
||||
$glob_timers= mtr_init_timers();
|
||||
|
||||
|
@ -670,10 +676,10 @@ sub command_line_setup () {
|
|||
# number as early as possible
|
||||
#
|
||||
|
||||
# Look for the client binaries
|
||||
$path_client_bindir= mtr_path_exists(vs_config_dirs('client', ''),
|
||||
"$glob_basedir/client_release",
|
||||
# Look for the client binaries directory
|
||||
$path_client_bindir= mtr_path_exists("$glob_basedir/client_release",
|
||||
"$glob_basedir/client_debug",
|
||||
vs_config_dirs('client', ''),
|
||||
"$glob_basedir/client",
|
||||
"$glob_basedir/bin");
|
||||
|
||||
|
@ -804,27 +810,12 @@ sub command_line_setup () {
|
|||
$opt_vardir= "$glob_mysql_test_dir/$opt_vardir";
|
||||
}
|
||||
|
||||
# Ensure a proper error message
|
||||
mkpath("$opt_vardir");
|
||||
unless ( -d $opt_vardir and -w $opt_vardir )
|
||||
{
|
||||
mtr_error("Writable 'var' directory is needed, use the '--vardir' option");
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Set tmpdir
|
||||
# --------------------------------------------------------------------------
|
||||
$opt_tmpdir= "$opt_vardir/tmp" unless $opt_tmpdir;
|
||||
$opt_tmpdir =~ s,/+$,,; # Remove ending slash if any
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Set socket
|
||||
# --------------------------------------------------------------------------
|
||||
if (!$opt_socket)
|
||||
{
|
||||
$opt_socket= $mysqld_variables{'socket'};
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Check im suport
|
||||
# --------------------------------------------------------------------------
|
||||
|
@ -922,17 +913,17 @@ sub command_line_setup () {
|
|||
}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Sleep flag
|
||||
# Big test flags
|
||||
# --------------------------------------------------------------------------
|
||||
if ( $opt_sleep )
|
||||
{
|
||||
$opt_sleep_time_after_restart= $opt_sleep;
|
||||
}
|
||||
if ( $opt_big_test )
|
||||
{
|
||||
$ENV{'BIG_TEST'}= 1;
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Gcov flag
|
||||
# --------------------------------------------------------------------------
|
||||
if ( $opt_gcov and ! $opt_source_dist )
|
||||
if ( $opt_gcov and ! $source_dist )
|
||||
{
|
||||
mtr_error("Coverage test needs the source - please use source dist");
|
||||
}
|
||||
|
@ -946,8 +937,6 @@ sub command_line_setup () {
|
|||
{
|
||||
# Indicate that we are using debugger
|
||||
$glob_debugger= 1;
|
||||
# Increase timeouts
|
||||
$opt_wait_timeout= 300;
|
||||
if ( $opt_extern )
|
||||
{
|
||||
mtr_error("Can't use --extern when using debugger");
|
||||
|
@ -1013,16 +1002,9 @@ sub command_line_setup () {
|
|||
$opt_suite_timeout*= 6 if $opt_valgrind;
|
||||
}
|
||||
|
||||
# Increase times to wait for executables to start if using valgrind
|
||||
if ( $opt_valgrind )
|
||||
{
|
||||
$opt_sleep_time_after_restart= 10;
|
||||
$opt_sleep_time_for_delete= 60;
|
||||
}
|
||||
|
||||
if ( ! $opt_user )
|
||||
{
|
||||
if ( $glob_use_running_server )
|
||||
if ( $opt_extern )
|
||||
{
|
||||
$opt_user= "test";
|
||||
}
|
||||
|
@ -1204,9 +1186,17 @@ sub command_line_setup () {
|
|||
|
||||
if ( $opt_extern )
|
||||
{
|
||||
$glob_use_running_server= 1;
|
||||
$opt_skip_rpl= 1; # We don't run rpl test cases
|
||||
$master->[0]->{'path_sock'}= $opt_socket;
|
||||
# Turn off features not supported when running with extern server
|
||||
$opt_skip_rpl= 1;
|
||||
|
||||
# Setup master->[0] with the settings for the extern server
|
||||
$master->[0]->{'path_sock'}= $opt_socket if $opt_socket;
|
||||
mtr_report("Using extern server at '$master->[0]->{path_sock}'");
|
||||
}
|
||||
else
|
||||
{
|
||||
mtr_error("--socket can only be used in combination with --extern")
|
||||
if $opt_socket;
|
||||
}
|
||||
|
||||
$path_timefile= "$opt_vardir/log/mysqltest-time";
|
||||
|
@ -1260,7 +1250,7 @@ sub set_mtr_build_thread_ports($) {
|
|||
}
|
||||
|
||||
|
||||
sub datadir_setup () {
|
||||
sub datadir_list_setup () {
|
||||
|
||||
# Make a list of all data_dirs
|
||||
@data_dir_lst = (
|
||||
|
@ -1290,26 +1280,15 @@ sub datadir_setup () {
|
|||
|
||||
|
||||
sub collect_mysqld_features () {
|
||||
#
|
||||
# Execute "mysqld --no-defaults --help --verbose", that will
|
||||
# print out version and a list of all features and settings
|
||||
#
|
||||
my $found_variable_list_start= 0;
|
||||
my $spec_file= "$glob_mysql_test_dir/mysqld.spec.$$";
|
||||
if ( mtr_run($exe_mysqld,
|
||||
["--no-defaults",
|
||||
"--verbose",
|
||||
"--help"],
|
||||
"", "$spec_file", "$spec_file", "") != 0 )
|
||||
{
|
||||
mtr_error("Failed to get version and list of features from %s",
|
||||
$exe_mysqld);
|
||||
}
|
||||
|
||||
my $F= IO::File->new($spec_file) or
|
||||
mtr_error("can't open file \"$spec_file\": $!");
|
||||
#
|
||||
# Execute "mysqld --no-defaults --help --verbose" to get a
|
||||
# of all features and settings
|
||||
#
|
||||
my $list= `$exe_mysqld --no-defaults --verbose --help`;
|
||||
|
||||
while ( my $line= <$F> )
|
||||
foreach my $line (split('\n', $list))
|
||||
{
|
||||
# First look for version
|
||||
if ( !$mysql_version_id )
|
||||
|
@ -1362,7 +1341,7 @@ sub collect_mysqld_features () {
|
|||
}
|
||||
}
|
||||
}
|
||||
unlink($spec_file);
|
||||
|
||||
mtr_error("Could not find version of MySQL") unless $mysql_version_id;
|
||||
mtr_error("Could not find variabes list") unless $found_variable_list_start;
|
||||
|
||||
|
@ -1465,7 +1444,15 @@ sub executable_setup () {
|
|||
$exe_mysql= mtr_exe_exists("$path_client_bindir/mysql");
|
||||
if ( $mysql_version_id >= 50100 )
|
||||
{
|
||||
$exe_mysqlslap= mtr_exe_exists("$path_client_bindir/mysqlslap");
|
||||
$exe_mysqlslap= mtr_exe_exists("$path_client_bindir/mysqlslap");
|
||||
}
|
||||
if ( $mysql_version_id >= 50000 and !$glob_use_embedded_server )
|
||||
{
|
||||
$exe_mysql_upgrade= mtr_exe_exists("$path_client_bindir/mysql_upgrade")
|
||||
}
|
||||
else
|
||||
{
|
||||
$exe_mysql_upgrade= "";
|
||||
}
|
||||
|
||||
if ( ! $glob_win32 )
|
||||
|
@ -1476,6 +1463,10 @@ sub executable_setup () {
|
|||
"$path_client_bindir/mysql_fix_privilege_tables");
|
||||
}
|
||||
|
||||
# Look for mysql_fix_privilege_tables.sql script
|
||||
$file_mysql_fix_privilege_tables=
|
||||
mtr_file_exists("$glob_basedir/scripts/mysql_fix_privilege_tables.sql",
|
||||
"$glob_basedir/share/mysql_fix_privilege_tables.sql");
|
||||
|
||||
if ( ! $opt_skip_ndbcluster and executable_setup_ndb())
|
||||
{
|
||||
|
@ -1506,13 +1497,13 @@ sub executable_setup () {
|
|||
if ( $glob_use_embedded_server )
|
||||
{
|
||||
$exe_mysqltest=
|
||||
mtr_exe_exists(vs_config_dirs('libmysqld/examples', 'mysqltest_embedded'),
|
||||
"$glob_basedir/libmysqld/examples/mysqltest_embedded",
|
||||
mtr_exe_exists(vs_config_dirs('libmysqld/examples','mysqltest_embedded'),
|
||||
"$glob_basedir/libmysqld/examples/mysqltest_embedded",
|
||||
"$path_client_bindir/mysqltest_embedded");
|
||||
}
|
||||
else
|
||||
{
|
||||
$exe_mysqltest= mtr_exe_exists("$path_client_bindir/mysqltest");
|
||||
$exe_mysqltest= mtr_exe_exists("$path_client_bindir/mysqltest");
|
||||
}
|
||||
|
||||
# Look for mysql_client_test executable which may _not_ exist in
|
||||
|
@ -1591,6 +1582,33 @@ sub mysql_client_test_arguments()
|
|||
return join(" ", $exe, @$args);
|
||||
}
|
||||
|
||||
sub mysql_upgrade_arguments()
|
||||
{
|
||||
my $exe= $exe_mysql_upgrade;
|
||||
|
||||
my $args;
|
||||
mtr_init_args(\$args);
|
||||
# if ( $opt_valgrind_mysql_ugrade )
|
||||
# {
|
||||
# valgrind_arguments($args, \$exe);
|
||||
# }
|
||||
|
||||
mtr_add_arg($args, "--no-defaults");
|
||||
mtr_add_arg($args, "--user=root");
|
||||
mtr_add_arg($args, "--port=$master->[0]->{'port'}");
|
||||
mtr_add_arg($args, "--socket=$master->[0]->{'path_sock'}");
|
||||
mtr_add_arg($args, "--datadir=$master->[0]->{'path_myddir'}");
|
||||
mtr_add_arg($args, "--basedir=$glob_basedir");
|
||||
|
||||
if ( $opt_debug )
|
||||
{
|
||||
mtr_add_arg($args,
|
||||
"--debug=d:t:A,$path_vardir_trace/log/mysql_upgrade.trace");
|
||||
}
|
||||
|
||||
return join(" ", $exe, @$args);
|
||||
}
|
||||
|
||||
# Note that some env is setup in spawn/run, in "mtr_process.pl"
|
||||
|
||||
sub environment_setup () {
|
||||
|
@ -1603,7 +1621,7 @@ sub environment_setup () {
|
|||
# Setup LD_LIBRARY_PATH so the libraries from this distro/clone
|
||||
# are used in favor of the system installed ones
|
||||
# --------------------------------------------------------------------------
|
||||
if ( $opt_source_dist )
|
||||
if ( $source_dist )
|
||||
{
|
||||
push(@ld_library_paths, "$glob_basedir/libmysql/.libs/",
|
||||
"$glob_basedir/libmysql_r/.libs/",
|
||||
|
@ -1635,9 +1653,17 @@ sub environment_setup () {
|
|||
# impossible to add correct supressions, that means if "/usr/lib/debug"
|
||||
# is available, it should be added to
|
||||
# LD_LIBRARY_PATH
|
||||
#
|
||||
# But pthread is broken in libc6-dbg on Debian <= 3.1 (see Debian
|
||||
# bug 399035, http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=399035),
|
||||
# so don't change LD_LIBRARY_PATH on that platform.
|
||||
# --------------------------------------------------------------------------
|
||||
my $debug_libraries_path= "/usr/lib/debug";
|
||||
if ( $opt_valgrind and -d $debug_libraries_path )
|
||||
my $deb_version;
|
||||
if ( $opt_valgrind and -d $debug_libraries_path and
|
||||
(! -e '/etc/debian_version' or
|
||||
($deb_version= mtr_grab_file('/etc/debian_version')) == 0 or
|
||||
$deb_version > 3.1 ) )
|
||||
{
|
||||
push(@ld_library_paths, $debug_libraries_path);
|
||||
}
|
||||
|
@ -1661,7 +1687,7 @@ sub environment_setup () {
|
|||
$ENV{'UMASK'}= "0660"; # The octal *string*
|
||||
$ENV{'UMASK_DIR'}= "0770"; # The octal *string*
|
||||
$ENV{'LC_COLLATE'}= "C";
|
||||
$ENV{'USE_RUNNING_SERVER'}= $glob_use_running_server;
|
||||
$ENV{'USE_RUNNING_SERVER'}= $opt_extern;
|
||||
$ENV{'MYSQL_TEST_DIR'}= $glob_mysql_test_dir;
|
||||
$ENV{'MYSQLTEST_VARDIR'}= $opt_vardir;
|
||||
$ENV{'MYSQL_TMP_DIR'}= $opt_tmpdir;
|
||||
|
@ -1674,6 +1700,7 @@ sub environment_setup () {
|
|||
$ENV{'SLAVE_MYPORT1'}= $slave->[1]->{'port'};
|
||||
$ENV{'SLAVE_MYPORT2'}= $slave->[2]->{'port'};
|
||||
$ENV{'MYSQL_TCP_PORT'}= $mysqld_variables{'port'};
|
||||
$ENV{'DEFAULT_MASTER_PORT'}= $mysqld_variables{'master-port'};
|
||||
|
||||
$ENV{'IM_PATH_SOCK'}= $instance_manager->{path_sock};
|
||||
$ENV{'IM_USERNAME'}= $instance_manager->{admin_login};
|
||||
|
@ -1851,6 +1878,14 @@ sub environment_setup () {
|
|||
# ----------------------------------------------------
|
||||
$ENV{'MYSQL_CLIENT_TEST'}= mysql_client_test_arguments();
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Setup env so childs can execute mysql_upgrade
|
||||
# ----------------------------------------------------
|
||||
if ( $mysql_version_id >= 50000 )
|
||||
{
|
||||
$ENV{'MYSQL_UPGRADE'}= mysql_upgrade_arguments();
|
||||
}
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Setup env so childs can execute mysql_fix_system_tables
|
||||
# ----------------------------------------------------
|
||||
|
@ -1864,12 +1899,17 @@ sub environment_setup () {
|
|||
"--socket=$master->[0]->{'path_sock'}";
|
||||
$ENV{'MYSQL_FIX_SYSTEM_TABLES'}= $cmdline_mysql_fix_system_tables;
|
||||
}
|
||||
$ENV{'MYSQL_FIX_PRIVILEGE_TABLES'}= $file_mysql_fix_privilege_tables;
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Setup env so childs can execute my_print_defaults
|
||||
# ----------------------------------------------------
|
||||
$ENV{'MYSQL_MY_PRINT_DEFAULTS'}= $exe_my_print_defaults;
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Setup env so childs can execute mysqladmin
|
||||
# ----------------------------------------------------
|
||||
$ENV{'MYSQLADMIN'}= $exe_mysqladmin;
|
||||
|
||||
# ----------------------------------------------------
|
||||
# Setup env so childs can execute perror
|
||||
|
@ -1890,7 +1930,7 @@ sub environment_setup () {
|
|||
# ----------------------------------------------------
|
||||
# We are nice and report a bit about our settings
|
||||
# ----------------------------------------------------
|
||||
if (!$opt_extern && $opt_verbose)
|
||||
if (!$opt_extern)
|
||||
{
|
||||
print "Using MTR_BUILD_THREAD = $ENV{MTR_BUILD_THREAD}\n";
|
||||
print "Using MASTER_MYPORT = $ENV{MASTER_MYPORT}\n";
|
||||
|
@ -1964,29 +2004,23 @@ sub kill_running_servers () {
|
|||
# This is different from terminating processes we have
|
||||
# started from this run of the script, this is terminating
|
||||
# leftovers from previous runs.
|
||||
|
||||
if ( ! -d $opt_vardir )
|
||||
{
|
||||
if ( -l $opt_vardir and ! -d readlink($opt_vardir) )
|
||||
{
|
||||
mtr_report("Removing $opt_vardir symlink without destination");
|
||||
unlink($opt_vardir);
|
||||
}
|
||||
# The "var" dir does not exist already
|
||||
# the processes that mtr_kill_leftovers start will write
|
||||
# their log files to var/log so it should be created
|
||||
mkpath("$opt_vardir/log");
|
||||
}
|
||||
mtr_kill_leftovers();
|
||||
}
|
||||
}
|
||||
|
||||
sub cleanup_stale_files () {
|
||||
|
||||
my $created_by_mem_file= "$glob_mysql_test_dir/var/created_by_mem";
|
||||
#
|
||||
# Remove var and any directories in var/ created by previous
|
||||
# tests
|
||||
#
|
||||
sub remove_stale_vardir () {
|
||||
|
||||
mtr_report("Removing Stale Files");
|
||||
|
||||
# Safety!
|
||||
mtr_error("No, don't remove the vardir when running with --extern")
|
||||
if $opt_extern;
|
||||
|
||||
mtr_verbose("opt_vardir: $opt_vardir");
|
||||
if ( $opt_vardir eq $default_vardir )
|
||||
{
|
||||
#
|
||||
|
@ -1995,29 +2029,47 @@ sub cleanup_stale_files () {
|
|||
if ( -l $opt_vardir)
|
||||
{
|
||||
# var is a symlink
|
||||
if (-f $created_by_mem_file)
|
||||
|
||||
if ( $opt_mem and readlink($opt_vardir) eq $opt_mem )
|
||||
{
|
||||
# Remove the directory which the link points at
|
||||
mtr_verbose("Removing " . readlink($opt_vardir));
|
||||
rmtree(readlink($opt_vardir));
|
||||
# Remove the entire "var" dir
|
||||
rmtree("$opt_vardir/");
|
||||
|
||||
# Remove the "var" symlink
|
||||
mtr_verbose("unlink($opt_vardir)");
|
||||
unlink($opt_vardir);
|
||||
}
|
||||
elsif ( $opt_mem )
|
||||
{
|
||||
# Just remove the "var" symlink
|
||||
mtr_report("WARNING: Removing '$opt_vardir' symlink it's wrong");
|
||||
|
||||
mtr_verbose("unlink($opt_vardir)");
|
||||
unlink($opt_vardir);
|
||||
}
|
||||
else
|
||||
{
|
||||
# Some users creates a soft link in mysql-test/var to another area
|
||||
# - allow it
|
||||
# - allow it, but remove all files in it
|
||||
|
||||
mtr_report("WARNING: Using the 'mysql-test/var' symlink");
|
||||
rmtree("$opt_vardir/log");
|
||||
rmtree("$opt_vardir/ndbcluster-$opt_ndbcluster_port");
|
||||
rmtree("$opt_vardir/run");
|
||||
rmtree("$opt_vardir/tmp");
|
||||
|
||||
# Make sure the directory where it points exist
|
||||
mtr_error("The destination for symlink $opt_vardir does not exist")
|
||||
if ! -d readlink($opt_vardir);
|
||||
|
||||
foreach my $bin ( glob("$opt_vardir/*") )
|
||||
{
|
||||
mtr_verbose("Removing bin $bin");
|
||||
rmtree($bin);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
# Remove the entire "var" dir
|
||||
mtr_verbose("Removing $opt_vardir/");
|
||||
rmtree("$opt_vardir/");
|
||||
}
|
||||
}
|
||||
|
@ -2029,21 +2081,56 @@ sub cleanup_stale_files () {
|
|||
|
||||
# Remove the var/ dir in mysql-test dir if any
|
||||
# this could be an old symlink that shouldn't be there
|
||||
mtr_verbose("Removing $default_vardir");
|
||||
rmtree($default_vardir);
|
||||
|
||||
# Remove the "var" dir
|
||||
mtr_verbose("Removing $opt_vardir/");
|
||||
rmtree("$opt_vardir/");
|
||||
}
|
||||
}
|
||||
|
||||
if ( $opt_mem )
|
||||
#
|
||||
# Create var and the directories needed in var
|
||||
#
|
||||
sub setup_vardir() {
|
||||
mtr_report("Creating Directories");
|
||||
|
||||
if ( $opt_vardir eq $default_vardir )
|
||||
{
|
||||
# Runinng with var as a link to some "memory" location, normally tmpfs
|
||||
rmtree($opt_mem);
|
||||
mkpath($opt_mem);
|
||||
mtr_report("Creating symlink from $opt_vardir to $opt_mem");
|
||||
symlink($opt_mem, $opt_vardir);
|
||||
# Put a small file to recognize this dir was created by --mem
|
||||
mtr_tofile($created_by_mem_file, $opt_mem);
|
||||
#
|
||||
# Running with "var" in mysql-test dir
|
||||
#
|
||||
if ( -l $opt_vardir )
|
||||
{
|
||||
# it's a symlink
|
||||
|
||||
# Make sure the directory where it points exist
|
||||
mtr_error("The destination for symlink $opt_vardir does not exist")
|
||||
if ! -d readlink($opt_vardir);
|
||||
}
|
||||
elsif ( $opt_mem )
|
||||
{
|
||||
# Runinng with "var" as a link to some "memory" location, normally tmpfs
|
||||
mtr_verbose("Creating $opt_mem");
|
||||
mkpath($opt_mem);
|
||||
|
||||
mtr_report("Symlinking 'var' to '$opt_mem'");
|
||||
symlink($opt_mem, $opt_vardir);
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! -d $opt_vardir )
|
||||
{
|
||||
mtr_verbose("Creating $opt_vardir");
|
||||
mkpath($opt_vardir);
|
||||
}
|
||||
|
||||
# Ensure a proper error message if vardir couldn't be created
|
||||
unless ( -d $opt_vardir and -w $opt_vardir )
|
||||
{
|
||||
mtr_error("Writable 'var' directory is needed, use the " .
|
||||
"'--vardir=<path>' option");
|
||||
}
|
||||
|
||||
mkpath("$opt_vardir/log");
|
||||
|
@ -2051,10 +2138,9 @@ sub cleanup_stale_files () {
|
|||
mkpath("$opt_vardir/tmp");
|
||||
mkpath($opt_tmpdir) if $opt_tmpdir ne "$opt_vardir/tmp";
|
||||
|
||||
# Remove old and create new data dirs
|
||||
# Create new data dirs
|
||||
foreach my $data_dir (@data_dir_lst)
|
||||
{
|
||||
rmtree("$data_dir");
|
||||
mkpath("$data_dir/mysql");
|
||||
mkpath("$data_dir/test");
|
||||
}
|
||||
|
@ -2568,7 +2654,7 @@ sub run_suite () {
|
|||
mtr_print_line();
|
||||
|
||||
if ( ! $glob_debugger and
|
||||
! $glob_use_running_server and
|
||||
! $opt_extern and
|
||||
! $glob_use_embedded_server )
|
||||
{
|
||||
stop_all_servers();
|
||||
|
@ -2597,28 +2683,41 @@ sub run_suite () {
|
|||
|
||||
sub initialize_servers () {
|
||||
|
||||
datadir_setup();
|
||||
datadir_list_setup();
|
||||
|
||||
if ( ! $glob_use_running_server )
|
||||
if ( $opt_extern )
|
||||
{
|
||||
# Running against an already started server, if the specified
|
||||
# vardir does not already exist it should be created
|
||||
if ( ! -d $opt_vardir )
|
||||
{
|
||||
mtr_report("Creating '$opt_vardir'");
|
||||
setup_vardir();
|
||||
}
|
||||
else
|
||||
{
|
||||
mtr_report("No need to create '$opt_vardir' it already exists");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
kill_running_servers();
|
||||
|
||||
if ( ! $opt_start_dirty )
|
||||
{
|
||||
cleanup_stale_files();
|
||||
remove_stale_vardir();
|
||||
setup_vardir();
|
||||
|
||||
mysql_install_db();
|
||||
if ( $opt_force )
|
||||
{
|
||||
# Save a snapshot of the freshly installed db
|
||||
# to make it possible to restore to a known point in time
|
||||
save_installed_db();
|
||||
}
|
||||
}
|
||||
check_running_as_root();
|
||||
}
|
||||
else
|
||||
{
|
||||
# We have to create the 'var' and related directories
|
||||
cleanup_stale_files();
|
||||
}
|
||||
check_running_as_root();
|
||||
}
|
||||
|
||||
sub mysql_install_db () {
|
||||
|
@ -2985,29 +3084,15 @@ sub do_before_run_mysqltest($)
|
|||
unlink("$result_dir/$tname.log");
|
||||
unlink("$result_dir/$tname.warnings");
|
||||
|
||||
if (!$opt_extern)
|
||||
{
|
||||
mtr_tonewfile($path_current_test_log,"$tname\n"); # Always tell where we are
|
||||
|
||||
# output current test to ndbcluster log file to enable diagnostics
|
||||
mtr_tofile($path_ndb_testrun_log,"CURRENT TEST $tname\n");
|
||||
|
||||
mtr_tofile($master->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
|
||||
if ( $master->[1]->{'pid'} )
|
||||
{
|
||||
mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");
|
||||
}
|
||||
}
|
||||
|
||||
if ( $mysql_version_id < 50000 )
|
||||
{
|
||||
# Set envirnoment variable NDB_STATUS_OK to 1
|
||||
# Set environment variable NDB_STATUS_OK to 1
|
||||
# if script decided to run mysqltest cluster _is_ installed ok
|
||||
$ENV{'NDB_STATUS_OK'} = "1";
|
||||
}
|
||||
elsif ( $mysql_version_id < 50100 )
|
||||
{
|
||||
# Set envirnoment variable NDB_STATUS_OK to YES
|
||||
# Set environment variable NDB_STATUS_OK to YES
|
||||
# if script decided to run mysqltest cluster _is_ installed ok
|
||||
$ENV{'NDB_STATUS_OK'} = "YES";
|
||||
}
|
||||
|
@ -3018,14 +3103,34 @@ sub do_after_run_mysqltest($)
|
|||
my $tinfo= shift;
|
||||
my $tname= $tinfo->{'name'};
|
||||
|
||||
mtr_tofile($path_mysqltest_log,"CURRENT TEST $tname\n");
|
||||
|
||||
# Save info from this testcase run to mysqltest.log
|
||||
mtr_appendfile_to_file($path_current_test_log, $path_mysqltest_log)
|
||||
if -f $path_current_test_log;
|
||||
mtr_appendfile_to_file($path_timefile, $path_mysqltest_log)
|
||||
if -f $path_timefile;
|
||||
}
|
||||
|
||||
|
||||
sub run_testcase_mark_logs($)
|
||||
{
|
||||
my ($log_msg)= @_;
|
||||
|
||||
# Write a marker to all log files
|
||||
|
||||
# The file indicating current test name
|
||||
mtr_tonewfile($path_current_test_log, $log_msg);
|
||||
|
||||
# each mysqld's .err file
|
||||
foreach my $mysqld (@{$master}, @{$slave})
|
||||
{
|
||||
mtr_tofile($mysqld->{path_myerr}, $log_msg);
|
||||
}
|
||||
|
||||
# ndbcluster log file
|
||||
mtr_tofile($path_ndb_testrun_log, $log_msg);
|
||||
|
||||
}
|
||||
|
||||
sub find_testcase_skipped_reason($)
|
||||
{
|
||||
my ($tinfo)= @_;
|
||||
|
@ -3127,7 +3232,7 @@ sub run_testcase ($) {
|
|||
# -------------------------------------------------------
|
||||
|
||||
$ENV{'TZ'}= $tinfo->{'timezone'};
|
||||
mtr_verbose("Starting server with timezone: $tinfo->{'timezone'}");
|
||||
mtr_verbose("Setting timezone: $tinfo->{'timezone'}");
|
||||
|
||||
my $master_restart= run_testcase_need_master_restart($tinfo);
|
||||
my $slave_restart= run_testcase_need_slave_restart($tinfo);
|
||||
|
@ -3135,7 +3240,7 @@ sub run_testcase ($) {
|
|||
if ($master_restart or $slave_restart)
|
||||
{
|
||||
# Can't restart a running server that may be in use
|
||||
if ( $glob_use_running_server )
|
||||
if ( $opt_extern )
|
||||
{
|
||||
mtr_report_test_name($tinfo);
|
||||
$tinfo->{comment}= "Can't restart a running server";
|
||||
|
@ -3145,6 +3250,10 @@ sub run_testcase ($) {
|
|||
|
||||
run_testcase_stop_servers($tinfo, $master_restart, $slave_restart);
|
||||
}
|
||||
|
||||
# Write to all log files to indicate start of testcase
|
||||
run_testcase_mark_logs("CURRENT_TEST: $tinfo->{name}\n");
|
||||
|
||||
my $died= mtr_record_dead_children();
|
||||
if ($died or $master_restart or $slave_restart)
|
||||
{
|
||||
|
@ -3301,7 +3410,7 @@ sub report_failure_and_restart ($) {
|
|||
my $tinfo= shift;
|
||||
|
||||
mtr_report_test_failed($tinfo);
|
||||
mtr_show_failed_diff($tinfo->{'name'});
|
||||
mtr_show_failed_diff($tinfo->{'result_file'});
|
||||
print "\n";
|
||||
if ( $opt_force )
|
||||
{
|
||||
|
@ -3318,7 +3427,7 @@ sub report_failure_and_restart ($) {
|
|||
print "Aborting: $tinfo->{'name'} failed in $test_mode mode. ";
|
||||
print "To continue, re-run with '--force'.\n";
|
||||
if ( ! $glob_debugger and
|
||||
! $glob_use_running_server and
|
||||
! $opt_extern and
|
||||
! $glob_use_embedded_server )
|
||||
{
|
||||
stop_all_servers();
|
||||
|
@ -3490,6 +3599,17 @@ sub mysqld_arguments ($$$$$) {
|
|||
mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
|
||||
}
|
||||
}
|
||||
|
||||
if ( $mysql_version_id <= 50106 )
|
||||
{
|
||||
# Force mysqld to use log files up until 5.1.6
|
||||
mtr_add_arg($args, "%s--log=%s", $prefix, $master->[0]->{'path_mylog'});
|
||||
}
|
||||
else
|
||||
{
|
||||
# Turn on logging, will be sent to tables
|
||||
mtr_add_arg($args, "%s--log=", $prefix);
|
||||
}
|
||||
}
|
||||
|
||||
if ( $type eq 'slave' )
|
||||
|
@ -3507,8 +3627,6 @@ sub mysqld_arguments ($$$$$) {
|
|||
mtr_add_arg($args, "%s--log-slave-updates", $prefix);
|
||||
}
|
||||
|
||||
mtr_add_arg($args, "%s--log=%s", $prefix,
|
||||
$slave->[$idx]->{'path_mylog'});
|
||||
mtr_add_arg($args, "%s--master-retry-count=10", $prefix);
|
||||
mtr_add_arg($args, "%s--pid-file=%s", $prefix,
|
||||
$slave->[$idx]->{'path_pid'});
|
||||
|
@ -3569,6 +3687,18 @@ sub mysqld_arguments ($$$$$) {
|
|||
mtr_add_arg($args, "%s--ndb-extra-logging", $prefix);
|
||||
}
|
||||
}
|
||||
|
||||
if ( $mysql_version_id <= 50106 )
|
||||
{
|
||||
# Force mysqld to use log files up until 5.1.6
|
||||
mtr_add_arg($args, "%s--log=%s", $prefix, $master->[0]->{'path_mylog'});
|
||||
}
|
||||
else
|
||||
{
|
||||
# Turn on logging, will be sent to tables
|
||||
mtr_add_arg($args, "%s--log=", $prefix);
|
||||
}
|
||||
|
||||
} # end slave
|
||||
|
||||
if ( $opt_debug )
|
||||
|
@ -3645,7 +3775,6 @@ sub mysqld_arguments ($$$$$) {
|
|||
elsif ( $type eq 'master' )
|
||||
{
|
||||
mtr_add_arg($args, "%s--open-files-limit=1024", $prefix);
|
||||
mtr_add_arg($args, "%s--log=%s", $prefix, $master->[0]->{'path_mylog'});
|
||||
}
|
||||
|
||||
return $args;
|
||||
|
@ -3894,10 +4023,17 @@ sub run_testcase_need_master_restart($)
|
|||
}
|
||||
elsif( ! $master->[0]->{'pid'} )
|
||||
{
|
||||
$do_restart= 1;
|
||||
mtr_verbose("Restart master: master is not started");
|
||||
if ( $opt_extern )
|
||||
{
|
||||
$do_restart= 0;
|
||||
mtr_verbose("No restart: using extern master");
|
||||
}
|
||||
else
|
||||
{
|
||||
$do_restart= 1;
|
||||
mtr_verbose("Restart master: master is not started");
|
||||
}
|
||||
}
|
||||
|
||||
return $do_restart;
|
||||
}
|
||||
|
||||
|
@ -4018,6 +4154,7 @@ sub run_testcase_stop_servers($$$) {
|
|||
|
||||
if ( $do_restart || $do_slave_restart )
|
||||
{
|
||||
|
||||
delete $slave->[0]->{'running_slave_options'}; # Forget history
|
||||
|
||||
# Start shutdown of all started slaves
|
||||
|
@ -4142,8 +4279,6 @@ sub run_testcase_start_servers($) {
|
|||
return 1;
|
||||
}
|
||||
}
|
||||
mtr_tofile($master->[1]->{'path_myerr'},"CURRENT_TEST: $tname\n");
|
||||
|
||||
mysqld_start($master->[1],$tinfo->{'master_opt'},[]);
|
||||
}
|
||||
|
||||
|
@ -4171,8 +4306,6 @@ sub run_testcase_start_servers($) {
|
|||
# ----------------------------------------------------------------------
|
||||
if ( $tinfo->{'slave_num'} )
|
||||
{
|
||||
mtr_tofile($slave->[0]->{'path_myerr'},"CURRENT_TEST: $tname\n");
|
||||
|
||||
restore_slave_databases($tinfo->{'slave_num'});
|
||||
|
||||
do_before_start_slave($tinfo);
|
||||
|
@ -4388,11 +4521,6 @@ sub run_mysqltest ($) {
|
|||
mtr_add_arg($args, "--timer-file=%s/log/timer", $opt_vardir);
|
||||
}
|
||||
|
||||
if ( $opt_big_test )
|
||||
{
|
||||
mtr_add_arg($args, "--big-test");
|
||||
}
|
||||
|
||||
if ( $opt_compress )
|
||||
{
|
||||
mtr_add_arg($args, "--compress");
|
||||
|
@ -4513,6 +4641,7 @@ sub run_mysqltest ($) {
|
|||
}
|
||||
|
||||
return $res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -4762,9 +4891,9 @@ Options to control directories to use
|
|||
vardir=DIR The directory where files generated from the test run
|
||||
is stored (default: ./var). Specifying a ramdisk or
|
||||
tmpfs will speed up tests.
|
||||
mem[=DIR] Run testsuite in "memory" using tmpfs or ramdisk
|
||||
Attempts to use DIR first if specified else
|
||||
uses as builtin list of standard locations
|
||||
mem Run testsuite in "memory" using tmpfs or ramdisk
|
||||
Attempts to find a suitable location
|
||||
using a builtin list of standard locations
|
||||
for tmpfs (/dev/shm)
|
||||
The option can also be set using environment
|
||||
variable MTR_MEM=[DIR]
|
||||
|
@ -4782,9 +4911,8 @@ Options to control what test suites or cases to run
|
|||
skip-rpl Skip the replication test cases.
|
||||
skip-im Don't start IM, and skip the IM test cases
|
||||
skip-test=PREFIX Skip test cases which name are prefixed with PREFIX
|
||||
big-test Pass "--big-test" to mysqltest which will set the
|
||||
environment variable BIG_TEST, which can be checked
|
||||
from test cases.
|
||||
big-test Set the environment variable BIG_TEST, which can be
|
||||
checked from test cases.
|
||||
|
||||
Options that specify ports
|
||||
|
||||
|
@ -4806,10 +4934,11 @@ Options that pass on options
|
|||
|
||||
Options to run test on running server
|
||||
|
||||
extern Use running server for tests FIXME DANGEROUS
|
||||
extern Use running server for tests
|
||||
ndb-connectstring=STR Use running cluster, and connect using STR
|
||||
ndb-connectstring-slave=STR Use running slave cluster, and connect using STR
|
||||
user=USER User for connect to server
|
||||
user=USER User for connection to extern server
|
||||
socket=PATH Socket for connection to extern server
|
||||
|
||||
Options for debugging the product
|
||||
|
||||
|
@ -4858,23 +4987,15 @@ Misc options
|
|||
unified-diff | udiff When presenting differences, use unified diff
|
||||
|
||||
testcase-timeout=MINUTES Max test case run time (default $default_testcase_timeout)
|
||||
suite-timeout=MINUTES Max test suite run time (default $default_suite_timeout)
|
||||
suite-timeout=MINUTES Max test suite run time (default $default_suite_timeout)
|
||||
warnings | log-warnings Pass --log-warnings to mysqld
|
||||
|
||||
sleep=SECONDS Passed to mysqltest, will be used as fixed sleep time
|
||||
|
||||
Deprecated options
|
||||
with-openssl Deprecated option for ssl
|
||||
|
||||
|
||||
Options not yet described, or that I want to look into more
|
||||
local
|
||||
netware
|
||||
sleep=SECONDS
|
||||
socket=PATH
|
||||
user-test=s
|
||||
wait-timeout=SECONDS
|
||||
warnings
|
||||
log-warnings
|
||||
|
||||
HERE
|
||||
mtr_exit(1);
|
||||
|
||||
|
|
|
@ -541,6 +541,127 @@ create table t1 ( a timestamp );
|
|||
alter table t1 add unique ( a(1) );
|
||||
ERROR HY000: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys
|
||||
drop table t1;
|
||||
drop table if exists t1;
|
||||
create table t1 (a int, key(a));
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||
"this used not to disable the index"
|
||||
alter table t1 modify a int, disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
alter table t1 enable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||
alter table t1 modify a bigint, disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
alter table t1 enable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||
alter table t1 add b char(10), disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
alter table t1 add c decimal(10,2), enable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE
|
||||
"this however did"
|
||||
alter table t1 disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
desc t1;
|
||||
Field Type Null Key Default Extra
|
||||
a bigint(20) YES MUL NULL
|
||||
b char(10) YES NULL
|
||||
c decimal(10,2) YES NULL
|
||||
alter table t1 add d decimal(15,5);
|
||||
"The key should still be disabled"
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
drop table t1;
|
||||
"Now will test with one unique index"
|
||||
create table t1(a int, b char(10), unique(a));
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
alter table t1 disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
alter table t1 enable keys;
|
||||
"If no copy on noop change, this won't touch the data file"
|
||||
"Unique index, no change"
|
||||
alter table t1 modify a int, disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
"Change the type implying data copy"
|
||||
"Unique index, no change"
|
||||
alter table t1 modify a bigint, disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
alter table t1 modify a bigint;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
alter table t1 modify a int;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
drop table t1;
|
||||
"Now will test with one unique and one non-unique index"
|
||||
create table t1(a int, b char(10), unique(a), key(b));
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE
|
||||
alter table t1 disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||
alter table t1 enable keys;
|
||||
"If no copy on noop change, this won't touch the data file"
|
||||
"The non-unique index will be disabled"
|
||||
alter table t1 modify a int, disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||
alter table t1 enable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE
|
||||
"Change the type implying data copy"
|
||||
"The non-unique index will be disabled"
|
||||
alter table t1 modify a bigint, disable keys;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||
"Change again the type, but leave the indexes as_is"
|
||||
alter table t1 modify a int;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||
"Try the same. When data is no copied on similar tables, this is noop"
|
||||
alter table t1 modify a int;
|
||||
show indexes from t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 0 a 1 a A NULL NULL NULL YES BTREE
|
||||
t1 1 b 1 b A NULL NULL NULL YES BTREE disabled
|
||||
drop table t1;
|
||||
create database mysqltest;
|
||||
create table t1 (c1 int);
|
||||
alter table t1 rename mysqltest.t1;
|
||||
|
@ -556,6 +677,17 @@ ERROR 3D000: No database selected
|
|||
alter table test.t1 rename test.t1;
|
||||
use test;
|
||||
drop table t1;
|
||||
DROP TABLE IF EXISTS bug24219;
|
||||
DROP TABLE IF EXISTS bug24219_2;
|
||||
CREATE TABLE bug24219 (a INT, INDEX(a));
|
||||
SHOW INDEX FROM bug24219;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
bug24219 1 a 1 a A NULL NULL NULL YES BTREE
|
||||
ALTER TABLE bug24219 RENAME TO bug24219_2, DISABLE KEYS;
|
||||
SHOW INDEX FROM bug24219_2;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
bug24219_2 1 a 1 a A NULL NULL NULL YES BTREE disabled
|
||||
DROP TABLE bug24219_2;
|
||||
create table t1 (mycol int(10) not null);
|
||||
alter table t1 alter column mycol set default 0;
|
||||
desc t1;
|
||||
|
|
|
@ -341,3 +341,14 @@ select * from t1 where bigint_col='17666000000000000000';
|
|||
bigint_col
|
||||
17666000000000000000
|
||||
drop table t1;
|
||||
|
||||
bug 19955 -- mod is signed with bigint
|
||||
select cast(10000002383263201056 as unsigned) mod 50 as result;
|
||||
result
|
||||
6
|
||||
create table t1 (c1 bigint unsigned);
|
||||
insert into t1 values (10000002383263201056);
|
||||
select c1 mod 50 as result from t1;
|
||||
result
|
||||
6
|
||||
drop table t1;
|
||||
|
|
|
@ -189,12 +189,12 @@ date format datetime
|
|||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 2003-01-02 02:11:12.123450
|
||||
2003-01-02 12:11:12.12345 am %Y-%m-%d %h:%i:%S.%f%p 2003-01-02 00:11:12.123450
|
||||
2003-01-02 11:11:12Pm %Y-%m-%d %h:%i:%S%p 2003-01-02 23:11:12
|
||||
10:20:10 %H:%i:%s 0000-00-00 10:20:10
|
||||
10:20:10 %h:%i:%s.%f 0000-00-00 10:20:10
|
||||
10:20:10 %T 0000-00-00 10:20:10
|
||||
10:20:10AM %h:%i:%s%p 0000-00-00 10:20:10
|
||||
10:20:10AM %r 0000-00-00 10:20:10
|
||||
10:20:10.44AM %h:%i:%s.%f%p 0000-00-00 10:20:10.440000
|
||||
10:20:10 %H:%i:%s 0000-00-00 00:00:00
|
||||
10:20:10 %h:%i:%s.%f 0000-00-00 00:00:00
|
||||
10:20:10 %T 0000-00-00 00:00:00
|
||||
10:20:10AM %h:%i:%s%p 0000-00-00 00:00:00
|
||||
10:20:10AM %r 0000-00-00 00:00:00
|
||||
10:20:10.44AM %h:%i:%s.%f%p 0000-00-00 00:00:00
|
||||
15-01-2001 12:59:58 %d-%m-%Y %H:%i:%S 2001-01-15 12:59:58
|
||||
15 September 2001 %d %M %Y 2001-09-15 00:00:00
|
||||
15 SEPTEMB 2001 %d %M %Y 2001-09-15 00:00:00
|
||||
|
@ -211,6 +211,13 @@ Tuesday 52 2001 %W %V %X 2002-01-01 00:00:00
|
|||
15-01-2001 %d-%m-%Y %H:%i:%S 2001-01-15 00:00:00
|
||||
15-01-20 %d-%m-%y 2020-01-15 00:00:00
|
||||
15-2001-1 %d-%Y-%c 2001-01-15 00:00:00
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 10:20:10.440000'
|
||||
select date,format,DATE(str_to_date(date, format)) as date2 from t1;
|
||||
date format date2
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 2003-01-02
|
||||
|
@ -251,12 +258,12 @@ date format time
|
|||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 02:11:12.123450
|
||||
2003-01-02 12:11:12.12345 am %Y-%m-%d %h:%i:%S.%f%p 00:11:12.123450
|
||||
2003-01-02 11:11:12Pm %Y-%m-%d %h:%i:%S%p 23:11:12
|
||||
10:20:10 %H:%i:%s 10:20:10
|
||||
10:20:10 %h:%i:%s.%f 10:20:10
|
||||
10:20:10 %T 10:20:10
|
||||
10:20:10AM %h:%i:%s%p 10:20:10
|
||||
10:20:10AM %r 10:20:10
|
||||
10:20:10.44AM %h:%i:%s.%f%p 10:20:10.440000
|
||||
10:20:10 %H:%i:%s NULL
|
||||
10:20:10 %h:%i:%s.%f NULL
|
||||
10:20:10 %T NULL
|
||||
10:20:10AM %h:%i:%s%p NULL
|
||||
10:20:10AM %r NULL
|
||||
10:20:10.44AM %h:%i:%s.%f%p NULL
|
||||
15-01-2001 12:59:58 %d-%m-%Y %H:%i:%S 12:59:58
|
||||
15 September 2001 %d %M %Y 00:00:00
|
||||
15 SEPTEMB 2001 %d %M %Y 00:00:00
|
||||
|
@ -273,6 +280,13 @@ Tuesday 52 2001 %W %V %X 00:00:00
|
|||
15-01-2001 %d-%m-%Y %H:%i:%S 00:00:00
|
||||
15-01-20 %d-%m-%y 00:00:00
|
||||
15-2001-1 %d-%Y-%c 00:00:00
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10.440000'
|
||||
select date,format,concat(TIME(str_to_date(date, format))) as time2 from t1;
|
||||
date format time2
|
||||
2003-01-02 10:11:12 %Y-%m-%d %H:%i:%S 10:11:12
|
||||
|
@ -282,12 +296,12 @@ date format time2
|
|||
2003-01-02 02:11:12.12345AM %Y-%m-%d %h:%i:%S.%f %p 02:11:12.123450
|
||||
2003-01-02 12:11:12.12345 am %Y-%m-%d %h:%i:%S.%f%p 00:11:12.123450
|
||||
2003-01-02 11:11:12Pm %Y-%m-%d %h:%i:%S%p 23:11:12
|
||||
10:20:10 %H:%i:%s 10:20:10
|
||||
10:20:10 %h:%i:%s.%f 10:20:10
|
||||
10:20:10 %T 10:20:10
|
||||
10:20:10AM %h:%i:%s%p 10:20:10
|
||||
10:20:10AM %r 10:20:10
|
||||
10:20:10.44AM %h:%i:%s.%f%p 10:20:10.440000
|
||||
10:20:10 %H:%i:%s NULL
|
||||
10:20:10 %h:%i:%s.%f NULL
|
||||
10:20:10 %T NULL
|
||||
10:20:10AM %h:%i:%s%p NULL
|
||||
10:20:10AM %r NULL
|
||||
10:20:10.44AM %h:%i:%s.%f%p NULL
|
||||
15-01-2001 12:59:58 %d-%m-%Y %H:%i:%S 12:59:58
|
||||
15 September 2001 %d %M %Y 00:00:00
|
||||
15 SEPTEMB 2001 %d %M %Y 00:00:00
|
||||
|
@ -304,6 +318,13 @@ Tuesday 52 2001 %W %V %X 00:00:00
|
|||
15-01-2001 %d-%m-%Y %H:%i:%S 00:00:00
|
||||
15-01-20 %d-%m-%y 00:00:00
|
||||
15-2001-1 %d-%Y-%c 00:00:00
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10'
|
||||
Warning 1292 Truncated incorrect time value: '0000-00-00 10:20:10.440000'
|
||||
select concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d'));
|
||||
concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d'))
|
||||
2003-01-02 08:11:02.123456
|
||||
|
@ -574,4 +595,13 @@ DATE_FORMAT('%Y-%m-%d %H:%i:%s', 1151414896)
|
|||
NULL
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '%Y-%m-%d %H:%i:%s'
|
||||
select str_to_date('04 /30/2004', '%m /%d/%Y');
|
||||
str_to_date('04 /30/2004', '%m /%d/%Y')
|
||||
2004-04-30
|
||||
select str_to_date('04/30 /2004', '%m /%d /%Y');
|
||||
str_to_date('04/30 /2004', '%m /%d /%Y')
|
||||
2004-04-30
|
||||
select str_to_date('04/30/2004 ', '%m/%d/%Y ');
|
||||
str_to_date('04/30/2004 ', '%m/%d/%Y ')
|
||||
2004-04-30
|
||||
"End of 4.1 tests"
|
||||
|
|
|
@ -104,3 +104,95 @@ a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1
|
|||
1 0000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
create table bug20691 (i int, d datetime NOT NULL, dn datetime not null default '0000-00-00 00:00:00');
|
||||
insert into bug20691 values (1, DEFAULT, DEFAULT), (1, '1975-07-10 07:10:03', '1978-01-13 14:08:51'), (1, DEFAULT, DEFAULT);
|
||||
Warnings:
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
insert into bug20691 (i) values (2);
|
||||
Warnings:
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
desc bug20691;
|
||||
Field Type Null Key Default Extra
|
||||
i int(11) YES NULL
|
||||
d datetime NO
|
||||
dn datetime NO 0000-00-00 00:00:00
|
||||
insert into bug20691 values (3, DEFAULT, DEFAULT), (3, '1975-07-10 07:10:03', '1978-01-13 14:08:51'), (3, DEFAULT, DEFAULT);
|
||||
Warnings:
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
insert into bug20691 (i) values (4);
|
||||
Warnings:
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
insert into bug20691 values (5, DEFAULT, DEFAULT), (5, '1975-07-10 07:10:03', '1978-01-13 14:08:51'), (5, DEFAULT, DEFAULT);
|
||||
Warnings:
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
SET sql_mode = 'ALLOW_INVALID_DATES';
|
||||
insert into bug20691 values (6, DEFAULT, DEFAULT), (6, '1975-07-10 07:10:03', '1978-01-13 14:08:51'), (6, DEFAULT, DEFAULT);
|
||||
Warnings:
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
SET sql_mode = 'STRICT_ALL_TABLES';
|
||||
insert into bug20691 values (7, DEFAULT, DEFAULT), (7, '1975-07-10 07:10:03', '1978-01-13 14:08:51'), (7, DEFAULT, DEFAULT);
|
||||
ERROR HY000: Field 'd' doesn't have a default value
|
||||
select * from bug20691 order by i asc;
|
||||
i d dn
|
||||
1 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
1 1975-07-10 07:10:03 1978-01-13 14:08:51
|
||||
1 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
2 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
3 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
3 1975-07-10 07:10:03 1978-01-13 14:08:51
|
||||
3 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
4 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
5 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
5 1975-07-10 07:10:03 1978-01-13 14:08:51
|
||||
5 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
6 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
6 1975-07-10 07:10:03 1978-01-13 14:08:51
|
||||
6 0000-00-00 00:00:00 0000-00-00 00:00:00
|
||||
drop table bug20691;
|
||||
SET sql_mode = '';
|
||||
create table bug20691 (
|
||||
a set('one', 'two', 'three') not null,
|
||||
b enum('small', 'medium', 'large', 'enormous', 'ellisonego') not null,
|
||||
c time not null,
|
||||
d date not null,
|
||||
e int not null,
|
||||
f long not null,
|
||||
g blob not null,
|
||||
h datetime not null,
|
||||
i decimal not null,
|
||||
x int);
|
||||
insert into bug20691 values (2, 3, 5, '0007-01-01', 11, 13, 17, '0019-01-01 00:00:00', 23, 1);
|
||||
insert into bug20691 (x) values (2);
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
Warning 1364 Field 'c' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'e' doesn't have a default value
|
||||
Warning 1364 Field 'f' doesn't have a default value
|
||||
Warning 1364 Field 'g' doesn't have a default value
|
||||
Warning 1364 Field 'h' doesn't have a default value
|
||||
Warning 1364 Field 'i' doesn't have a default value
|
||||
insert into bug20691 values (2, 3, 5, '0007-01-01', 11, 13, 17, '0019-01-01 00:00:00', 23, 3);
|
||||
insert into bug20691 values (DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 4);
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
Warning 1364 Field 'b' doesn't have a default value
|
||||
Warning 1364 Field 'c' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'e' doesn't have a default value
|
||||
Warning 1364 Field 'f' doesn't have a default value
|
||||
Warning 1364 Field 'g' doesn't have a default value
|
||||
Warning 1364 Field 'h' doesn't have a default value
|
||||
Warning 1364 Field 'i' doesn't have a default value
|
||||
select * from bug20691 order by x asc;
|
||||
a b c d e f g h i x
|
||||
two large 00:00:05 0007-01-01 11 13 17 0019-01-01 00:00:00 23 1
|
||||
small 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 2
|
||||
two large 00:00:05 0007-01-01 11 13 17 0019-01-01 00:00:00 23 3
|
||||
small 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 4
|
||||
drop table bug20691;
|
||||
End of 5.0 tests.
|
||||
|
|
36
mysql-test/r/fix_priv_tables.result
Normal file
36
mysql-test/r/fix_priv_tables.result
Normal file
|
@ -0,0 +1,36 @@
|
|||
drop table if exists t1,t1aa,t2aa;
|
||||
DROP DATABASE IF EXISTS testdb;
|
||||
CREATE DATABASE testdb;
|
||||
CREATE TABLE testdb.t1 (
|
||||
c1 INT,
|
||||
c3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
CREATE VIEW testdb.v1 AS
|
||||
SELECT * FROM testdb.t1;
|
||||
GRANT CREATE VIEW, SHOW VIEW ON testdb.v1 TO 'show_view_tbl'@'localhost';
|
||||
SHOW GRANTS FOR 'show_view_tbl'@'localhost';
|
||||
Grants for show_view_tbl@localhost
|
||||
GRANT USAGE ON *.* TO 'show_view_tbl'@'localhost'
|
||||
GRANT CREATE VIEW, SHOW VIEW ON `testdb`.`v1` TO 'show_view_tbl'@'localhost'
|
||||
|
||||
GRANT SELECT(c1) on testdb.v1 to 'select_only_c1'@localhost;
|
||||
SHOW GRANTS FOR 'select_only_c1'@'localhost';
|
||||
Grants for select_only_c1@localhost
|
||||
GRANT USAGE ON *.* TO 'select_only_c1'@'localhost'
|
||||
GRANT SELECT (c1) ON `testdb`.`v1` TO 'select_only_c1'@'localhost'
|
||||
|
||||
"after fix privs"
|
||||
SHOW GRANTS FOR 'show_view_tbl'@'localhost';
|
||||
Grants for show_view_tbl@localhost
|
||||
GRANT USAGE ON *.* TO 'show_view_tbl'@'localhost'
|
||||
GRANT CREATE VIEW, SHOW VIEW ON `testdb`.`v1` TO 'show_view_tbl'@'localhost'
|
||||
|
||||
SHOW GRANTS FOR 'select_only_c1'@'localhost';
|
||||
Grants for select_only_c1@localhost
|
||||
GRANT USAGE ON *.* TO 'select_only_c1'@'localhost'
|
||||
GRANT SELECT (c1) ON `testdb`.`v1` TO 'select_only_c1'@'localhost'
|
||||
|
||||
DROP USER 'show_view_tbl'@'localhost';
|
||||
DROP USER 'select_only_c1'@'localhost';
|
||||
DROP VIEW testdb.v1;
|
||||
DROP TABLE testdb.t1;
|
||||
DROP DATABASE testdb;
|
0
mysql-test/r/fix_priv_tabs.result
Normal file
0
mysql-test/r/fix_priv_tabs.result
Normal file
24
mysql-test/r/flush2.result
Normal file
24
mysql-test/r/flush2.result
Normal file
|
@ -0,0 +1,24 @@
|
|||
flush logs;
|
||||
set global expire_logs_days = 3;
|
||||
show variables like 'log%';
|
||||
Variable_name Value
|
||||
log ON
|
||||
log_bin OFF
|
||||
log_bin_trust_function_creators ON
|
||||
log_error
|
||||
log_queries_not_using_indexes OFF
|
||||
log_slave_updates OFF
|
||||
log_slow_queries OFF
|
||||
log_warnings 1
|
||||
flush logs;
|
||||
show variables like 'log%';
|
||||
Variable_name Value
|
||||
log ON
|
||||
log_bin OFF
|
||||
log_bin_trust_function_creators ON
|
||||
log_error
|
||||
log_queries_not_using_indexes OFF
|
||||
log_slave_updates OFF
|
||||
log_slow_queries OFF
|
||||
log_warnings 1
|
||||
set global expire_logs_days = 0;
|
|
@ -134,4 +134,11 @@ timediff(b, a) >= '00:00:03'
|
|||
drop table t2;
|
||||
drop table t1;
|
||||
set global query_cache_size=default;
|
||||
create table t1 select INET_ATON('255.255.0.1') as `a`;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` bigint(21) unsigned DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
End of 5.0 tests
|
||||
|
|
|
@ -1047,6 +1047,9 @@ union
|
|||
(select time_format(timediff(now(), DATE_SUB(now(),INTERVAL 5 HOUR)),'%k') As H);
|
||||
H
|
||||
5
|
||||
select last_day('0000-00-00');
|
||||
last_day('0000-00-00')
|
||||
NULL
|
||||
End of 4.1 tests
|
||||
explain extended select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a1,
|
||||
timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a2;
|
||||
|
@ -1057,6 +1060,7 @@ Note 1003 select timestampdiff(WEEK,_latin1'2001-02-01',_latin1'2001-05-01') AS
|
|||
select time_format('100:00:00', '%H %k %h %I %l');
|
||||
time_format('100:00:00', '%H %k %h %I %l')
|
||||
100 100 04 04 4
|
||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||
create table t1 (a timestamp default '2005-05-05 01:01:01',
|
||||
b timestamp default '2005-05-05 01:01:01');
|
||||
drop function if exists t_slow_sysdate;
|
||||
|
@ -1080,6 +1084,7 @@ a != b
|
|||
drop trigger t_before;
|
||||
drop function t_slow_sysdate;
|
||||
drop table t1;
|
||||
SET GLOBAL log_bin_trust_function_creators = 0;
|
||||
create table t1 (a datetime, i int, b datetime);
|
||||
insert into t1 select sysdate(), sleep(1), sysdate() from dual;
|
||||
select a != b from t1;
|
||||
|
@ -1175,6 +1180,9 @@ id day id day
|
|||
3 2005-07-01 3 2005-07-15
|
||||
DROP TABLE t1,t2;
|
||||
set time_zone= @@global.time_zone;
|
||||
select str_to_date('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE;
|
||||
str_to_date('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE
|
||||
NULL
|
||||
End of 5.0 tests
|
||||
select date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND);
|
||||
date_sub("0050-01-01 00:00:01",INTERVAL 2 SECOND)
|
||||
|
|
|
@ -679,10 +679,11 @@ insert into t1 values (null,null);
|
|||
ERROR 23000: Column 's1' cannot be null
|
||||
drop table t1;
|
||||
drop procedure if exists fn3;
|
||||
create function fn3 () returns point return GeomFromText("point(1 1)");
|
||||
create function fn3 () returns point deterministic return GeomFromText("point(1 1)");
|
||||
show create function fn3;
|
||||
Function sql_mode Create Function
|
||||
fn3 CREATE DEFINER=`root`@`localhost` FUNCTION `fn3`() RETURNS point
|
||||
DETERMINISTIC
|
||||
return GeomFromText("point(1 1)")
|
||||
select astext(fn3());
|
||||
astext(fn3())
|
||||
|
|
|
@ -365,13 +365,14 @@ insert into mysql.user select * from t1;
|
|||
drop table t1, t2;
|
||||
drop database TESTDB;
|
||||
flush privileges;
|
||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||
grant all privileges on test.* to `a@`@localhost;
|
||||
grant execute on * to `a@`@localhost;
|
||||
create table t2 (s1 int);
|
||||
insert into t2 values (1);
|
||||
drop function if exists f2;
|
||||
create function f2 () returns int begin declare v int; select s1 from t2
|
||||
into v; return v; end//
|
||||
create function f2 () returns int
|
||||
begin declare v int; select s1 from t2 into v; return v; end//
|
||||
select f2();
|
||||
f2()
|
||||
1
|
||||
|
@ -379,3 +380,4 @@ drop function f2;
|
|||
drop table t2;
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
|
||||
drop user `a@`@localhost;
|
||||
SET GLOBAL log_bin_trust_function_creators = 0;
|
||||
|
|
2
mysql-test/r/have_mysql_upgrade.result
Normal file
2
mysql-test/r/have_mysql_upgrade.result
Normal file
|
@ -0,0 +1,2 @@
|
|||
have_mysql_upgrade
|
||||
1
|
|
@ -1077,7 +1077,7 @@ CREATE PROCEDURE p1 ()
|
|||
BEGIN
|
||||
SELECT 'foo' FROM DUAL;
|
||||
END |
|
||||
ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
|
||||
ERROR 42000: Unknown database 'information_schema'
|
||||
select ROUTINE_NAME from routines;
|
||||
ROUTINE_NAME
|
||||
grant all on information_schema.* to 'user1'@'localhost';
|
||||
|
|
|
@ -132,7 +132,7 @@ x
|
|||
17
|
||||
19
|
||||
drop trigger trg1;
|
||||
set global init_connect=default;
|
||||
set global init_connect="set @a='a\\0c'";
|
||||
revoke all privileges, grant option from mysqltest1@localhost;
|
||||
drop user mysqltest1@localhost;
|
||||
drop table t1, t2;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
drop table if exists t1;
|
||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||
create table t1 (col1 integer primary key, col2 integer) engine=innodb;
|
||||
insert t1 values (1,100);
|
||||
create function f1 () returns integer begin
|
||||
|
@ -18,3 +19,4 @@ rollback;
|
|||
rollback;
|
||||
drop table t1;
|
||||
drop function f1;
|
||||
SET GLOBAL log_bin_trust_function_creators = 0;
|
||||
|
|
|
@ -284,12 +284,15 @@ insert t1 values ('aaabbb');
|
|||
check table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
set @my_key_cache_block_size= @@global.key_cache_block_size;
|
||||
set GLOBAL key_cache_block_size=2048;
|
||||
check table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
drop table t1;
|
||||
set global key_cache_block_size= @my_key_cache_block_size;
|
||||
CREATE TABLE t1(a int NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
SET @my_key_cache_block_size= @@global.key_cache_block_size;
|
||||
SET GLOBAL key_cache_block_size=1536;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
SELECT @@key_cache_block_size;
|
||||
|
@ -331,6 +334,7 @@ CHECK TABLE t1;
|
|||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1,t2;
|
||||
set global key_cache_block_size= @my_key_cache_block_size;
|
||||
set @@global.key_buffer_size=0;
|
||||
Warnings:
|
||||
Warning 1438 Cannot drop default keycache
|
||||
|
|
|
@ -90,3 +90,4 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
select sum(a) c FROM t1 WHERE a > 0 ORDER BY c LIMIT 3;
|
||||
c
|
||||
28
|
||||
drop table t1;
|
||||
|
|
|
@ -8,4 +8,5 @@ create database d2;
|
|||
ERROR 42000: Access denied for user 'sample'@'localhost' to database 'd2'
|
||||
create database D1;
|
||||
ERROR 42000: Access denied for user 'sample'@'localhost' to database 'D1'
|
||||
drop user 'sample'@'localhost';
|
||||
drop database if exists d1;
|
||||
|
|
|
@ -36,6 +36,8 @@ Tables_in_test
|
|||
t1
|
||||
t2
|
||||
t3
|
||||
Tables_in_test
|
||||
t1
|
||||
_
|
||||
Test delimiter : from command line
|
||||
a
|
||||
|
@ -178,4 +180,8 @@ Too long dbname
|
|||
ERROR 1049 (42000) at line 1: Unknown database 'test_really_long_dbnamexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
|
||||
Too long hostname
|
||||
ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'cyrils_superlonghostnameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' (errno)
|
||||
1
|
||||
1
|
||||
ERROR at line 1: DELIMITER cannot contain a backslash character
|
||||
ERROR at line 1: DELIMITER cannot contain a backslash character
|
||||
End of 5.0 tests
|
||||
|
|
173
mysql-test/r/mysql_upgrade.result
Normal file
173
mysql-test/r/mysql_upgrade.result
Normal file
|
@ -0,0 +1,173 @@
|
|||
Run mysql_upgrade once
|
||||
mysql.binlog_index OK
|
||||
mysql.columns_priv OK
|
||||
mysql.db OK
|
||||
mysql.event OK
|
||||
mysql.func OK
|
||||
mysql.general_log OK
|
||||
mysql.help_category OK
|
||||
mysql.help_keyword OK
|
||||
mysql.help_relation OK
|
||||
mysql.help_topic OK
|
||||
mysql.host OK
|
||||
mysql.plugin OK
|
||||
mysql.proc OK
|
||||
mysql.procs_priv OK
|
||||
mysql.slow_log OK
|
||||
mysql.tables_priv OK
|
||||
mysql.time_zone OK
|
||||
mysql.time_zone_leap_second OK
|
||||
mysql.time_zone_name OK
|
||||
mysql.time_zone_transition OK
|
||||
mysql.time_zone_transition_type OK
|
||||
mysql.user OK
|
||||
@hadGrantPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadShowDbPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateViewPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateRoutinePriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateUserPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadEventPriv :=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadTriggerPriv :=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
Run it again - should say already completed
|
||||
@hadGrantPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadShowDbPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateViewPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateRoutinePriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateUserPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadEventPriv :=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadTriggerPriv :=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
Force should run it regardless of wheter it's been run before
|
||||
mysql.binlog_index OK
|
||||
mysql.columns_priv OK
|
||||
mysql.db OK
|
||||
mysql.event OK
|
||||
mysql.func OK
|
||||
mysql.general_log OK
|
||||
mysql.help_category OK
|
||||
mysql.help_keyword OK
|
||||
mysql.help_relation OK
|
||||
mysql.help_topic OK
|
||||
mysql.host OK
|
||||
mysql.plugin OK
|
||||
mysql.proc OK
|
||||
mysql.procs_priv OK
|
||||
mysql.slow_log OK
|
||||
mysql.tables_priv OK
|
||||
mysql.time_zone OK
|
||||
mysql.time_zone_leap_second OK
|
||||
mysql.time_zone_name OK
|
||||
mysql.time_zone_transition OK
|
||||
mysql.time_zone_transition_type OK
|
||||
mysql.user OK
|
||||
@hadGrantPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadShowDbPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateViewPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateRoutinePriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadCreateUserPriv:=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadEventPriv :=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
@hadTriggerPriv :=1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
4
mysql-test/r/mysqladmin.result
Normal file
4
mysql-test/r/mysqladmin.result
Normal file
|
@ -0,0 +1,4 @@
|
|||
mysqld is alive
|
||||
mysqladmin: unknown variable 'database=db1'
|
||||
Warning: mysqladmin: unknown variable 'loose-database=db2'
|
||||
mysqld is alive
|
|
@ -3088,7 +3088,7 @@ drop user mysqltest_1@localhost;
|
|||
#
|
||||
create database mysqldump_myDB;
|
||||
use mysqldump_myDB;
|
||||
create user myDB_User;
|
||||
create user myDB_User@localhost;
|
||||
grant create, create view, select, insert on mysqldump_myDB.* to myDB_User@localhost;
|
||||
create table t1 (c1 int);
|
||||
insert into t1 values (3);
|
||||
|
@ -3101,7 +3101,7 @@ drop view v1;
|
|||
drop table t1;
|
||||
drop table u1;
|
||||
revoke all privileges on mysqldump_myDB.* from myDB_User@localhost;
|
||||
drop user myDB_User;
|
||||
drop user myDB_User@localhost;
|
||||
drop database mysqldump_myDB;
|
||||
flush privileges;
|
||||
# Bug #21424 continues from here.
|
||||
|
@ -3119,7 +3119,7 @@ drop view v1;
|
|||
drop table t1;
|
||||
drop table u1;
|
||||
revoke all privileges on mysqldump_myDB.* from myDB_User@localhost;
|
||||
drop user myDB_User;
|
||||
drop user myDB_User@localhost;
|
||||
drop database mysqldump_myDB;
|
||||
use test;
|
||||
#
|
||||
|
|
|
@ -512,6 +512,12 @@ mysqltest: At line 1: End of line junk detected: "write_file filename ";
|
|||
mysqltest: At line 1: Missing required argument 'filename' to command 'file_exists'
|
||||
mysqltest: At line 1: Missing required argument 'from_file' to command 'copy_file'
|
||||
mysqltest: At line 1: Missing required argument 'to_file' to command 'copy_file'
|
||||
mysqltest: At line 1: Missing required argument 'mode' to command 'chmod'
|
||||
mysqltest: At line 1: You must write a 4 digit octal number for mode
|
||||
mysqltest: At line 1: You must write a 4 digit octal number for mode
|
||||
mysqltest: At line 1: Missing required argument 'file' to command 'chmod'
|
||||
mysqltest: At line 1: You must write a 4 digit octal number for mode
|
||||
mysqltest: At line 1: You must write a 4 digit octal number for mode
|
||||
hello
|
||||
hello
|
||||
hello
|
||||
|
|
|
@ -373,3 +373,104 @@ select yearweek();
|
|||
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
||||
select yearweek(1, 2, 3);
|
||||
ERROR 42000: Incorrect parameter count in the call to native function 'yearweek'
|
||||
select abs(3);
|
||||
abs(3)
|
||||
3
|
||||
select abs(3 AS three);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||
select abs(3 three);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||
select abs(3 AS "three");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||
select abs(3 "three");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'abs'
|
||||
set @bar="bar";
|
||||
set @foobar="foobar";
|
||||
select instr("foobar", "bar");
|
||||
instr("foobar", "bar")
|
||||
4
|
||||
select instr("foobar" AS p1, "bar");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar" p1, "bar");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar" AS "p1", "bar");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar" "p1", "bar");
|
||||
instr("foobar" "p1", "bar")
|
||||
4
|
||||
select instr(@foobar "p1", "bar");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar", "bar" AS p2);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar", "bar" p2);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar", "bar" AS "p2");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar", "bar" "p2");
|
||||
instr("foobar", "bar" "p2")
|
||||
0
|
||||
select instr("foobar", @bar "p2");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select instr("foobar" AS p1, "bar" AS p2);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'instr'
|
||||
select conv(255, 10, 16);
|
||||
conv(255, 10, 16)
|
||||
FF
|
||||
select conv(255 AS p1, 10, 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255 p1, 10, 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255 AS "p1", 10, 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255 "p1", 10, 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10 AS p2, 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10 p2, 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10 AS "p2", 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10 "p2", 16);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10, 16 AS p3);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10, 16 p3);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10, 16 AS "p3");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255, 10, 16 "p3");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select conv(255 AS p1, 10 AS p2, 16 AS p3);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'conv'
|
||||
select atan(10);
|
||||
atan(10)
|
||||
1.4711276743037
|
||||
select atan(10 AS p1);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 p1);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 AS "p1");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 "p1");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10, 20);
|
||||
atan(10, 20)
|
||||
0.46364760900081
|
||||
select atan(10 AS p1, 20);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 p1, 20);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 AS "p1", 20);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 "p1", 20);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10, 20 AS p2);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10, 20 p2);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10, 20 AS "p2");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10, 20 "p2");
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
select atan(10 AS p1, 20 AS p2);
|
||||
ERROR 42000: Incorrect parameters in the call to native function 'atan'
|
||||
|
|
|
@ -1527,9 +1527,9 @@ create procedure proc_1() reset query cache;
|
|||
call proc_1();
|
||||
call proc_1();
|
||||
call proc_1();
|
||||
create function func_1() returns int begin reset query cache; return 1; end|
|
||||
create function func_1() returns int deterministic begin reset query cache; return 1; end|
|
||||
ERROR 0A000: RESET is not allowed in stored function or trigger
|
||||
create function func_1() returns int begin call proc_1(); return 1; end|
|
||||
create function func_1() returns int deterministic begin call proc_1(); return 1; end|
|
||||
select func_1(), func_1(), func_1() from dual;
|
||||
ERROR 0A000: RESET is not allowed in stored function or trigger
|
||||
drop function func_1;
|
||||
|
|
|
@ -1077,10 +1077,12 @@ create procedure `p1`()
|
|||
begin
|
||||
select a, f1() from t1;
|
||||
end//
|
||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||
call p1()//
|
||||
a f1()
|
||||
1 2
|
||||
2 2
|
||||
SET GLOBAL log_bin_trust_function_creators = 0;
|
||||
drop procedure p1//
|
||||
drop function f1//
|
||||
drop table t1//
|
||||
|
|
|
@ -314,6 +314,7 @@ drop procedure f2;
|
|||
drop procedure f3;
|
||||
drop procedure f4;
|
||||
drop table t1;
|
||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||
reset query cache;
|
||||
drop function if exists f1;
|
||||
create table t1 (id int);
|
||||
|
@ -345,3 +346,4 @@ id
|
|||
drop table t1;
|
||||
drop function f1;
|
||||
set GLOBAL query_cache_size=0;
|
||||
SET GLOBAL log_bin_trust_function_creators = 0;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue