From 06e542271543a242c0ef79a77f8a9210294d4931 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Thu, 10 Mar 2016 14:02:30 +0100 Subject: [PATCH] 10.2-integration fixes: - always send COM_STMT_RESET if specified - prevent double free of context buffer --- libmariadb/ma_net.c | 4 +++- libmariadb/mariadb_lib.c | 5 ++--- libmariadb/mariadb_stmt.c | 6 ++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libmariadb/ma_net.c b/libmariadb/ma_net.c index c6babbf1..383bedb7 100644 --- a/libmariadb/ma_net.c +++ b/libmariadb/ma_net.c @@ -101,9 +101,11 @@ static int ma_net_write_buff(NET *net,const char *packet, size_t len); int ma_net_init(NET *net, MARIADB_PVIO* pvio) { - if (!(net->buff=(uchar*) calloc(1, net_buffer_length))) + if (!(net->buff=(uchar*) malloc(net_buffer_length))) return 1; + memset(net->buff, 0, net_buffer_length); + if (!net->extension) { printf("Fatal\n"); diff --git a/libmariadb/mariadb_lib.c b/libmariadb/mariadb_lib.c index 909432f4..2bfee6a8 100644 --- a/libmariadb/mariadb_lib.c +++ b/libmariadb/mariadb_lib.c @@ -1516,8 +1516,6 @@ error: end_server(mysql); /* only free the allocated memory, user needs to call mysql_close */ mysql_close_memory(mysql); - if (!(((ulong) client_flag) & CLIENT_REMEMBER_OPTIONS)) - mysql_close_options(mysql); return(0); } @@ -1786,10 +1784,11 @@ static void mysql_close_options(MYSQL *mysql) if (mysql->options.extension) { struct mysql_async_context *ctxt; - if ((ctxt = mysql->options.extension->async_context) != 0) + if ((ctxt = mysql->options.extension->async_context)) { my_context_destroy(&ctxt->async_context); free(ctxt); + mysql->options.extension->async_context= 0; } free(mysql->options.extension->plugin_dir); free(mysql->options.extension->default_auth); diff --git a/libmariadb/mariadb_stmt.c b/libmariadb/mariadb_stmt.c index ee9ce7cb..8583e8c4 100644 --- a/libmariadb/mariadb_stmt.c +++ b/libmariadb/mariadb_stmt.c @@ -1687,7 +1687,6 @@ static my_bool madb_reset_stmt(MYSQL_STMT *stmt, unsigned int flags) } } - if (flags & MADB_RESET_SERVER) { /* reset statement on server side */ @@ -1760,9 +1759,8 @@ static my_bool mysql_stmt_internal_reset(MYSQL_STMT *stmt, my_bool is_close) stmt->mysql->status= MYSQL_STATUS_READY; } } - if (!stmt->execute_count) - if (!is_close) - ret= madb_reset_stmt(stmt, MADB_RESET_SERVER); + if (!is_close) + ret= madb_reset_stmt(stmt, MADB_RESET_SERVER); } stmt->state= MYSQL_STMT_PREPARED; stmt->upsert_status.affected_rows= mysql->affected_rows;