Mercurial > hg > nginx-quic
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 } |