comparison src/http/ngx_http_upstream.c @ 5044:48d1606107d4 stable-1.2

Merge of r4965: upstream: fixed SIGSEGV with the "if" directive. Configuration like location / { set $true 1; if ($true) { proxy_pass http://backend; } if ($true) { # nothing } } resulted in segmentation fault due to NULL pointer dereference as the upstream configuration wasn't initialized in an implicit location created by the last if(), but the r->content_handler was set due to first if(). Instead of committing a suicide by dereferencing a NULL pointer, return 500 (Internal Server Error) in such cases, i.e. if uscf is NULL. Better fix would be to avoid such cases by fixing the "if" directive handling, but it's out of scope of this patch. Prodded by Piotr Sikora.
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 10 Feb 2013 03:27:15 +0000
parents 3795aeb360fb
children be9ce2946a8e
comparison
equal deleted inserted replaced
5043:30fe1b1acf93 5044:48d1606107d4
634 return; 634 return;
635 } 635 }
636 636
637 found: 637 found:
638 638
639 if (uscf == NULL) {
640 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
641 "no upstream configuration");
642 ngx_http_upstream_finalize_request(r, u,
643 NGX_HTTP_INTERNAL_SERVER_ERROR);
644 return;
645 }
646
639 if (uscf->peer.init(r, uscf) != NGX_OK) { 647 if (uscf->peer.init(r, uscf) != NGX_OK) {
640 ngx_http_upstream_finalize_request(r, u, 648 ngx_http_upstream_finalize_request(r, u,
641 NGX_HTTP_INTERNAL_SERVER_ERROR); 649 NGX_HTTP_INTERNAL_SERVER_ERROR);
642 return; 650 return;
643 } 651 }