diff options
author | Sergei Golubchik <serg@mariadb.org> | 2020-10-07 18:40:50 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2020-10-07 18:40:50 +0200 |
commit | b18921cfd26f7f627ee5cbcae269aff9be4e9ea4 (patch) | |
tree | fa519c419cf2254c6577834bb150dfa9fea96e46 /sql | |
parent | 4aec143ad8c11564ba37f67ce19308c45f29b566 (diff) | |
parent | a464917766dc513b524d16282b8f2c30f323abe5 (diff) | |
download | mariadb-git-b18921cfd26f7f627ee5cbcae269aff9be4e9ea4.tar.gz |
Merge tag 'mariadb-10.2.34' into 10.2
Diffstat (limited to 'sql')
-rw-r--r-- | sql/wsrep_sst.cc | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index af3a80cb67c..65a3f971c62 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -1726,24 +1726,65 @@ static int sst_donate_other (const char* method, return arg.err; } +/* return true if character can be a part of a filename */ +static bool filename_char(int const c) +{ + return isalnum(c) || (c == '-') || (c == '_') || (c == '.'); +} + +/* return true if character can be a part of an address string */ +static bool address_char(int const c) +{ + return filename_char(c) || + (c == ':') || (c == '[') || (c == ']') || (c == '/'); +} + +static bool check_request_str(const char* const str, + bool (*check) (int c)) +{ + for (size_t i(0); str[i] != '\0'; ++i) + { + if (!check(str[i])) + { + WSREP_WARN("Illegal character in state transfer request: %i (%c).", + str[i], str[i]); + return true; + } + } + + return false; +} + wsrep_cb_status_t wsrep_sst_donate_cb (void* app_ctx, void* recv_ctx, const void* msg, size_t msg_len, const wsrep_gtid_t* current_gtid, const char* state, size_t state_len, bool bypass) { - /* This will be reset when sync callback is called. - * Should we set wsrep_ready to FALSE here too? */ - - wsrep_config_state->set(WSREP_MEMBER_DONOR); - const char* method = (char*)msg; size_t method_len = strlen (method); + + if (check_request_str(method, filename_char)) + { + WSREP_ERROR("Bad SST method name. SST canceled."); + return WSREP_CB_FAILURE; + } + const char* data = method + method_len + 1; + if (check_request_str(data, address_char)) + { + WSREP_ERROR("Bad SST address string. SST canceled."); + return WSREP_CB_FAILURE; + } + char uuid_str[37]; wsrep_uuid_print (¤t_gtid->uuid, uuid_str, sizeof(uuid_str)); + /* This will be reset when sync callback is called. + * Should we set wsrep_ready to FALSE here too? */ + wsrep_config_state->set(WSREP_MEMBER_DONOR); + wsp::env env(NULL); if (env.error()) { |