nginx 0.7.62/0.8.20 ssl and "worker process ... exited on signal 11"

Maxim Dounin mdounin at mdounin.ru
Sat Oct 31 01:20:01 MSK 2009


Hello!

On Fri, Oct 30, 2009 at 03:01:58PM +0300, Maxim Dounin wrote:

> Hello!
> 
> On Fri, Oct 30, 2009 at 12:21:56PM +0300, Andrey Y. Ostanovsky wrote:
> 
> > Maxim Dounin пишет:
> > > On Fri, Oct 23, 2009 at 11:52:03AM +0400, Andrey Y. Ostanovsky wrote
> > >> Maxim Dounin пишет:
> > >>     
> > >>> Либо это совсем плохой, негодный стек, либо gdb запускали не с тем 
> > >>> бинарником.
> > >>>
> > >>> Я склоняюсь ко второму варианту - адреса переменных вполне похожи 
> > >>> на правду, между тем как имена функций и файлы/строки - абсолютно 
> > >>> левые
> > >>>       
> > >> Точно! Не с той коркой. Прошу прощения. Вот более правильный вариант:
> > >>
> > >> # gdb /usr/local/sbin/nginx-0.8.20 /var/tmp/80.nginx-0.8.20.core
> > >> GNU gdb 6.1.1 [FreeBSD]

[...]

> > >> (gdb) bt
> > >> #0  0x283e18a3 in memcpy () from /lib/libc.so.7
> > >> #1  0x08077ad1 in ngx_ssl_send_chain (c=0x28567258, in=0x285d9f9c,
> > >> limit=2012)
> > >>     at src/event/ngx_event_openssl.c:973
> 
> [...]
> 
> Ага, понял с чем именно проблема, воспроизвёл.  Падает при 
> использовании limit_rate для ssl.
> 
> Это, кстати, объясняет почему proxy_buffering off; ситуацию 
> исправляет - с ним limit_rate отключается.
> 
> Подробнее буду смотреть позже (если Игорь не успеет раньше...).

Патч.

Maxim Dounin
-------------- next part --------------
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1256940952 -10800
# Node ID 0b084ba04491d17deed8eb61934c5fc3742cdf58
# Parent  c88014f7483250ce1e3e93f0a179a21c719198d2
Fix ssl + limit_rate SIGSEGV.

diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -946,7 +946,7 @@ ngx_ssl_send_chain(ngx_connection_t *c, 
 
     for ( ;; ) {
 
-        while (in && buf->last < buf->end) {
+        while (in && buf->last < buf->end && send < limit) {
             if (in->buf->last_buf || in->buf->flush) {
                 flush = 1;
             }
@@ -976,6 +976,8 @@ ngx_ssl_send_chain(ngx_connection_t *c, 
 
             in->buf->pos += size;
 
+            send += size;
+
             if (in->buf->pos == in->buf->last) {
                 in = in->next;
             }
@@ -999,7 +1001,6 @@ ngx_ssl_send_chain(ngx_connection_t *c, 
         }
 
         buf->pos += n;
-        send += n;
         c->sent += n;
 
         if (n < size) {


More information about the nginx-ru mailing list