diff options
-rw-r--r-- | src/http/modules/ngx_http_range_filter_module.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/src/http/modules/ngx_http_range_filter_module.c b/src/http/modules/ngx_http_range_filter_module.c index e11240660..a0c70b87c 100644 --- a/src/http/modules/ngx_http_range_filter_module.c +++ b/src/http/modules/ngx_http_range_filter_module.c @@ -146,7 +146,6 @@ static ngx_int_t ngx_http_range_header_filter(ngx_http_request_t *r) { time_t if_range; - ngx_int_t rc; ngx_http_range_filter_ctx_t *ctx; if (r->http_version < NGX_HTTP_VERSION_10 @@ -192,10 +191,9 @@ ngx_http_range_header_filter(ngx_http_request_t *r) return NGX_ERROR; } - rc = ngx_http_range_parse(r, ctx); - - if (rc == NGX_OK) { + switch (ngx_http_range_parse(r, ctx)) { + case NGX_OK: ngx_http_set_ctx(r, ctx, ngx_http_range_body_filter_module); r->headers_out.status = NGX_HTTP_PARTIAL_CONTENT; @@ -206,15 +204,16 @@ ngx_http_range_header_filter(ngx_http_request_t *r) } return ngx_http_range_multipart_header(r, ctx); - } - if (rc == NGX_HTTP_RANGE_NOT_SATISFIABLE) { + case NGX_HTTP_RANGE_NOT_SATISFIABLE: return ngx_http_range_not_satisfiable(r); - } - /* rc == NGX_ERROR */ + case NGX_ERROR: + return NGX_ERROR; - return rc; + default: /* NGX_DECLINED */ + break; + } next_filter: @@ -235,11 +234,12 @@ ngx_int_t ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx) { u_char *p; - off_t start, end; + off_t start, end, size; ngx_uint_t suffix; ngx_http_range_t *range; p = r->headers_in.range->value.data + 6; + size = 0; for ( ;; ) { start = 0; @@ -277,9 +277,10 @@ ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx) range->start = start; range->end = r->headers_out.content_length_n; + size += range->end - start; if (*p++ != ',') { - return NGX_OK; + break; } continue; @@ -331,10 +332,18 @@ ngx_http_range_parse(ngx_http_request_t *r, ngx_http_range_filter_ctx_t *ctx) range->end = end + 1; } + size += range->end - start; + if (*p++ != ',') { - return NGX_OK; + break; } } + + if (size > r->headers_out.content_length_n) { + return NGX_DECLINED; + } + + return NGX_OK; } |