mod_cgi.c revision 404e2e1f8ad30c2d996f5fb6b3a9a4a4a14a004b
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering/* ====================================================================
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * The Apache Software License, Version 1.1
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * Copyright (c) 2000 The Apache Software Foundation. All rights
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * Redistribution and use in source and binary forms, with or without
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * modification, are permitted provided that the following conditions
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * 1. Redistributions of source code must retain the above copyright
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * notice, this list of conditions and the following disclaimer.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * 2. Redistributions in binary form must reproduce the above copyright
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * notice, this list of conditions and the following disclaimer in
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * the documentation and/or other materials provided with the
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * distribution.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * 3. The end-user documentation included with the redistribution,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * if any, must include the following acknowledgment:
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * "This product includes software developed by the
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * Apache Software Foundation (http://www.apache.org/)."
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * Alternately, this acknowledgment may appear in the software itself,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * if and wherever such third-party acknowledgments normally appear.
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * 4. The names "Apache" and "Apache Software Foundation" must
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * not be used to endorse or promote products derived from this
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * software without prior written permission. For written
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * permission, please contact apache@apache.org.
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering * 5. Products derived from this software may not be called "Apache",
3bbdc31df37a23b5134a115c01d15e7ff870b3ccLennart Poettering * nor may "Apache" appear in their name, without prior written
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * permission of the Apache Software Foundation.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
b2b796b8ab5565fbe60b544d2579e2bfca31bf6aLennart Poettering * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
91adc4db33f69606aabd332813a5d7d5751c859fLennart Poettering * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * SUCH DAMAGE.
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering * ====================================================================
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * This software consists of voluntary contributions made by many
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * individuals on behalf of the Apache Software Foundation. For more
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * information on the Apache Software Foundation, please see
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * Portions of this software are based upon public domain software
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * originally written at the National Center for Supercomputing Applications,
c3bc53e62459d7e566ffffeade41cd82bc6754f5Lennart Poettering * University of Illinois, Urbana-Champaign.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * http_script: keeps all script-related ramblings together.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * Compliant to CGI/1.1 spec
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * Adapted by rst from original NCSA code by Rob McCool
f52e61da047d7fc74e83f12dbbf87e0cbcc51c73Lennart Poettering * Apache adds some new env vars; REDIRECT_URL and REDIRECT_QUERY_STRING for
a5784c498598348354543b23b13ee8639a8b9e35Lennart Poettering * custom error responses, and DOCUMENT_ROOT because we found it useful.
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering * It also adds SERVER_ADMIN - useful for scripts to know who to mail when
105e151299dc1208855380be2b22d0db2d66ebc6Lennart Poettering/* KLUDGE --- for back-combatibility, we don't have to check ExecCGI
105e151299dc1208855380be2b22d0db2d66ebc6Lennart Poettering * in ScriptAliased directories, which means we need to know if this
105e151299dc1208855380be2b22d0db2d66ebc6Lennart Poettering * request came through ScriptAlias or not... so the Alias module
931851e8e492a4d2715e22dcde50a5e7ccef4b49Lennart Poettering * leaves a note for us.
105e151299dc1208855380be2b22d0db2d66ebc6Lennart Poetteringstatic int is_scriptaliased(request_rec *r)
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering const char *t = ap_table_get(r->notes, "alias-forced-type");
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering/* Configuration stuff */
d20b1667dbab8bccf69735523a0d5fc645e81b80Tom Gundersentypedef struct {
8300ba218e3cf5049496937be8bce10f22d09bbcTom Gundersenstatic void *create_cgi_config(ap_pool_t *p, server_rec *s)
be808ea083fa07271116b4519c3c27fd20c5f077Tom Gundersen (cgi_server_conf *) ap_pcalloc(p, sizeof(cgi_server_conf));
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poetteringstatic void *merge_cgi_config(ap_pool_t *p, void *basev, void *overridesv)
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering cgi_server_conf *base = (cgi_server_conf *) basev, *overrides = (cgi_server_conf *) overridesv;
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poettering return overrides->logname ? overrides : base;
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poetteringstatic const char *set_scriptlog(cmd_parms *cmd, void *dummy, char *arg)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (cgi_server_conf *) ap_get_module_config(s->module_config, &cgi_module);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic const char *set_scriptlog_length(cmd_parms *cmd, void *dummy, char *arg)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (cgi_server_conf *) ap_get_module_config(s->module_config, &cgi_module);
547973dea7abd6c124ff6c79fe2bbe322a7314aeLennart Poetteringstatic const char *set_scriptlog_buffer(cmd_parms *cmd, void *dummy, char *arg)
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering (cgi_server_conf *) ap_get_module_config(s->module_config, &cgi_module);
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering {"ScriptLog", set_scriptlog, NULL, RSRC_CONF, TAKE1,
ea12bcc78911fd3531955a799dbf6c5ac33bf567Daniel Mack "the name of a log for script debugging info"},
ea12bcc78911fd3531955a799dbf6c5ac33bf567Daniel Mack {"ScriptLogLength", set_scriptlog_length, NULL, RSRC_CONF, TAKE1,
ea12bcc78911fd3531955a799dbf6c5ac33bf567Daniel Mack "the maximum length (in bytes) of the script debug log"},
ea12bcc78911fd3531955a799dbf6c5ac33bf567Daniel Mack {"ScriptLogBuffer", set_scriptlog_buffer, NULL, RSRC_CONF, TAKE1,
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poettering "the maximum size (in bytes) to record of a POST request"},
ec2c5e4398f9d65e5dfe61530f2556224733d1e6Lennart Poetteringstatic int log_scripterror(request_rec *r, cgi_server_conf * conf, int ret,
return ret;
ap_close(f);
return ret;
#ifdef WIN32
return ret;
&& *dbuf) {
ap_close(f);
return ret;
char **env;
#ifdef DEBUG_CGI
#ifdef OS2
#ifdef DEBUG_CGI
ap_add_cgi_vars(r);
#ifdef DEBUG_CGI
for (i = 0; env[i]; ++i)
if (!iol)
return APR_EBADF;
if (!iol)
return APR_EBADF;
if (!iol)
return APR_EBADF;
return (rc);
++numwords;
ap_unescape_url(w);
return APR_SUCCESS;
#ifdef WIN32
*c = NULL;
r->filename);
return APR_EBADF;
return APR_SUCCESS;
char *command;
ap_pool_t *p;
return DECLINED;
argv0++;
char *newfile;
return retval;
return HTTP_INTERNAL_SERVER_ERROR;
return HTTP_INTERNAL_SERVER_ERROR;
return HTTP_INTERNAL_SERVER_ERROR;
if (ap_should_client_block(r)) {
dbpos = 0;
while ((len_read =
const char *location;
int ret;
#ifdef CHARSET_EBCDIC
ap_checkconv(r);
return OK;
return REDIRECT;
if (!r->header_only) {
{NULL}