Mercurial > hg > nginx
comparison src/http/ngx_http_core_module.c @ 7811:1ebd78df4ce7
Fixed handling of already closed connections.
In limit_req, auth_delay, and upstream code to check for broken
connections, tests for possible connection close by the client
did not work if the connection was already closed when relevant
event handler was set. This happened because there were no additional
events in case of edge-triggered event methods, and read events
were disabled in case of level-triggered ones.
Fix is to explicitly post a read event if the c->read->ready flag
is set.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sun, 28 Mar 2021 17:45:39 +0300 |
parents | de0b6f1fe4e4 |
children | fdc3d40979b0 f1986657fc26 |
comparison
equal
deleted
inserted
replaced
7810:1bf8ab7063de | 7811:1ebd78df4ce7 |
---|---|
1188 } | 1188 } |
1189 | 1189 |
1190 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, | 1190 ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, |
1191 "delaying unauthorized request"); | 1191 "delaying unauthorized request"); |
1192 | 1192 |
1193 if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { | 1193 if (r->connection->read->ready) { |
1194 return NGX_HTTP_INTERNAL_SERVER_ERROR; | 1194 ngx_post_event(r->connection->read, &ngx_posted_events); |
1195 | |
1196 } else { | |
1197 if (ngx_handle_read_event(r->connection->read, 0) != NGX_OK) { | |
1198 return NGX_HTTP_INTERNAL_SERVER_ERROR; | |
1199 } | |
1195 } | 1200 } |
1196 | 1201 |
1197 r->read_event_handler = ngx_http_test_reading; | 1202 r->read_event_handler = ngx_http_test_reading; |
1198 r->write_event_handler = ngx_http_core_auth_delay_handler; | 1203 r->write_event_handler = ngx_http_core_auth_delay_handler; |
1199 | 1204 |