diff options
author | unknown <andrey@whirlpool.hristov.com> | 2008-03-25 18:18:58 +0200 |
---|---|---|
committer | unknown <andrey@whirlpool.hristov.com> | 2008-03-25 18:18:58 +0200 |
commit | 2d5a444d1fac9dc1866231355ea791ea0545fdd8 (patch) | |
tree | 3b8e24ad99bae9eb98905f05233bd93c39d51597 /include/mysql_com.h | |
parent | 92a09cf98b8f8abc6c1f1adc987c9826b657f812 (diff) | |
download | mariadb-git-2d5a444d1fac9dc1866231355ea791ea0545fdd8.tar.gz |
Fix for Bug #27944 Filtering THD::client capabilities
The server used to trust blindly information from the client about
its capabilities. During the connection handshake the server sends
information about what it supports and then the client sends back a
set of capabilities which cover all of the server's or less.
Before this changeset the server didn't check whether the flags sent
by the client were valid for the server. For example, if the server
doesn't support compressed protocol but the client does and sends that
bit turned on, the server didn't check it. The change make the server code
less error prone to problems related to the value of THD::client_capabilities.
Clearly there is no vulnerability being fixed but this is a maintainenance
fix to prevent misusage in the future.
include/mysql_com.h:
List all CLIENT flags in a common defition. Add also a definition
which excludes flags, which are optoinal.
sql/sql_connect.cc:
Renamed client_flags to server_capabilities to reflect what
the server supports. Only allow from the client the flags the
server supports.
Diffstat (limited to 'include/mysql_com.h')
-rw-r--r-- | include/mysql_com.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/include/mysql_com.h b/include/mysql_com.h index cea98cebc61..25bf58e58ba 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -148,6 +148,37 @@ enum enum_server_command #define CLIENT_SSL_VERIFY_SERVER_CERT (1UL << 30) #define CLIENT_REMEMBER_OPTIONS (1UL << 31) +/* Gather all possible capabilites (flags) supported by the server */ +#define CLIENT_ALL_FLAGS (CLIENT_LONG_PASSWORD | \ + CLIENT_FOUND_ROWS | \ + CLIENT_LONG_FLAG | \ + CLIENT_CONNECT_WITH_DB | \ + CLIENT_NO_SCHEMA | \ + CLIENT_COMPRESS | \ + CLIENT_ODBC | \ + CLIENT_LOCAL_FILES | \ + CLIENT_IGNORE_SPACE | \ + CLIENT_PROTOCOL_41 | \ + CLIENT_INTERACTIVE | \ + CLIENT_SSL | \ + CLIENT_IGNORE_SIGPIPE | \ + CLIENT_TRANSACTIONS | \ + CLIENT_RESERVED | \ + CLIENT_SECURE_CONNECTION | \ + CLIENT_MULTI_STATEMENTS | \ + CLIENT_MULTI_RESULTS | \ + CLIENT_SSL_VERIFY_SERVER_CERT | \ + CLIENT_REMEMBER_OPTIONS) + +/* + Switch off the flags that are optional and depending on build flags + If any of the optional flags is supported by the build it will be switched + on before sending to the client during the connection handshake. +*/ +#define CLIENT_BASIC_FLAGS (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ + & ~CLIENT_COMPRESS) \ + & ~CLIENT_SSL_VERIFY_SERVER_CERT) + #define SERVER_STATUS_IN_TRANS 1 /* Transaction has started */ #define SERVER_STATUS_AUTOCOMMIT 2 /* Server in auto_commit mode */ #define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */ |