You've already forked mariadb-connector-c
mirror of
https://github.com/mariadb-corporation/mariadb-connector-c.git
synced 2025-08-07 02:42:49 +03:00
Fix for CONC-332:
mysql_change_user doesn't reset server status Fixed my_auth.c, after successful connect the server status package information (including session change information) must be updated.
This commit is contained in:
@@ -1977,67 +1977,84 @@ mysql_send_query(MYSQL* mysql, const char* query, unsigned long length)
|
||||
return ma_simple_command(mysql, COM_QUERY, query, length, 1,0);
|
||||
}
|
||||
|
||||
int mthd_my_read_query_result(MYSQL *mysql)
|
||||
int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length)
|
||||
{
|
||||
uchar *pos;
|
||||
ulong field_count;
|
||||
MYSQL_DATA *fields;
|
||||
ulong length;
|
||||
size_t item_len;
|
||||
mysql->affected_rows= net_field_length_ll(&pos);
|
||||
mysql->insert_id= net_field_length_ll(&pos);
|
||||
mysql->server_status=uint2korr(pos);
|
||||
pos+=2;
|
||||
mysql->warning_count=uint2korr(pos);
|
||||
pos+=2;
|
||||
if (pos < mysql->net.read_pos+length)
|
||||
{
|
||||
if ((item_len= net_field_length(&pos)))
|
||||
mysql->info=(char*) pos;
|
||||
|
||||
if (!mysql || (length = ma_net_safe_read(mysql)) == packet_error)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
free_old_query(mysql); /* Free old result */
|
||||
get_info:
|
||||
pos=(uchar*) mysql->net.read_pos;
|
||||
if ((field_count= net_field_length(&pos)) == 0)
|
||||
{
|
||||
size_t item_len;
|
||||
mysql->affected_rows= net_field_length_ll(&pos);
|
||||
mysql->insert_id= net_field_length_ll(&pos);
|
||||
mysql->server_status=uint2korr(pos);
|
||||
pos+=2;
|
||||
mysql->warning_count=uint2korr(pos);
|
||||
pos+=2;
|
||||
if (pos < mysql->net.read_pos+length)
|
||||
/* check if server supports session tracking */
|
||||
if (mysql->server_capabilities & CLIENT_SESSION_TRACKING)
|
||||
{
|
||||
if ((item_len= net_field_length(&pos)))
|
||||
mysql->info=(char*) pos;
|
||||
ma_clear_session_state(mysql);
|
||||
pos+= item_len;
|
||||
|
||||
/* check if server supports session tracking */
|
||||
if (mysql->server_capabilities & CLIENT_SESSION_TRACKING)
|
||||
if (mysql->server_status & SERVER_SESSION_STATE_CHANGED)
|
||||
{
|
||||
ma_clear_session_state(mysql);
|
||||
pos+= item_len;
|
||||
|
||||
if (mysql->server_status & SERVER_SESSION_STATE_CHANGED)
|
||||
int i;
|
||||
if (pos < mysql->net.read_pos + length)
|
||||
{
|
||||
int i;
|
||||
if (pos < mysql->net.read_pos + length)
|
||||
LIST *session_item;
|
||||
MYSQL_LEX_STRING *str= NULL;
|
||||
enum enum_session_state_type si_type;
|
||||
uchar *old_pos= pos;
|
||||
size_t item_len= net_field_length(&pos); /* length for all items */
|
||||
|
||||
/* length was already set, so make sure that info will be zero terminated */
|
||||
if (mysql->info)
|
||||
*old_pos= 0;
|
||||
|
||||
while (item_len > 0)
|
||||
{
|
||||
LIST *session_item;
|
||||
MYSQL_LEX_STRING *str= NULL;
|
||||
enum enum_session_state_type si_type;
|
||||
uchar *old_pos= pos;
|
||||
size_t item_len= net_field_length(&pos); /* length for all items */
|
||||
size_t plen;
|
||||
char *data;
|
||||
old_pos= pos;
|
||||
si_type= (enum enum_session_state_type)net_field_length(&pos);
|
||||
switch(si_type) {
|
||||
case SESSION_TRACK_SCHEMA:
|
||||
case SESSION_TRACK_STATE_CHANGE:
|
||||
case SESSION_TRACK_TRANSACTION_CHARACTERISTICS:
|
||||
case SESSION_TRACK_SYSTEM_VARIABLES:
|
||||
net_field_length(&pos); /* ignore total length, item length will follow next */
|
||||
plen= net_field_length(&pos);
|
||||
if (!ma_multi_malloc(0,
|
||||
&session_item, sizeof(LIST),
|
||||
&str, sizeof(MYSQL_LEX_STRING),
|
||||
&data, plen,
|
||||
NULL))
|
||||
{
|
||||
SET_CLIENT_ERROR(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0);
|
||||
return -1;
|
||||
}
|
||||
str->length= plen;
|
||||
str->str= data;
|
||||
memcpy(str->str, (char *)pos, plen);
|
||||
pos+= plen;
|
||||
session_item->data= str;
|
||||
mysql->extension->session_state[si_type].list= list_add(mysql->extension->session_state[si_type].list, session_item);
|
||||
|
||||
/* length was already set, so make sure that info will be zero terminated */
|
||||
if (mysql->info)
|
||||
*old_pos= 0;
|
||||
|
||||
while (item_len > 0)
|
||||
{
|
||||
size_t plen;
|
||||
char *data;
|
||||
old_pos= pos;
|
||||
si_type= (enum enum_session_state_type)net_field_length(&pos);
|
||||
switch(si_type) {
|
||||
case SESSION_TRACK_SCHEMA:
|
||||
case SESSION_TRACK_STATE_CHANGE:
|
||||
case SESSION_TRACK_TRANSACTION_CHARACTERISTICS:
|
||||
case SESSION_TRACK_SYSTEM_VARIABLES:
|
||||
net_field_length(&pos); /* ignore total length, item length will follow next */
|
||||
/* in case schema has changed, we have to update mysql->db */
|
||||
if (si_type == SESSION_TRACK_SCHEMA)
|
||||
{
|
||||
free(mysql->db);
|
||||
mysql->db= malloc(plen + 1);
|
||||
memcpy(mysql->db, str->str, plen);
|
||||
mysql->db[plen]= 0;
|
||||
}
|
||||
else if (si_type == SESSION_TRACK_SYSTEM_VARIABLES)
|
||||
{
|
||||
my_bool set_charset= 0;
|
||||
/* make sure that we update charset in case it has changed */
|
||||
if (!strncmp(str->str, "character_set_client", str->length))
|
||||
set_charset= 1;
|
||||
plen= net_field_length(&pos);
|
||||
if (!ma_multi_malloc(0,
|
||||
&session_item, sizeof(LIST),
|
||||
@@ -2054,68 +2071,54 @@ get_info:
|
||||
pos+= plen;
|
||||
session_item->data= str;
|
||||
mysql->extension->session_state[si_type].list= list_add(mysql->extension->session_state[si_type].list, session_item);
|
||||
|
||||
/* in case schema has changed, we have to update mysql->db */
|
||||
if (si_type == SESSION_TRACK_SCHEMA)
|
||||
if (set_charset &&
|
||||
strncmp(mysql->charset->csname, str->str, str->length) != 0)
|
||||
{
|
||||
free(mysql->db);
|
||||
mysql->db= malloc(plen + 1);
|
||||
memcpy(mysql->db, str->str, plen);
|
||||
mysql->db[plen]= 0;
|
||||
char cs_name[64];
|
||||
MARIADB_CHARSET_INFO *cs_info;
|
||||
memcpy(cs_name, str->str, str->length);
|
||||
cs_name[str->length]= 0;
|
||||
if ((cs_info = (MARIADB_CHARSET_INFO *)mysql_find_charset_name(cs_name)))
|
||||
mysql->charset= cs_info;
|
||||
}
|
||||
else if (si_type == SESSION_TRACK_SYSTEM_VARIABLES)
|
||||
{
|
||||
my_bool set_charset= 0;
|
||||
/* make sure that we update charset in case it has changed */
|
||||
if (!strncmp(str->str, "character_set_client", str->length))
|
||||
set_charset= 1;
|
||||
plen= net_field_length(&pos);
|
||||
if (!ma_multi_malloc(0,
|
||||
&session_item, sizeof(LIST),
|
||||
&str, sizeof(MYSQL_LEX_STRING),
|
||||
&data, plen,
|
||||
NULL))
|
||||
{
|
||||
SET_CLIENT_ERROR(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0);
|
||||
return -1;
|
||||
}
|
||||
str->length= plen;
|
||||
str->str= data;
|
||||
memcpy(str->str, (char *)pos, plen);
|
||||
pos+= plen;
|
||||
session_item->data= str;
|
||||
mysql->extension->session_state[si_type].list= list_add(mysql->extension->session_state[si_type].list, session_item);
|
||||
if (set_charset &&
|
||||
strncmp(mysql->charset->csname, str->str, str->length) != 0)
|
||||
{
|
||||
char cs_name[64];
|
||||
MARIADB_CHARSET_INFO *cs_info;
|
||||
memcpy(cs_name, str->str, str->length);
|
||||
cs_name[str->length]= 0;
|
||||
if ((cs_info = (MARIADB_CHARSET_INFO *)mysql_find_charset_name(cs_name)))
|
||||
mysql->charset= cs_info;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* not supported yet */
|
||||
plen= net_field_length(&pos);
|
||||
pos+= plen;
|
||||
break;
|
||||
}
|
||||
item_len-= (pos - old_pos);
|
||||
break;
|
||||
default:
|
||||
/* not supported yet */
|
||||
plen= net_field_length(&pos);
|
||||
pos+= plen;
|
||||
break;
|
||||
}
|
||||
item_len-= (pos - old_pos);
|
||||
}
|
||||
for (i= SESSION_TRACK_BEGIN; i <= SESSION_TRACK_END; i++)
|
||||
{
|
||||
mysql->extension->session_state[i].list= list_reverse(mysql->extension->session_state[i].list);
|
||||
mysql->extension->session_state[i].current= mysql->extension->session_state[i].list;
|
||||
}
|
||||
}
|
||||
for (i= SESSION_TRACK_BEGIN; i <= SESSION_TRACK_END; i++)
|
||||
{
|
||||
mysql->extension->session_state[i].list= list_reverse(mysql->extension->session_state[i].list);
|
||||
mysql->extension->session_state[i].current= mysql->extension->session_state[i].list;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
int mthd_my_read_query_result(MYSQL *mysql)
|
||||
{
|
||||
uchar *pos;
|
||||
ulong field_count;
|
||||
MYSQL_DATA *fields;
|
||||
ulong length;
|
||||
|
||||
if (!mysql || (length = ma_net_safe_read(mysql)) == packet_error)
|
||||
{
|
||||
return(1);
|
||||
}
|
||||
free_old_query(mysql); /* Free old result */
|
||||
get_info:
|
||||
pos=(uchar*) mysql->net.read_pos;
|
||||
if ((field_count= net_field_length(&pos)) == 0)
|
||||
return ma_read_ok_packet(mysql, pos, length);
|
||||
if (field_count == NULL_LENGTH) /* LOAD DATA LOCAL INFILE */
|
||||
{
|
||||
int error=mysql_handle_local_infile(mysql, (char *)pos);
|
||||
|
Reference in New Issue
Block a user