Commit 134a8708 authored by Jeff Trawick's avatar Jeff Trawick
Browse files

mod_cgi: Fix some problems where the wrong error value was being traced

(errno instead of apr_status).

mod_cgid: Keep some of the code in synch with the version in mod_cgi.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87576 13f79535-47bb-0310-9956-ffa450edef68
parent e16b0e00
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
Changes with Apache 2.0b1

  *) mod_cgi: Fix some problems where the wrong error value was being
     traced.  [Jeff Trawick]

  *) EBCDIC: Fix some missing ASCII conversion on some protocol data.
     [Jeff Trawick]

+20 −17
Original line number Diff line number Diff line
@@ -183,13 +183,14 @@ AP_INIT_TAKE1("ScriptLogBuffer", set_scriptlog_buffer, NULL, RSRC_CONF,
};

static int log_scripterror(request_rec *r, cgi_server_conf * conf, int ret,
			   int show_errno, char *error)
			   apr_status_t rv, char *error)
{
    apr_file_t *f = NULL;
    apr_finfo_t finfo;
    char time_str[APR_CTIME_LEN];
    int log_flags = rv ? APLOG_ERR : APLOG_NOERRNO | APLOG_ERR;

    ap_log_rerror(APLOG_MARK, show_errno|APLOG_ERR, errno, r, 
    ap_log_rerror(APLOG_MARK, log_flags, rv, r, 
                  "%s: %s", error, r->filename);

    if (!conf->logname ||
@@ -511,6 +512,7 @@ static int cgi_handler(request_rec *r)
    int is_included = !strcmp(r->protocol, "INCLUDED");
    apr_pool_t *p;
    cgi_server_conf *conf;
    apr_status_t rv;

    p = r->main ? r->main->pool : r->pool;

@@ -530,10 +532,10 @@ static int cgi_handler(request_rec *r)
    conf = ap_get_module_config(r->server->module_config, &cgi_module);

    if (!(ap_allow_options(r) & OPT_EXECCGI) && !is_scriptaliased(r))
        return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO,
        return log_scripterror(r, conf, HTTP_FORBIDDEN, 0,
                               "Options ExecCGI is off in this directory");
    if (nph && is_included)
        return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO,
        return log_scripterror(r, conf, HTTP_FORBIDDEN, 0,
                               "attempt to include NPH CGI script");

#if defined(OS2) || defined(WIN32)
@@ -545,11 +547,12 @@ static int cgi_handler(request_rec *r)
    if (r->finfo.protection == 0) {
        apr_finfo_t finfo;
        char *newfile;
        apr_status_t rv;

        newfile = apr_pstrcat(r->pool, r->filename, ".EXE", NULL);
        if ((apr_stat(&finfo, newfile, r->pool) != APR_SUCCESS) || 
        if (((rv = apr_stat(&finfo, newfile, r->pool)) != APR_SUCCESS) || 
            (finfo.filetype != APR_REG)) {
            return log_scripterror(r, conf, HTTP_NOT_FOUND, 0,
            return log_scripterror(r, conf, HTTP_NOT_FOUND, rv,
                                   "script not found or unable to stat");
        } else {
            r->filename = newfile;
@@ -557,17 +560,17 @@ static int cgi_handler(request_rec *r)
    }
#else
    if (r->finfo.protection == 0)
	return log_scripterror(r, conf, HTTP_NOT_FOUND, APLOG_NOERRNO,
	return log_scripterror(r, conf, HTTP_NOT_FOUND, 0,
			       "script not found or unable to stat");
#endif
    if (r->finfo.filetype == APR_DIR)
	return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO,
	return log_scripterror(r, conf, HTTP_FORBIDDEN, 0,
			       "attempt to invoke directory as script");

/*
    if (!ap_suexec_enabled) {
	if (!ap_can_exec(&r->finfo))
	    return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO,
	    return log_scripterror(r, conf, HTTP_FORBIDDEN, 0,
				   "file permissions deny server execution");
    }

@@ -578,23 +581,23 @@ static int cgi_handler(request_rec *r)
    ap_add_common_vars(r);

    /* build the command line */
    if (build_command_line(&command, r, p) != APR_SUCCESS) {
	ap_log_rerror(APLOG_MARK, APLOG_ERR, errno, r,
    if ((rv = build_command_line(&command, r, p)) != APR_SUCCESS) {
	ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
	      "couldn't spawn child process: %s", r->filename);
	return HTTP_INTERNAL_SERVER_ERROR;
    }
    /* build the argument list */
    else if (build_argv_list(&argv, r, p) != APR_SUCCESS) {
	ap_log_rerror(APLOG_MARK, APLOG_ERR, errno, r,
    else if ((rv = build_argv_list(&argv, r, p)) != APR_SUCCESS) {
	ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
		      "couldn't spawn child process: %s", r->filename);
	return HTTP_INTERNAL_SERVER_ERROR;
    }
    argv[0] = apr_pstrdup(p, command);

    /* run the script in its own process */
    if (run_cgi_child(&script_out, &script_in, &script_err,
                      command, argv, r, p) != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, errno, r,
    if ((rv = run_cgi_child(&script_out, &script_in, &script_err,
                            command, argv, r, p)) != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                      "couldn't spawn child process: %s", r->filename);
        return HTTP_INTERNAL_SERVER_ERROR;
    }
+13 −24
Original line number Diff line number Diff line
@@ -609,13 +609,14 @@ static const command_rec cgid_cmds[] =
}; 

static int log_scripterror(request_rec *r, cgid_server_conf * conf, int ret, 
                           int show_errno, char *error) 
                           apr_status_t rv, char *error) 
{ 
    apr_file_t *f = NULL; 
    struct stat finfo; 
    char time_str[APR_CTIME_LEN];
    int log_flags = rv ? APLOG_ERR : APLOG_NOERRNO | APLOG_ERR;

    ap_log_rerror(APLOG_MARK, show_errno|APLOG_ERR, errno, r, 
    ap_log_rerror(APLOG_MARK, log_flags, rv, r, 
                "%s: %s", error, r->filename); 

    if (!conf->logname || 
@@ -765,39 +766,27 @@ static int cgid_handler(request_rec *r)
        argv0 = r->filename; 

    if (!(ap_allow_options(r) & OPT_EXECCGI) && !is_scriptaliased(r)) 
        return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO, 
        return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, 
                               "Options ExecCGI is off in this directory"); 
    if (nph && is_included) 
        return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO, 
        return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, 
                               "attempt to include NPH CGI script"); 

#if defined(OS2) || defined(WIN32)
    /* Allow for cgid files without the .EXE extension on them under OS/2 */ 
    if (r->finfo.st_mode == 0) { 
        struct stat statbuf; 
        char *newfile; 

        newfile = apr_pstrcat(r->pool, r->filename, ".EXE", NULL); 

        if ((stat(newfile, &statbuf) != 0) || (!S_ISREG(statbuf.st_mode))) { 
            return log_scripterror(r, conf, HTTP_NOT_FOUND, 0, 
                                   "script not found or unable to stat"); 
        } else { 
            r->filename = newfile; 
        } 
    } 
#error mod_cgid does not work on this platform.  If you teach it to, look 
#error at mod_cgi.c for required code in this path.
#else 
    if (r->finfo.protection == 0) 
        return log_scripterror(r, conf, HTTP_NOT_FOUND, APLOG_NOERRNO, 
        return log_scripterror(r, conf, HTTP_NOT_FOUND, 0, 
                               "script not found or unable to stat"); 
#endif 
    if (r->finfo.filetype == APR_DIR) 
        return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO, 
        return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, 
                               "attempt to invoke directory as script"); 
/*
    if (!ap_suexec_enabled) { 
        if (!ap_can_exec(&r->finfo)) 
            return log_scripterror(r, conf, HTTP_FORBIDDEN, APLOG_NOERRNO, 
            return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, 
                                   "file permissions deny server execution"); 
    } 
*/
@@ -806,7 +795,7 @@ static int cgid_handler(request_rec *r)
    env = ap_create_environment(r->pool, r->subprocess_env); 

    if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
            return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, 0, 
            return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, errno, 
                                   "unable to create socket to cgi daemon");
    } 
    memset(&unix_addr, 0, sizeof(unix_addr));
@@ -814,7 +803,7 @@ static int cgid_handler(request_rec *r)
    strcpy(unix_addr.sun_path, conf->sockname);

    if (connect(sd, (struct sockaddr *)&unix_addr, sizeof(unix_addr)) < 0) {
            return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, 0, 
            return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, errno, 
                                   "unable to connect to cgi daemon");
    }