doubtfull solution, if he fires requests that require more than two parameters to crash the server it would block him, if 1 pa

This commit is contained in:
Christian 2020-11-04 20:18:20 +01:00
parent 0b1fee4e78
commit 097e2289d7

View File

@ -147,6 +147,7 @@ static void OnAsyncData(AsyncSocket socket, const char[] data, const int size)
static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
{
int parameter_count_verified = 0;
static char sMethod[32];
if(jRequest.GetString("method", sMethod, sizeof(sMethod)) < 0)
{
@ -174,7 +175,6 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
}
g_Client_Subscriber[Client] = Subscriber;
}
return Subscriber_HandleRequest(Subscriber, jRequest, jResponse);
}
else if(StrEqual(sMethod, "function"))
@ -206,7 +206,9 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
}
}
else
{
Call_StartFunction(INVALID_HANDLE, Fun);
}
JSONArray jArgsArray = view_as<JSONArray>(jRequest.Get("args"));
if(jArgsArray == null || !jArgsArray.IsArray)
@ -257,6 +259,7 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
Call_PushArrayEx(aiValues[iValues], jValueArray.Length, SM_PARAM_COPYBACK);
iValues += jValueArray.Length;
parameter_count_verified++;
}
else if(jArrayValue.IsFloat)
{
@ -270,6 +273,7 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
Call_PushArrayEx(afValues[fValues], jValueArray.Length, SM_PARAM_COPYBACK);
fValues += jValueArray.Length;
parameter_count_verified++;
}
/*else if(jArrayValue.IsString)
{
@ -290,9 +294,15 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
view_as<JSONArray>(jArrayValue).GetString(0, sSpecial, sizeof(sSpecial));
if(StrEqual(sSpecial, "NULL_VECTOR"))
{
Call_PushArrayEx(NULL_VECTOR, 3, 0);
parameter_count_verified++;
}
else if(StrEqual(sSpecial, "NULL_STRING"))
{
Call_PushString(NULL_STRING);
parameter_count_verified++;
}
else
Fail = true;
}
@ -323,11 +333,13 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
{
aiValues[iValues] = view_as<JSONInteger>(jValue).Value;
Call_PushCell(aiValues[iValues++]);
parameter_count_verified++;
}
else if(jValue.IsFloat)
{
afValues[fValues] = view_as<JSONFloat>(jValue).Value;
Call_PushFloat(afValues[fValues++]);
parameter_count_verified++;
}
else if(jValue.IsString)
{
@ -335,6 +347,7 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
JSONString jString = view_as<JSONString>(jValue);
jString.GetString(asValues[sValues], sizeof(asValues[]));
Call_PushStringEx(asValues[sValues++], sizeof(asValues[]), SM_PARAM_STRING_COPY, SM_PARAM_COPYBACK);
parameter_count_verified++;
}
else
{
@ -355,7 +368,21 @@ static int HandleRequest(int Client, JSONObject jRequest, JSONObject jResponse)
}
delete jValue;
}
int sm_call_finish_ex_params_size = 2;
if (parameter_count_verified > sm_call_finish_ex_params_size)
{
Call_Cancel();
delete jArgsArray;
char sError[128];
FormatEx(sError, sizeof(sError), "blocking parameterized call %i", parameter_count_verified);
JSONObject jError = new JSONObject();
jError.SetString("error", sError);
jResponse.Set("error", jError);
return -1;
}
int Result;
static char sException[1024];
int Error = Call_FinishEx(Result, sException, sizeof(sException));