Changeset 1993

Show
Ignore:
Timestamp:
09/07/2007 11:24:28 PM (13 months ago)
Author:
darix
Message:

- handle errors from the fcgi packet construction and return 400 if we have an error.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/lighttpd-1.4.x/src/mod_fastcgi.c

    r1984 r1993  
    5050#endif 
    5151 
     52#define FCGI_ENV_ADD_CHECK(ret, con) \ 
     53        if (ret == -1) { \ 
     54                con->http_status = 400; \ 
     55                con->file_finished = 1; \ 
     56                return -1; \ 
     57        }; 
    5258 
    5359/* 
     
    17721778                        srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0'; 
    17731779 
    1774                         fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)); 
     1780                        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)),con); 
    17751781                } 
    17761782        } 
     
    17991805                        srv->tmp_buf->ptr[srv->tmp_buf->used++] = '\0'; 
    18001806 
    1801                         fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)); 
     1807                        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_BUF_LEN(srv->tmp_buf), CONST_BUF_LEN(ds->value)), con); 
    18021808                } 
    18031809        } 
     
    18431849 
    18441850 
    1845         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_STR_LEN(PACKAGE_NAME"/"PACKAGE_VERSION)); 
     1851        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_SOFTWARE"), CONST_STR_LEN(PACKAGE_NAME"/"PACKAGE_VERSION)),con) 
    18461852 
    18471853        if (con->server_name->used) { 
    1848                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), CONST_BUF_LEN(con->server_name)); 
     1854                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), CONST_BUF_LEN(con->server_name)),con) 
    18491855        } else { 
    18501856#ifdef HAVE_IPV6 
     
    18571863                s = inet_ntoa(srv_sock->addr.ipv4.sin_addr); 
    18581864#endif 
    1859                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), s, strlen(s)); 
    1860         } 
    1861  
    1862         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("GATEWAY_INTERFACE"), CONST_STR_LEN("CGI/1.1")); 
     1865                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_NAME"), s, strlen(s)),con) 
     1866        } 
     1867 
     1868        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("GATEWAY_INTERFACE"), CONST_STR_LEN("CGI/1.1")),con) 
    18631869 
    18641870        LI_ltostr(buf, 
     
    18701876               ); 
    18711877 
    1872         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PORT"), buf, strlen(buf)); 
     1878        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PORT"), buf, strlen(buf)),con) 
    18731879 
    18741880        /* get the server-side of the connection to the client */ 
     
    18801886                s = inet_ntop_cache_get_ip(srv, &(our_addr)); 
    18811887        } 
    1882         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_ADDR"), s, strlen(s)); 
     1888        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_ADDR"), s, strlen(s)),con) 
    18831889 
    18841890        LI_ltostr(buf, 
     
    18901896               ); 
    18911897 
    1892         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_PORT"), buf, strlen(buf)); 
     1898        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_PORT"), buf, strlen(buf)),con) 
    18931899 
    18941900        s = inet_ntop_cache_get_ip(srv, &(con->dst_addr)); 
    1895         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_ADDR"), s, strlen(s)); 
     1901        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_ADDR"), s, strlen(s)),con) 
    18961902 
    18971903        if (!buffer_is_empty(con->authed_user)) { 
     
    19091915                data_string *ds; 
    19101916                 
    1911                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_USER"), CONST_BUF_LEN(con->authed_user)); 
     1917                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REMOTE_USER"), CONST_BUF_LEN(con->authed_user)),con) 
    19121918         
    19131919                if (NULL != (ds = (data_string *)array_get_element(con->request.headers, "Authorization"))) { 
     
    19331939                /* request.content_length < SSIZE_MAX, see request.c */ 
    19341940                LI_ltostr(buf, con->request.content_length); 
    1935                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf)); 
     1941                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("CONTENT_LENGTH"), buf, strlen(buf)),con) 
    19361942        } 
    19371943 
     
    19441950                 */ 
    19451951 
    1946                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path)); 
     1952                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_NAME"), CONST_BUF_LEN(con->uri.path)),con) 
    19471953 
    19481954                if (!buffer_is_empty(con->request.pathinfo)) { 
    1949                         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo)); 
     1955                        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_BUF_LEN(con->request.pathinfo)),con) 
    19501956 
    19511957                        /* PATH_TRANSLATED is only defined if PATH_INFO is set */ 
     
    19571963                        } 
    19581964                        buffer_append_string_buffer(p->path, con->request.pathinfo); 
    1959                         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_TRANSLATED"), CONST_BUF_LEN(p->path)); 
     1965                        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_TRANSLATED"), CONST_BUF_LEN(p->path)),con) 
    19601966                } else { 
    1961                         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_STR_LEN("")); 
     1967                        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("PATH_INFO"), CONST_STR_LEN("")),con) 
    19621968                } 
    19631969        } 
     
    19801986                buffer_append_string_buffer(p->path, con->uri.path); 
    19811987 
    1982                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)); 
    1983                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(host->docroot)); 
     1988                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)),con) 
     1989                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(host->docroot)),con) 
    19841990        } else { 
    19851991                buffer_copy_string_buffer(p->path, con->physical.path); 
     
    19931999                } 
    19942000 
    1995                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)); 
    1996                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.doc_root)); 
     2001                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SCRIPT_FILENAME"), CONST_BUF_LEN(p->path)),con) 
     2002                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("DOCUMENT_ROOT"), CONST_BUF_LEN(con->physical.doc_root)),con) 
    19972003        } 
    19982004 
     
    20202026                                        con->request.orig_uri->used - (host->strip_request_uri->used - 2)); 
    20212027                } else { 
    2022                         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)); 
     2028                        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)),con) 
    20232029                } 
    20242030        } else { 
    2025                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)); 
     2031                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_URI"), CONST_BUF_LEN(con->request.orig_uri)),con) 
    20262032        } 
    20272033        if (!buffer_is_equal(con->request.uri, con->request.orig_uri)) { 
    2028                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri)); 
     2034                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_URI"), CONST_BUF_LEN(con->request.uri)),con) 
    20292035        } 
    20302036        if (!buffer_is_empty(con->uri.query)) { 
    2031                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query)); 
     2037                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_BUF_LEN(con->uri.query)),con) 
    20322038        } else { 
    2033                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_STR_LEN("")); 
     2039                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("QUERY_STRING"), CONST_STR_LEN("")),con) 
    20342040        } 
    20352041 
    20362042        s = get_http_method_name(con->request.http_method); 
    2037         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_METHOD"), s, strlen(s)); 
    2038         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_STATUS"), CONST_STR_LEN("200")); /* if php is compiled with --force-redirect */ 
     2043        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REQUEST_METHOD"), s, strlen(s)),con) 
     2044        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("REDIRECT_STATUS"), CONST_STR_LEN("200")),con) /* if php is compiled with --force-redirect */ 
    20392045        s = get_http_version_name(con->request.http_version); 
    2040         fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PROTOCOL"), s, strlen(s)); 
     2046        FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("SERVER_PROTOCOL"), s, strlen(s)),con) 
    20412047 
    20422048#ifdef USE_OPENSSL 
    20432049        if (srv_sock->is_ssl) { 
    2044                 fcgi_env_add(p->fcgi_env, CONST_STR_LEN("HTTPS"), CONST_STR_LEN("on")); 
     2050                FCGI_ENV_ADD_CHECK(fcgi_env_add(p->fcgi_env, CONST_STR_LEN("HTTPS"), CONST_STR_LEN("on")),con) 
    20452051        } 
    20462052#endif 
    20472053 
    20482054 
    2049         fcgi_env_add_request_headers(srv, con, p); 
     2055        FCGI_ENV_ADD_CHECK(fcgi_env_add_request_headers(srv, con, p), con); 
    20502056 
    20512057        fcgi_header(&(header), FCGI_PARAMS, request_id, p->fcgi_env->used, 0); 
     
    29422948 
    29432949                /* fall through */ 
    2944                 fcgi_create_env(srv, hctx, hctx->request_id); 
    2945  
     2950                if (-1 == fcgi_create_env(srv, hctx, hctx->request_id)) return HANDLER_ERROR; 
    29462951                fcgi_set_state(srv, hctx, FCGI_STATE_WRITE); 
    2947  
    29482952                /* fall through */ 
    29492953        case FCGI_STATE_WRITE: 
     
    31273131                        buffer_reset(con->physical.path); 
    31283132                        con->mode = DIRECT; 
    3129                         con->http_status = 503; 
     3133                        if (con->http_status != 400) con->http_status = 503; 
    31303134                        joblist_append(srv, con); /* really ? */ 
    31313135