diff --git a/CMakeLists.txt b/CMakeLists.txt index 457961c2..3c14206a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,7 +198,9 @@ SET(DEFAULT_CHARSET_HOME "${CMAKE_INSTALL_PREFIX}") INCLUDE(${CC_SOURCE_DIR}/cmake/SearchLibrary.cmake) IF(WITH_EXTERNAL_ZLIB) - FIND_PACKAGE(ZLIB) + IF(NOT ZLIB_FOUND) + FIND_PACKAGE(ZLIB) + ENDIF() IF(ZLIB_FOUND) INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) SET(LIBZ ${ZLIB_LIBRARY}) diff --git a/libmariadb/ma_stmt_codec.c b/libmariadb/ma_stmt_codec.c index e05b37f0..45ce4c3c 100644 --- a/libmariadb/ma_stmt_codec.c +++ b/libmariadb/ma_stmt_codec.c @@ -209,6 +209,7 @@ static long long my_strtoll(const char *str, size_t len, const char **end, int * return -1LL * uval; } + static long long my_atoll(const char *str, const char *end_str, int *error) { const char *p=str; @@ -216,18 +217,36 @@ static long long my_atoll(const char *str, const char *end_str, int *error) long long ret; while (p < end_str && isspace(*p)) p++; + ret = my_strtoll(p, end_str - p, &end, error); + + while(end < end_str && isspace(*end)) + end++; + + if(end != end_str) + *error= 1; + return ret; } + static unsigned long long my_atoull(const char *str, const char *end_str, int *error) { const char *p = str; const char *end; unsigned long long ret; + while (p < end_str && isspace(*p)) p++; + ret = my_strtoull(p, end_str - p, &end, error); + + while(end < end_str && isspace(*end)) + end++; + + if(end != end_str) + *error= 1; + return ret; } diff --git a/libmariadb/secure/win_crypt.c b/libmariadb/secure/win_crypt.c index 3ae44ddd..5e2b80ba 100644 --- a/libmariadb/secure/win_crypt.c +++ b/libmariadb/secure/win_crypt.c @@ -19,6 +19,7 @@ #include #include #include +#include #pragma comment(lib, "bcrypt.lib") diff --git a/plugins/auth/CMakeLists.txt b/plugins/auth/CMakeLists.txt index 3e4bcf12..3a598168 100644 --- a/plugins/auth/CMakeLists.txt +++ b/plugins/auth/CMakeLists.txt @@ -68,7 +68,7 @@ IF(WITH_SSL) SET(CACHING_SHA2_LIBS crypt32 bcrypt) ELSEIF(${WITH_SSL} STREQUAL "GNUTLS") SET(CRYPT_SOURCE ${CC_SOURCE_DIR}/libmariadb/secure/gnutls_crypt.c) - SET(CACHING_SHA2_LIBS ${SSL_LIBRARIES}) + SET(CACHING_SHA2_LIBS ${SSL_LIBRARIES} ${LIBZ}) ENDIF() REGISTER_PLUGIN(TARGET caching_sha2_password TYPE MARIADB_CLIENT_PLUGIN_AUTH diff --git a/unittest/libmariadb/ps_bugs.c b/unittest/libmariadb/ps_bugs.c index e2a595d1..e9079c47 100644 --- a/unittest/libmariadb/ps_bugs.c +++ b/unittest/libmariadb/ps_bugs.c @@ -4658,6 +4658,62 @@ static int equal_MYSQL_TIME(MYSQL_TIME *tm1, MYSQL_TIME *tm2) tm1->second_part==tm2->second_part && tm1->time_type==tm2->time_type && tm1->year==tm2->year; } +static int test_str_to_int(MYSQL *mysql) +{ + int i; + struct st_atoi_test{ + const char *str_value; + int int_value; + int rc; + } atoi_tests[]= + { + {"0", 0, 0}, + {" 1",1, 0}, + {"123 ",123, 0}, + {"10.2",10, MYSQL_DATA_TRUNCATED}, + {"a", 0, MYSQL_DATA_TRUNCATED}, + {"1 2 3", 1, MYSQL_DATA_TRUNCATED}, + {NULL, 0, 0} + }; + + for(i=0; atoi_tests[i].str_value; i++) + { + int rc; + MYSQL_STMT *stmt; + MYSQL_BIND bind[1]; + struct st_atoi_test *test= &atoi_tests[i]; + char sql[256]; + int int_value; + + snprintf(sql, sizeof(sql), "SELECT '%s'",test->str_value); + + stmt= mysql_stmt_init(mysql); + + rc= mysql_stmt_prepare(stmt, sql, (ulong)strlen(sql)); + check_stmt_rc(rc, stmt); + rc= mysql_stmt_execute(stmt); + check_stmt_rc(rc, stmt); + rc= mysql_stmt_store_result(stmt); + + memset(bind, 0, sizeof(MYSQL_BIND)); + bind[0].buffer_type= MYSQL_TYPE_LONG; + bind[0].buffer= &int_value; + bind[0].buffer_length= sizeof(int_value); + + rc= mysql_stmt_bind_result(stmt, bind); + check_stmt_rc(rc, stmt); + rc= mysql_stmt_fetch(stmt); + + diag("test: str='%s', expected/returned value =%d/%d, expected/returned rc=%d/%d", + test->str_value, test->int_value, int_value, test->rc, rc); + FAIL_UNLESS(rc == test->rc, "unexpected return code"); + FAIL_UNLESS(int_value == test->int_value, "unexpected int value"); + mysql_stmt_close(stmt); + } + return OK; +} + + static int test_codbc138(MYSQL *mysql) { int rc; @@ -5029,6 +5085,7 @@ struct my_tests_st my_tests[] = { {"test_stiny_bug", test_stiny_bug, TEST_CONNECTION_DEFAULT, 0, NULL , NULL}, {"test_bug53311", test_bug53311, TEST_CONNECTION_NEW, 0, NULL , NULL}, {"test_conc_fraction", test_conc_fraction, TEST_CONNECTION_DEFAULT, 0, NULL , NULL}, + {"test_str_to_int", test_str_to_int, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {NULL, NULL, 0, 0, NULL, NULL} };