mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[10340] Some fixes for recent chat code changes.
* Fixed crash at absent optional literal. Thanks to MysteriousSouL for reproting. * Converted mode commands use new way parsing functions with fixing posible crash cases.
This commit is contained in:
parent
a202b33702
commit
8b99ac7298
4 changed files with 115 additions and 153 deletions
|
|
@ -2202,33 +2202,40 @@ char* ChatHandler::ExtractLiteralArg(char** args, char const* lit /*= NULL*/)
|
|||
|
||||
if (lit)
|
||||
{
|
||||
int diff = strncmp(head, lit, strlen(lit));
|
||||
int l = strlen(lit);
|
||||
int diff = strncmp(head, lit, l);
|
||||
|
||||
if (diff > 0)
|
||||
if (diff != 0)
|
||||
return NULL;
|
||||
|
||||
if (diff < 0 && !head[-diff] && !isWhiteSpace(head[-diff]))
|
||||
if (head[l] && !isWhiteSpace(head[l]))
|
||||
return NULL;
|
||||
|
||||
char* arg = head;
|
||||
|
||||
if (head[-diff])
|
||||
if (head[l])
|
||||
{
|
||||
head[-diff] = '\0';
|
||||
head[l] = '\0';
|
||||
|
||||
head += -diff + 1;
|
||||
head += l + 1;
|
||||
|
||||
*args = head;
|
||||
}
|
||||
else
|
||||
*args = NULL;
|
||||
*args = head + l;
|
||||
|
||||
SkipWhiteSpaces(args);
|
||||
return arg;
|
||||
}
|
||||
|
||||
char* name = strtok(head, " ");
|
||||
*args = strtok(NULL, "");
|
||||
|
||||
char* tail = strtok(NULL, "");
|
||||
|
||||
*args = tail ? tail : (char*)""; // *args don't must be NULL
|
||||
|
||||
SkipWhiteSpaces(args);
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
|
|
@ -2255,7 +2262,8 @@ char* ChatHandler::ExtractQuotedArg( char** args )
|
|||
|
||||
char* str = strtok((*args)+1, guard); // skip start guard symbol
|
||||
|
||||
*args = strtok(NULL, "");
|
||||
char* tail = strtok(NULL, "");
|
||||
*args = tail ? tail : (char*)""; // *args don't must be NULL
|
||||
|
||||
SkipWhiteSpaces(args);
|
||||
|
||||
|
|
@ -2522,7 +2530,7 @@ char* ChatHandler::ExtractOptNotLastArg(char** args)
|
|||
return arg;
|
||||
|
||||
// optional name not found
|
||||
*args = arg;
|
||||
*args = arg ? arg : (char*)""; // *args don't must be NULL
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4459,14 +4459,15 @@ bool ChatHandler::HandleLearnAllRecipesCommand(char* args)
|
|||
|
||||
bool ChatHandler::HandleLookupAccountEmailCommand(char* args)
|
||||
{
|
||||
|
||||
if (!*args)
|
||||
char* emailStr = ExtractQuotedOrLiteralArg(&args);
|
||||
if (!emailStr)
|
||||
return false;
|
||||
|
||||
std::string email = strtok(args, " ");
|
||||
char* limit_str = strtok(NULL, " ");
|
||||
uint32 limit = limit_str ? atoi(limit_str) : 100;
|
||||
uint32 limit;
|
||||
if (!ExtractOptUInt32(&args, limit, 100))
|
||||
return false;
|
||||
|
||||
std::string email = emailStr;
|
||||
LoginDatabase.escape_string(email);
|
||||
// 0 1 2 3 4
|
||||
QueryResult *result = LoginDatabase.PQuery("SELECT id, username, last_ip, gmlevel, expansion FROM account WHERE email "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), email.c_str ());
|
||||
|
|
@ -4476,13 +4477,15 @@ bool ChatHandler::HandleLookupAccountEmailCommand(char* args)
|
|||
|
||||
bool ChatHandler::HandleLookupAccountIpCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
char* ipStr = ExtractQuotedOrLiteralArg(&args);
|
||||
if (!ipStr)
|
||||
return false;
|
||||
|
||||
std::string ip = strtok(args, " ");
|
||||
char* limit_str = strtok(NULL, " ");
|
||||
uint32 limit = limit_str ? atoi(limit_str) : 100;
|
||||
uint32 limit;
|
||||
if (!ExtractOptUInt32(&args, limit, 100))
|
||||
return false;
|
||||
|
||||
std::string ip = ipStr;
|
||||
LoginDatabase.escape_string(ip);
|
||||
|
||||
// 0 1 2 3 4
|
||||
|
|
@ -4493,13 +4496,15 @@ bool ChatHandler::HandleLookupAccountIpCommand(char* args)
|
|||
|
||||
bool ChatHandler::HandleLookupAccountNameCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
char* accountStr = ExtractQuotedOrLiteralArg(&args);
|
||||
if (!accountStr)
|
||||
return false;
|
||||
|
||||
std::string account = strtok(args, " ");
|
||||
char* limit_str = strtok(NULL, " ");
|
||||
uint32 limit = limit_str ? atoi(limit_str) : 100;
|
||||
uint32 limit;
|
||||
if (!ExtractOptUInt32(&args, limit, 100))
|
||||
return false;
|
||||
|
||||
std::string account = accountStr;
|
||||
if (!AccountMgr::normalizeString(account))
|
||||
return false;
|
||||
|
||||
|
|
@ -4564,13 +4569,15 @@ bool ChatHandler::ShowAccountListHelper(QueryResult* result, uint32* limit, bool
|
|||
|
||||
bool ChatHandler::HandleLookupPlayerIpCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
char* ipStr = ExtractQuotedOrLiteralArg(&args);
|
||||
if (!ipStr)
|
||||
return false;
|
||||
|
||||
std::string ip = strtok(args, " ");
|
||||
char* limit_str = strtok(NULL, " ");
|
||||
uint32 limit = limit_str ? atoi(limit_str) : 100;
|
||||
uint32 limit;
|
||||
if (!ExtractOptUInt32(&args, limit, 100))
|
||||
return false;
|
||||
|
||||
std::string ip = ipStr;
|
||||
LoginDatabase.escape_string(ip);
|
||||
|
||||
QueryResult* result = LoginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), ip.c_str ());
|
||||
|
|
@ -4580,13 +4587,15 @@ bool ChatHandler::HandleLookupPlayerIpCommand(char* args)
|
|||
|
||||
bool ChatHandler::HandleLookupPlayerAccountCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
char* accountStr = ExtractQuotedOrLiteralArg(&args);
|
||||
if (!accountStr)
|
||||
return false;
|
||||
|
||||
std::string account = strtok(args, " ");
|
||||
char* limit_str = strtok(NULL, " ");
|
||||
uint32 limit = limit_str ? atoi(limit_str) : 100;
|
||||
uint32 limit;
|
||||
if (!ExtractOptUInt32(&args, limit, 100))
|
||||
return false;
|
||||
|
||||
std::string account = accountStr;
|
||||
if (!AccountMgr::normalizeString(account))
|
||||
return false;
|
||||
|
||||
|
|
@ -4599,13 +4608,15 @@ bool ChatHandler::HandleLookupPlayerAccountCommand(char* args)
|
|||
|
||||
bool ChatHandler::HandleLookupPlayerEmailCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
char* emailStr = ExtractQuotedOrLiteralArg(&args);
|
||||
if (!emailStr)
|
||||
return false;
|
||||
|
||||
std::string email = strtok(args, " ");
|
||||
char* limit_str = strtok(NULL, " ");
|
||||
uint32 limit = limit_str ? atoi(limit_str) : 100;
|
||||
uint32 limit;
|
||||
if (!ExtractOptUInt32(&args, limit, 100))
|
||||
return false;
|
||||
|
||||
std::string email = emailStr;
|
||||
LoginDatabase.escape_string(email);
|
||||
|
||||
QueryResult* result = LoginDatabase.PQuery("SELECT id,username FROM account WHERE email "_LIKE_" "_CONCAT3_("'%%'","'%s'","'%%'"), email.c_str ());
|
||||
|
|
|
|||
|
|
@ -4168,9 +4168,6 @@ bool ChatHandler::HandleStableCommand(char* /*args*/)
|
|||
|
||||
bool ChatHandler::HandleChangeWeatherCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
return false;
|
||||
|
||||
//Weather is OFF
|
||||
if (!sWorld.getConfig(CONFIG_BOOL_WEATHER))
|
||||
{
|
||||
|
|
@ -4179,15 +4176,21 @@ bool ChatHandler::HandleChangeWeatherCommand(char* args)
|
|||
return false;
|
||||
}
|
||||
|
||||
//*Change the weather of a cell
|
||||
char* px = strtok(args, " ");
|
||||
char* py = strtok(NULL, " ");
|
||||
|
||||
if (!px || !py)
|
||||
uint32 type;
|
||||
if (!ExtractUInt32(&args, type))
|
||||
return false;
|
||||
|
||||
uint32 type = (uint32)atoi(px); //0 to 3, 0: fine, 1: rain, 2: snow, 3: sand
|
||||
float grade = (float)atof(py); //0 to 1, sending -1 is instand good weather
|
||||
//0 to 3, 0: fine, 1: rain, 2: snow, 3: sand
|
||||
if (type > 3)
|
||||
return false;
|
||||
|
||||
float grade;
|
||||
if (!ExtractFloat(&args, grade))
|
||||
return false;
|
||||
|
||||
//0 to 1, sending -1 is instand good weather
|
||||
if (grade < 0.0f || grade > 1.0f)
|
||||
return false;
|
||||
|
||||
Player *player = m_session->GetPlayer();
|
||||
uint32 zoneid = player->GetZoneId();
|
||||
|
|
@ -4659,24 +4662,12 @@ bool ChatHandler::HandleServerShutDownCancelCommand(char* /*args*/)
|
|||
|
||||
bool ChatHandler::HandleServerShutDownCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
uint32 delay;
|
||||
if (!ExtractUInt32(&args, delay))
|
||||
return false;
|
||||
|
||||
char* time_str = strtok(args, " ");
|
||||
char* exitcode_str = strtok(NULL, "");
|
||||
|
||||
int32 time = atoi(time_str);
|
||||
|
||||
///- Prevent interpret wrong arg value as 0 secs shutdown time
|
||||
if ((time == 0 && (time_str[0]!='0' || time_str[1]!='\0')) || time < 0)
|
||||
return false;
|
||||
|
||||
if (exitcode_str)
|
||||
{
|
||||
int32 exitcode = atoi (exitcode_str);
|
||||
|
||||
// Handle atoi() errors
|
||||
if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
|
||||
uint32 exitcode;
|
||||
if (!ExtractOptUInt32(&args, exitcode, SHUTDOWN_EXIT_CODE))
|
||||
return false;
|
||||
|
||||
// Exit code should be in range of 0-125, 126-255 is used
|
||||
|
|
@ -4685,33 +4676,18 @@ bool ChatHandler::HandleServerShutDownCommand(char* args)
|
|||
if (exitcode < 0 || exitcode > 125)
|
||||
return false;
|
||||
|
||||
sWorld.ShutdownServ (time, 0, exitcode);
|
||||
}
|
||||
else
|
||||
sWorld.ShutdownServ(time,0,SHUTDOWN_EXIT_CODE);
|
||||
sWorld.ShutdownServ (delay, 0, exitcode);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleServerRestartCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
uint32 delay;
|
||||
if (!ExtractUInt32(&args, delay))
|
||||
return false;
|
||||
|
||||
char* time_str = strtok(args, " ");
|
||||
char* exitcode_str = strtok(NULL, "");
|
||||
|
||||
int32 time = atoi(time_str);
|
||||
|
||||
///- Prevent interpret wrong arg value as 0 secs shutdown time
|
||||
if ((time == 0 && (time_str[0]!='0' || time_str[1]!='\0')) || time < 0)
|
||||
return false;
|
||||
|
||||
if (exitcode_str)
|
||||
{
|
||||
int32 exitcode = atoi(exitcode_str);
|
||||
|
||||
// Handle atoi() errors
|
||||
if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
|
||||
uint32 exitcode;
|
||||
if (!ExtractOptUInt32(&args, exitcode, RESTART_EXIT_CODE))
|
||||
return false;
|
||||
|
||||
// Exit code should be in range of 0-125, 126-255 is used
|
||||
|
|
@ -4720,33 +4696,18 @@ bool ChatHandler::HandleServerRestartCommand(char* args)
|
|||
if (exitcode < 0 || exitcode > 125)
|
||||
return false;
|
||||
|
||||
sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART, exitcode);
|
||||
}
|
||||
else
|
||||
sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART, RESTART_EXIT_CODE);
|
||||
sWorld.ShutdownServ(delay, SHUTDOWN_MASK_RESTART, exitcode);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleServerIdleRestartCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
uint32 delay;
|
||||
if (!ExtractUInt32(&args, delay))
|
||||
return false;
|
||||
|
||||
char* time_str = strtok(args, " ");
|
||||
char* exitcode_str = strtok(NULL, "");
|
||||
|
||||
int32 time = atoi(time_str);
|
||||
|
||||
///- Prevent interpret wrong arg value as 0 secs shutdown time
|
||||
if ((time == 0 && (time_str[0]!='0' || time_str[1]!='\0')) || time < 0)
|
||||
return false;
|
||||
|
||||
if (exitcode_str)
|
||||
{
|
||||
int32 exitcode = atoi(exitcode_str);
|
||||
|
||||
// Handle atoi() errors
|
||||
if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
|
||||
uint32 exitcode;
|
||||
if (!ExtractOptUInt32(&args, exitcode, RESTART_EXIT_CODE))
|
||||
return false;
|
||||
|
||||
// Exit code should be in range of 0-125, 126-255 is used
|
||||
|
|
@ -4755,33 +4716,18 @@ bool ChatHandler::HandleServerIdleRestartCommand(char* args)
|
|||
if (exitcode < 0 || exitcode > 125)
|
||||
return false;
|
||||
|
||||
sWorld.ShutdownServ(time, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, exitcode);
|
||||
}
|
||||
else
|
||||
sWorld.ShutdownServ(time,SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE,RESTART_EXIT_CODE);
|
||||
sWorld.ShutdownServ(delay, SHUTDOWN_MASK_RESTART|SHUTDOWN_MASK_IDLE, exitcode);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleServerIdleShutDownCommand(char* args)
|
||||
{
|
||||
if (!*args)
|
||||
uint32 delay;
|
||||
if (!ExtractUInt32(&args, delay))
|
||||
return false;
|
||||
|
||||
char* time_str = strtok(args, " ");
|
||||
char* exitcode_str = strtok(NULL, "");
|
||||
|
||||
int32 time = atoi(time_str);
|
||||
|
||||
///- Prevent interpret wrong arg value as 0 secs shutdown time
|
||||
if ((time == 0 && (time_str[0]!='0' || time_str[1]!='\0')) || time < 0)
|
||||
return false;
|
||||
|
||||
if (exitcode_str)
|
||||
{
|
||||
int32 exitcode = atoi(exitcode_str);
|
||||
|
||||
// Handle atoi() errors
|
||||
if (exitcode == 0 && (exitcode_str[0] != '0' || exitcode_str[1] != '\0'))
|
||||
uint32 exitcode;
|
||||
if (!ExtractOptUInt32(&args, exitcode, SHUTDOWN_EXIT_CODE))
|
||||
return false;
|
||||
|
||||
// Exit code should be in range of 0-125, 126-255 is used
|
||||
|
|
@ -4790,10 +4736,7 @@ bool ChatHandler::HandleServerIdleShutDownCommand(char* args)
|
|||
if (exitcode < 0 || exitcode > 125)
|
||||
return false;
|
||||
|
||||
sWorld.ShutdownServ(time, SHUTDOWN_MASK_IDLE, exitcode);
|
||||
}
|
||||
else
|
||||
sWorld.ShutdownServ(time,SHUTDOWN_MASK_IDLE,SHUTDOWN_EXIT_CODE);
|
||||
sWorld.ShutdownServ(delay, SHUTDOWN_MASK_IDLE, exitcode);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -5197,7 +5140,7 @@ bool ChatHandler::HandleBanInfoIPCommand(char* args)
|
|||
if (!*args)
|
||||
return false;
|
||||
|
||||
char* cIP = strtok (args, "");
|
||||
char* cIP = ExtractQuotedOrLiteralArg(&args);
|
||||
if(!cIP)
|
||||
return false;
|
||||
|
||||
|
|
@ -5227,7 +5170,7 @@ bool ChatHandler::HandleBanListCharacterCommand(char* args)
|
|||
{
|
||||
LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||
|
||||
char* cFilter = strtok (args, " ");
|
||||
char* cFilter = ExtractLiteralArg(&args);
|
||||
if(!cFilter)
|
||||
return false;
|
||||
|
||||
|
|
@ -5247,7 +5190,7 @@ bool ChatHandler::HandleBanListAccountCommand(char* args)
|
|||
{
|
||||
LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||
|
||||
char* cFilter = strtok(args, " ");
|
||||
char* cFilter = ExtractLiteralArg(&args);
|
||||
std::string filter = cFilter ? cFilter : "";
|
||||
LoginDatabase.escape_string(filter);
|
||||
|
||||
|
|
@ -5356,7 +5299,7 @@ bool ChatHandler::HandleBanListIPCommand(char* args)
|
|||
{
|
||||
LoginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||
|
||||
char* cFilter = strtok(args, " ");
|
||||
char* cFilter = ExtractLiteralArg(&args);
|
||||
std::string filter = cFilter ? cFilter : "";
|
||||
LoginDatabase.escape_string(filter);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "10339"
|
||||
#define REVISION_NR "10340"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue