Mercurial > hg > nginx-quic
comparison src/event/modules/ngx_poll_module.c @ 5016:4406168861e8
Events: fixed null pointer dereference with resolver and poll.
A POLLERR signalled by poll() without POLLIN/POLLOUT, as seen on
Linux, would generate both read and write events, but there's no
write event handler for resolver events. A fix is to only call
event handler of an active event.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 25 Jan 2013 09:59:28 +0000 |
parents | d620f497c50f |
children | a4e9c7e6e062 |
comparison
equal
deleted
inserted
replaced
5015:a74d211f034d | 5016:4406168861e8 |
---|---|
369 revents |= POLLIN|POLLOUT; | 369 revents |= POLLIN|POLLOUT; |
370 } | 370 } |
371 | 371 |
372 found = 0; | 372 found = 0; |
373 | 373 |
374 if (revents & POLLIN) { | 374 if ((revents & POLLIN) && c->read->active) { |
375 found = 1; | 375 found = 1; |
376 | 376 |
377 ev = c->read; | 377 ev = c->read; |
378 | 378 |
379 if ((flags & NGX_POST_THREAD_EVENTS) && !ev->accept) { | 379 if ((flags & NGX_POST_THREAD_EVENTS) && !ev->accept) { |
386 queue = (ngx_event_t **) (ev->accept ? &ngx_posted_accept_events: | 386 queue = (ngx_event_t **) (ev->accept ? &ngx_posted_accept_events: |
387 &ngx_posted_events); | 387 &ngx_posted_events); |
388 ngx_locked_post_event(ev, queue); | 388 ngx_locked_post_event(ev, queue); |
389 } | 389 } |
390 | 390 |
391 if (revents & POLLOUT) { | 391 if ((revents & POLLOUT) && c->write->active) { |
392 found = 1; | 392 found = 1; |
393 ev = c->write; | 393 ev = c->write; |
394 | 394 |
395 if (flags & NGX_POST_THREAD_EVENTS) { | 395 if (flags & NGX_POST_THREAD_EVENTS) { |
396 ev->posted_ready = 1; | 396 ev->posted_ready = 1; |