aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_grpc_module.c
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2018-11-06 16:29:59 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2018-11-06 16:29:59 +0300
commit42043b4ef7e60eabed114164f36c1d2314faef1a (patch)
tree7fea674711e3b6ef9a932b94bcc1898f79ed67e6 /src/http/modules/ngx_http_grpc_module.c
parent60b93594cca9cb5d63f26e724c458ccb380ac540 (diff)
downloadnginx-42043b4ef7e60eabed114164f36c1d2314faef1a.tar.gz
nginx-42043b4ef7e60eabed114164f36c1d2314faef1a.zip
gRPC: limited allocations due to ping and settings frames.
Diffstat (limited to 'src/http/modules/ngx_http_grpc_module.c')
-rw-r--r--src/http/modules/ngx_http_grpc_module.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/http/modules/ngx_http_grpc_module.c b/src/http/modules/ngx_http_grpc_module.c
index e6e11b07a..18478b978 100644
--- a/src/http/modules/ngx_http_grpc_module.c
+++ b/src/http/modules/ngx_http_grpc_module.c
@@ -78,6 +78,9 @@ typedef struct {
ngx_uint_t id;
+ ngx_uint_t pings;
+ ngx_uint_t settings;
+
ssize_t send_window;
size_t recv_window;
@@ -3584,6 +3587,12 @@ ngx_http_grpc_parse_settings(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
ctx->rest);
return NGX_ERROR;
}
+
+ if (ctx->free == NULL && ctx->settings++ > 1000) {
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+ "upstream sent too many settings frames");
+ return NGX_ERROR;
+ }
}
for (p = b->pos; p < last; p++) {
@@ -3736,6 +3745,12 @@ ngx_http_grpc_parse_ping(ngx_http_request_t *r,
"upstream sent ping frame with ack flag");
return NGX_ERROR;
}
+
+ if (ctx->free == NULL && ctx->pings++ > 1000) {
+ ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
+ "upstream sent too many ping frames");
+ return NGX_ERROR;
+ }
}
for (p = b->pos; p < last; p++) {