From 69596e230a7d6742eae70e25e9c8fab73e1d5ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Thu, 28 Dec 2017 15:02:43 +0100 Subject: [PATCH] Apply patches to mariadb_connector_c_3.0.2 #1126 --- deps/Makefile | 18 +-- deps/mariadb-client-library/ma_alloc.c.patch | 9 ++ .../mariadb-client-library/ma_charset.c.patch | 8 ++ .../ma_password.c.patch | 56 +++++++++ .../mariadb_async.c.patch | 31 +++++ .../mariadb_lib.c.patch | 110 ++++++++++++++++++ deps/mariadb-client-library/mysql.h.patch | 16 +-- .../unittest_basic-t.c.patch | 11 ++ .../unittest_charset.c.patch | 71 +++++++++++ 9 files changed, 314 insertions(+), 16 deletions(-) create mode 100644 deps/mariadb-client-library/ma_alloc.c.patch create mode 100644 deps/mariadb-client-library/ma_charset.c.patch create mode 100644 deps/mariadb-client-library/ma_password.c.patch create mode 100644 deps/mariadb-client-library/mariadb_async.c.patch create mode 100644 deps/mariadb-client-library/mariadb_lib.c.patch create mode 100644 deps/mariadb-client-library/unittest_basic-t.c.patch create mode 100644 deps/mariadb-client-library/unittest_charset.c.patch diff --git a/deps/Makefile b/deps/Makefile index 52a2d110d..c1b4e9895 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -69,18 +69,20 @@ jemalloc: jemalloc/jemalloc/lib/libjemalloc.a mariadb-client-library/mariadb_client/include/my_config.h: - cd mariadb-client-library && rm -rf mariadb-connector-c-2.3.1 - cd mariadb-client-library && tar -zxf mariadb-connector-c-2.3.1-src.tar.gz + cd mariadb-client-library && rm -rf mariadb-connector-c-3.0.2-src + cd mariadb-client-library && tar -zxf mariadb-connector-c-3.0.2-src.tar.gz cd mariadb-client-library/mariadb_client && cmake . # cd mariadb-client-library/mariadb_client && cmake . -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl # this is needed on MacOSX - cd mariadb-client-library/mariadb_client && patch libmariadb/libmariadb.c < ../libmariadb.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/net.c < ../net.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/mysql_async.c < ../mysql_async.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/password.c < ../password.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_lib.c < ../mariadb_lib.c.patch +# cd mariadb-client-library/mariadb_client && patch libmariadb/net.c < ../net.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/mariadb_async.c < ../mariadb_async.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/ma_password.c < ../ma_password.c.patch # cd mariadb-client-library/mariadb_client && patch libmariadb/ma_secure.c < ../ma_secure.c.patch cd mariadb-client-library/mariadb_client && patch include/mysql.h < ../mysql.h.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/my_alloc.c < ../my_alloc.c.patch - cd mariadb-client-library/mariadb_client && patch libmariadb/my_charset.c < ../my_charset.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/ma_alloc.c < ../ma_alloc.c.patch + cd mariadb-client-library/mariadb_client && patch libmariadb/ma_charset.c < ../ma_charset.c.patch + cd mariadb-client-library/mariadb_client && patch unittest/libmariadb/basic-t.c < ../unittest_basic-t.c.patch + cd mariadb-client-library/mariadb_client && patch unittest/libmariadb/charset.c < ../unittest_charset.c.patch cd mariadb-client-library/mariadb_client && CC=${CC} CXX=${CXX} ${MAKE} # cd mariadb-client-library/mariadb_client/include && make my_config.h diff --git a/deps/mariadb-client-library/ma_alloc.c.patch b/deps/mariadb-client-library/ma_alloc.c.patch new file mode 100644 index 000000000..04104d0a4 --- /dev/null +++ b/deps/mariadb-client-library/ma_alloc.c.patch @@ -0,0 +1,9 @@ +@@ -85,7 +85,7 @@ + if (! next) + { /* Time to alloc new block */ + get_size= MAX(Size+ALIGN_SIZE(sizeof(MA_USED_MEM)), +- (mem_root->block_size & ~1) * (mem_root->block_num >> 2)); ++ (mem_root->block_size & ~1) * ( (mem_root->block_num >> 2) > 4 ? 4 : (mem_root->block_num >> 2) ) ); + + if (!(next = (MA_USED_MEM*) malloc(get_size))) + { diff --git a/deps/mariadb-client-library/ma_charset.c.patch b/deps/mariadb-client-library/ma_charset.c.patch new file mode 100644 index 000000000..456accdcc --- /dev/null +++ b/deps/mariadb-client-library/ma_charset.c.patch @@ -0,0 +1,8 @@ +@@ -732,6 +732,7 @@ + { 247, 1, UTF8_MB4, UTF8_MB4"_vietnamese_ci", "", 65001, "UTF-8", 1, 4, mysql_mbcharlen_utf8, check_mb_utf8_valid}, + + { 254, 1, UTF8_MB3, UTF8_MB3"_general_cs", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8, check_mb_utf8_valid}, ++ { 255, 1, UTF8_MB4, UTF8_MB4"_0900_ai_ci", "", 65001, "UTF-8", 1, 4, mysql_mbcharlen_utf8, check_mb_utf8_valid}, + { 576, 1, UTF8_MB3, UTF8_MB3"_croatian_ci", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8mb3, check_mb_utf8mb3_valid}, /*MDB*/ + { 577, 1, UTF8_MB3, UTF8_MB3"_myanmar_ci", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8mb3, check_mb_utf8mb3_valid}, /*MDB*/ + { 578, 1, UTF8_MB3, UTF8_MB3"_thai_520_w2", "", 65001, "UTF-8", 1, 3, mysql_mbcharlen_utf8mb3, check_mb_utf8mb3_valid}, /*MDB*/ diff --git a/deps/mariadb-client-library/ma_password.c.patch b/deps/mariadb-client-library/ma_password.c.patch new file mode 100644 index 000000000..2ba8f9352 --- /dev/null +++ b/deps/mariadb-client-library/ma_password.c.patch @@ -0,0 +1,56 @@ +@@ -105,6 +105,35 @@ + } + } + ++unsigned char decode_char(char x) { ++ if (x >= '0' && x <= '9') ++ return (x - 0x30); ++ else if (x >= 'A' && x <= 'F') ++ return(x - 0x37); ++ else if (x >= 'a' && x <= 'f') ++ return(x - 0x57); ++ else { ++ fprintf(stderr,"%s:%d:%s(): [ERROR in libmariadbclient]: \n", __FILE__, __LINE__, __func__); ++ return 0; ++ } ++} ++ ++void unhex_pass(unsigned char *out, const char *in) { ++ int i=0; ++ for (i=0;imysql, parms->csname), ++ (parms->mysql, parms->csname, parms->charsetnr), + parms->mysql, + int, + r_int) + } + int STDCALL +-mysql_set_character_set_start(int *ret, MYSQL *mysql, const char *csname) ++mysql_set_character_set_start(int *ret, MYSQL *mysql, const char *csname, uint charsetnr) + { + MK_ASYNC_START_BODY( + mysql_set_character_set, +@@ -500,6 +501,7 @@ + WIN_SET_NONBLOCKING(mysql) + parms.mysql= mysql; + parms.csname= csname; ++ parms.charsetnr= charsetnr; + }, + 1, + r_int, diff --git a/deps/mariadb-client-library/mariadb_lib.c.patch b/deps/mariadb-client-library/mariadb_lib.c.patch new file mode 100644 index 000000000..d5dbcc070 --- /dev/null +++ b/deps/mariadb-client-library/mariadb_lib.c.patch @@ -0,0 +1,110 @@ +@@ -1494,9 +1494,16 @@ + + mysql->client_flag= client_flag; + ++ { ++ volatile my_bool net_blocking = ma_pvio_is_blocking(net->pvio); ++ if (!net_blocking) ++ ma_pvio_blocking(net->pvio, TRUE, 0); + if (run_plugin_auth(mysql, scramble_data, scramble_len, + scramble_plugin, db)) + goto error; ++ if (!net_blocking) ++ ma_pvio_blocking(net->pvio, FALSE, 0); ++ } + + if (mysql->client_flag & CLIENT_COMPRESS) + net->compress= 1; +@@ -1625,7 +1632,7 @@ + if (!mysql_real_connect(&tmp_mysql,mysql->host,mysql->user,mysql->passwd, + mysql->db, mysql->port, mysql->unix_socket, + mysql->client_flag | CLIENT_REMEMBER_OPTIONS) || +- mysql_set_character_set(&tmp_mysql, mysql->charset->csname)) ++ mysql_set_character_set(&tmp_mysql, mysql->charset->csname, NULL)) + { + if (ctxt) + my_context_install_suspend_resume_hook(ctxt, NULL, NULL); +@@ -1671,6 +1678,7 @@ + { + if (mysql->stmts) + { ++/* + LIST *li_stmt= mysql->stmts; + + for (; li_stmt; li_stmt= li_stmt->next) +@@ -1679,6 +1687,7 @@ + stmt->mysql= NULL; + SET_CLIENT_STMT_ERROR(stmt, CR_STMT_CLOSED, SQLSTATE_UNKNOWN, function_name); + } ++*/ + mysql->stmts= NULL; + } + } +@@ -1948,6 +1957,33 @@ + return; + } + ++void STDCALL ++mysql_close_no_command(MYSQL *mysql) ++{ ++ if (mysql) /* Some simple safety */ ++ { ++ ++ if (mysql->methods) { ++ if (mysql->net.pvio) { ++ free_old_query(mysql); ++ mysql->status=MYSQL_STATUS_READY; /* Force command */ ++ mysql->options.reconnect=0; ++ end_server(mysql); ++ } ++ } ++ mysql_close_memory(mysql); ++ mysql_close_options(mysql); ++ mysql->host_info=mysql->user=mysql->passwd=mysql->db=0; ++ ++ /* Clear pointers for better safety */ ++ bzero((char*) &mysql->options,sizeof(mysql->options)); ++ mysql->net.pvio= 0; ++ if (mysql->free_me) ++ free(mysql); ++ } ++ return; ++} ++ + + /************************************************************************** + ** Do a query. If query returned rows, free old rows. +@@ -3425,18 +3461,27 @@ + mariadb_get_charset_info(mysql, cs); + } + +-int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname) ++int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname, uint charsetnr) + { + const MARIADB_CHARSET_INFO *cs; + +- if (!csname) ++ if (!csname && !charsetnr) + goto error; + +- if ((cs= mysql_find_charset_name(csname))) +- { +- char buff[64]; ++ if (csname) { ++ cs = mysql_find_charset_name(csname); ++ } else { ++ cs = mysql_find_charset_nr(charsetnr); ++ } ++ if (cs) ++ { ++ char buff[128]; ++ if (csname) { // default behavior ++ snprintf(buff, 63, "SET NAMES %s", cs->csname); ++ } else { ++ snprintf(buff, 63, "SET NAMES %s COLLATE %s", cs->csname, cs->name); ++ } + +- snprintf(buff, 63, "SET NAMES %s", cs->csname); + if (!mysql_real_query(mysql, buff, (unsigned long)strlen(buff))) + { + mysql->charset= cs; diff --git a/deps/mariadb-client-library/mysql.h.patch b/deps/mariadb-client-library/mysql.h.patch index 8ef51000b..ab93317cc 100644 --- a/deps/mariadb-client-library/mysql.h.patch +++ b/deps/mariadb-client-library/mysql.h.patch @@ -1,23 +1,23 @@ -@@ -404,7 +404,7 @@ +@@ -490,7 +490,7 @@ unsigned long STDCALL mysql_thread_id(MYSQL *mysql); const char * STDCALL mysql_character_set_name(MYSQL *mysql); void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs); -int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname); +int STDCALL mysql_set_character_set(MYSQL *mysql, const char *csname, uint charsetnr); - MYSQL * STDCALL mysql_init(MYSQL *mysql); - int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key, -@@ -424,6 +424,7 @@ + my_bool STDCALL mariadb_get_infov(MYSQL *mysql, enum mariadb_value value, void *arg, ...); + my_bool STDCALL mariadb_get_info(MYSQL *mysql, enum mariadb_value value, void *arg); +@@ -509,6 +509,7 @@ const char *unix_socket, unsigned long clientflag); void STDCALL mysql_close(MYSQL *sock); -+void STDCALL mysql_close_no_command(MYSQL *sock); ++void STDCALL mysql_close_no_command(MYSQL *sock); int STDCALL mysql_select_db(MYSQL *mysql, const char *db); int STDCALL mysql_query(MYSQL *mysql, const char *q); int STDCALL mysql_send_query(MYSQL *mysql, const char *q, -@@ -515,7 +516,7 @@ - int STDCALL mysql_stmt_close_start(my_bool *ret, MYSQL_STMT *stmt); - int STDCALL mysql_stmt_close_cont(my_bool *ret, MYSQL_STMT * stmt, int status); +@@ -608,7 +609,7 @@ + int STDCALL mysql_stmt_next_result_cont(int *ret, MYSQL_STMT *stmt, int status); + int STDCALL mysql_set_character_set_start(int *ret, MYSQL *mysql, - const char *csname); + const char *csname, uint charsetnr); diff --git a/deps/mariadb-client-library/unittest_basic-t.c.patch b/deps/mariadb-client-library/unittest_basic-t.c.patch new file mode 100644 index 000000000..3f0737041 --- /dev/null +++ b/deps/mariadb-client-library/unittest_basic-t.c.patch @@ -0,0 +1,11 @@ +--- /tmp/basic-t.c 2017-12-28 14:55:55.958512116 +0100 ++++ unittest/libmariadb/basic-t.c 2017-12-28 14:56:08.770490417 +0100 +@@ -48,7 +48,7 @@ + rc= mysql_query(mysql, "CREATE TABLE a (a varchar(200))"); + check_mysql_rc(rc, mysql); + +- rc= mysql_set_character_set(mysql, "utf8"); ++ rc= mysql_set_character_set(mysql, "utf8", 0); + check_mysql_rc(rc, mysql); + + for (i=0; i < 10; i++) diff --git a/deps/mariadb-client-library/unittest_charset.c.patch b/deps/mariadb-client-library/unittest_charset.c.patch new file mode 100644 index 000000000..ceb58ea2e --- /dev/null +++ b/deps/mariadb-client-library/unittest_charset.c.patch @@ -0,0 +1,71 @@ +--- /tmp/charset.c 2017-12-28 14:58:14.174281738 +0100 ++++ unittest/libmariadb/charset.c 2017-12-28 14:59:53.510120540 +0100 +@@ -74,12 +74,12 @@ + char *csname= (char*) "utf8"; + char *csdefault= (char*)mysql_character_set_name(mysql); + +- FAIL_IF(mysql_set_character_set(mysql, csname), mysql_error(mysql)); ++ FAIL_IF(mysql_set_character_set(mysql, csname, 0), mysql_error(mysql)); + + mysql_get_character_set_info(mysql, &cs); + + FAIL_IF(strcmp(cs.csname, "utf8") || strcmp(cs.name, "utf8_general_ci"), "Character set != UTF8"); +- FAIL_IF(mysql_set_character_set(mysql, csdefault), mysql_error(mysql)); ++ FAIL_IF(mysql_set_character_set(mysql, csdefault, 0), mysql_error(mysql)); + + return OK; + } +@@ -542,7 +542,7 @@ + } + /* Retrieve character set information. */ + +- mysql_set_character_set(mysql, "latin1"); ++ mysql_set_character_set(mysql, "latin1", 0); + bug30472_retrieve_charset_info(mysql, + character_set_name_1, + character_set_client_1, +@@ -551,7 +551,7 @@ + + /* Switch client character set. */ + +- FAIL_IF(mysql_set_character_set(mysql, "utf8"), "Setting cs to utf8 failed"); ++ FAIL_IF(mysql_set_character_set(mysql, "utf8", 0), "Setting cs to utf8 failed"); + + /* Retrieve character set information. */ + +@@ -581,7 +581,7 @@ + /* Call mysql_change_user() with the same username, password, database. */ + + rc= mysql_change_user(mysql, username, password, (schema) ? schema : "test"); +- mysql_set_character_set(mysql, "latin1"); ++ mysql_set_character_set(mysql, "latin1", 0); + check_mysql_rc(rc, mysql); + + /* Retrieve character set information. */ +@@ -647,7 +647,7 @@ + /* ignore ucs2 */ + if (strcmp(row[0], "ucs2") && strcmp(row[0], "utf16le") && strcmp(row[0], "utf8mb4") && + strcmp(row[0], "utf16") && strcmp(row[0], "utf32")) { +- rc= mysql_set_character_set(mysql, row[0]); ++ rc= mysql_set_character_set(mysql, row[0], 0); + check_mysql_rc(rc, mysql); + } + } +@@ -748,7 +748,7 @@ + + if (strcmp(osname, "utf8")) + { +- rc= mysql_set_character_set(mysql, "utf8"); ++ rc= mysql_set_character_set(mysql, "utf8", 0); + check_mysql_rc(rc, mysql); + + csname2= mysql_character_set_name(mysql); +@@ -756,7 +756,7 @@ + + FAIL_IF(!strcmp(csname2, csname1), "Wrong charset: expected utf8"); + +- rc= mysql_set_character_set(mysql, "auto"); ++ rc= mysql_set_character_set(mysql, "auto", 0); + check_mysql_rc(rc, mysql); + + csname2= mysql_character_set_name(mysql);