diff --git a/cmake/symlink.cmake b/cmake/symlink.cmake index 117c1647..c1c883d1 100644 --- a/cmake/symlink.cmake +++ b/cmake/symlink.cmake @@ -30,6 +30,6 @@ IF(UNIX) # presumably this will be used for libmysql*.so symlinks INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${symlink_name} DESTINATION ${install_path} - COMPONENT SharedLibraries) + COMPONENT Development) ENDIF() ENDMACRO() diff --git a/include/mariadb_com.h b/include/mariadb_com.h index 7e722a0b..2f3dcfef 100644 --- a/include/mariadb_com.h +++ b/include/mariadb_com.h @@ -158,6 +158,7 @@ enum enum_server_command #define CLIENT_PS_MULTI_RESULTS (1UL << 18) #define CLIENT_PLUGIN_AUTH (1UL << 19) #define CLIENT_CONNECT_ATTRS (1UL << 20) +#define CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA (1UL << 21) #define CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS (1UL << 22) #define CLIENT_SESSION_TRACKING (1UL << 23) #define CLIENT_PROGRESS (1UL << 29) /* client supports progress indicator */ @@ -200,10 +201,11 @@ enum enum_server_command CLIENT_MULTI_STATEMENTS |\ CLIENT_MULTI_RESULTS |\ CLIENT_PROGRESS |\ - CLIENT_SSL_VERIFY_SERVER_CERT |\ + CLIENT_SSL_VERIFY_SERVER_CERT |\ CLIENT_REMEMBER_OPTIONS |\ CLIENT_PLUGIN_AUTH |\ CLIENT_SESSION_TRACKING |\ + CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA |\ CLIENT_CONNECT_ATTRS) #define CLIENT_CAPABILITIES (CLIENT_MYSQL | \ @@ -215,6 +217,7 @@ enum enum_server_command CLIENT_PROTOCOL_41 |\ CLIENT_PLUGIN_AUTH |\ CLIENT_SESSION_TRACKING |\ + CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA |\ CLIENT_CONNECT_ATTRS) #define CLIENT_DEFAULT_FLAGS ((CLIENT_SUPPORTED_FLAGS & ~CLIENT_COMPRESS)\ diff --git a/plugins/auth/my_auth.c b/plugins/auth/my_auth.c index 0435b4f3..40352999 100644 --- a/plugins/auth/my_auth.c +++ b/plugins/auth/my_auth.c @@ -12,7 +12,7 @@ static int dummy_fallback_auth_client(MYSQL_PLUGIN_VIO *vio, MYSQL *mysql __attr extern void read_user_name(char *name); extern char *ma_send_connect_attr(MYSQL *mysql, unsigned char *buffer); extern int ma_read_ok_packet(MYSQL *mysql, uchar *pos, ulong length); - +extern unsigned char *mysql_net_store_length(unsigned char *packet, size_t length); typedef struct { int (*read_packet)(struct st_plugin_vio *vio, uchar **buf); int (*write_packet)(struct st_plugin_vio *vio, const uchar *pkt, size_t pkt_len); @@ -323,9 +323,21 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, { if (mysql->server_capabilities & CLIENT_SECURE_CONNECTION) { - *end++= data_len; - memcpy(end, data, data_len); - end+= data_len; + /* CONC-493: Support for passwords > 255 characters */ + if (mysql->server_capabilities & CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA) + { + unsigned char *to= mysql_net_store_length((uchar *)end, data_len); + if (data_len) + memcpy(to, data, data_len); + end= (char *)to + data_len; + printf("length encoded\n"); + } else { + if (data_len > 255) + goto error; + *end++= data_len; + memcpy(end, data, data_len); + end+= data_len; + } } else { diff --git a/unittest/libmariadb/connection.c b/unittest/libmariadb/connection.c index 11632e69..0095604a 100644 --- a/unittest/libmariadb/connection.c +++ b/unittest/libmariadb/connection.c @@ -1783,7 +1783,37 @@ static int test_default_auth(MYSQL *my __attribute__((unused))) return OK; } +static int test_conc493(MYSQL *mysql) +{ + MYSQL *my; + char long_password[300]; + char query[512]; + int rc; + + SKIP_SKYSQL; + + memset(&long_password, 'A', 299); + long_password[299]= 0; + + sprintf(query, "GRANT ALL PRIVILEGES ON *.* TO 'foo1'@'%%' IDENTIFIED BY '%s' WITH GRANT OPTION", long_password); + rc= mysql_query(mysql, query); + check_mysql_rc(rc, mysql); + + my= mysql_init(NULL); + if (!my_test_connect(my, hostname, "foo1", long_password, schema, port, socketname, CLIENT_REMEMBER_OPTIONS)) + { + diag("Connection failed. Error: %s", mysql_error(my)); + mysql_close(my); + exit(1); + return FAIL; + } + + mysql_close(my); + return OK; +} + struct my_tests_st my_tests[] = { + {"test_conc493", test_conc493, TEST_CONNECTION_DEFAULT, 0, NULL, NULL}, {"test_default_auth", test_default_auth, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_conc443", test_conc443, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_conc366", test_conc366, TEST_CONNECTION_DEFAULT, 0, NULL, NULL},