]> git.kaiwu.me - nginx.git/commitdiff
gRPC: limited allocations due to ping and settings frames.
authorMaxim Dounin <mdounin@mdounin.ru>
Tue, 6 Nov 2018 13:29:59 +0000 (16:29 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Tue, 6 Nov 2018 13:29:59 +0000 (16:29 +0300)
src/http/modules/ngx_http_grpc_module.c

index e6e11b07add412a44f23bdae1c98f06fc8e1d11a..18478b978775e7ffd2d51cba909e33d336772921 100644 (file)
@@ -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++) {