1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-10 01:02:57 +03:00

Merge branch '10.2-server'

# Conflicts:
#	CMakeLists.txt
#	unittest/libmariadb/connection.c
#	unittest/libmariadb/ps_bugs.c
This commit is contained in:
Vladislav Vaintroub
2018-05-21 09:48:21 +00:00

View File

@@ -767,6 +767,9 @@ unpack_fields(MYSQL_DATA *data,MA_MEM_ROOT *alloc,uint fields,
for (row=data->data; row ; row = row->next,field++) for (row=data->data; row ; row = row->next,field++)
{ {
if (field >= result + fields)
goto error;
for (i=0; i < field_count; i++) for (i=0; i < field_count; i++)
{ {
switch(row->data[i][0]) { switch(row->data[i][0]) {
@@ -803,15 +806,19 @@ unpack_fields(MYSQL_DATA *data,MA_MEM_ROOT *alloc,uint fields,
field->flags|= NUM_FLAG; field->flags|= NUM_FLAG;
if (default_value && row->data[7]) if (default_value && row->data[7])
{
field->def=ma_strdup_root(alloc,(char*) row->data[7]); field->def=ma_strdup_root(alloc,(char*) row->data[7]);
}
else else
field->def=0; field->def=0;
field->max_length= 0; field->max_length= 0;
} }
if (field < result + fields)
goto error;
free_rows(data); /* Free old data */ free_rows(data); /* Free old data */
return(result); return(result);
error:
free_rows(data);
ma_free_root(alloc, MYF(0));
return(0);
} }
@@ -868,7 +875,7 @@ MYSQL_DATA *mthd_my_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
else else
{ {
cur->data[field] = to; cur->data[field] = to;
if (len > (ulong) (end_to - to)) if (len > (ulong)(end_to - to) || to > end_to)
{ {
free_rows(result); free_rows(result);
SET_CLIENT_ERROR(mysql, CR_UNKNOWN_ERROR, SQLSTATE_UNKNOWN, 0); SET_CLIENT_ERROR(mysql, CR_UNKNOWN_ERROR, SQLSTATE_UNKNOWN, 0);
@@ -937,11 +944,11 @@ int mthd_my_read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
} }
else else
{ {
if (len > (ulong) (end_pos - 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)); strcpy(mysql->net.last_error,ER(mysql->net.last_errno));
return -1; return -1;
} }
row[field] = (char*) pos; row[field] = (char*) pos;
pos+=len; pos+=len;
@@ -2452,13 +2459,17 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
} }
result->field_alloc=mysql->field_alloc; result->field_alloc=mysql->field_alloc;
mysql->fields=0; mysql->fields=0;
result->eof=1;
result->field_count = (uint) query->rows; result->field_count = (uint) query->rows;
result->fields= unpack_fields(query,&result->field_alloc, result->fields= unpack_fields(query,&result->field_alloc,
result->field_count,1, result->field_count,1,
(my_bool) test(mysql->server_capabilities & (my_bool) test(mysql->server_capabilities &
CLIENT_LONG_FLAG)); CLIENT_LONG_FLAG));
result->eof=1; if (result->fields)
return(result); return(result);
free(result);
return(NULL);
} }
/* List all running processes (threads) in server */ /* List all running processes (threads) in server */
@@ -2472,7 +2483,7 @@ mysql_list_processes(MYSQL *mysql)
LINT_INIT(fields); LINT_INIT(fields);
if (ma_simple_command(mysql, COM_PROCESS_INFO,0,0,0,0)) if (ma_simple_command(mysql, COM_PROCESS_INFO,0,0,0,0))
return(0); return(NULL);
free_old_query(mysql); free_old_query(mysql);
pos=(uchar*) mysql->net.read_pos; pos=(uchar*) mysql->net.read_pos;
field_count=(uint) net_field_length(&pos); field_count=(uint) net_field_length(&pos);
@@ -2481,7 +2492,7 @@ mysql_list_processes(MYSQL *mysql)
if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,field_count,0, if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,field_count,0,
(my_bool) test(mysql->server_capabilities & (my_bool) test(mysql->server_capabilities &
CLIENT_LONG_FLAG)))) CLIENT_LONG_FLAG))))
return(0); return(NULL);
mysql->status=MYSQL_STATUS_GET_RESULT; mysql->status=MYSQL_STATUS_GET_RESULT;
mysql->field_count=field_count; mysql->field_count=field_count;
return(mysql_store_result(mysql)); return(mysql_store_result(mysql));