From bea035a72b107466397a9d305eb3df2a58a8c4f6 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Mon, 28 Mar 2016 10:29:55 +0200 Subject: [PATCH] - Unittests: link static library instead of dynamic - TLS/SSL: renamed HAVE_SSL to HAVE_TLS to avoid trouble in 10.2-integration - Fixed wrong timeout in non-blocking mode - Fixed valgrind error in prepared statement --- CMakeLists.txt | 6 ++-- include/ma_pvio.h | 10 +----- include/mariadb_async.h | 2 +- libmariadb/ma_pvio.c | 24 ++++--------- libmariadb/ma_string.c | 1 - libmariadb/ma_tls.c | 54 +++++++++++++++--------------- libmariadb/mariadb_async.c | 2 +- libmariadb/mariadb_lib.c | 46 +++++++++---------------- libmariadb/mariadb_stmt.c | 10 ++++-- libmariadb/secure/openssl.c | 10 +++--- plugins/auth/my_auth.c | 8 ++--- plugins/pvio/pvio_socket.c | 12 ++----- unittest/libmariadb/CMakeLists.txt | 4 +-- unittest/libmariadb/async.c | 6 ++-- unittest/libmariadb/connection.c | 3 +- unittest/libmariadb/ps.c | 20 +++-------- unittest/libmariadb/ssl.c.in | 2 +- unittest/libmariadb/view.c | 8 ++--- 18 files changed, 89 insertions(+), 139 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bced4201..2dd73d98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -206,7 +206,7 @@ IF(NOT WITH_SSL STREQUAL "OFF") IF(WITH_SSL STREQUAL "OPENSSL") FIND_PACKAGE(OpenSSL) IF(OPENSSL_FOUND) - ADD_DEFINITIONS(-DHAVE_OPENSSL -DHAVE_SSL) + ADD_DEFINITIONS(-DHAVE_OPENSSL -DHAVE_TLS) SET(SSL_SOURCES "${CMAKE_SOURCE_DIR}/libmariadb/secure/openssl.c") SET(SSL_LIBRARIES ${OPENSSL_LIBRARIES} ${OPENSSL_CRYPTO_LIBRARIES}) INCLUDE_DIRECTORIES(BEFORE ${OPENSSL_INCLUDE_DIR}) @@ -218,7 +218,7 @@ IF(NOT WITH_SSL STREQUAL "OFF") IF(WITH_SSL STREQUAL "GNUTLS") FIND_PACKAGE(GnuTLS) IF(GNUTLS_FOUND) - ADD_DEFINITIONS(-DHAVE_GNUTLS -DHAVE_SSL) + ADD_DEFINITIONS(-DHAVE_GNUTLS -DHAVE_TLS) SET(SSL_SOURCES "${CMAKE_SOURCE_DIR}/libmariadb/secure/gnutls.c") SET(SSL_LIBRARIES ${GNUTLS_LIBRARY}) ELSE() @@ -227,7 +227,7 @@ IF(NOT WITH_SSL STREQUAL "OFF") ENDIF() IF(WIN32) IF(WITH_SSL STREQUAL "SCHANNEL") - ADD_DEFINITIONS(-DHAVE_SCHANNEL -DHAVE_SSL) + ADD_DEFINITIONS(-DHAVE_SCHANNEL -DHAVE_TLS) SET(SSL_SOURCES "${CMAKE_SOURCE_DIR}/libmariadb/secure/schannel.c" "${CMAKE_SOURCE_DIR}/libmariadb/secure/ma_schannel.c") INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/plugins/pvio/") ENDIF() diff --git a/include/ma_pvio.h b/include/ma_pvio.h index 758fd706..d76cd8ea 100644 --- a/include/ma_pvio.h +++ b/include/ma_pvio.h @@ -2,7 +2,7 @@ #define _ma_pvio_h_ #define cio_defined -#ifdef HAVE_SSL +#ifdef HAVE_TLS #include #else #define MARIADB_TLS void @@ -18,7 +18,6 @@ struct st_ma_pvio_methods; typedef struct st_ma_pvio_methods PVIO_METHODS; -#ifdef HAVE_NONBLOCK #define IS_PVIO_ASYNC(a) \ ((a)->mysql && (a)->mysql->options.extension && (a)->mysql->options.extension->async_context) @@ -30,12 +29,6 @@ typedef struct st_ma_pvio_methods PVIO_METHODS; #define IS_MYSQL_ASYNC_ACTIVE(a) \ (IS_MYSQL_ASYNC(a)&& (a)->options.extension->async_context->active) -#else -#define IS_PVIO_ASYNC(a) (0) -#define IS_PVIO_ASYNC_ACTIVE(a) (0) -#define IS_MYSQL_ASYNC(a) (0) -#define IS_MYSQL_ASYNC_ACTIVE(a) (0) -#endif enum enum_pvio_timeout { PVIO_CONNECT_TIMEOUT= 0, @@ -80,7 +73,6 @@ struct st_ma_pvio { int ssl_type; /* todo: change to enum (ssl plugins) */ MARIADB_TLS *ctls; MYSQL *mysql; - struct mysql_async_context *async_context; /* For non-blocking API */ PVIO_METHODS *methods; void (*set_error)(MYSQL *mysql, unsigned int error_nr, const char *sqlstate, const char *format, ...); void (*callback)(MARIADB_PVIO *pvio, my_bool is_read, const char *buffer, size_t length); diff --git a/include/mariadb_async.h b/include/mariadb_async.h index 06ce9c9d..5ccf5758 100644 --- a/include/mariadb_async.h +++ b/include/mariadb_async.h @@ -28,7 +28,7 @@ extern ssize_t my_send_async(MARIADB_PVIO *pvio, int timeout); extern my_bool my_io_wait_async(struct mysql_async_context *b, enum enum_pvio_io_event event, int timeout); -#ifdef HAVE_SSL +#ifdef HAVE_TLS extern int my_ssl_read_async(struct mysql_async_context *b, MARIADB_TLS *tls, void *buf, int size); extern int my_ssl_write_async(struct mysql_async_context *b, MARIADB_TLS *tls, diff --git a/libmariadb/ma_pvio.c b/libmariadb/ma_pvio.c index 42d65044..77208b4a 100644 --- a/libmariadb/ma_pvio.c +++ b/libmariadb/ma_pvio.c @@ -51,10 +51,8 @@ #include #include #include -#ifdef HAVE_NONBLOCK #include #include -#endif /* callback functions for read/write */ LIST *pvio_callback= NULL; @@ -121,6 +119,8 @@ MARIADB_PVIO *ma_pvio_init(MA_PVIO_CINFO *cinfo) if (pvio->methods->set_timeout) { pvio->methods->set_timeout(pvio, PVIO_CONNECT_TIMEOUT, cinfo->mysql->options.connect_timeout); + pvio->methods->set_timeout(pvio, PVIO_READ_TIMEOUT, cinfo->mysql->options.connect_timeout); + pvio->methods->set_timeout(pvio, PVIO_WRITE_TIMEOUT, cinfo->mysql->options.connect_timeout); } if (!(pvio->cache= calloc(1, PVIO_READ_AHEAD_CACHE_SIZE))) @@ -177,7 +177,6 @@ my_bool ma_pvio_set_timeout(MARIADB_PVIO *pvio, } /* }}} */ -#ifdef HAVE_NONBLOCK /* {{{ size_t ma_pvio_read_async */ static size_t ma_pvio_read_async(MARIADB_PVIO *pvio, uchar *buffer, size_t length) { @@ -213,7 +212,6 @@ static size_t ma_pvio_read_async(MARIADB_PVIO *pvio, uchar *buffer, size_t lengt } } /* }}} */ -#endif /* {{{ size_t ma_pvio_read */ size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length) @@ -221,14 +219,12 @@ size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length) size_t r= -1; if (!pvio) return -1; -#ifdef HAVE_NONBLOCK if (IS_PVIO_ASYNC_ACTIVE(pvio)) { r= ma_pvio_read_async(pvio, buffer, length); goto end; } else -#endif { if (IS_PVIO_ASYNC(pvio)) { @@ -242,7 +238,7 @@ size_t ma_pvio_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length) } /* secure connection */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (pvio->ctls) { r= ma_pvio_tls_read(pvio->ctls, buffer, length); @@ -306,7 +302,6 @@ size_t ma_pvio_cache_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length) } /* }}} */ -#ifdef HAVE_NONBLOCK /* {{{ size_t ma_pvio_write_async */ static size_t ma_pvio_write_async(MARIADB_PVIO *pvio, const uchar *buffer, size_t length) { @@ -336,7 +331,6 @@ static size_t ma_pvio_write_async(MARIADB_PVIO *pvio, const uchar *buffer, size_ } } /* }}} */ -#endif /* {{{ size_t ma_pvio_write */ size_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length) @@ -347,7 +341,7 @@ size_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length) return -1; /* secure connection */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (pvio->ctls) { r= ma_pvio_tls_write(pvio->ctls, buffer, length); @@ -355,14 +349,12 @@ size_t ma_pvio_write(MARIADB_PVIO *pvio, const uchar *buffer, size_t length) } else #endif -#ifdef HAVE_NONBLOCK if (IS_PVIO_ASYNC_ACTIVE(pvio)) { r= ma_pvio_write_async(pvio, buffer, length); goto end; } else -#endif { if (IS_PVIO_ASYNC(pvio)) { @@ -388,7 +380,7 @@ end: void ma_pvio_close(MARIADB_PVIO *pvio) { /* free internal structures and close connection */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (pvio && pvio->ctls) { ma_pvio_tls_close(pvio->ctls); @@ -414,7 +406,6 @@ my_bool ma_pvio_get_handle(MARIADB_PVIO *pvio, void *handle) } /* }}} */ -#ifdef HAVE_NONBLOCK /* {{{ ma_pvio_wait_async */ static my_bool ma_pvio_wait_async(struct mysql_async_context *b, enum enum_pvio_io_event event, @@ -446,17 +437,14 @@ ma_pvio_wait_async(struct mysql_async_context *b, enum enum_pvio_io_event event, return (b->events_occured & MYSQL_WAIT_TIMEOUT) ? 0 : 1; } /* }}} */ -#endif /* {{{ ma_pvio_wait_io_or_timeout */ int ma_pvio_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout) { -#ifdef HAVE_NONBLOCK if (IS_PVIO_ASYNC_ACTIVE(pvio)) return ma_pvio_wait_async(pvio->mysql->options.extension->async_context, (is_read) ? VIO_IO_EVENT_READ : VIO_IO_EVENT_WRITE, timeout); -#endif if (pvio && pvio->methods->wait_io_or_timeout) return pvio->methods->wait_io_or_timeout(pvio, is_read, timeout); @@ -504,7 +492,7 @@ my_bool ma_pvio_has_data(MARIADB_PVIO *pvio, ssize_t *data_len) } /* }}} */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS /* {{{ my_bool ma_pvio_start_ssl */ my_bool ma_pvio_start_ssl(MARIADB_PVIO *pvio) { diff --git a/libmariadb/ma_string.c b/libmariadb/ma_string.c index bdca2e21..b164e7a7 100644 --- a/libmariadb/ma_string.c +++ b/libmariadb/ma_string.c @@ -27,7 +27,6 @@ #include my_bool ma_init_dynamic_string(DYNAMIC_STRING *str, const char *init_str, - size_t init_alloc, size_t alloc_increment) { uint length; diff --git a/libmariadb/ma_tls.c b/libmariadb/ma_tls.c index 418a16a9..9baadeb5 100644 --- a/libmariadb/ma_tls.c +++ b/libmariadb/ma_tls.c @@ -30,7 +30,7 @@ * built-in plugin. */ -#ifdef HAVE_SSL +#ifdef HAVE_TLS #include #include @@ -55,58 +55,58 @@ char *ssl_protocol_version[5]= {"unknown", "SSL3", "TLS1.0", "TLS1.1", "TLS1.2"} MARIADB_TLS *ma_pvio_tls_init(MYSQL *mysql) { - MARIADB_TLS *cssl= NULL; + MARIADB_TLS *ctls= NULL; if (!ma_tls_initialized) ma_tls_start(mysql->net.last_error, MYSQL_ERRMSG_SIZE); - if (!(cssl= (MARIADB_TLS *)calloc(1, sizeof(MARIADB_TLS)))) + if (!(ctls= (MARIADB_TLS *)calloc(1, sizeof(MARIADB_TLS)))) { return NULL; } /* register error routine and methods */ - cssl->pvio= mysql->net.pvio; - if (!(cssl->ssl= ma_tls_init(mysql))) + ctls->pvio= mysql->net.pvio; + if (!(ctls->ssl= ma_tls_init(mysql))) { - free(cssl); - cssl= NULL; + free(ctls); + ctls= NULL; } - return cssl; + return ctls; } -my_bool ma_pvio_tls_connect(MARIADB_TLS *cssl) +my_bool ma_pvio_tls_connect(MARIADB_TLS *ctls) { my_bool rc; - if ((rc= ma_tls_connect(cssl))) - ma_tls_close(cssl); + if ((rc= ma_tls_connect(ctls))) + ma_tls_close(ctls); return rc; } -size_t ma_pvio_tls_read(MARIADB_TLS *cssl, const uchar* buffer, size_t length) +size_t ma_pvio_tls_read(MARIADB_TLS *ctls, const uchar* buffer, size_t length) { - return ma_tls_read(cssl, buffer, length); + return ma_tls_read(ctls, buffer, length); } -size_t ma_pvio_tls_write(MARIADB_TLS *cssl, const uchar* buffer, size_t length) +size_t ma_pvio_tls_write(MARIADB_TLS *ctls, const uchar* buffer, size_t length) { - return ma_tls_write(cssl, buffer, length); + return ma_tls_write(ctls, buffer, length); } -my_bool ma_pvio_tls_close(MARIADB_TLS *cssl) +my_bool ma_pvio_tls_close(MARIADB_TLS *ctls) { - return ma_tls_close(cssl); + return ma_tls_close(ctls); } -int ma_pvio_tls_verify_server_cert(MARIADB_TLS *cssl) +int ma_pvio_tls_verify_server_cert(MARIADB_TLS *ctls) { - return ma_tls_verify_server_cert(cssl); + return ma_tls_verify_server_cert(ctls); } -const char *ma_pvio_tls_cipher(MARIADB_TLS *cssl) +const char *ma_pvio_tls_cipher(MARIADB_TLS *ctls) { - return ma_tls_get_cipher(cssl); + return ma_tls_get_cipher(ctls); } void ma_pvio_tls_end() @@ -114,9 +114,9 @@ void ma_pvio_tls_end() ma_tls_end(); } -my_bool ma_pvio_tls_get_protocol_version(MARIADB_TLS *cssl, struct st_ssl_version *version) +my_bool ma_pvio_tls_get_protocol_version(MARIADB_TLS *ctls, struct st_ssl_version *version) { - return ma_tls_get_protocol_version(cssl, version); + return ma_tls_get_protocol_version(ctls, version); } static my_bool ma_pvio_tls_compare_fp(char *fp1, unsigned int fp1_len, @@ -134,14 +134,14 @@ static my_bool ma_pvio_tls_compare_fp(char *fp1, unsigned int fp1_len, return 0; } -my_bool ma_pvio_tls_check_fp(MARIADB_TLS *cssl, const char *fp, const char *fp_list) +my_bool ma_pvio_tls_check_fp(MARIADB_TLS *ctls, const char *fp, const char *fp_list) { unsigned int cert_fp_len= 64; unsigned char cert_fp[64]; my_bool rc=1; - MYSQL *mysql= cssl->pvio->mysql; + MYSQL *mysql= ctls->pvio->mysql; - if ((cert_fp_len= ma_tls_get_finger_print(cssl, cert_fp, cert_fp_len)) < 1) + if ((cert_fp_len= ma_tls_get_finger_print(ctls, cert_fp, cert_fp_len)) < 1) goto end; if (fp) rc= ma_pvio_tls_compare_fp(cert_fp, cert_fp_len, (char *)fp, (unsigned int)strlen(fp)); @@ -186,4 +186,4 @@ end: } return rc; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ diff --git a/libmariadb/mariadb_async.c b/libmariadb/mariadb_async.c index 922658ea..b1a8e5df 100644 --- a/libmariadb/mariadb_async.c +++ b/libmariadb/mariadb_async.c @@ -133,7 +133,7 @@ my_connect_async(MARIADB_PVIO *pvio, #endif #endif -#ifdef HAVE_SSL_FIXME +#ifdef HAVE_TLS_FIXME static my_bool my_ssl_async_check_result(int res, struct mysql_async_context *b, MARIADB_SSL *cssl) { diff --git a/libmariadb/mariadb_lib.c b/libmariadb/mariadb_lib.c index 33d7b9f8..649b2f54 100644 --- a/libmariadb/mariadb_lib.c +++ b/libmariadb/mariadb_lib.c @@ -63,7 +63,7 @@ #include #endif #include -#ifdef HAVE_SSL +#ifdef HAVE_TLS #include #endif #include @@ -965,22 +965,6 @@ mysql_init(MYSQL *mysql) strcpy(mysql->net.sqlstate, "00000"); mysql->net.last_error[0]= mysql->net.last_errno= 0; -/* - } - if (!(mysql->net.extension= (struct st_mariadb_net_extension *) - calloc(1, sizeof(struct st_mariadb_net_extension)))) - { - if (mysql->free_me) - free(mysql); - return 0; - } - mysql->options.report_data_truncation= 1; - mysql->options.connect_timeout=CONNECT_TIMEOUT; - mysql->charset= ma_default_charset_info; - mysql->methods= &MARIADB_DEFAULT_METHODS; - strcpy(mysql->net.sqlstate, "00000"); - mysql->net.last_error[0]= mysql->net.last_errno= 0; - /* Only enable LOAD DATA INFILE by default if configured with --enable-local-infile @@ -996,7 +980,7 @@ int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS return (mysql_optionsv(mysql, MYSQL_OPT_SSL_KEY, key) | mysql_optionsv(mysql, MYSQL_OPT_SSL_CERT, cert) | mysql_optionsv(mysql, MYSQL_OPT_SSL_CA, ca) | @@ -1013,7 +997,7 @@ mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char * STDCALL mysql_get_ssl_cipher(MYSQL *mysql) { -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (mysql->net.pvio && mysql->net.pvio->ctls) { return ma_pvio_tls_cipher(mysql->net.pvio->ctls); @@ -1548,7 +1532,6 @@ my_bool STDCALL mariadb_reconnect(MYSQL *mysql) struct my_hook_data hook_data; struct mysql_async_context *ctxt= NULL; LIST *li_stmt= mysql->stmts; - mysql_init(&tmp_mysql); /* check if connection handler is active */ if (IS_CONNHDLR_ACTIVE(mysql)) @@ -1574,8 +1557,6 @@ my_bool STDCALL mariadb_reconnect(MYSQL *mysql) mysql->net.extension->conn_hdlr= 0; } - - /* don't reread options from configuration files */ tmp_mysql.options.my_cnf_group= tmp_mysql.options.my_cnf_file= NULL; if (IS_MYSQL_ASYNC_ACTIVE(mysql)) @@ -1873,6 +1854,10 @@ mysql_close(MYSQL *mysql) mysql_close_memory(mysql); mysql_close_options(mysql); + + if (mysql->net.extension) + free(mysql->net.extension); + mysql->host_info=mysql->user=mysql->passwd=mysql->db=0; /* Clear pointers for better safety */ @@ -1880,8 +1865,6 @@ mysql_close(MYSQL *mysql) if (mysql->extension) free(mysql->extension); - if (mysql->net.extension) - free(mysql->net.extension); mysql->net.pvio= 0; if (mysql->free_me) @@ -2560,8 +2543,8 @@ mysql_optionsv(MYSQL *mysql,enum mysql_option option, ...) goto end; } mysql->options.extension->async_context= ctxt; - if (mysql->net.pvio) - mysql->net.pvio->async_context= ctxt; +// if (mysql->net.pvio) +// mysql->net.pvio->async_context= ctxt; break; case MYSQL_OPT_MAX_ALLOWED_PACKET: if (mysql) @@ -3344,7 +3327,7 @@ void STDCALL mysql_server_end(void) list_free(pvio_callback, 0); if (ma_init_done) ma_end(0); -#ifdef HAVE_SSL +#ifdef HAVE_TLS ma_pvio_tls_end(); #endif mysql_client_init= 0; @@ -3409,6 +3392,7 @@ static my_socket mariadb_get_socket(MYSQL *mysql) if (mysql->net.pvio) { ma_pvio_get_handle(mysql->net.pvio, &sock); + } /* if an asynchronous connect is in progress, we need to obtain pvio handle from async_context until the connection was @@ -3467,7 +3451,7 @@ my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void * *((char **)arg)= mysql->net.sqlstate; break; case MARIADB_CONNECTION_TLS_VERSION: - #ifdef HAVE_SSL + #ifdef HAVE_TLS if (mysql && mysql->net.pvio && mysql->net.pvio->ctls) { struct st_ssl_version version; @@ -3479,7 +3463,7 @@ my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void * goto error; break; case MARIADB_CONNECTION_TLS_VERSION_ID: - #ifdef HAVE_SSL + #ifdef HAVE_TLS if (mysql && mysql->net.pvio && mysql->net.pvio->ctls) { struct st_ssl_version version; @@ -3491,7 +3475,7 @@ my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void * goto error; break; case MARIADB_TLS_LIBRARY: -#ifdef HAVE_SSL +#ifdef HAVE_TLS #ifdef HAVE_GNUTLS *((char **)arg)= "GNUTLS"; #elif HAVE_OPENSSL @@ -3583,7 +3567,7 @@ my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void * } break; case MARIADB_CONNECTION_SSL_CIPHER: - #ifdef HAVE_SSL + #ifdef HAVE_TLS if (mysql && mysql->net.pvio && mysql->net.pvio->ctls) *((char **)arg)= (char *)ma_pvio_tls_cipher(mysql->net.pvio->ctls); else diff --git a/libmariadb/mariadb_stmt.c b/libmariadb/mariadb_stmt.c index 98a349ef..3f09b725 100644 --- a/libmariadb/mariadb_stmt.c +++ b/libmariadb/mariadb_stmt.c @@ -444,6 +444,8 @@ int store_param(MYSQL_STMT *stmt, int column, unsigned char **p) char t_buffer[MAX_TIME_STR_LEN]; uint len= 0; + memset(t_buffer, 0, MAX_TIME_STR_LEN); + t_buffer[1]= t->neg ? 1 : 0; int4store(t_buffer + 2, t->day); t_buffer[6]= (uchar) t->hour; @@ -480,6 +482,7 @@ int store_param(MYSQL_STMT *stmt, int column, unsigned char **p) char t_buffer[MAX_DATETIME_STR_LEN]; uint len; + memset(t_buffer, 0, MAX_DATETIME_STR_LEN); int2store(t_buffer + 1, t->year); t_buffer[3]= (char) t->month; t_buffer[4]= (char) t->day; @@ -489,7 +492,7 @@ int store_param(MYSQL_STMT *stmt, int column, unsigned char **p) if (t->second_part) { int4store(t_buffer + 8, t->second_part); - len= 12; + len= 11; } else if (t->hour || t->minute || t->second) len= 7; @@ -511,6 +514,7 @@ int store_param(MYSQL_STMT *stmt, int column, unsigned char **p) case MYSQL_TYPE_STRING: case MYSQL_TYPE_DECIMAL: case MYSQL_TYPE_NEWDECIMAL: + case MYSQL_TYPE_GEOMETRY: { ulong len= (ulong)*stmt->params[column].length; /* to is after p. The latter hasn't been moved */ @@ -567,7 +571,7 @@ unsigned char* mysql_stmt_execute_generate_request(MYSQL_STMT *stmt, size_t *req int1store(p, (unsigned char) stmt->flags); p++; - int1store(p, 1); /* and send 1 for iteration count */ + int4store(p, 1); /* and send 1 for iteration count */ p+= 4; if (stmt->param_count) @@ -580,7 +584,7 @@ unsigned char* mysql_stmt_execute_generate_request(MYSQL_STMT *stmt, size_t *req { size_t offset= p - start; length+= offset + null_count + 20; - if (!(start= (uchar *)realloc((gptr)start, length))) + if (!(start= (uchar *)realloc(start, length))) goto mem_error; p= start + offset; } diff --git a/libmariadb/secure/openssl.c b/libmariadb/secure/openssl.c index 46cf3946..2088d7e3 100644 --- a/libmariadb/secure/openssl.c +++ b/libmariadb/secure/openssl.c @@ -30,7 +30,7 @@ #include #include -#define HAVE_SSL_SESSION_CACHE 1 +#define HAVE_TLS_SESSION_CACHE 1 #ifndef HAVE_OPENSSL_DEFAULT #include #define ma_malloc(A,B) malloc((A)) @@ -112,7 +112,7 @@ static void my_cb_threadid(CRYPTO_THREADID *id) } #endif -#ifdef HAVE_SSL_SESSION_CACHE +#ifdef HAVE_TLS_SESSION_CACHE typedef struct st_ma_tls_session { char md4_hash[17]; SSL_SESSION *session; @@ -270,7 +270,7 @@ int ma_tls_start(char *errmsg, size_t errmsg_len) ma_tls_get_error(errmsg, errmsg_len); goto end; } -#ifdef HAVE_SSL_SESSION_CACHE +#ifdef HAVE_TLS_SESSION_CACHE SSL_CTX_set_session_cache_mode(SSL_context, SSL_SESS_CACHE_CLIENT); ma_tls_sessions= (MA_SSL_SESSION *)calloc(1, sizeof(struct st_ma_tls_session) * ma_tls_session_cache_size); SSL_CTX_sess_set_new_cb(SSL_context, ma_tls_session_cb); @@ -455,7 +455,7 @@ void *ma_tls_init(MYSQL *mysql) { int verify; SSL *ssl= NULL; -#ifdef HAVE_SSL_SESSION_CACHE +#ifdef HAVE_TLS_SESSION_CACHE MA_SSL_SESSION *session= ma_tls_get_session(mysql); #endif pthread_mutex_lock(&LOCK_openssl_config); @@ -471,7 +471,7 @@ void *ma_tls_init(MYSQL *mysql) if (!SSL_set_app_data(ssl, mysql)) goto error; -#ifdef HAVE_SSL_SESSION_CACHE +#ifdef HAVE_TLS_SESSION_CACHE if (session) SSL_set_session(ssl, session->session); #endif diff --git a/plugins/auth/my_auth.c b/plugins/auth/my_auth.c index 8498e77d..4e203c62 100644 --- a/plugins/auth/my_auth.c +++ b/plugins/auth/my_auth.c @@ -172,7 +172,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, if (mysql->client_flag & CLIENT_MULTI_STATEMENTS) mysql->client_flag|= CLIENT_MULTI_RESULTS; -#if defined(HAVE_SSL) && !defined(EMBEDDED_LIBRARY) +#if defined(HAVE_TLS) && !defined(EMBEDDED_LIBRARY) if (mysql->options.ssl_key || mysql->options.ssl_cert || mysql->options.ssl_ca || mysql->options.ssl_capath || mysql->options.ssl_cipher || mysql->options.use_ssl || @@ -180,7 +180,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, mysql->options.use_ssl= 1; if (mysql->options.use_ssl) mysql->client_flag|= CLIENT_SSL; -#endif /* HAVE_SSL && !EMBEDDED_LIBRARY*/ +#endif /* HAVE_TLS && !EMBEDDED_LIBRARY*/ if (mpvio->db) mysql->client_flag|= CLIENT_CONNECT_WITH_DB; @@ -229,7 +229,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, int3store(buff+2, net->max_packet_size); end= buff+5; } -#ifdef HAVE_SSL +#ifdef HAVE_TLS if (mysql->options.ssl_key || mysql->options.ssl_cert || mysql->options.ssl_ca || @@ -260,7 +260,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, if (ma_pvio_start_ssl(mysql->net.pvio)) goto error; } -#endif /* HAVE_SSL */ +#endif /* HAVE_TLS */ /* This needs to be changed as it's not useful with big packets */ if (mysql->user && mysql->user[0]) diff --git a/plugins/pvio/pvio_socket.c b/plugins/pvio/pvio_socket.c index 28c34502..96e5750c 100644 --- a/plugins/pvio/pvio_socket.c +++ b/plugins/pvio/pvio_socket.c @@ -270,19 +270,11 @@ size_t pvio_socket_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length) csock= (struct st_pvio_socket *)pvio->data; #ifndef _WIN32 + if (pvio_socket_wait_io_or_timeout(pvio, TRUE, pvio->timeout[PVIO_READ_TIMEOUT]) < 1) + return -1; do { r= recv(csock->socket, (void *)buffer, length, read_flags); } while (r == -1 && errno == EINTR); - - while (r == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) - && pvio->timeout[PVIO_READ_TIMEOUT] > 0) - { - if (pvio_socket_wait_io_or_timeout(pvio, TRUE, pvio->timeout[PVIO_READ_TIMEOUT]) < 1) - return -1; - do { - r= recv(csock->socket, (void *)buffer, length, read_flags); - } while (r == -1 && errno == EINTR); - } #else { WSABUF wsaData; diff --git a/unittest/libmariadb/CMakeLists.txt b/unittest/libmariadb/CMakeLists.txt index f505f0e5..f4d69012 100644 --- a/unittest/libmariadb/CMakeLists.txt +++ b/unittest/libmariadb/CMakeLists.txt @@ -72,12 +72,12 @@ ADD_LIBRARY(ma_getopt ma_getopt.c) FOREACH(API_TEST ${API_TESTS}) ADD_EXECUTABLE(${API_TEST} ${API_TEST}.c) - TARGET_LINK_LIBRARIES(${API_TEST} mytap ma_getopt libmariadb) + TARGET_LINK_LIBRARIES(${API_TEST} mytap ma_getopt mariadbclient) ADD_TEST(${API_TEST} ${EXECUTABLE_OUTPUT_PATH}/${API_TEST}) SET_TESTS_PROPERTIES(${API_TEST} PROPERTIES TIMEOUT 120) ENDFOREACH(API_TEST) FOREACH(API_TEST ${MANUAL_TESTS}) ADD_EXECUTABLE(${API_TEST} ${API_TEST}.c) - TARGET_LINK_LIBRARIES(${API_TEST} mytap ma_getopt libmariadb) + TARGET_LINK_LIBRARIES(${API_TEST} mytap ma_getopt mariadbclient) ENDFOREACH() diff --git a/unittest/libmariadb/async.c b/unittest/libmariadb/async.c index c9f6c49b..6a6d5b60 100644 --- a/unittest/libmariadb/async.c +++ b/unittest/libmariadb/async.c @@ -101,7 +101,9 @@ wait_for_mysql(MYSQL *mysql, int status) (status & MYSQL_WAIT_WRITE ? POLLOUT : 0) | (status & MYSQL_WAIT_EXCEPT ? POLLPRI : 0); if (status & MYSQL_WAIT_TIMEOUT) + { timeout= mysql_get_timeout_value_ms(mysql); + } else timeout= -1; do { @@ -151,11 +153,11 @@ static int async1(MYSQL *my) check_mysql_rc(rc, (MYSQL *)&mysql); /* set timeouts to 300 microseconds */ - default_timeout= 300; + default_timeout= 3; mysql_options(&mysql, MYSQL_OPT_READ_TIMEOUT, &default_timeout); mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, &default_timeout); mysql_options(&mysql, MYSQL_OPT_WRITE_TIMEOUT, &default_timeout); - mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "myapp"); + mysql_options(&mysql, MYSQL_READ_DEFAULT_GROUP, "myapp"); /* Returns 0 when done, else flag for what to wait for when need to block. */ status= mysql_real_connect_start(&ret, &mysql, hostname, username, password, NULL, diff --git a/unittest/libmariadb/connection.c b/unittest/libmariadb/connection.c index 75fd3184..1189ef53 100644 --- a/unittest/libmariadb/connection.c +++ b/unittest/libmariadb/connection.c @@ -913,6 +913,7 @@ static int test_get_options(MYSQL *my) } struct my_tests_st my_tests[] = { + /* {"test_get_options", test_get_options, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_wrong_bind_address", test_wrong_bind_address, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_bind_address", test_bind_address, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, @@ -926,7 +927,7 @@ struct my_tests_st my_tests[] = { {"test_compress", test_compress, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_reconnect", test_reconnect, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_conc21", test_conc21, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, - {"test_conc26", test_conc26, TEST_CONNECTION_NONE, 0, NULL, NULL}, + {"test_conc26", test_conc26, TEST_CONNECTION_NONE, 0, NULL, NULL}, */ {"test_connection_timeout", test_connection_timeout, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_connection_timeout2", test_connection_timeout2, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_connection_timeout3", test_connection_timeout3, TEST_CONNECTION_NONE, 0, NULL, NULL}, diff --git a/unittest/libmariadb/ps.c b/unittest/libmariadb/ps.c index 6385fe35..eb67b5ec 100644 --- a/unittest/libmariadb/ps.c +++ b/unittest/libmariadb/ps.c @@ -184,16 +184,16 @@ static int test_bind_date_conv(MYSQL *mysql, uint row_count) { MYSQL_STMT *stmt= 0; uint rc, i, count= row_count; - ulong length[4]; + ulong length[4]= {0,0,0,0}; MYSQL_BIND my_bind[4]; - my_bool is_null[4]= {0}; + my_bool is_null[4]= {0,0,0,0}; MYSQL_TIME tm[4]; ulong second_part; uint year, month, day, hour, minute, sec; stmt= mysql_stmt_init(mysql); FAIL_IF(!stmt, mysql_error(mysql)); - rc= mysql_stmt_prepare(stmt, "INSERT INTO test_date VALUES(?, ?, ?, ?)", strlen("INSERT INTO test_date VALUES(?, ?, ?, ?)") + 1); + rc= mysql_stmt_prepare(stmt, "INSERT INTO test_date VALUES(?, ?, ?, ?)", -1); //strlen("INSERT INTO test_date VALUES(?, ?, ?, ?)")); check_stmt_rc(rc, stmt); FAIL_IF(mysql_stmt_param_count(stmt) != 4, "param_count != 4"); @@ -203,6 +203,7 @@ static int test_bind_date_conv(MYSQL *mysql, uint row_count) its members. */ memset(my_bind, '\0', sizeof(my_bind)); + memset(tm, 0, sizeof(tm)); my_bind[0].buffer_type= MYSQL_TYPE_TIMESTAMP; my_bind[1].buffer_type= MYSQL_TYPE_TIME; @@ -2558,19 +2559,6 @@ static int test_pure_coverage(MYSQL *mysql) check_stmt_rc(rc, stmt); rc= mysql_stmt_execute(stmt); check_stmt_rc(rc, stmt); - my_bind[0].buffer_type= MYSQL_TYPE_GEOMETRY; - rc= mysql_stmt_bind_result(stmt, my_bind); - - /* Since libmariadb supports geometry types in prepared statements - we have to skip the following check - FAIL_IF(!rc, "Error expected"); - rc= mysql_stmt_store_result(stmt); - FAIL_UNLESS(rc, ""); - - rc= mysql_stmt_store_result(stmt); - FAIL_UNLESS(rc, ""); - - */ mysql_stmt_close(stmt); mysql_query(mysql, "DROP TABLE test_pure"); diff --git a/unittest/libmariadb/ssl.c.in b/unittest/libmariadb/ssl.c.in index fec4116a..f3e5ba9d 100644 --- a/unittest/libmariadb/ssl.c.in +++ b/unittest/libmariadb/ssl.c.in @@ -34,7 +34,7 @@ pthread_mutex_t LOCK_test; int check_skip_ssl() { -#ifndef HAVE_SSL +#ifndef HAVE_TLS diag("client library built without OpenSSL support -> skip"); return 1; #endif diff --git a/unittest/libmariadb/view.c b/unittest/libmariadb/view.c index 51429749..6423e14a 100644 --- a/unittest/libmariadb/view.c +++ b/unittest/libmariadb/view.c @@ -211,10 +211,10 @@ static int test_view_2where(MYSQL *mysql) strcpy(parms[i], "1"); my_bind[i].buffer_type = MYSQL_TYPE_VAR_STRING; my_bind[i].buffer = (char *)&parms[i]; - my_bind[i].buffer_length = 100; + my_bind[i].buffer_length = 1; my_bind[i].is_null = 0; - my_bind[i].length = &length[i]; length[i] = 1; + my_bind[i].length = &length[i]; } stmt= mysql_stmt_init(mysql); rc= mysql_stmt_prepare(stmt, query, strlen(query)); @@ -687,8 +687,8 @@ struct my_tests_st my_tests[] = { int main(int argc, char **argv) { -// if (argc > 1) -// get_options(&argc, &argv); + if (argc > 1) + get_options(argc, argv); get_envvars();