summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2004-02-14 20:26:21 +0400
committerunknown <hf@deer.(none)>2004-02-14 20:26:21 +0400
commitb012018b7a126eec08867b0726b7fad5b31a153f (patch)
tree4dd52b37d447d33fe6e01db093004f501c36c60a
parenta02bf29344f3ac58a49866e4be73dfbc9100b162 (diff)
downloadmariadb-git-b012018b7a126eec08867b0726b7fad5b31a153f.tar.gz
Fix for #2212 (mysql_change_user doesn't work in embedded library)
now it's working include/mysql.h: read_change_user_result 'virtual' method added libmysql/client_settings.h: cli_read_change_user_result interface libmysql/libmysql.c: cli_read_change_user_result implementation libmysqld/lib_sql.cc: emb_read_change_user_result implementation sql-common/client.c: cli_read_change_user_result added to the method's table sql/sql_parse.cc: fixes to make mysql_change_user working in embedded library
-rw-r--r--include/mysql.h1
-rw-r--r--libmysql/client_settings.h1
-rw-r--r--libmysql/libmysql.c63
-rw-r--r--libmysqld/lib_sql.cc10
-rw-r--r--sql-common/client.c3
-rw-r--r--sql/sql_parse.cc21
6 files changed, 63 insertions, 36 deletions
diff --git a/include/mysql.h b/include/mysql.h
index cd5d01d6f44..35d9aa62040 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -575,6 +575,7 @@ typedef struct st_mysql_methods
void (*free_embedded_thd)(MYSQL *mysql);
const char *(*read_statistic)(MYSQL *mysql);
int (*next_result)(MYSQL *mysql);
+ int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
#endif
} MYSQL_METHODS;
diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h
index b1a85f567f9..4558f0f2abe 100644
--- a/libmysql/client_settings.h
+++ b/libmysql/client_settings.h
@@ -58,6 +58,7 @@ int cli_stmt_execute(MYSQL_STMT *stmt);
MYSQL_DATA * cli_read_binary_rows(MYSQL_STMT *stmt);
int cli_unbuffered_fetch(MYSQL *mysql, char **row);
const char * cli_read_statistic(MYSQL *mysql);
+int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd);
#ifdef EMBEDDED_LIBRARY
int init_embedded_server(int argc, char **argv, char **groups);
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 859ec92f793..0eea5ee7007 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -606,13 +606,42 @@ mysql_connect(MYSQL *mysql,const char *host,
/**************************************************************************
Change user and database
**************************************************************************/
+int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd)
+{
+ NET *net= &mysql->net;
+ ulong pkt_length;
+
+ pkt_length= net_safe_read(mysql);
+
+ if (pkt_length == packet_error)
+ return 1;
+
+ if (pkt_length == 1 && net->read_pos[0] == 254 &&
+ mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
+ {
+ /*
+ By sending this very specific reply server asks us to send scrambled
+ password in old format. The reply contains scramble_323.
+ */
+ scramble_323(buff, mysql->scramble, passwd);
+ if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net))
+ {
+ net->last_errno= CR_SERVER_LOST;
+ strmov(net->sqlstate, unknown_sqlstate);
+ strmov(net->last_error,ER(net->last_errno));
+ return 1;
+ }
+ /* Read what server thinks about out new auth message report */
+ if (net_safe_read(mysql) == packet_error)
+ return 1;
+ }
+ return 0;
+}
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
const char *passwd, const char *db)
{
char buff[512],*end=buff;
- NET *net= &mysql->net;
- ulong pkt_length;
DBUG_ENTER("mysql_change_user");
if (!user)
@@ -646,31 +675,8 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
/* Write authentication package */
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1);
- pkt_length= net_safe_read(mysql);
-
- if (pkt_length == packet_error)
- goto error;
-
- if (pkt_length == 1 && net->read_pos[0] == 254 &&
- mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
- {
- /*
- By sending this very specific reply server asks us to send scrambled
- password in old format. The reply contains scramble_323.
- */
- scramble_323(buff, mysql->scramble, passwd);
- if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net))
- {
- net->last_errno= CR_SERVER_LOST;
- strmov(net->sqlstate, unknown_sqlstate);
- strmov(net->last_error,ER(net->last_errno));
- goto error;
- }
- /* Read what server thinks about out new auth message report */
- if (net_safe_read(mysql) == packet_error)
- goto error;
- }
-
+ if ((*mysql->methods->read_change_user_result)(mysql, buff, passwd))
+ DBUG_RETURN(1);
/* Free old connect information */
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
@@ -681,9 +687,6 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
mysql->passwd=my_strdup(passwd,MYF(MY_WME));
mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
DBUG_RETURN(0);
-
-error:
- DBUG_RETURN(1);
}
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index 63354149d42..ee6451f4a17 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -258,6 +258,13 @@ int emb_next_result(MYSQL *mysql)
DBUG_RETURN(0); /* No more results */
}
+int emb_read_change_user_result(MYSQL *mysql,
+ char *buff __attribute__((unused)),
+ const char *passwd __attribute__((unused)))
+{
+ return mysql_errno(mysql);
+}
+
MYSQL_METHODS embedded_methods=
{
emb_mysql_read_query_result,
@@ -272,7 +279,8 @@ MYSQL_METHODS embedded_methods=
emb_unbuffered_fetch,
emb_free_embedded_thd,
emb_read_statistic,
- emb_next_result
+ emb_next_result,
+ emb_read_change_user_result
};
C_MODE_END
diff --git a/sql-common/client.c b/sql-common/client.c
index 10df4653601..36b2c6122dd 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -1421,7 +1421,8 @@ static MYSQL_METHODS client_methods=
cli_unbuffered_fetch,
NULL,
cli_read_statistic,
- cli_read_query_result
+ cli_read_query_result,
+ cli_read_change_user_result
#endif
};
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index e2884b73444..caa9528298c 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -206,7 +206,21 @@ int check_user(THD *thd, enum enum_server_command command,
#ifdef NO_EMBEDDED_ACCESS_CHECKS
thd->master_access= GLOBAL_ACLS; // Full rights
- return 0;
+ /* Change database if necessary: OK or FAIL is sent in mysql_change_db */
+ if (db && db[0])
+ {
+ thd->db= 0;
+ thd->db_length= 0;
+ if (mysql_change_db(thd, db))
+ {
+ if (thd->user_connect)
+ decrease_user_connections(thd->user_connect);
+ DBUG_RETURN(-1);
+ }
+ }
+ else
+ send_ok(thd);
+ DBUG_RETURN(0);
#else
my_bool opt_secure_auth_local;
@@ -1282,7 +1296,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
send_error(thd); // dump to NET
break;
}
-#ifndef EMBEDDED_LIBRARY
case COM_CHANGE_USER:
{
thd->change_user();
@@ -1301,13 +1314,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ?
*passwd++ : strlen(passwd);
db+= passwd_len + 1;
+#ifndef EMBEDDED_LIBRARY
/* Small check for incomming packet */
if ((uint) ((uchar*) db - net->read_pos) > packet_length)
{
send_error(thd, ER_UNKNOWN_COM_ERROR);
break;
}
-
+#endif
/* Convert database name to utf8 */
db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
system_charset_info, db, strlen(db),
@@ -1358,7 +1372,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
}
break;
}
-#endif /* EMBEDDED_LIBRARY */
case COM_EXECUTE:
{
mysql_stmt_execute(thd, packet);