ngx_http_range_filter_ctx_t *ctx, ngx_chain_t *in)
{
off_t start, last;
+ ngx_int_t rc;
ngx_buf_t *buf;
- ngx_chain_t *out, *cl, **ll;
+ ngx_chain_t *out, *cl, *tl, **ll;
ngx_http_range_t *range;
out = NULL;
"http range body buf: %O-%O", start, last);
if (ngx_buf_special(buf)) {
- *ll = cl;
- ll = &cl->next;
+
+ tl = ngx_alloc_chain_link(r->pool);
+ if (tl == NULL) {
+ return NGX_ERROR;
+ }
+
+ tl->buf = buf;
+ tl->next = NULL;
+
+ *ll = tl;
+ ll = &tl->next;
+
continue;
}
buf->last_buf = (r == r->main) ? 1 : 0;
buf->last_in_chain = 1;
- *ll = cl;
- cl->next = NULL;
- break;
+ tl = ngx_alloc_chain_link(r->pool);
+ if (tl == NULL) {
+ return NGX_ERROR;
+ }
+
+ tl->buf = buf;
+ tl->next = NULL;
+
+ *ll = tl;
+ ll = &tl->next;
+
+ continue;
+ }
+
+ tl = ngx_alloc_chain_link(r->pool);
+ if (tl == NULL) {
+ return NGX_ERROR;
}
- *ll = cl;
- ll = &cl->next;
+ tl->buf = buf;
+ tl->next = NULL;
+
+ *ll = tl;
+ ll = &tl->next;
}
if (out == NULL) {
return NGX_OK;
}
- return ngx_http_next_body_filter(r, out);
+ rc = ngx_http_next_body_filter(r, out);
+
+ while (out) {
+ cl = out;
+ out = out->next;
+ ngx_free_chain(r->pool, cl);
+ }
+
+ return rc;
}