]> git.kaiwu.me - nginx.git/commitdiff
Merge of r4965: upstream: fixed SIGSEGV with the "if" directive.
authorMaxim Dounin <mdounin@mdounin.ru>
Sun, 10 Feb 2013 03:27:15 +0000 (03:27 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Sun, 10 Feb 2013 03:27:15 +0000 (03:27 +0000)
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.

src/http/ngx_http_upstream.c

index 703017f542827d38bd68f0acc7a71f46ef12d0e4..5e04324d753546cb55e45905fdd00c53a37be95a 100644 (file)
@@ -636,6 +636,14 @@ ngx_http_upstream_init_request(ngx_http_request_t *r)
 
 found:
 
+    if (uscf == NULL) {
+        ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
+                      "no upstream configuration");
+        ngx_http_upstream_finalize_request(r, u,
+                                           NGX_HTTP_INTERNAL_SERVER_ERROR);
+        return;
+    }
+
     if (uscf->peer.init(r, uscf) != NGX_OK) {
         ngx_http_upstream_finalize_request(r, u,
                                            NGX_HTTP_INTERNAL_SERVER_ERROR);