Handle FastCGI null request IDs better

This commit is contained in:
Přemysl Eric Janouch 2018-10-15 03:04:39 +02:00
parent 14ded260a0
commit 441c89f654
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 24 additions and 8 deletions

View File

@ -276,7 +276,14 @@ static void
fcgi_muxer_on_get_values
(struct fcgi_muxer *self, const struct fcgi_parser *parser)
{
struct str_map values = str_map_make (free);
if (parser->request_id != FCGI_NULL_REQUEST_ID)
{
print_debug ("FastCGI: ignoring invalid %s message",
STRINGIFY (FCGI_GET_VALUES));
return;
}
struct str_map values = str_map_make (free);
struct str_map response = str_map_make (free);
struct fcgi_nv_parser nv_parser = fcgi_nv_parser_make ();
@ -330,6 +337,13 @@ fcgi_muxer_on_begin_request
return;
}
struct fcgi_request *request = self->requests[parser->request_id];
if (parser->request_id == FCGI_NULL_REQUEST_ID || request)
{
// TODO: fail
return;
}
// We can only act as a responder, reject everything else up front
if (role != FCGI_RESPONDER)
{
@ -338,10 +352,11 @@ fcgi_muxer_on_begin_request
return;
}
struct fcgi_request *request = self->requests[parser->request_id];
if (request)
// TODO: also send OVERLOADED when shutting down?
if (parser->request_id >= N_ELEMENTS (self->requests))
{
// TODO: fail
fcgi_muxer_send_end_request (self,
parser->request_id, 0, FCGI_OVERLOADED);
return;
}
@ -359,21 +374,22 @@ fcgi_muxer_on_abort_request
(struct fcgi_muxer *self, const struct fcgi_parser *parser)
{
struct fcgi_request *request = self->requests[parser->request_id];
if (!request)
if (parser->request_id == FCGI_NULL_REQUEST_ID || !request)
{
print_debug ("FastCGI: received %s for an unknown request",
STRINGIFY (FCGI_ABORT_REQUEST));
return;
}
// TODO: abort the request: let it somehow produce FCGI_END_REQUEST
// TODO: abort the request: let it somehow produce FCGI_END_REQUEST,
// make sure to send an stdout EOF record
}
static void
fcgi_muxer_on_params (struct fcgi_muxer *self, const struct fcgi_parser *parser)
{
struct fcgi_request *request = self->requests[parser->request_id];
if (!request)
if (parser->request_id == FCGI_NULL_REQUEST_ID || !request)
{
print_debug ("FastCGI: received %s for an unknown request",
STRINGIFY (FCGI_PARAMS));
@ -388,7 +404,7 @@ static void
fcgi_muxer_on_stdin (struct fcgi_muxer *self, const struct fcgi_parser *parser)
{
struct fcgi_request *request = self->requests[parser->request_id];
if (!request)
if (parser->request_id == FCGI_NULL_REQUEST_ID || !request)
{
print_debug ("FastCGI: received %s for an unknown request",
STRINGIFY (FCGI_STDIN));