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;