comparison src/event/modules/ngx_poll_module.c @ 5062:a095b3692ad1 stable-1.2

Merge of r5017: fixed null dereference with resolver and poll. 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 Maxim Dounin <mdounin@mdounin.ru>
date Mon, 11 Feb 2013 16:06:39 +0000
parents d620f497c50f
children a4e9c7e6e062
comparison
equal deleted inserted replaced
5061:7ce4ecb6df5c 5062:a095b3692ad1
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;