mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
A fix and a test case for Bug#16365 "Prepared Statements: DoS with
too many open statements". The patch adds a new global variable @@max_prepared_stmt_count. This variable limits the total number of prepared statements in the server. The default value of @@max_prepared_stmt_count is 16382. 16382 small statements (a select against 3 tables with GROUP, ORDER and LIMIT) consume 100MB of RAM. Once this limit has been reached, the server will refuse to prepare a new statement and return ER_UNKNOWN_ERROR (unfortunately, we can't add new errors to 4.1 without breaking 5.0). The limit is changeable after startup and can accept any value from 0 to 1 million. In case the new value of the limit is less than the current statement count, no new statements can be added, while the old still can be used. Additionally, the current count of prepared statements is now available through a global read-only variable @@prepared_stmt_count.
This commit is contained in:
@@ -620,7 +620,7 @@ class Statement_map
|
||||
public:
|
||||
Statement_map();
|
||||
|
||||
int insert(Statement *statement);
|
||||
int insert(THD *thd, Statement *statement);
|
||||
|
||||
Statement *find_by_name(LEX_STRING *name)
|
||||
{
|
||||
@@ -642,29 +642,10 @@ public:
|
||||
}
|
||||
return last_found_statement;
|
||||
}
|
||||
void erase(Statement *statement)
|
||||
{
|
||||
if (statement == last_found_statement)
|
||||
last_found_statement= 0;
|
||||
if (statement->name.str)
|
||||
{
|
||||
hash_delete(&names_hash, (byte *) statement);
|
||||
}
|
||||
hash_delete(&st_hash, (byte *) statement);
|
||||
}
|
||||
void erase(Statement *statement);
|
||||
/* Erase all statements (calls Statement destructor) */
|
||||
void reset()
|
||||
{
|
||||
my_hash_reset(&names_hash);
|
||||
my_hash_reset(&st_hash);
|
||||
last_found_statement= 0;
|
||||
}
|
||||
|
||||
~Statement_map()
|
||||
{
|
||||
hash_free(&names_hash);
|
||||
hash_free(&st_hash);
|
||||
}
|
||||
void reset();
|
||||
~Statement_map();
|
||||
private:
|
||||
HASH st_hash;
|
||||
HASH names_hash;
|
||||
@@ -932,6 +913,7 @@ public:
|
||||
{
|
||||
my_bool my_bool_value;
|
||||
long long_value;
|
||||
ulong ulong_value;
|
||||
} sys_var_tmp;
|
||||
|
||||
THD();
|
||||
|
Reference in New Issue
Block a user