Segmentation fault в DAV модуле

Dmitry Petrov dmitry.petroff at gmail.com
Mon Nov 19 15:24:10 UTC 2012


Здравствуйте.

При использовании iphonовского клиента наткнулся на устойчивые падения в
DAV модуле такого характера (бактрейс для nginx-1.2.1 с парой отладочных
printf-ов, общая картина в 1.3.8 та же самая):
#0  0x08057494 in ngx_ext_rename_file (src=0x4, to=0xbfb3af54,
ext=0xbfb3aedc) at src/core/ngx_file.c:545
#1  0x080bb8ee in ngx_http_dav_put_handler (r=0x8c71598) at
src/http/modules/ngx_http_dav_module.c:262
#2  0x0809590e in ngx_http_read_client_request_body (r=0x8c71598,
post_handler=0x80bb64b <ngx_http_dav_put_handler>) at
src/http/ngx_http_request_body.c:44
#3  0x080bb5f1 in ngx_http_dav_handler (r=0x8c71598) at
src/http/modules/ngx_http_dav_module.c:172
#4  0x08081103 in ngx_http_core_content_phase (r=0x8c71598, ph=0x8c86004)
at src/http/ngx_http_core_module.c:1403
#5  0x0807febd in ngx_http_core_run_phases (r=0x8c71598) at
src/http/ngx_http_core_module.c:877
#6  0x0808c40f in ngx_http_request_handler (ev=0x8caf230) at
src/http/ngx_http_request.c:1864
#7  0x08077095 in ngx_epoll_process_events (cycle=0x8c72828, timer=75000,
flags=1) at src/event/modules/ngx_epoll_module.c:710
#8  0x08069c6b in ngx_process_events_and_timers (cycle=0x8c72828) at
src/event/ngx_event.c:247
#9  0x08075271 in ngx_worker_process_cycle (cycle=0x8c72828, data=0x0) at
src/os/unix/ngx_process_cycle.c:806
#10 0x0807234f in ngx_spawn_process (cycle=0x8c72828, proc=0x8075124
<ngx_worker_process_cycle>, data=0x0, name=0x80e1e47 "worker process",
respawn=-3) at src/os/unix/ngx_process.c:198
#11 0x08074484 in ngx_start_worker_processes (cycle=0x8c72828, n=1,
type=-3) at src/os/unix/ngx_process_cycle.c:365
#12 0x08073c07 in ngx_master_process_cycle (cycle=0x8c72828) at
src/os/unix/ngx_process_cycle.c:137
#13 0x0804ca97 in main (argc=5, argv=0xbfb3b4d4) at src/core/nginx.c:410

Автоматизированного тесткейса сделать не удалось, вопроизводил и удалял
ручками.
Причина кроется в src/http/ngx_http_request_body.c в строке 42: при двух
идущих <<быстро>> друг за другом PUT-запросах r->request_body сохранялся от
прошлого запроса, а r->request_body->temp_file был равен NULL. В итоге без
попытки вычитывания тела запроса шло исполнение post_handler, который в
нашем случае ngx_http_dav_put_handler, где все благополучно падало, т. к.
temp = &r->request_body->temp_file->file.name указывал явно на левую
область памяти.

Для меня все починилось дополнительной проверкой на NULL
r->request_body->temp_file (патч для 1.3.8 прилагается). Не знаю насколько
идеологически правилен этот фикс, но проблему с падением решает.

-- 
Regards,
Dmitry
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20121119/96e05d59/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nginx-1.3.8-dav-segfault-fix.diff
Type: application/octet-stream
Size: 699 bytes
Desc: not available
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20121119/96e05d59/attachment.obj>


More information about the nginx-devel mailing list