sub filter‘s bug?

Simon Liu simohayha.bobo at gmail.com
Wed Sep 15 07:00:55 MSD 2010


my nginx version is 0.7.67.

I test nginx's sub filter, there have some alert log in error log:

*the http output chain is empty while sending response to client.*
*
*
and  i debug nginx , and then found this is cause by sub filter. so  i read
 sub filter's source.

in  ngx_http_sub_body_filter:

  *  if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {*
*
*
*        if (ctx->busy) {*
*            if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {*
*                return NGX_ERROR;*
*            }*
*        }*
*
*
*        return ngx_http_next_body_filter(r, in);*
*    }*

i found when  sub_filter_once is on , after  text have replaced . and the
second enter ngx_http_sub_body_filter.
At the moment when in is null,ctx->busy is not null,and so *ngx_http_sub_output
 may send  *the rest of* buf  completely**,  therefore in
**ngx_http_next_body_filter
will log alert log : the http output chain is empty while sending response
to client. *
*
*
*i*n conclusion I *think  there should add a *judgement that in is whether
or not NULL.
*
*
*this is my patch:*
*
*
*
--- nginx-0.7.67/src/http/modules/ngx_http_sub_filter_module.c 2009-10-26
23:54:29.000000000 +0800
+++ nginx-0.7.67_new/src/http/modules/ngx_http_sub_filter_module.c 2010-09-15
10:14:04.996666685 +0800
@@ -187,16 +187,16 @@ ngx_http_sub_body_filter(ngx_http_reques
     }

     if (ctx->once && (ctx->buf == NULL || ctx->in == NULL)) {

         if (ctx->busy) {
-            if (ngx_http_sub_output(r, ctx) == NGX_ERROR) {
-                return NGX_ERROR;
-            }
+            rc = ngx_http_sub_output(r, ctx);
         }

-        return ngx_http_next_body_filter(r, in);
+        if (rc != NGX_ERROR && in != NULL)
+            return ngx_http_next_body_filter(r, in);
+        return rc;
     }

     /* add the incoming chain to the chain ctx->in */

     if (in) {
*
*
*
-- 
博观约取

豆瓣:www.douban.com/people/mustang/

blog: www.pagefault.info

twitter: www.twitter.com/minibobo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx/attachments/20100915/b6c34253/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nginx-0.7.67.sub-patch.diff
Type: text/x-patch
Size: 784 bytes
Desc: not available
URL: <http://nginx.org/pipermail/nginx/attachments/20100915/b6c34253/attachment.bin>


More information about the nginx mailing list