2017/01/11 の nginx

要約

  • stream モジュールのバグ修正。

コミットログ (changeset)

http://hg.nginx.org/nginx/rev/ee3645078759

ソケット読み込みエラーが起きたときに無限ループに陥ってしまうバグがあったらしく、if文の条件に !src->read->errorを追加して回避している。

changeset:   6868:ee3645078759
user:        Vladimir Homutov <vl@nginx.com>
date:        Wed Jan 11 12:01:56 2017 +0300
summary:     Stream: avoid infinite loop in case of socket read error.

 src/stream/ngx_stream_proxy_module.c |  5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff -r 8c4d07ef08f5 -r ee3645078759 src/stream/ngx_stream_proxy_module.c
--- a/src/stream/ngx_stream_proxy_module.c      Tue Jan 10 17:13:06 2017 +0300
+++ b/src/stream/ngx_stream_proxy_module.c      Wed Jan 11 12:01:56 2017 +0300
@@ -1534,8 +1534,9 @@

         size = b->end - b->last;

-        if (size && src->read->ready && !src->read->delayed) {
-
+        if (size && src->read->ready && !src->read->delayed
+            && !src->read->error)
+        {
             if (limit_rate) {
                 limit = (off_t) limit_rate * (ngx_time() - u->start_sec + 1)
                         - *received;

srcはngx_connection_t型の変数で、 src->readはイベントループに追加されるngx_event_t型の変数である。src->read->readysrc->read->error はそれぞれunsigned integer。

struct ngx_event_s {
    ...
    /* the ready event; in aio mode 0 means that no operation can be posted */
    unsigned         ready:1;

    ...

    unsigned         error:1;

    ...
};

src->read->ready だが src->read->error になるケースがあまり具体的に想像できなかったので、そこは宿題とする。