summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@mysql.com>2008-11-19 13:57:23 +0400
committerAlexey Botchkov <holyfoot@mysql.com>2008-11-19 13:57:23 +0400
commit70e8a4fd544984c3b7792d2428d16e0f4a244076 (patch)
tree071816ae207f688b1ce7cd2f417f46f05d90aad8
parent749f8b3ec1fe144a5f510ecb2e9ab9b198185755 (diff)
downloadmariadb-git-70e8a4fd544984c3b7792d2428d16e0f4a244076.tar.gz
Bug#38293 Libmysqld crash in mysql_library_init if language file missing
That's a Win-specific error. When we create libmysqld.dll we have many libraries like mysys, dbug, strings, etc linked into that dll, so the application built upon this library shouldn't link these libraries to itself, rather use those inside the dll. Fixed by redirecting calls into the libmysqld.dll per-file comments: dbug/dbug.c Bug#38293 Libmysqld crash in mysql_library_init if language file missing fake _db_something definitions added include/my_dbug.h Bug#38293 Libmysqld crash in mysql_library_init if language file missing fake _db_something declarations added libmysqld/examples/CMakeLists.txt Bug#38293 Libmysqld crash in mysql_library_init if language file missing superfluous libraries removed from linking libmysqld/libmysqld.def Bug#38293 Libmysqld crash in mysql_library_init if language file missing set of mysys functions added to the export section
-rw-r--r--dbug/dbug.c9
-rw-r--r--include/my_dbug.h16
-rw-r--r--libmysqld/examples/CMakeLists.txt6
-rw-r--r--libmysqld/libmysqld.def60
-rw-r--r--mysys/mf_tempdir.c2
-rw-r--r--mysys/my_getopt.c19
-rw-r--r--sql/mysqld.cc31
7 files changed, 122 insertions, 21 deletions
diff --git a/dbug/dbug.c b/dbug/dbug.c
index 1cebbbcf72a..bbd1abb9598 100644
--- a/dbug/dbug.c
+++ b/dbug/dbug.c
@@ -2407,4 +2407,13 @@ int i_am_a_dummy_function() {
return 0;
}
+#ifdef __WIN__
+char _db_doprnt_;
+char _db_enter_;
+char _db_pargs_;
+char _db_process_;
+char _db_push_;
+char _db_return_;
+#endif /*__WIN__*/
+
#endif
diff --git a/include/my_dbug.h b/include/my_dbug.h
index a77e439b5db..fa7941faf1c 100644
--- a/include/my_dbug.h
+++ b/include/my_dbug.h
@@ -108,6 +108,22 @@ extern FILE *_db_fp_(void);
#define DBUG_EXPLAIN(buf,len)
#define DBUG_EXPLAIN_INITIAL(buf,len)
#define IF_DBUG(A)
+
+#ifdef __WIN__
+/*
+ On windows all the dll export has to be declared in the *.def file
+ so as we export these symbols in DEBUG mode we have to export
+ these in the RELEASE mode also. So below are the dummy symbols
+ for the RELEASE export
+*/
+extern char _db_doprnt_;
+extern char _db_enter_;
+extern char _db_pargs_;
+extern char _db_process_;
+extern char _db_push_;
+extern char _db_return_;
+#endif /*__WIN__*/
+
#endif
#ifdef __cplusplus
}
diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt
index a07d089c757..ca383d59b24 100644
--- a/libmysqld/examples/CMakeLists.txt
+++ b/libmysqld/examples/CMakeLists.txt
@@ -29,13 +29,13 @@ ADD_DEFINITIONS(-DEMBEDDED_LIBRARY)
ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc
../../client/mysql.cc ../../client/readline.cc
../../client/sql_string.cc)
-TARGET_LINK_LIBRARIES(mysql_embedded mysys yassl taocrypt zlib debug dbug regex strings wsock32)
+TARGET_LINK_LIBRARIES(mysql_embedded debug wsock32)
ADD_DEPENDENCIES(mysql_embedded libmysqld)
ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.c)
-TARGET_LINK_LIBRARIES(mysqltest_embedded mysys yassl taocrypt zlib debug dbug regex strings wsock32)
+TARGET_LINK_LIBRARIES(mysqltest_embedded debug wsock32)
ADD_DEPENDENCIES(mysqltest_embedded libmysqld)
ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c)
-TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug mysys yassl taocrypt zlib strings wsock32)
+TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug wsock32)
ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld)
diff --git a/libmysqld/libmysqld.def b/libmysqld/libmysqld.def
index 2aa75c0b23c..431c0efdaa0 100644
--- a/libmysqld/libmysqld.def
+++ b/libmysqld/libmysqld.def
@@ -2,6 +2,66 @@ LIBRARY LIBMYSQLD
DESCRIPTION 'MySQL 5.1 Embedded Server Library'
VERSION 5.1
EXPORTS
+ _db_process_
+ _db_enter_
+ _db_return_
+ _db_push_
+ _db_doprnt_
+ _db_pargs_
+ strnmov
+ get_charset
+ my_memmem
+ my_snprintf
+ pthread_exit
+ pthread_cond_signal
+ dynstr_append_mem
+ init_dynamic_string
+ dynstr_free
+ hash_free
+ my_vsnprintf
+ dynstr_append
+ my_close
+ my_open
+ dynstr_set
+ dynstr_append_os_quoted
+ my_delete
+ my_seek
+ my_write
+ create_temp_file
+ fn_format
+ dirname_part
+ my_hash_insert
+ hash_search
+ test_if_hard_path
+ my_copy
+ my_mkdir
+ my_sleep
+ my_strtod
+ pthread_cond_wait
+ my_strnncoll_simple
+ get_dynamic
+ my_regerror
+ init_dynamic_array2
+ pthread_create
+ pthread_cond_init
+ my_regcomp
+ my_regexec
+ my_regex_end
+ my_regfree
+ longlong2str
+ my_set_exception_pointers
+ my_print_stacktrace
+ my_thread_stack_size
+ my_safe_print_str
+ my_stat
+ _hash_init
+ pthread_attr_setstacksize
+ pthread_attr_init
+ my_dirend
+ wild_compare
+ my_dir
+ my_micro_time
+ find_type_or_exit
_dig_vec_upper
_dig_vec_lower
bmove_upp
diff --git a/mysys/mf_tempdir.c b/mysys/mf_tempdir.c
index b2c18c74347..d6492c90965 100644
--- a/mysys/mf_tempdir.c
+++ b/mysys/mf_tempdir.c
@@ -85,6 +85,8 @@ char *my_tmpdir(MY_TMPDIR *tmpdir)
void free_tmpdir(MY_TMPDIR *tmpdir)
{
uint i;
+ if (!tmpdir->full_list.elements)
+ return;
for (i=0; i<=tmpdir->max; i++)
my_free(tmpdir->list[i], MYF(0));
delete_dynamic(&tmpdir->full_list);
diff --git a/mysys/my_getopt.c b/mysys/my_getopt.c
index 6a7ee748930..0f8055860d4 100644
--- a/mysys/my_getopt.c
+++ b/mysys/my_getopt.c
@@ -397,9 +397,10 @@ invalid value '%s'",
my_progname, optp->name, optend);
continue;
}
- get_one_option(optp->id, optp,
- *((my_bool*) value) ?
- (char*) "1" : disabled_my_option);
+ if (get_one_option(optp->id, optp,
+ *((my_bool*) value) ?
+ (char*) "1" : disabled_my_option))
+ return EXIT_ARGUMENT_INVALID;
continue;
}
argument= optend;
@@ -457,7 +458,8 @@ invalid value '%s'",
optp->arg_type == NO_ARG)
{
*((my_bool*) optp->value)= (my_bool) 1;
- get_one_option(optp->id, optp, argument);
+ if (get_one_option(optp->id, optp, argument))
+ return EXIT_UNSPECIFIED_ERROR;
continue;
}
else if (optp->arg_type == REQUIRED_ARG ||
@@ -476,7 +478,8 @@ invalid value '%s'",
{
if (optp->var_type == GET_BOOL)
*((my_bool*) optp->value)= (my_bool) 1;
- get_one_option(optp->id, optp, argument);
+ if (get_one_option(optp->id, optp, argument))
+ return EXIT_UNSPECIFIED_ERROR;
continue;
}
/* Check if there are more arguments after this one */
@@ -501,7 +504,8 @@ invalid value '%s'",
my_progname, argument, optp->name);
return error;
}
- get_one_option(optp->id, optp, argument);
+ if (get_one_option(optp->id, optp, argument))
+ return EXIT_UNSPECIFIED_ERROR;
break;
}
}
@@ -524,7 +528,8 @@ invalid value '%s'",
my_progname, argument, optp->name);
return error;
}
- get_one_option(optp->id, optp, argument);
+ if (get_one_option(optp->id, optp, argument))
+ return EXIT_UNSPECIFIED_ERROR;
(*argc)--; /* option handled (short or long), decrease argument count */
}
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index a3b0123ee4a..99583ca8ea9 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -733,7 +733,7 @@ uint connection_count= 0;
/* Function declarations */
pthread_handler_t signal_hand(void *arg);
-static void mysql_init_variables(void);
+static int mysql_init_variables(void);
static void get_options(int *argc,char **argv);
extern "C" my_bool mysqld_get_one_option(int, const struct my_option *, char *);
static void set_server_version(void);
@@ -3131,12 +3131,12 @@ static int init_common_variables(const char *conf_file_name, int argc,
if (!rpl_filter || !binlog_filter)
{
sql_perror("Could not allocate replication and binlog filters");
- exit(1);
+ return 1;
}
- if (init_thread_environment())
+ if (init_thread_environment() ||
+ mysql_init_variables())
return 1;
- mysql_init_variables();
#ifdef HAVE_TZNAME
{
@@ -3735,7 +3735,10 @@ version 5.0 and above. It is replaced by the binary log.");
{
/* as opt_bin_log==0, no need to free opt_bin_logname */
if (!(opt_bin_logname= my_strdup(opt_update_logname, MYF(MY_WME))))
- exit(EXIT_OUT_OF_MEMORY);
+ {
+ sql_print_error("Out of memory");
+ return EXIT_OUT_OF_MEMORY;
+ }
sql_print_error("The update log is no longer supported by MySQL in \
version 5.0 and above. It is replaced by the binary log. Now starting MySQL \
with --log-bin='%s' instead.",opt_bin_logname);
@@ -7404,7 +7407,7 @@ To see what values a running MySQL server is using, type\n\
as these are initialized by my_getopt.
*/
-static void mysql_init_variables(void)
+static int mysql_init_variables(void)
{
/* Things reset to zero */
opt_skip_slave_start= opt_reckless_slave = 0;
@@ -7485,7 +7488,10 @@ static void mysql_init_variables(void)
key_caches.empty();
if (!(dflt_key_cache= get_or_create_key_cache(default_key_cache_base.str,
default_key_cache_base.length)))
- exit(1);
+ {
+ sql_print_error("Cannot allocate the keycache");
+ return 1;
+ }
/* set key_cache_hash.default_value = dflt_key_cache */
multi_keycache_init();
@@ -7628,6 +7634,7 @@ static void mysql_init_variables(void)
tmpenv = DEFAULT_MYSQL_HOME;
(void) strmake(mysql_home, tmpenv, sizeof(mysql_home)-1);
#endif
+ return 0;
}
@@ -7687,9 +7694,11 @@ mysqld_get_one_option(int optid,
#endif
break;
#include <sslopt-case.h>
+#ifndef EMBEDDED_LIBRARY
case 'V':
print_version();
exit(0);
+#endif /*EMBEDDED_LIBRARY*/
case 'W':
if (!argument)
global_system_variables.log_warnings++;
@@ -7914,14 +7923,14 @@ mysqld_get_one_option(int optid,
if (gethostname(myhostname,sizeof(myhostname)) < 0)
{
sql_perror("Can't start server: cannot get my own hostname!");
- exit(1);
+ return 1;
}
ent=gethostbyname(myhostname);
}
if (!ent)
{
sql_perror("Can't start server: cannot resolve hostname!");
- exit(1);
+ return 1;
}
my_bind_addr = (ulong) ((in_addr*)ent->h_addr_list[0])->s_addr;
}
@@ -8118,8 +8127,8 @@ mysqld_get_one_option(int optid,
case OPT_FT_BOOLEAN_SYNTAX:
if (ft_boolean_check_syntax_string((uchar*) argument))
{
- fprintf(stderr, "Invalid ft-boolean-syntax string: %s\n", argument);
- exit(1);
+ sql_print_error("Invalid ft-boolean-syntax string: %s\n", argument);
+ return 1;
}
strmake(ft_boolean_syntax, argument, sizeof(ft_boolean_syntax)-1);
break;