<div dir="ltr">Hello Maxim,<div><br></div><div style>We are sending chains data into a brigade/bucket structure (APR). It sometimes works fine.. sometimes trigger the cpu issue</div><div style><br></div><div style>If i call:</div>
<div style><span style="color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px"> rc = move_chain_to_brigade(in, ctx->brigade, r->pool, 1);   <--- change from 0 to 1</span></div>
<div style><span style="color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px">Then i will get only the first X bytes of the response body. This works great... but i need the entire buffer :)</span></div>
<div style><br></div><div style><span style="color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px">Could you give us more details how we could patch this function to fix the issue ?</span></div>
<div style><span style="color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px"><br></span></div><div style><span style="color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px">Thanks</span></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, May 11, 2013 at 7:56 PM, Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<div><div class="h5"><br>
On Sat, May 11, 2013 at 04:23:00PM -0300, Breno Silva wrote:<br>
<br>
> Hello list,<br>
><br>
> We are porting ModSecurity to NGINX. However we are seeing sometimes an<br>
> issue. Nginx eats 100% of cpu and when i use gdb i see:<br>
><br>
> gdb -p 8645<br>
><br>
> ngx_event_pipe_write_to_downstream (p=0x9bbc720, do_write=0) at<br>
> src/event/ngx_event_pipe.c:551<br>
><br>
> 551 if (cl->buf->recycled) {<br>
> (gdb)<br>
><br>
> Looks like it is happening when we call ngx_http_modsecurity_body_filter()<br>
> then go to this conditions;<br>
><br>
>     rc = move_chain_to_brigade(in, ctx->brigade, r->pool, 0);<br>
><br>
>     if (rc != NGX_OK)  {<br>
><br>
>         r->buffered |= NGX_HTTP_SSI_BUFFERED;<br>
><br>
>         return rc;<br>
><br>
>      }<br>
><br>
> move_chainto_brigade is defined as:<br>
><br>
><br>
> ngx_int_t<br>
><br>
> move_chain_to_brigade(ngx_chain_t *chain, apr_bucket_brigade *bb,<br>
> ngx_pool_t *pool, ngx_int_t last_buf) {<br>
><br>
>     apr_bucket         *e;<br>
><br>
>     ngx_chain_t        *cl;<br>
><br>
><br>
>     while (chain) {<br>
><br>
>         e = ngx_buf_to_apr_bucket(chain->buf, bb->p, bb->bucket_alloc);<br>
><br>
>         if (e == NULL) {<br>
><br>
>             return NGX_ERROR;<br>
><br>
>         }<br>
><br>
><br>
>         APR_BRIGADE_INSERT_TAIL(bb, e);<br>
><br>
>         if (chain->buf->last_buf) {<br>
><br>
>             e = apr_bucket_eos_create(bb->bucket_alloc);<br>
><br>
>             APR_BRIGADE_INSERT_TAIL(bb, e);<br>
><br>
>             chain->buf->last_buf = 0;<br>
><br>
>             return NGX_OK;<br>
><br>
>         }<br>
><br>
>         cl = chain;<br>
><br>
>         chain = chain->next;<br>
><br>
>         ngx_free_chain(pool, cl);<br>
><br>
>     }<br>
><br>
><br>
>     if (last_buf) {<br>
><br>
>         e = apr_bucket_eos_create(bb->bucket_alloc);<br>
><br>
>         APR_BRIGADE_INSERT_TAIL(bb, e);<br>
><br>
>         return NGX_OK;<br>
><br>
>     }<br>
><br>
>     return NGX_AGAIN;<br>
><br>
> }<br>
> Let me know if you guys can help us understanding why sometimes we trigger<br>
> this issue<br>
<br>
</div></div>It looks like your code modify chain links (ngx_chain_t<br>
structures) as got by your response body filter.  This is not<br>
something filters are allowed to do, and results are undefined.<br>
If a filter needs to modify chain, it should allocate it's own<br>
chain links.<br>
<br>
In the code quoted you probably don't want to touch chain links at<br>
all.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Maxim Dounin<br>
<a href="http://nginx.org/en/donation.html" target="_blank">http://nginx.org/en/donation.html</a><br>
<br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org">nginx-devel@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-devel" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
</font></span></blockquote></div><br></div>