Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: nginx 0.7.62/0.8.20 ssl and "worker process ... exited on signal 11"
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
# HG changeset patch
# User Maxim Dounin <mdounin@xxxxxxxxxx>
# 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) {
|