summaryrefslogtreecommitdiffhomepage
path: root/src
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
commit65a28d1703c8eaf6b43a92e122c3aa533ba9f5c9 (patch)
tree8018955be0678e168757db72e78bff90247d332b /src
parentb5802dbf51cf713f84c763180bc45069fb3bf320 (diff)
downloadnginx-65a28d1703c8eaf6b43a92e122c3aa533ba9f5c9.tar.gz
nginx-65a28d1703c8eaf6b43a92e122c3aa533ba9f5c9.tar.bz2
gRPC: limited allocations due to ping and settings frames.
Diffstat (limited to 'src')
-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 837ad9a2e..758f89eb2 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;
@@ -3531,6 +3534,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++) {
@@ -3683,6 +3692,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++) {