1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-07 02:42:49 +03:00

Coverity fixes and travis integration

This commit is contained in:
Georg Richter
2018-07-06 09:28:24 +02:00
parent ffd9084063
commit b0f2e4e72f
19 changed files with 154 additions and 102 deletions

View File

@@ -4,16 +4,33 @@ cache:
apt: true apt: true
ccache: true ccache: true
services: docker services: docker
env:
global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key
- secure: "Pk5DUyHtal064Yc4bx0S2Zo4C3NqOURLOqYxW/tQJ73XDTRhyJqD5PFLhsFN+nqvZqx8b1LLtQuVoxP7sW12Qpys7Qs39QavSsa2GWAVf9Kf4PRRsUy5as72/Vh19XbQ1w8fFdPax6KPgnWMb97XZSDJP+2Tyuk8R5pk+/T2t2QsQeml5bJwD0diffLZi27APc0mcNSdaLpPYN4SlEKFmD2CxUAR5IxaBjGKoiuo0f6FSSB1tqlirAnAc5s28tGVkXf42o13oooNYwLgNatc4JRDMofbCVxo9OzqsVbVaN2OwOD3uQ+RxB7X1FydFQm2nfiDNt+D/dBlAz0LkUw1NRrDxl+r6+9xtzVZgHTNUOqG9W5JGJ7j99dUzwSJl6RS4QxeetlrRHGx9S2TTBa6JSkDxiRTQR2XfZxyMtARuHZkY7SAq6sHNKYoyAERuUoeq5e8UOa3dLj4gBwsB/J4y0eLWMxtfDKZj2vGI2BRJewBCBeouPAVIlmWGDyNg6f6X/o07N2IeWJOoj9ZF27Kbp7QxK/D0pQp4AONxtl15ZCfRs5lthKYIHQo0qzlukcir8e7zi5J0bUlOlTT4DtXAeaeIP9oUrLn9kCv7EyvLZMR4dPvREDThqQovF03jqwMDggVa3iGmxu/zrm+S11PwDmzq45+WLcYwyikvsqBFSE="
addons: addons:
hosts: hosts:
- mariadb.example.com - mariadb.example.com
coverity_scan:
project:
name: "MariaDB/mariadb-connector-c"
description: "MariaDB Connector/C"
notification_email: georg@mariadb.com
build_command_prepend: "cmake ."
build_command: "make"
branch_pattern: coverity_scan
before_script: before_script:
# Disable services enabled by default # Disable services enabled by default
- sudo /etc/init.d/mysql stop - sudo /etc/init.d/mysql stop
before_install: before_install:
- echo -n | openssl s_client -connect https://scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
- chmod -R +x .travis/* - chmod -R +x .travis/*
- chmod 777 .travis/build/ - chmod 777 .travis/build/
- export PROJ_PATH=`pwd` - export PROJ_PATH=`pwd`

View File

@@ -85,6 +85,9 @@ extern const char *mariadb_client_errors[]; /* Error messages */
#define CR_AUTH_PLUGIN_CANNOT_LOAD 2059 #define CR_AUTH_PLUGIN_CANNOT_LOAD 2059
#define CR_DUPLICATE_CONNECTION_ATTR 2060 #define CR_DUPLICATE_CONNECTION_ATTR 2060
#define CR_AUTH_PLUGIN_ERR 2061 #define CR_AUTH_PLUGIN_ERR 2061
/* Always last, if you add new error codes please update the
value for CR_MYSQL_LAST_ERROR */
#define CR_MYSQL_LAST_ERROR CR_AUTH_PLUGIN_ERR
/* /*
* MariaDB Connector/C errors: * MariaDB Connector/C errors:
@@ -96,5 +99,8 @@ extern const char *mariadb_client_errors[]; /* Error messages */
#define CR_FILE_NOT_FOUND 5004 #define CR_FILE_NOT_FOUND 5004
#define CR_FILE_READ 5005 #define CR_FILE_READ 5005
#define CR_BULK_WITHOUT_PARAMETERS 5006 #define CR_BULK_WITHOUT_PARAMETERS 5006
#define CR_INVALID_STMT 5007
/* Always last, if you add new error codes please update the
value for CR_MARIADB_LAST_ERROR */
#define CR_MARIADB_LAST_ERROR CR_INVALID_STMT
#endif #endif

View File

@@ -37,8 +37,8 @@
#define SET_CLIENT_STMT_ERROR(a, b, c, d) \ #define SET_CLIENT_STMT_ERROR(a, b, c, d) \
{ \ { \
(a)->last_errno= (b);\ (a)->last_errno= (b);\
strncpy((a)->sqlstate, (c), sizeof((a)->sqlstate));\ strncpy((a)->sqlstate, (c), SQLSTATE_LENGTH);\
strncpy((a)->last_error, (d) ? (d) : ER((b)), sizeof((a)->last_error));\ strncpy((a)->last_error, (d) ? (d) : ER((b)), MYSQL_ERRMSG_SIZE - 1);\
} }
#define CLEAR_CLIENT_STMT_ERROR(a) \ #define CLEAR_CLIENT_STMT_ERROR(a) \

View File

@@ -124,8 +124,8 @@ extern unsigned int mariadb_deinitialize_ssl;
#define SET_CLIENT_ERROR(a, b, c, d) \ #define SET_CLIENT_ERROR(a, b, c, d) \
{ \ { \
(a)->net.last_errno= (b);\ (a)->net.last_errno= (b);\
strncpy((a)->net.sqlstate, (c), sizeof((a)->net.sqlstate));\ strncpy((a)->net.sqlstate, (c), SQLSTATE_LENGTH);\
strncpy((a)->net.last_error, (d) ? (d) : ER((b)), sizeof((a)->net.last_error));\ strncpy((a)->net.last_error, (d) ? (d) : ER((b)), MYSQL_ERRMSG_SIZE - 1);\
} }
/* For mysql_async.c */ /* For mysql_async.c */

View File

@@ -1408,7 +1408,7 @@ static void map_charset_name(const char *cs_name, my_bool target_cs, char *buffe
if (target_cs) if (target_cs)
{ {
strncat(buffer, "//TRANSLIT", buff_len); strncat(buffer, "//TRANSLIT", buff_len - strlen(buffer));
} }
} }
/* }}} */ /* }}} */

View File

@@ -237,20 +237,20 @@ static void load_env_plugins(MYSQL *mysql)
{ {
char *plugs, *free_env, *s= getenv("LIBMYSQL_PLUGINS"); char *plugs, *free_env, *s= getenv("LIBMYSQL_PLUGINS");
/* no plugins to load */ if ((s= getenv("LIBMYSQL_PLUGINS")))
if (!s) {
return; s= strdup(s);
free_env= plugs= s;
free_env= plugs= strdup(s); do {
if ((s= strchr(plugs, ';')))
*s= '\0';
mysql_load_plugin(mysql, plugs, -1, 0);
plugs= s + 1;
} while (s);
do { free(free_env);
if ((s= strchr(plugs, ';'))) }
*s= '\0';
mysql_load_plugin(mysql, plugs, -1, 0);
plugs= s + 1;
} while (s);
free(free_env);
} }
/********** extern functions to be used by libmariadb *********************/ /********** extern functions to be used by libmariadb *********************/
@@ -365,7 +365,7 @@ mysql_load_plugin_v(MYSQL *mysql, const char *name, int type,
char errbuf[1024]; char errbuf[1024];
#endif #endif
char dlpath[FN_REFLEN+1]; char dlpath[FN_REFLEN+1];
void *sym, *dlhandle; void *sym, *dlhandle = NULL;
struct st_mysql_client_plugin *plugin; struct st_mysql_client_plugin *plugin;
char *env_plugin_dir= getenv("MARIADB_PLUGIN_DIR"); char *env_plugin_dir= getenv("MARIADB_PLUGIN_DIR");
@@ -448,6 +448,8 @@ mysql_load_plugin_v(MYSQL *mysql, const char *name, int type,
return plugin; return plugin;
err: err:
if (dlhandle)
dlclose(dlhandle);
pthread_mutex_unlock(&LOCK_load_client_plugin); pthread_mutex_unlock(&LOCK_load_client_plugin);
my_set_error(mysql, CR_AUTH_PLUGIN_CANNOT_LOAD, SQLSTATE_UNKNOWN, my_set_error(mysql, CR_AUTH_PLUGIN_CANNOT_LOAD, SQLSTATE_UNKNOWN,
ER(CR_AUTH_PLUGIN_CANNOT_LOAD), name, errmsg); ER(CR_AUTH_PLUGIN_CANNOT_LOAD), name, errmsg);

View File

@@ -231,12 +231,7 @@ static my_bool _mariadb_read_options_from_file(MYSQL *mysql,
key= ptr; key= ptr;
for ( ; isspace(end[-1]) ; end--) ; for ( ; isspace(end[-1]) ; end--) ;
*end= 0; *end= 0;
if (!value) if (value)
{
if (!key)
key= ptr;
}
else
{ {
/* Remove pre- and end space */ /* Remove pre- and end space */
char *value_end; char *value_end;

View File

@@ -1333,7 +1333,9 @@ static char *dtoa(double dd, int mode, int ndigits, int *decpt, int *sign,
*sign= 0; *sign= 0;
/* If infinity, set decpt to DTOA_OVERFLOW, if 0 set it to 1 */ /* If infinity, set decpt to DTOA_OVERFLOW, if 0 set it to 1 */
/* coverity[assign_where_compare_meant] */
if (((word0(&u) & Exp_mask) == Exp_mask && (*decpt= DTOA_OVERFLOW)) || if (((word0(&u) & Exp_mask) == Exp_mask && (*decpt= DTOA_OVERFLOW)) ||
/* coverity[assign_where_compare_meant] */
(!dval(&u) && (*decpt= 1))) (!dval(&u) && (*decpt= 1)))
{ {
/* Infinity, NaN, 0 */ /* Infinity, NaN, 0 */

View File

@@ -142,7 +142,7 @@ const char *client_errors[]=
/* 2057 */ "The number of parameters in bound buffers differs from number of columns in resultset", /* 2057 */ "The number of parameters in bound buffers differs from number of columns in resultset",
/* 2059 */ "Can't connect twice. Already connected", /* 2059 */ "Can't connect twice. Already connected",
/* 2058 */ "Plugin %s could not be loaded: %s", /* 2058 */ "Plugin %s could not be loaded: %s",
/* 2059 */ "An attribute with same name already exists" /* 2059 */ "An attribute with same name already exists",
/* 2060 */ "Plugin doesn't support this function", /* 2060 */ "Plugin doesn't support this function",
"" ""
}; };
@@ -157,6 +157,7 @@ const char *mariadb_client_errors[] =
/* 5004 */ "File '%s' not found (Errcode: %d)", /* 5004 */ "File '%s' not found (Errcode: %d)",
/* 5005 */ "Error reading file '%s' (Errcode: %d)", /* 5005 */ "Error reading file '%s' (Errcode: %d)",
/* 5006 */ "Bulk operation without parameters is not supported", /* 5006 */ "Bulk operation without parameters is not supported",
/* 5007 */ "Invalid statement handle",
"" ""
}; };

View File

@@ -108,6 +108,7 @@ MA_FILE *ma_open(const char *location, const char *mode, MYSQL *mysql)
ma_file= (MA_FILE *)malloc(sizeof(MA_FILE)); ma_file= (MA_FILE *)malloc(sizeof(MA_FILE));
if (!ma_file) if (!ma_file)
{ {
fclose(fp);
my_set_error(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0); my_set_error(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0);
return NULL; return NULL;
} }

View File

@@ -549,7 +549,6 @@ ulong ma_net_read(NET *net)
return packet_error; return packet_error;
if (_mariadb_uncompress((unsigned char*) net->buff + net->where_b, &packet_length, &complen)) if (_mariadb_uncompress((unsigned char*) net->buff + net->where_b, &packet_length, &complen))
{ {
len= packet_error;
net->error=2; /* caller will close socket */ net->error=2; /* caller will close socket */
net->last_errno=ER_NET_UNCOMPRESS_ERROR; net->last_errno=ER_NET_UNCOMPRESS_ERROR;
break; break;

View File

@@ -102,7 +102,7 @@ MARIADB_PVIO *ma_pvio_init(MA_PVIO_CINFO *cinfo)
return NULL; return NULL;
} }
/* coverity[var_deref_op] */
if (!(pvio= (MARIADB_PVIO *)calloc(1, sizeof(MARIADB_PVIO)))) if (!(pvio= (MARIADB_PVIO *)calloc(1, sizeof(MARIADB_PVIO))))
{ {
PVIO_SET_ERROR(cinfo->mysql, CR_OUT_OF_MEMORY, unknown_sqlstate, 0); PVIO_SET_ERROR(cinfo->mysql, CR_OUT_OF_MEMORY, unknown_sqlstate, 0);
@@ -399,20 +399,23 @@ end:
void ma_pvio_close(MARIADB_PVIO *pvio) void ma_pvio_close(MARIADB_PVIO *pvio)
{ {
/* free internal structures and close connection */ /* free internal structures and close connection */
#ifdef HAVE_TLS if (pvio)
if (pvio && pvio->ctls)
{ {
ma_pvio_tls_close(pvio->ctls); #ifdef HAVE_TLS
free(pvio->ctls); if (pvio->ctls)
} {
ma_pvio_tls_close(pvio->ctls);
free(pvio->ctls);
}
#endif #endif
if (pvio && pvio->methods->close) if (pvio && pvio->methods->close)
pvio->methods->close(pvio); pvio->methods->close(pvio);
if (pvio->cache) if (pvio->cache)
free(pvio->cache); free(pvio->cache);
free(pvio); free(pvio);
}
} }
/* }}} */ /* }}} */
@@ -460,13 +463,16 @@ ma_pvio_wait_async(struct mysql_async_context *b, enum enum_pvio_io_event event,
/* {{{ ma_pvio_wait_io_or_timeout */ /* {{{ ma_pvio_wait_io_or_timeout */
int ma_pvio_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout) int ma_pvio_wait_io_or_timeout(MARIADB_PVIO *pvio, my_bool is_read, int timeout)
{ {
if (IS_PVIO_ASYNC_ACTIVE(pvio)) if (pvio)
return ma_pvio_wait_async(pvio->mysql->options.extension->async_context, {
(is_read) ? VIO_IO_EVENT_READ : VIO_IO_EVENT_WRITE, if (IS_PVIO_ASYNC_ACTIVE(pvio))
timeout); return ma_pvio_wait_async(pvio->mysql->options.extension->async_context,
(is_read) ? VIO_IO_EVENT_READ : VIO_IO_EVENT_WRITE,
timeout);
if (pvio && pvio->methods->wait_io_or_timeout) if (pvio && pvio->methods->wait_io_or_timeout)
return pvio->methods->wait_io_or_timeout(pvio, is_read, timeout); return pvio->methods->wait_io_or_timeout(pvio, is_read, timeout);
}
return 1; return 1;
} }
/* }}} */ /* }}} */

View File

@@ -34,7 +34,7 @@ size_t mariadb_time_to_string(const MYSQL_TIME *tm, char *time_str, size_t len,
return 0; return 0;
if (digits == AUTO_SEC_PART_DIGITS) if (digits == AUTO_SEC_PART_DIGITS)
digits= MIN((tm->second_part) ? SEC_PART_DIGITS : 0, 15); digits= (tm->second_part) ? SEC_PART_DIGITS : 0;
switch(tm->time_type) { switch(tm->time_type) {
case MYSQL_TIMESTAMP_DATE: case MYSQL_TIMESTAMP_DATE:

View File

@@ -1681,7 +1681,10 @@ dynamic_new_column_store(DYNAMIC_COLUMN *str,
goto err; goto err;
} }
if (!column_count) if (!column_count)
{
free(columns_order);
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
}
memset(str->str, 0, fmt->fixed_hdr); memset(str->str, 0, fmt->fixed_hdr);
str->length= fmt->fixed_hdr; str->length= fmt->fixed_hdr;
@@ -2755,7 +2758,7 @@ dynamic_column_update_copy(DYNAMIC_COLUMN *str, PLAN *plan,
new_hdr->header_size + new_hdr->nmpool_size; new_hdr->header_size + new_hdr->nmpool_size;
for (i= 0, j= 0; i < add_column_count || j < hdr->column_count; i++) for (i= 0, j= 0; i < add_column_count || j < hdr->column_count; i++)
{ {
size_t UNINIT_VAR(first_offset); size_t first_offset= 0;
uint start= j, end; uint start= j, end;
/* /*

View File

@@ -230,7 +230,7 @@ restart:
} }
else else
{ {
strcpy(net->sqlstate, SQLSTATE_UNKNOWN); strncpy(net->sqlstate, SQLSTATE_UNKNOWN, SQLSTATE_LENGTH);
} }
ma_strmake(net->last_error,(char*) pos, ma_strmake(net->last_error,(char*) pos,
min(len,sizeof(net->last_error)-1)); min(len,sizeof(net->last_error)-1));
@@ -948,7 +948,8 @@ int mthd_my_read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
if (len > (ulong) (end_pos - pos) || pos > end_pos) if (len > (ulong) (end_pos - pos) || pos > end_pos)
{ {
mysql->net.last_errno=CR_UNKNOWN_ERROR; mysql->net.last_errno=CR_UNKNOWN_ERROR;
strcpy(mysql->net.last_error,ER(mysql->net.last_errno)); strncpy(mysql->net.last_error,ER(mysql->net.last_errno),
MYSQL_ERRMSG_SIZE - 1);
return -1; return -1;
} }
row[field] = (char*) pos; row[field] = (char*) pos;
@@ -985,6 +986,7 @@ mysql_init(MYSQL *mysql)
{ {
memset((char*) (mysql), 0, sizeof(*(mysql))); memset((char*) (mysql), 0, sizeof(*(mysql)));
mysql->net.pvio= 0; mysql->net.pvio= 0;
mysql->free_me= 0;
mysql->net.extension= 0; mysql->net.extension= 0;
} }
@@ -1190,8 +1192,7 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
uint port, const char *unix_socket, unsigned long client_flag) uint port, const char *unix_socket, unsigned long client_flag)
{ {
char buff[NAME_LEN+USERNAME_LENGTH+100]; char buff[NAME_LEN+USERNAME_LENGTH+100];
char *end, *end_pkt, *host_info, char *end, *end_pkt, *host_info;
*charset_name= NULL;
MA_PVIO_CINFO cinfo= {NULL, NULL, 0, -1, NULL}; MA_PVIO_CINFO cinfo= {NULL, NULL, 0, -1, NULL};
MARIADB_PVIO *pvio= NULL; MARIADB_PVIO *pvio= NULL;
char *scramble_data; char *scramble_data;
@@ -1386,9 +1387,8 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
} }
/* Save connection information */ /* Save connection information */
if (!user) user=""; if (!user) user="";
if (!passwd) passwd="";
if (!(mysql->host_info= strdup(host_info ? host_info : "")) || if (!(mysql->host_info= strdup(host_info)) ||
!(mysql->host= strdup(cinfo.host ? cinfo.host : "")) || !(mysql->host= strdup(cinfo.host ? cinfo.host : "")) ||
!(mysql->user=strdup(user)) || !(mysql->user=strdup(user)) ||
!(mysql->passwd=strdup(passwd))) !(mysql->passwd=strdup(passwd)))
@@ -1490,7 +1490,8 @@ MYSQL *mthd_my_real_connect(MYSQL *mysql, const char *host, const char *user,
{ {
net->last_errno=CR_CANT_READ_CHARSET; net->last_errno=CR_CANT_READ_CHARSET;
sprintf(net->last_error,ER(net->last_errno), sprintf(net->last_error,ER(net->last_errno),
charset_name ? charset_name : "unknown", mysql->options.charset_name ? mysql->options.charset_name :
MARIADB_DEFAULT_CHARSET,
"compiled_in"); "compiled_in");
goto error; goto error;
} }
@@ -1607,6 +1608,7 @@ my_bool STDCALL mariadb_reconnect(MYSQL *mysql)
} }
mysql_init(&tmp_mysql); mysql_init(&tmp_mysql);
tmp_mysql.free_me= 0;
tmp_mysql.options=mysql->options; tmp_mysql.options=mysql->options;
if (mysql->extension->conn_hdlr) if (mysql->extension->conn_hdlr)
{ {
@@ -1722,13 +1724,6 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
*s_db= mysql->db; *s_db= mysql->db;
int rc; int rc;
if (!user)
user="";
if (!passwd)
passwd="";
if (!db)
db="";
if (mysql->options.charset_name) if (mysql->options.charset_name)
mysql->charset= mysql_find_charset_name(mysql->options.charset_name); mysql->charset= mysql_find_charset_name(mysql->options.charset_name);
else else
@@ -1779,8 +1774,11 @@ mysql_select_db(MYSQL *mysql, const char *db)
{ {
int error; int error;
if (!db)
return 1;
if ((error=ma_simple_command(mysql, COM_INIT_DB, db, if ((error=ma_simple_command(mysql, COM_INIT_DB, db,
db ? (uint) strlen(db) : 0,0,0))) (uint) strlen(db),0,0)))
return(error); return(error);
free(mysql->db); free(mysql->db);
mysql->db=strdup(db); mysql->db=strdup(db);
@@ -2293,12 +2291,14 @@ mysql_fetch_row(MYSQL_RES *res)
if (!res) if (!res)
return 0; return 0;
if (res->handle) if (res->handle)
{
if (res->handle->status != MYSQL_STATUS_USE_RESULT && if (res->handle->status != MYSQL_STATUS_USE_RESULT &&
res->handle->status != MYSQL_STATUS_GET_RESULT) res->handle->status != MYSQL_STATUS_GET_RESULT)
return 0; return 0;
}
if (!res->data) if (!res->data)
{ /* Unbufferred fetch */ { /* Unbufferred fetch */
if (!res->eof) if (!res->eof && res->handle)
{ {
if (!(res->handle->methods->db_read_one_row(res->handle,res->field_count,res->row, res->lengths))) if (!(res->handle->methods->db_read_one_row(res->handle,res->field_count,res->row, res->lengths)))
{ {
@@ -2746,6 +2746,7 @@ mysql_optionsv(MYSQL *mysql,enum mysql_option option, ...)
if(!(mysql->options.extension= (struct st_mysql_options_extension *) if(!(mysql->options.extension= (struct st_mysql_options_extension *)
calloc(1, sizeof(struct st_mysql_options_extension)))) calloc(1, sizeof(struct st_mysql_options_extension))))
{ {
free(ctxt);
SET_CLIENT_ERROR(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0); SET_CLIENT_ERROR(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0);
goto end; goto end;
} }
@@ -3146,9 +3147,6 @@ mysql_get_optionv(MYSQL *mysql, enum mysql_option option, void *arg, ...)
if (!(elements= va_arg(ap, unsigned int *))) if (!(elements= va_arg(ap, unsigned int *)))
goto error; goto error;
if (!elements)
goto error;
*elements= 0; *elements= 0;
if (!mysql->options.extension || if (!mysql->options.extension ||

View File

@@ -88,12 +88,18 @@ void stmt_set_error(MYSQL_STMT *stmt,
...) ...)
{ {
va_list ap; va_list ap;
const char *error= NULL;
if (error_nr >= CR_MIN_ERROR && error_nr <= CR_MYSQL_LAST_ERROR)
error= ER(error_nr);
else if (error_nr >= CER_MIN_ERROR && error_nr <= CR_MARIADB_LAST_ERROR)
error= CER(error_nr);
stmt->last_errno= error_nr; stmt->last_errno= error_nr;
ma_strmake(stmt->sqlstate, sqlstate, SQLSTATE_LENGTH); ma_strmake(stmt->sqlstate, sqlstate, SQLSTATE_LENGTH);
va_start(ap, format); va_start(ap, format);
vsnprintf(stmt->last_error, MYSQL_ERRMSG_SIZE, vsnprintf(stmt->last_error, MYSQL_ERRMSG_SIZE,
format ? format : ER(error_nr), ap); format ? format : error ? error : "", ap);
va_end(ap); va_end(ap);
return; return;
} }
@@ -869,7 +875,7 @@ unsigned char* mysql_stmt_execute_generate_bulk_request(MYSQL_STMT *stmt, size_t
if (!stmt->param_count) if (!stmt->param_count)
{ {
stmt_set_error(stmt, CR_BULK_WITHOUT_PARAMETERS, "IM001", stmt_set_error(stmt, CR_BULK_WITHOUT_PARAMETERS, "IM001",
CER(CR_BULK_WITHOUT_PARAMETERS), "Bulk operation"); CER(CR_BULK_WITHOUT_PARAMETERS));
return NULL; return NULL;
} }
@@ -1328,15 +1334,18 @@ static my_bool net_stmt_close(MYSQL_STMT *stmt, my_bool remove)
my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt) my_bool STDCALL mysql_stmt_close(MYSQL_STMT *stmt)
{ {
my_bool rc; my_bool rc= 1;
if (stmt && stmt->mysql && stmt->mysql->net.pvio)
mysql_stmt_internal_reset(stmt, 1);
rc= net_stmt_close(stmt, 1); if (stmt)
{
if (stmt->mysql && stmt->mysql->net.pvio)
mysql_stmt_internal_reset(stmt, 1);
free(stmt->extension); rc= net_stmt_close(stmt, 1);
free(stmt);
free(stmt->extension);
free(stmt);
}
return(rc); return(rc);
} }
@@ -1898,7 +1907,8 @@ int stmt_read_execute_response(MYSQL_STMT *stmt)
*/ */
/* preferred is buffered read */ /* preferred is buffered read */
mysql_stmt_store_result(stmt); if (mysql_stmt_store_result(stmt))
return 1;
stmt->mysql->status= MYSQL_STATUS_STMT_RESULT; stmt->mysql->status= MYSQL_STATUS_STMT_RESULT;
} else } else
{ {
@@ -2313,17 +2323,23 @@ int STDCALL mariadb_stmt_execute_direct(MYSQL_STMT *stmt,
const char *stmt_str, const char *stmt_str,
size_t length) size_t length)
{ {
MYSQL *mysql= stmt->mysql; MYSQL *mysql;
my_bool emulate_cmd= !(!(stmt->mysql->server_capabilities & CLIENT_MYSQL) && my_bool emulate_cmd;
(stmt->mysql->extension->mariadb_server_capabilities &
(MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))) || mysql->net.compress;
if (!stmt)
return 1;
mysql= stmt->mysql;
if (!mysql) if (!mysql)
{ {
SET_CLIENT_STMT_ERROR(stmt, CR_SERVER_LOST, SQLSTATE_UNKNOWN, 0); SET_CLIENT_STMT_ERROR(stmt, CR_SERVER_LOST, SQLSTATE_UNKNOWN, 0);
goto fail; return 1;
} }
emulate_cmd= !(!(stmt->mysql->server_capabilities & CLIENT_MYSQL) &&
(stmt->mysql->extension->mariadb_server_capabilities &
(MARIADB_CLIENT_STMT_BULK_OPERATIONS >> 32))) || mysql->net.compress;
/* Server versions < 10.2 don't support execute_direct, so we need to /* Server versions < 10.2 don't support execute_direct, so we need to
emulate it */ emulate it */
if (emulate_cmd) if (emulate_cmd)
@@ -2331,7 +2347,6 @@ int STDCALL mariadb_stmt_execute_direct(MYSQL_STMT *stmt,
int rc; int rc;
/* avoid sending close + prepare in 2 packets */ /* avoid sending close + prepare in 2 packets */
if ((rc= mysql_stmt_prepare(stmt, stmt_str, (unsigned long)length))) if ((rc= mysql_stmt_prepare(stmt, stmt_str, (unsigned long)length)))
return rc; return rc;
return mysql_stmt_execute(stmt); return mysql_stmt_execute(stmt);
@@ -2340,13 +2355,7 @@ int STDCALL mariadb_stmt_execute_direct(MYSQL_STMT *stmt,
if (ma_multi_command(mysql, COM_MULTI_ENABLED)) if (ma_multi_command(mysql, COM_MULTI_ENABLED))
{ {
SET_CLIENT_STMT_ERROR(stmt, CR_COMMANDS_OUT_OF_SYNC, SQLSTATE_UNKNOWN, 0); SET_CLIENT_STMT_ERROR(stmt, CR_COMMANDS_OUT_OF_SYNC, SQLSTATE_UNKNOWN, 0);
goto fail; return 1;
}
if (!stmt->mysql)
{
SET_CLIENT_STMT_ERROR(stmt, CR_SERVER_LOST, SQLSTATE_UNKNOWN, 0);
return(1);
} }
if (length == (size_t) -1) if (length == (size_t) -1)
@@ -2430,8 +2439,10 @@ int STDCALL mariadb_stmt_execute_direct(MYSQL_STMT *stmt,
/* read execute response packet */ /* read execute response packet */
return stmt_read_execute_response(stmt); return stmt_read_execute_response(stmt);
fail: fail:
SET_CLIENT_STMT_ERROR(stmt, mysql->net.last_errno, mysql->net.sqlstate, /* check if we need to set error message */
mysql->net.last_error); if (!mysql_stmt_errno(stmt))
SET_CLIENT_STMT_ERROR(stmt, mysql->net.last_errno, mysql->net.sqlstate,
mysql->net.last_error);
do { do {
stmt->mysql->methods->db_stmt_flush_unbuffered(stmt); stmt->mysql->methods->db_stmt_flush_unbuffered(stmt);
} while(mysql_stmt_more_results(stmt)); } while(mysql_stmt_more_results(stmt));

View File

@@ -96,8 +96,8 @@ static int auth_old_password(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql)
return CR_SERVER_HANDSHAKE_ERR; return CR_SERVER_HANDSHAKE_ERR;
/* save it in MYSQL */ /* save it in MYSQL */
memmove(mysql->scramble_buff, pkt, pkt_len); memmove(mysql->scramble_buff, pkt, pkt_len - 1);
mysql->scramble_buff[pkt_len] = 0; mysql->scramble_buff[pkt_len - 1] = 0;
} }
if (mysql && mysql->passwd[0]) if (mysql && mysql->passwd[0])

View File

@@ -117,6 +117,7 @@ char *load_pub_key_file(const char *filename, int *pub_key_size)
FILE *fp= NULL; FILE *fp= NULL;
char *buffer= NULL; char *buffer= NULL;
unsigned char error= 1; unsigned char error= 1;
size_t bytes_read= 0;
if (!pub_key_size) if (!pub_key_size)
return NULL; return NULL;
@@ -133,7 +134,8 @@ char *load_pub_key_file(const char *filename, int *pub_key_size)
if (!(buffer= malloc(*pub_key_size + 1))) if (!(buffer= malloc(*pub_key_size + 1)))
goto end; goto end;
if (!fread(buffer, *pub_key_size, 1, fp)) bytes_read= fread(buffer, (size_t)*pub_key_size, 1, fp);
if (bytes_read < (size_t)*pub_key_size)
goto end; goto end;
error= 0; error= 0;

View File

@@ -178,6 +178,7 @@ static int pvio_socket_end(void)
my_bool pvio_socket_change_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout) my_bool pvio_socket_change_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout type, int timeout)
{ {
struct timeval tm; struct timeval tm;
int rc= 0;
struct st_pvio_socket *csock= NULL; struct st_pvio_socket *csock= NULL;
if (!pvio) if (!pvio)
return 1; return 1;
@@ -189,22 +190,22 @@ my_bool pvio_socket_change_timeout(MARIADB_PVIO *pvio, enum enum_pvio_timeout ty
{ {
case PVIO_WRITE_TIMEOUT: case PVIO_WRITE_TIMEOUT:
#ifndef _WIN32 #ifndef _WIN32
setsockopt(csock->socket, SOL_SOCKET, SO_SNDTIMEO, (const char *)&tm, sizeof(tm)); rc= setsockopt(csock->socket, SOL_SOCKET, SO_SNDTIMEO, (const char *)&tm, sizeof(tm));
#else #else
setsockopt(csock->socket, SOL_SOCKET, SO_SNDTIMEO, (const char *)&timeout, sizeof(int)); rc= setsockopt(csock->socket, SOL_SOCKET, SO_SNDTIMEO, (const char *)&timeout, sizeof(int));
#endif #endif
break; break;
case PVIO_READ_TIMEOUT: case PVIO_READ_TIMEOUT:
#ifndef _WIN32 #ifndef _WIN32
setsockopt(csock->socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tm, sizeof(tm)); rc= setsockopt(csock->socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&tm, sizeof(tm));
#else #else
setsockopt(csock->socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(int)); src= etsockopt(csock->socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(int));
#endif #endif
break; break;
default: default:
break; break;
} }
return 0; return rc;
} }
/* {{{ pvio_socket_set_timeout */ /* {{{ pvio_socket_set_timeout */
@@ -887,6 +888,7 @@ my_bool pvio_socket_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
if (rc) if (rc)
{ {
closesocket(csock->socket); closesocket(csock->socket);
csock->socket= INVALID_SOCKET;
continue; continue;
} }
} }
@@ -901,6 +903,7 @@ my_bool pvio_socket_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
if (pvio_socket_blocking(pvio, 0, 0) == SOCKET_ERROR) if (pvio_socket_blocking(pvio, 0, 0) == SOCKET_ERROR)
{ {
closesocket(csock->socket); closesocket(csock->socket);
csock->socket= INVALID_SOCKET;
continue; continue;
} }
break; /* success! */ break; /* success! */
@@ -936,21 +939,27 @@ my_bool pvio_socket_connect(MARIADB_PVIO *pvio, MA_PVIO_CINFO *cinfo)
/* apply timeouts */ /* apply timeouts */
if (pvio->timeout[PVIO_CONNECT_TIMEOUT] > 0) if (pvio->timeout[PVIO_CONNECT_TIMEOUT] > 0)
{ {
pvio_socket_change_timeout(pvio, PVIO_READ_TIMEOUT, pvio->timeout[PVIO_CONNECT_TIMEOUT]); if (pvio_socket_change_timeout(pvio, PVIO_READ_TIMEOUT, pvio->timeout[PVIO_CONNECT_TIMEOUT]) ||
pvio_socket_change_timeout(pvio, PVIO_WRITE_TIMEOUT, pvio->timeout[PVIO_CONNECT_TIMEOUT]); pvio_socket_change_timeout(pvio, PVIO_WRITE_TIMEOUT, pvio->timeout[PVIO_CONNECT_TIMEOUT]))
goto error;
} }
else else
{ {
if (pvio->timeout[PVIO_WRITE_TIMEOUT] > 0) if (pvio->timeout[PVIO_WRITE_TIMEOUT] > 0)
pvio_socket_change_timeout(pvio, PVIO_WRITE_TIMEOUT, pvio->timeout[PVIO_WRITE_TIMEOUT]); if (pvio_socket_change_timeout(pvio, PVIO_WRITE_TIMEOUT, pvio->timeout[PVIO_WRITE_TIMEOUT]))
goto error;
if (pvio->timeout[PVIO_READ_TIMEOUT] > 0) if (pvio->timeout[PVIO_READ_TIMEOUT] > 0)
pvio_socket_change_timeout(pvio, PVIO_READ_TIMEOUT, pvio->timeout[PVIO_READ_TIMEOUT]); if (pvio_socket_change_timeout(pvio, PVIO_READ_TIMEOUT, pvio->timeout[PVIO_READ_TIMEOUT]))
goto error;
} }
return 0; return 0;
error: error:
/* close socket: MDEV-10891 */ /* close socket: MDEV-10891 */
if (csock->socket != INVALID_SOCKET) if (csock->socket != INVALID_SOCKET)
{
closesocket(csock->socket); closesocket(csock->socket);
csock->socket= INVALID_SOCKET;
}
if (pvio->data) if (pvio->data)
{ {
free((gptr)pvio->data); free((gptr)pvio->data);