diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2016-04-13 11:09:38 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2016-10-09 18:11:31 +0200 |
commit | a10fdaeeb4421794f073fe348020435aa6dcef4e (patch) | |
tree | 607e1f1fc127042129934458d75d0a616cac9938 /sql/sql_acl.cc | |
parent | 553ca406cd44946d454d84c08a7247ef595378f5 (diff) | |
download | mariadb-git-10.2-MDEV-9059.tar.gz |
MDEV-9059: draft for integration with client10.2-MDEV-9059
Diffstat (limited to 'sql/sql_acl.cc')
-rw-r--r-- | sql/sql_acl.cc | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index ab6a8032348..31b792b8af2 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -11687,38 +11687,78 @@ static bool find_mpvio_user(MPVIO_EXT *mpvio) } static bool -read_client_connect_attrs(char **ptr, char *end, CHARSET_INFO *from_cs) +read_bundle_length (size_t *length, char **ptr, char *end) { - size_t length; char *ptr_save= *ptr; /* not enough bytes to hold the length */ if (ptr_save >= end) return true; - length= safe_net_field_length_ll((uchar **) ptr, end - ptr_save); + *length= safe_net_field_length_ll((uchar **) ptr, end - ptr_save); /* cannot even read the length */ if (*ptr == NULL) return true; /* length says there're more data than can fit into the packet */ - if (*ptr + length > end) + if (*ptr + *length > end) + return true; + + return false; +} + +static bool +read_client_connect_attrs(char **ptr, char *end, CHARSET_INFO *from_cs) +{ + size_t length; + + if (read_bundle_length(&length, ptr, end)) return true; /* impose an artificial length limit of 64k */ if (length > 65535) return true; + #ifdef HAVE_PSI_THREAD_INTERFACE if (PSI_THREAD_CALL(set_thread_connect_attrs)(*ptr, length, from_cs) && current_thd->variables.log_warnings) sql_print_warning("Connection attributes of length %lu were truncated", (unsigned long) length); #endif + *ptr+= length; return false; } +static LEX_STRING +read_client_bundle_com(char **ptr, char *end) +{ + LEX_STRING res= {0, packet_error}; + + if (read_bundle_length(&res.length, ptr, end)) + return res; + + if (!res.length) + return res; + + /* do_command add \0 to the end so we need allocate more */ + res.str= (char *)my_malloc(res.length + 1, MYF(MY_WME)); + + if (likely(res.str)) + { + memcpy(res.str, *ptr, res.length); + *ptr+= res.length; + } + else + { + *ptr+= res.length; + res.length= packet_error; + } + + return res; +} + #endif /* the packet format is described in send_change_user_packet() */ @@ -12096,6 +12136,18 @@ static ulong parse_client_handshake_packet(MPVIO_EXT *mpvio, mpvio->thd->charset())) return packet_error; + if (thd->client_capabilities & MARIADB_CLIENT_COM_IN_AUTH) + { + thd->bundle_command= + read_client_bundle_com(&next_field, + ((char *)net->read_pos) + pkt_len); + if (thd->bundle_command.length == packet_error) + { + thd->bundle_command.length= 0; + return packet_error; + } + } + /* if the acl_user needs a different plugin to authenticate (specified in GRANT ... AUTHENTICATED VIA plugin_name ..) |