Blame standalone/server.c

Packit Service 384592
/*
Packit Service 384592
* ModSecurity for Apache 2.x, http://www.modsecurity.org/
Packit Service 384592
* Copyright (c) 2004-2013 Trustwave Holdings, Inc. (http://www.trustwave.com/)
Packit Service 384592
*
Packit Service 384592
* You may not use this file except in compliance with
Packit Service 384592
* the License.  You may obtain a copy of the License at
Packit Service 384592
*
Packit Service 384592
*     http://www.apache.org/licenses/LICENSE-2.0
Packit Service 384592
*
Packit Service 384592
* If any of the files related to licensing are missing or if you have any
Packit Service 384592
* other questions related to licensing please contact Trustwave Holdings, Inc.
Packit Service 384592
* directly using the email address security@modsecurity.org.
Packit Service 384592
*/
Packit Service 384592
Packit Service 384592
#include <limits.h>
Packit Service 384592
Packit Service 384592
#include "http_core.h"
Packit Service 384592
#include "http_request.h"
Packit Service 384592
Packit Service 384592
#include "modsecurity.h"
Packit Service 384592
#include "apache2.h"
Packit Service 384592
#include "http_main.h"
Packit Service 384592
#include "http_connection.h"
Packit Service 384592
Packit Service 384592
#include "apr_optional.h"
Packit Service 384592
#include "mod_log_config.h"
Packit Service 384592
Packit Service 384592
#include "msc_logging.h"
Packit Service 384592
#include "msc_util.h"
Packit Service 384592
Packit Service 384592
#include "ap_mpm.h"
Packit Service 384592
#include "scoreboard.h"
Packit Service 384592
Packit Service 384592
#include "apr_version.h"
Packit Service 384592
Packit Service 384592
#include "apr_lib.h"
Packit Service 384592
#include "ap_config.h"
Packit Service 384592
#include "http_config.h"
Packit Service 384592
Packit Service 384592
#ifdef HAVE_UNISTD_H
Packit Service 384592
#include <unistd.h>
Packit Service 384592
#endif
Packit Service 384592
#ifdef HAVE_SYS_SEM_H
Packit Service 384592
#include <sys/sem.h>
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
//=========
Packit Service 384592
Packit Service 384592
/** The default path for CGI scripts if none is currently set */
Packit Service 384592
#ifndef DEFAULT_PATH
Packit Service 384592
#define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
//=========
Packit Service 384592
Packit Service 384592
AP_DECLARE_DATA scoreboard *ap_scoreboard_image = NULL;
Packit Service 384592
Packit Service 384592
AP_DECLARE_DATA apr_array_header_t *ap_server_config_defines = NULL;
Packit Service 384592
Packit Service 384592
AP_DECLARE_DATA const char *ap_server_root = "\\";
Packit Service 384592
Packit Service 384592
static int server_limit, thread_limit, lb_limit;
Packit Service 384592
static apr_size_t scoreboard_size;
Packit Service 384592
Packit Service 384592
void *modsecLogObj = NULL;
Packit Service 384592
void (*modsecLogHook)(void *obj, int level, char *str) = NULL;
Packit Service 384592
Packit Service 384592
//=========
Packit Service 384592
Packit Service 384592
static const char * const status_lines[RESPONSE_CODES] =
Packit Service 384592
{
Packit Service 384592
    "100 Continue",
Packit Service 384592
    "101 Switching Protocols",
Packit Service 384592
    "102 Processing",
Packit Service 384592
#define LEVEL_200  3
Packit Service 384592
    "200 OK",
Packit Service 384592
    "201 Created",
Packit Service 384592
    "202 Accepted",
Packit Service 384592
    "203 Non-Authoritative Information",
Packit Service 384592
    "204 No Content",
Packit Service 384592
    "205 Reset Content",
Packit Service 384592
    "206 Partial Content",
Packit Service 384592
    "207 Multi-Status",
Packit Service 384592
#define LEVEL_300 11
Packit Service 384592
    "300 Multiple Choices",
Packit Service 384592
    "301 Moved Permanently",
Packit Service 384592
    "302 Found",
Packit Service 384592
    "303 See Other",
Packit Service 384592
    "304 Not Modified",
Packit Service 384592
    "305 Use Proxy",
Packit Service 384592
    "306 unused",
Packit Service 384592
    "307 Temporary Redirect",
Packit Service 384592
#define LEVEL_400 19
Packit Service 384592
    "400 Bad Request",
Packit Service 384592
    "401 Authorization Required",
Packit Service 384592
    "402 Payment Required",
Packit Service 384592
    "403 Forbidden",
Packit Service 384592
    "404 Not Found",
Packit Service 384592
    "405 Method Not Allowed",
Packit Service 384592
    "406 Not Acceptable",
Packit Service 384592
    "407 Proxy Authentication Required",
Packit Service 384592
    "408 Request Time-out",
Packit Service 384592
    "409 Conflict",
Packit Service 384592
    "410 Gone",
Packit Service 384592
    "411 Length Required",
Packit Service 384592
    "412 Precondition Failed",
Packit Service 384592
    "413 Request Entity Too Large",
Packit Service 384592
    "414 Request-URI Too Large",
Packit Service 384592
    "415 Unsupported Media Type",
Packit Service 384592
    "416 Requested Range Not Satisfiable",
Packit Service 384592
    "417 Expectation Failed",
Packit Service 384592
    "418 unused",
Packit Service 384592
    "419 unused",
Packit Service 384592
    "420 unused",
Packit Service 384592
    "421 unused",
Packit Service 384592
    "422 Unprocessable Entity",
Packit Service 384592
    "423 Locked",
Packit Service 384592
    "424 Failed Dependency",
Packit Service 384592
    /* This is a hack, but it is required for ap_index_of_response
Packit Service 384592
     * to work with 426.
Packit Service 384592
     */
Packit Service 384592
    "425 No code",
Packit Service 384592
    "426 Upgrade Required",
Packit Service 384592
#define LEVEL_500 46
Packit Service 384592
    "500 Internal Server Error",
Packit Service 384592
    "501 Method Not Implemented",
Packit Service 384592
    "502 Bad Gateway",
Packit Service 384592
    "503 Service Temporarily Unavailable",
Packit Service 384592
    "504 Gateway Time-out",
Packit Service 384592
    "505 HTTP Version Not Supported",
Packit Service 384592
    "506 Variant Also Negotiates",
Packit Service 384592
    "507 Insufficient Storage",
Packit Service 384592
    "508 unused",
Packit Service 384592
    "509 unused",
Packit Service 384592
    "510 Not Extended"
Packit Service 384592
};
Packit Service 384592
Packit Service 384592
AP_DECLARE(int) ap_index_of_response(int status)
Packit Service 384592
{
Packit Service 384592
    static int shortcut[6] = {0, LEVEL_200, LEVEL_300, LEVEL_400,
Packit Service 384592
    LEVEL_500, RESPONSE_CODES};
Packit Service 384592
    int i, pos;
Packit Service 384592
Packit Service 384592
    if (status < 100) {               /* Below 100 is illegal for HTTP status */
Packit Service 384592
        return LEVEL_500;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    for (i = 0; i < 5; i++) {
Packit Service 384592
        status -= 100;
Packit Service 384592
        if (status < 100) {
Packit Service 384592
            pos = (status + shortcut[i]);
Packit Service 384592
            if (pos < shortcut[i + 1]) {
Packit Service 384592
                return pos;
Packit Service 384592
            }
Packit Service 384592
            else {
Packit Service 384592
                return LEVEL_500;            /* status unknown (falls in gap) */
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    return LEVEL_500;                         /* 600 or above is also illegal */
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
//=========
Packit Service 384592
Packit Service 384592
static char *http2env(apr_pool_t *a, const char *w)
Packit Service 384592
{
Packit Service 384592
    char *res = (char *)apr_palloc(a, sizeof("HTTP_") + strlen(w));
Packit Service 384592
    char *cp = res;
Packit Service 384592
    char c;
Packit Service 384592
Packit Service 384592
    *cp++ = 'H';
Packit Service 384592
    *cp++ = 'T';
Packit Service 384592
    *cp++ = 'T';
Packit Service 384592
    *cp++ = 'P';
Packit Service 384592
    *cp++ = '_';
Packit Service 384592
Packit Service 384592
    while ((c = *w++) != 0) {
Packit Service 384592
        if (!apr_isalnum(c)) {
Packit Service 384592
            *cp++ = '_';
Packit Service 384592
        }
Packit Service 384592
        else {
Packit Service 384592
            *cp++ = apr_toupper(c);
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    *cp = 0;
Packit Service 384592
Packit Service 384592
    return res;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max)
Packit Service 384592
{
Packit Service 384592
    return rand();
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc)
Packit Service 384592
{
Packit Service 384592
    int i, j;
Packit Service 384592
    char *x;
Packit Service 384592
Packit Service 384592
    /* first, count the number of extra characters */
Packit Service 384592
    for (i = 0, j = 0; s[i] != '\0'; i++)
Packit Service 384592
        if (s[i] == '<' || s[i] == '>')
Packit Service 384592
            j += 3;
Packit Service 384592
        else if (s[i] == '&')
Packit Service 384592
            j += 4;
Packit Service 384592
        else if (s[i] == '"')
Packit Service 384592
            j += 5;
Packit Service 384592
        else if (toasc && !apr_isascii(s[i]))
Packit Service 384592
            j += 5;
Packit Service 384592
Packit Service 384592
    if (j == 0)
Packit Service 384592
        return apr_pstrmemdup(p, s, i);
Packit Service 384592
Packit Service 384592
    x = apr_palloc(p, i + j + 1);
Packit Service 384592
    for (i = 0, j = 0; s[i] != '\0'; i++, j++)
Packit Service 384592
        if (s[i] == '<') {
Packit Service 384592
            memcpy(&x[j], "<", 4);
Packit Service 384592
            j += 3;
Packit Service 384592
        }
Packit Service 384592
        else if (s[i] == '>') {
Packit Service 384592
            memcpy(&x[j], ">", 4);
Packit Service 384592
            j += 3;
Packit Service 384592
        }
Packit Service 384592
        else if (s[i] == '&') {
Packit Service 384592
            memcpy(&x[j], "&", 5);
Packit Service 384592
            j += 4;
Packit Service 384592
        }
Packit Service 384592
        else if (s[i] == '"') {
Packit Service 384592
            memcpy(&x[j], """, 6);
Packit Service 384592
            j += 5;
Packit Service 384592
        }
Packit Service 384592
        else if (toasc && !apr_isascii(s[i])) {
Packit Service 384592
            char *esc = apr_psprintf(p, "&#%3.3d;", (unsigned char)s[i]);
Packit Service 384592
            memcpy(&x[j], esc, 6);
Packit Service 384592
            j += 5;
Packit Service 384592
        }
Packit Service 384592
        else
Packit Service 384592
            x[j] = s[i];
Packit Service 384592
Packit Service 384592
    x[j] = '\0';
Packit Service 384592
    return x;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s)
Packit Service 384592
{
Packit Service 384592
    return ap_escape_html2(p, s, 0);
Packit Service 384592
}
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r)
Packit Service 384592
{
Packit Service 384592
	return prefix;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */
Packit Service 384592
{
Packit Service 384592
	return "\\";
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r)
Packit Service 384592
{
Packit Service 384592
	return 80;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/////////////////////////////////////////////////////////////////////////////////////////////////////
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(void) ap_log_error(const char *file, int line, int level, 
Packit Service 384592
                             apr_status_t status, const server_rec *s, 
Packit Service 384592
                             const char *fmt, ...)
Packit Service 384592
//			    __attribute__((format(printf,6,7)))
Packit Service 384592
#else
Packit Service 384592
AP_DECLARE(void) ap_log_error_(const char *file, int line, int module_index,
Packit Service 384592
                               int level, apr_status_t status,
Packit Service 384592
                               const server_rec *s, const char *fmt, ...)
Packit Service 384592
//                              __attribute__((format(printf,7,8)))
Packit Service 384592
#endif
Packit Service 384592
{
Packit Service 384592
    va_list args;
Packit Service 384592
    char errstr[MAX_STRING_LEN];
Packit Service 384592
Packit Service 384592
    va_start(args, fmt);
Packit Service 384592
Packit Service 384592
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit Service 384592
Packit Service 384592
	va_end(args);
Packit Service 384592
Packit Service 384592
	if(modsecLogHook != NULL)
Packit Service 384592
		modsecLogHook(modsecLogObj, level, errstr);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level,
Packit Service 384592
                             apr_status_t status, const conn_rec *r,
Packit Service 384592
                             const char *fmt, ...)
Packit Service 384592
//			    __attribute__((format(printf,6,7)))
Packit Service 384592
#else
Packit Service 384592
AP_DECLARE(void) ap_log_cerror_(const char *file, int line, int module_index,
Packit Service 384592
                                int level, apr_status_t status,
Packit Service 384592
                                const conn_rec *c, const char *fmt, ...)
Packit Service 384592
//                              __attribute__((format(printf,7,8)))
Packit Service 384592
#endif
Packit Service 384592
{
Packit Service 384592
    va_list args;
Packit Service 384592
    char errstr[MAX_STRING_LEN];
Packit Service 384592
Packit Service 384592
    va_start(args, fmt);
Packit Service 384592
Packit Service 384592
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit Service 384592
Packit Service 384592
	va_end(args);
Packit Service 384592
Packit Service 384592
	if(modsecLogHook != NULL)
Packit Service 384592
		modsecLogHook(modsecLogObj, level, errstr);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level,
Packit Service 384592
                             apr_status_t status, const request_rec *r,
Packit Service 384592
                             const char *fmt, ...)
Packit Service 384592
//			    __attribute__((format(printf,6,7)))
Packit Service 384592
#else
Packit Service 384592
AP_DECLARE(void) ap_log_rerror_(const char *file, int line, int module_index,
Packit Service 384592
                               int level, apr_status_t status,
Packit Service 384592
                               const request_rec *r, const char *fmt, ...)
Packit Service 384592
//                              __attribute__((format(printf,7,8)))
Packit Service 384592
#endif
Packit Service 384592
{
Packit Service 384592
    va_list args;
Packit Service 384592
    char errstr[MAX_STRING_LEN];
Packit Service 384592
Packit Service 384592
    va_start(args, fmt);
Packit Service 384592
Packit Service 384592
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit Service 384592
Packit Service 384592
	va_end(args);
Packit Service 384592
Packit Service 384592
	if(modsecLogHook != NULL)
Packit Service 384592
		modsecLogHook(modsecLogObj, level, errstr);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, 
Packit Service 384592
                             apr_status_t status, apr_pool_t *p, 
Packit Service 384592
                             const char *fmt, ...)
Packit Service 384592
//			    __attribute__((format(printf,6,7)))
Packit Service 384592
#else
Packit Service 384592
AP_DECLARE(void) ap_log_perror_(const char *file, int line, int module_index,
Packit Service 384592
                                int level, apr_status_t status, apr_pool_t *p,
Packit Service 384592
                                const char *fmt, ...)
Packit Service 384592
#endif
Packit Service 384592
{
Packit Service 384592
    va_list args;
Packit Service 384592
    char errstr[MAX_STRING_LEN];
Packit Service 384592
Packit Service 384592
    va_start(args, fmt);
Packit Service 384592
Packit Service 384592
    apr_vsnprintf(errstr, MAX_STRING_LEN, fmt, args);
Packit Service 384592
Packit Service 384592
	va_end(args);
Packit Service 384592
Packit Service 384592
	if(modsecLogHook != NULL)
Packit Service 384592
		modsecLogHook(modsecLogObj, level, errstr);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(module *) ap_find_linked_module(const char *name)
Packit Service 384592
{
Packit Service 384592
	// only used for ACTION_PROXY to find mod_proxy.c; see mod_security2.c, perform_interception()
Packit Service 384592
	//
Packit Service 384592
	return NULL;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(const char *) ap_get_server_name(request_rec *r)
Packit Service 384592
{
Packit Service 384592
	return r->server->server_hostname;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component)
Packit Service 384592
{
Packit Service 384592
	// appends string to server description string
Packit Service 384592
	//
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(const char *) ap_get_status_line(int status)
Packit Service 384592
{
Packit Service 384592
    return status_lines[ap_index_of_response(status)];
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y)
Packit Service 384592
{
Packit Service 384592
    if (((x < 0) || (server_limit < x)) ||
Packit Service 384592
        ((y < 0) || (thread_limit < y))) {
Packit Service 384592
        return(NULL); /* Out of range */
Packit Service 384592
    }
Packit Service 384592
    return &ap_scoreboard_image->servers[x][y];
Packit Service 384592
}
Packit Service 384592
#else
Packit Service 384592
AP_DECLARE(worker_score *) ap_get_scoreboard_worker_from_indexes(int x, int y)
Packit Service 384592
{
Packit Service 384592
    if (((x < 0) || (x >= server_limit)) ||
Packit Service 384592
        ((y < 0) || (y >= thread_limit))) {
Packit Service 384592
        return(NULL); /* Out of range */
Packit Service 384592
    }
Packit Service 384592
    return &ap_scoreboard_image->servers[x][y];
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(worker_score *) ap_get_scoreboard_worker(ap_sb_handle_t *sbh)
Packit Service 384592
{
Packit Service 384592
    //if (!sbh)
Packit Service 384592
    //    return NULL;
Packit Service 384592
Packit Service 384592
    //return ap_get_scoreboard_worker_from_indexes(sbh->child_num,
Packit Service 384592
    //                                             sbh->thread_num);
Packit Service 384592
    return ap_get_scoreboard_worker_from_indexes(0, 0);
Packit Service 384592
}
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result)
Packit Service 384592
{
Packit Service 384592
    switch(query_code){
Packit Service 384592
        //case AP_MPMQ_MAX_DAEMON_USED:
Packit Service 384592
        //    *result = MAXIMUM_WAIT_OBJECTS;
Packit Service 384592
        //    return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_IS_THREADED:
Packit Service 384592
            *result = AP_MPMQ_STATIC;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_IS_FORKED:
Packit Service 384592
            *result = AP_MPMQ_NOT_SUPPORTED;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_HARD_LIMIT_DAEMONS:
Packit Service 384592
            *result = 1; //HARD_SERVER_LIMIT;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_HARD_LIMIT_THREADS:
Packit Service 384592
            *result = thread_limit;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        //case AP_MPMQ_MAX_THREADS:
Packit Service 384592
        //    *result = ap_threads_per_child;
Packit Service 384592
        //    return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_MIN_SPARE_DAEMONS:
Packit Service 384592
            *result = 0;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_MIN_SPARE_THREADS:
Packit Service 384592
            *result = 0;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_MAX_SPARE_DAEMONS:
Packit Service 384592
            *result = 0;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_MAX_SPARE_THREADS:
Packit Service 384592
            *result = 0;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        //case AP_MPMQ_MAX_REQUESTS_DAEMON:
Packit Service 384592
        //    *result = ap_max_requests_per_child;
Packit Service 384592
        //    return APR_SUCCESS;
Packit Service 384592
        case AP_MPMQ_MAX_DAEMONS:
Packit Service 384592
            *result = 0;
Packit Service 384592
            return APR_SUCCESS;
Packit Service 384592
        //case AP_MPMQ_MPM_STATE:
Packit Service 384592
        //    *result = winnt_mpm_state;
Packit Service 384592
        //    return APR_SUCCESS;
Packit Service 384592
    }
Packit Service 384592
    return APR_ENOTIMPL;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(const char *) ap_get_server_banner(void)
Packit Service 384592
{
Packit Service 384592
	return "ModSecurity Standalone";
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* Code from Harald Hanche-Olsen <hanche@imf.unit.no> */
Packit Service 384592
static APR_INLINE void do_double_reverse (conn_rec *conn)
Packit Service 384592
{
Packit Service 384592
    apr_sockaddr_t *sa;
Packit Service 384592
    apr_status_t rv;
Packit Service 384592
Packit Service 384592
    if (conn->double_reverse) {
Packit Service 384592
        /* already done */
Packit Service 384592
        return;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (conn->remote_host == NULL || conn->remote_host[0] == '\0') {
Packit Service 384592
        /* single reverse failed, so don't bother */
Packit Service 384592
        conn->double_reverse = -1;
Packit Service 384592
        return;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    rv = apr_sockaddr_info_get(&sa, conn->remote_host, APR_UNSPEC, 0, 0, conn->pool);
Packit Service 384592
    if (rv == APR_SUCCESS) {
Packit Service 384592
        while (sa) {
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
            if (apr_sockaddr_equal(sa, conn->remote_addr)) {
Packit Service 384592
#else
Packit Service 384592
	    if (apr_sockaddr_equal(sa, conn->client_addr)) {
Packit Service 384592
#endif
Packit Service 384592
                conn->double_reverse = 1;
Packit Service 384592
                return;
Packit Service 384592
            }
Packit Service 384592
Packit Service 384592
            sa = sa->next;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    conn->double_reverse = -1;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#ifndef HOSTNAME_LOOKUP_OFF
Packit Service 384592
#define HOSTNAME_LOOKUP_OFF	0
Packit Service 384592
#define HOSTNAME_LOOKUP_ON	1
Packit Service 384592
#define HOSTNAME_LOOKUP_DOUBLE	2
Packit Service 384592
#define HOSTNAME_LOOKUP_UNSET	3
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
AP_DECLARE(void) ap_str_tolower(char *str)
Packit Service 384592
{
Packit Service 384592
    while (*str) {
Packit Service 384592
        *str = apr_tolower(*str);
Packit Service 384592
        ++str;
Packit Service 384592
    }
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip)
Packit Service 384592
{
Packit Service 384592
    int hostname_lookups = HOSTNAME_LOOKUP_OFF;
Packit Service 384592
    int ignored_str_is_ip;
Packit Service 384592
Packit Service 384592
    if (!str_is_ip) { /* caller doesn't want to know */
Packit Service 384592
        str_is_ip = &ignored_str_is_ip;
Packit Service 384592
    }
Packit Service 384592
    *str_is_ip = 0;
Packit Service 384592
Packit Service 384592
    /* If we haven't checked the host name, and we want to */
Packit Service 384592
    //if (dir_config) {
Packit Service 384592
    //    hostname_lookups =
Packit Service 384592
    //        ((core_dir_config *)ap_get_module_config(dir_config, &core_module))
Packit Service 384592
    //        ->hostname_lookups;
Packit Service 384592
Packit Service 384592
    //    if (hostname_lookups == HOSTNAME_LOOKUP_UNSET) {
Packit Service 384592
    //        hostname_lookups = HOSTNAME_LOOKUP_OFF;
Packit Service 384592
    //    }
Packit Service 384592
    //}
Packit Service 384592
Packit Service 384592
    if (type != REMOTE_NOLOOKUP
Packit Service 384592
        && conn->remote_host == NULL
Packit Service 384592
        && (type == REMOTE_DOUBLE_REV
Packit Service 384592
        || hostname_lookups != HOSTNAME_LOOKUP_OFF)) {
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
        if (apr_getnameinfo(&conn->remote_host, conn->remote_addr, 0)
Packit Service 384592
            == APR_SUCCESS) {
Packit Service 384592
#else
Packit Service 384592
        if (apr_getnameinfo(&conn->remote_host, conn->client_addr, 0)
Packit Service 384592
            == APR_SUCCESS) {
Packit Service 384592
#endif
Packit Service 384592
            ap_str_tolower(conn->remote_host);
Packit Service 384592
Packit Service 384592
            if (hostname_lookups == HOSTNAME_LOOKUP_DOUBLE) {
Packit Service 384592
                do_double_reverse(conn);
Packit Service 384592
                if (conn->double_reverse != 1) {
Packit Service 384592
                    conn->remote_host = NULL;
Packit Service 384592
                }
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        /* if failed, set it to the NULL string to indicate error */
Packit Service 384592
        if (conn->remote_host == NULL) {
Packit Service 384592
            conn->remote_host = "";
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (type == REMOTE_DOUBLE_REV) {
Packit Service 384592
        do_double_reverse(conn);
Packit Service 384592
        if (conn->double_reverse == -1) {
Packit Service 384592
            return NULL;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    /*
Packit Service 384592
     * Return the desired information; either the remote DNS name, if found,
Packit Service 384592
     * or either NULL (if the hostname was requested) or the IP address
Packit Service 384592
     * (if any identifier was requested).
Packit Service 384592
     */
Packit Service 384592
    if (conn->remote_host != NULL && conn->remote_host[0] != '\0') {
Packit Service 384592
        return conn->remote_host;
Packit Service 384592
    }
Packit Service 384592
    else {
Packit Service 384592
        if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) {
Packit Service 384592
            return NULL;
Packit Service 384592
        }
Packit Service 384592
        else {
Packit Service 384592
            *str_is_ip = 1;
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
            return conn->remote_ip;
Packit Service 384592
#else
Packit Service 384592
	    return conn->client_ip;
Packit Service 384592
#endif
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *file)
Packit Service 384592
{
Packit Service 384592
    char *newpath = NULL;
Packit Service 384592
    apr_status_t rv;
Packit Service 384592
    rv = apr_filepath_merge(&newpath, ap_server_root, file,
Packit Service 384592
                            APR_FILEPATH_TRUENAME, p);
Packit Service 384592
    if (newpath && (rv == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rv)
Packit Service 384592
                                      || APR_STATUS_IS_ENOENT(rv)
Packit Service 384592
                                      || APR_STATUS_IS_ENOTDIR(rv))) {
Packit Service 384592
        return newpath;
Packit Service 384592
    }
Packit Service 384592
    else {
Packit Service 384592
        return NULL;
Packit Service 384592
    }
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program)
Packit Service 384592
{
Packit Service 384592
	return NULL;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 3
Packit Service 384592
AP_DECLARE(apr_file_t *) ap_piped_log_write_fd(piped_log *pl)
Packit Service 384592
{
Packit Service 384592
 return NULL;
Packit Service 384592
}
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t)
Packit Service 384592
{
Packit Service 384592
    const apr_array_header_t *env_arr = apr_table_elts(t);
Packit Service 384592
    const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts;
Packit Service 384592
    char **env = (char **) apr_palloc(p, (env_arr->nelts + 2) * sizeof(char *));
Packit Service 384592
    int i, j;
Packit Service 384592
    char *tz;
Packit Service 384592
    char *whack;
Packit Service 384592
Packit Service 384592
    j = 0;
Packit Service 384592
    if (!apr_table_get(t, "TZ")) {
Packit Service 384592
        tz = getenv("TZ");
Packit Service 384592
        if (tz != NULL) {
Packit Service 384592
            env[j++] = apr_pstrcat(p, "TZ=", tz, NULL);
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    for (i = 0; i < env_arr->nelts; ++i) {
Packit Service 384592
        if (!elts[i].key) {
Packit Service 384592
            continue;
Packit Service 384592
        }
Packit Service 384592
        env[j] = apr_pstrcat(p, elts[i].key, "=", elts[i].val, NULL);
Packit Service 384592
        whack = env[j];
Packit Service 384592
        if (apr_isdigit(*whack)) {
Packit Service 384592
            *whack++ = '_';
Packit Service 384592
        }
Packit Service 384592
        while (*whack != '=') {
Packit Service 384592
            if (!apr_isalnum(*whack) && *whack != '_') {
Packit Service 384592
                *whack = '_';
Packit Service 384592
            }
Packit Service 384592
            ++whack;
Packit Service 384592
        }
Packit Service 384592
        ++j;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    env[j] = NULL;
Packit Service 384592
    return env;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* This "cute" little function comes about because the path info on
Packit Service 384592
 * filenames and URLs aren't always the same. So we take the two,
Packit Service 384592
 * and find as much of the two that match as possible.
Packit Service 384592
 */
Packit Service 384592
Packit Service 384592
AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info)
Packit Service 384592
{
Packit Service 384592
    int lu = strlen(uri);
Packit Service 384592
    int lp = strlen(path_info);
Packit Service 384592
Packit Service 384592
    while (lu-- && lp-- && uri[lu] == path_info[lp]) {
Packit Service 384592
        if (path_info[lp] == '/') {
Packit Service 384592
            while (lu && uri[lu-1] == '/') lu--;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (lu == -1) {
Packit Service 384592
        lu = 0;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    while (uri[lu] != '\0' && uri[lu] != '/') {
Packit Service 384592
        lu++;
Packit Service 384592
    }
Packit Service 384592
    return lu;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* Obtain the Request-URI from the original request-line, returning
Packit Service 384592
 * a new string from the request pool containing the URI or "".
Packit Service 384592
 */
Packit Service 384592
static char *original_uri(request_rec *r)
Packit Service 384592
{
Packit Service 384592
    char *first, *last;
Packit Service 384592
Packit Service 384592
    if (r->the_request == NULL) {
Packit Service 384592
        return (char *) apr_pcalloc(r->pool, 1);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    first = r->the_request;     /* use the request-line */
Packit Service 384592
Packit Service 384592
    while (*first && !apr_isspace(*first)) {
Packit Service 384592
        ++first;                /* skip over the method */
Packit Service 384592
    }
Packit Service 384592
    while (apr_isspace(*first)) {
Packit Service 384592
        ++first;                /*   and the space(s)   */
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    last = first;
Packit Service 384592
    while (*last && !apr_isspace(*last)) {
Packit Service 384592
        ++last;                 /* end at next whitespace */
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    return apr_pstrmemdup(r->pool, first, last - first);
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(void) ap_add_cgi_vars(request_rec *r)
Packit Service 384592
{
Packit Service 384592
    apr_table_t *e = r->subprocess_env;
Packit Service 384592
Packit Service 384592
    apr_table_setn(e, "GATEWAY_INTERFACE", "CGI/1.1");
Packit Service 384592
    apr_table_setn(e, "SERVER_PROTOCOL", r->protocol);
Packit Service 384592
    apr_table_setn(e, "REQUEST_METHOD", r->method);
Packit Service 384592
    apr_table_setn(e, "QUERY_STRING", r->args ? r->args : "");
Packit Service 384592
    apr_table_setn(e, "REQUEST_URI", original_uri(r));
Packit Service 384592
Packit Service 384592
    /* Note that the code below special-cases scripts run from includes,
Packit Service 384592
     * because it "knows" that the sub_request has been hacked to have the
Packit Service 384592
     * args and path_info of the original request, and not any that may have
Packit Service 384592
     * come with the script URI in the include command.  Ugh.
Packit Service 384592
     */
Packit Service 384592
Packit Service 384592
    if (!strcmp(r->protocol, "INCLUDED")) {
Packit Service 384592
        apr_table_setn(e, "SCRIPT_NAME", r->uri);
Packit Service 384592
        if (r->path_info && *r->path_info) {
Packit Service 384592
            apr_table_setn(e, "PATH_INFO", r->path_info);
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    else if (!r->path_info || !*r->path_info) {
Packit Service 384592
        apr_table_setn(e, "SCRIPT_NAME", r->uri);
Packit Service 384592
    }
Packit Service 384592
    else {
Packit Service 384592
        int path_info_start = ap_find_path_info(r->uri, r->path_info);
Packit Service 384592
Packit Service 384592
        apr_table_setn(e, "SCRIPT_NAME",
Packit Service 384592
                      apr_pstrndup(r->pool, r->uri, path_info_start));
Packit Service 384592
Packit Service 384592
        apr_table_setn(e, "PATH_INFO", r->path_info);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    //if (r->path_info && r->path_info[0]) {
Packit Service 384592
        /*
Packit Service 384592
         * To get PATH_TRANSLATED, treat PATH_INFO as a URI path.
Packit Service 384592
         * Need to re-escape it for this, since the entire URI was
Packit Service 384592
         * un-escaped before we determined where the PATH_INFO began.
Packit Service 384592
         */
Packit Service 384592
    //    request_rec *pa_req;
Packit Service 384592
Packit Service 384592
    //    pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), r,
Packit Service 384592
    //                                   NULL);
Packit Service 384592
Packit Service 384592
    //    if (pa_req->filename) {
Packit Service 384592
    //        char *pt = apr_pstrcat(r->pool, pa_req->filename, pa_req->path_info,
Packit Service 384592
    //                              NULL);
Packit Service 384592
//#ifdef WIN32
Packit Service 384592
    //        /* We need to make this a real Windows path name */
Packit Service 384592
    //        apr_filepath_merge(&pt, "", pt, APR_FILEPATH_NATIVE, r->pool);
Packit Service 384592
//#endif
Packit Service 384592
    //        apr_table_setn(e, "PATH_TRANSLATED", pt);
Packit Service 384592
    //    }
Packit Service 384592
    //    ap_destroy_sub_req(pa_req);
Packit Service 384592
    //}
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(void) ap_add_common_vars(request_rec *r)
Packit Service 384592
{
Packit Service 384592
    apr_table_t *e;
Packit Service 384592
    server_rec *s = r->server;
Packit Service 384592
    conn_rec *c = r->connection;
Packit Service 384592
    //const char *rem_logname;
Packit Service 384592
    char *env_path;
Packit Service 384592
#if defined(WIN32) || defined(OS2) || defined(BEOS)
Packit Service 384592
    char *env_temp;
Packit Service 384592
#endif
Packit Service 384592
    const char *host;
Packit Service 384592
    const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in);
Packit Service 384592
    const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts;
Packit Service 384592
    int i;
Packit Service 384592
    apr_port_t rport;
Packit Service 384592
Packit Service 384592
    /* use a temporary apr_table_t which we'll overlap onto
Packit Service 384592
     * r->subprocess_env later
Packit Service 384592
     * (exception: if r->subprocess_env is empty at the start,
Packit Service 384592
     * write directly into it)
Packit Service 384592
     */
Packit Service 384592
    if (apr_is_empty_table(r->subprocess_env)) {
Packit Service 384592
        e = r->subprocess_env;
Packit Service 384592
    }
Packit Service 384592
    else {
Packit Service 384592
        e = apr_table_make(r->pool, 25 + hdrs_arr->nelts);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    /* First, add environment vars from headers... this is as per
Packit Service 384592
     * CGI specs, though other sorts of scripting interfaces see
Packit Service 384592
     * the same vars...
Packit Service 384592
     */
Packit Service 384592
Packit Service 384592
    for (i = 0; i < hdrs_arr->nelts; ++i) {
Packit Service 384592
        if (!hdrs[i].key) {
Packit Service 384592
            continue;
Packit Service 384592
        }
Packit Service 384592
Packit Service 384592
        /* A few headers are special cased --- Authorization to prevent
Packit Service 384592
         * rogue scripts from capturing passwords; content-type and -length
Packit Service 384592
         * for no particular reason.
Packit Service 384592
         */
Packit Service 384592
Packit Service 384592
        if (!strcasecmp(hdrs[i].key, "Content-type")) {
Packit Service 384592
            apr_table_addn(e, "CONTENT_TYPE", hdrs[i].val);
Packit Service 384592
        }
Packit Service 384592
        else if (!strcasecmp(hdrs[i].key, "Content-length")) {
Packit Service 384592
            apr_table_addn(e, "CONTENT_LENGTH", hdrs[i].val);
Packit Service 384592
        }
Packit Service 384592
        /*
Packit Service 384592
         * You really don't want to disable this check, since it leaves you
Packit Service 384592
         * wide open to CGIs stealing passwords and people viewing them
Packit Service 384592
         * in the environment with "ps -e".  But, if you must...
Packit Service 384592
         */
Packit Service 384592
#ifndef SECURITY_HOLE_PASS_AUTHORIZATION
Packit Service 384592
        else if (!strcasecmp(hdrs[i].key, "Authorization")
Packit Service 384592
                 || !strcasecmp(hdrs[i].key, "Proxy-Authorization")) {
Packit Service 384592
            continue;
Packit Service 384592
        }
Packit Service 384592
#endif
Packit Service 384592
        else {
Packit Service 384592
            apr_table_addn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val);
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (!(env_path = getenv("PATH"))) {
Packit Service 384592
        env_path = DEFAULT_PATH;
Packit Service 384592
    }
Packit Service 384592
    apr_table_addn(e, "PATH", apr_pstrdup(r->pool, env_path));
Packit Service 384592
Packit Service 384592
#ifdef WIN32
Packit Service 384592
    if ((env_temp = getenv("SystemRoot")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "SystemRoot", env_temp);
Packit Service 384592
    }
Packit Service 384592
    if ((env_temp = getenv("COMSPEC")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "COMSPEC", env_temp);
Packit Service 384592
    }
Packit Service 384592
    if ((env_temp = getenv("PATHEXT")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "PATHEXT", env_temp);
Packit Service 384592
    }
Packit Service 384592
    if ((env_temp = getenv("WINDIR")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "WINDIR", env_temp);
Packit Service 384592
    }
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
#ifdef OS2
Packit Service 384592
    if ((env_temp = getenv("COMSPEC")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "COMSPEC", env_temp);
Packit Service 384592
    }
Packit Service 384592
    if ((env_temp = getenv("ETC")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "ETC", env_temp);
Packit Service 384592
    }
Packit Service 384592
    if ((env_temp = getenv("DPATH")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "DPATH", env_temp);
Packit Service 384592
    }
Packit Service 384592
    if ((env_temp = getenv("PERLLIB_PREFIX")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "PERLLIB_PREFIX", env_temp);
Packit Service 384592
    }
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
#ifdef BEOS
Packit Service 384592
    if ((env_temp = getenv("LIBRARY_PATH")) != NULL) {
Packit Service 384592
        apr_table_addn(e, "LIBRARY_PATH", env_temp);
Packit Service 384592
    }
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
    apr_table_addn(e, "SERVER_SIGNATURE", ap_psignature("", r));
Packit Service 384592
    apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_banner());
Packit Service 384592
    apr_table_addn(e, "SERVER_NAME",
Packit Service 384592
                   ap_escape_html(r->pool, ap_get_server_name(r)));
Packit Service 384592
    apr_table_addn(e, "SERVER_ADDR", r->connection->local_ip);  /* Apache */
Packit Service 384592
    apr_table_addn(e, "SERVER_PORT",
Packit Service 384592
                  apr_psprintf(r->pool, "%u", ap_get_server_port(r)));
Packit Service 384592
    host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST, NULL);
Packit Service 384592
    if (host) {
Packit Service 384592
        apr_table_addn(e, "REMOTE_HOST", host);
Packit Service 384592
    }
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
    apr_table_addn(e, "REMOTE_ADDR", c->remote_ip);
Packit Service 384592
#else
Packit Service 384592
    apr_table_addn(e, "REMOTE_ADDR", c->client_ip);
Packit Service 384592
#endif
Packit Service 384592
    apr_table_addn(e, "DOCUMENT_ROOT", ap_document_root(r));    /* Apache */
Packit Service 384592
    apr_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */
Packit Service 384592
    apr_table_addn(e, "SCRIPT_FILENAME", r->filename);  /* Apache */
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
    rport = c->remote_addr->port;
Packit Service 384592
#else
Packit Service 384592
    rport = c->client_addr->port;
Packit Service 384592
#endif
Packit Service 384592
    apr_table_addn(e, "REMOTE_PORT", apr_itoa(r->pool, rport));
Packit Service 384592
Packit Service 384592
    if (r->user) {
Packit Service 384592
        apr_table_addn(e, "REMOTE_USER", r->user);
Packit Service 384592
    }
Packit Service 384592
    else if (r->prev) {
Packit Service 384592
        request_rec *back = r->prev;
Packit Service 384592
Packit Service 384592
        while (back) {
Packit Service 384592
            if (back->user) {
Packit Service 384592
                apr_table_addn(e, "REDIRECT_REMOTE_USER", back->user);
Packit Service 384592
                break;
Packit Service 384592
            }
Packit Service 384592
            back = back->prev;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    if (r->ap_auth_type) {
Packit Service 384592
        apr_table_addn(e, "AUTH_TYPE", r->ap_auth_type);
Packit Service 384592
    }
Packit Service 384592
    //rem_logname = ap_get_remote_logname(r);
Packit Service 384592
    //if (rem_logname) {
Packit Service 384592
    //    apr_table_addn(e, "REMOTE_IDENT", apr_pstrdup(r->pool, rem_logname));
Packit Service 384592
    //}
Packit Service 384592
Packit Service 384592
    /* Apache custom error responses. If we have redirected set two new vars */
Packit Service 384592
Packit Service 384592
    if (r->prev) {
Packit Service 384592
        if (r->prev->args) {
Packit Service 384592
            apr_table_addn(e, "REDIRECT_QUERY_STRING", r->prev->args);
Packit Service 384592
        }
Packit Service 384592
        if (r->prev->uri) {
Packit Service 384592
            apr_table_addn(e, "REDIRECT_URL", r->prev->uri);
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (e != r->subprocess_env) {
Packit Service 384592
      apr_table_overlap(r->subprocess_env, e, APR_OVERLAP_TABLES_SET);
Packit Service 384592
    }
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#ifndef WIN32
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
unixd_config_rec unixd_config;
Packit Service 384592
#else
Packit Service 384592
unixd_config_rec ap_unixd_config;
Packit Service 384592
#endif
Packit Service 384592
const char *ap_server_argv0 = "nginx";
Packit Service 384592
Packit Service 384592
#ifdef HAVE_GETPWNAM
Packit Service 384592
AP_DECLARE(uid_t) ap_uname2id(const char *name)
Packit Service 384592
{
Packit Service 384592
    struct passwd *ent;
Packit Service 384592
Packit Service 384592
    if (name[0] == '#')
Packit Service 384592
        return (atoi(&name[1]));
Packit Service 384592
Packit Service 384592
    if (!(ent = getpwnam(name))) {
Packit Service 384592
        ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
Packit Service 384592
                     "%s: bad user name %s", ap_server_argv0, name);
Packit Service 384592
        exit(1);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    return (ent->pw_uid);
Packit Service 384592
}
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
#ifdef HAVE_GETGRNAM
Packit Service 384592
AP_DECLARE(gid_t) ap_gname2id(const char *name)
Packit Service 384592
{
Packit Service 384592
    struct group *ent;
Packit Service 384592
Packit Service 384592
    if (name[0] == '#')
Packit Service 384592
        return (atoi(&name[1]));
Packit Service 384592
Packit Service 384592
    if (!(ent = getgrnam(name))) {
Packit Service 384592
        ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL,
Packit Service 384592
                     "%s: bad group name %s", ap_server_argv0, name);
Packit Service 384592
        exit(1);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    return (ent->gr_gid);
Packit Service 384592
}
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
AP_DECLARE(void) unixd_pre_config(apr_pool_t *ptemp)
Packit Service 384592
{
Packit Service 384592
    apr_finfo_t wrapper;
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
    unixd_config.user_name = DEFAULT_USER;
Packit Service 384592
    unixd_config.user_id = ap_uname2id(DEFAULT_USER);
Packit Service 384592
    unixd_config.group_id = ap_gname2id(DEFAULT_GROUP);
Packit Service 384592
    unixd_config.suexec_enabled = 0;
Packit Service 384592
#else
Packit Service 384592
    ap_unixd_config.user_name = DEFAULT_USER;
Packit Service 384592
    ap_unixd_config.user_id = ap_uname2id(DEFAULT_USER);
Packit Service 384592
    ap_unixd_config.group_id = ap_gname2id(DEFAULT_GROUP);
Packit Service 384592
    ap_unixd_config.suexec_enabled = 0;
Packit Service 384592
#endif
Packit Service 384592
Packit Service 384592
/*    if ((apr_stat(&wrapper, SUEXEC_BIN,
Packit Service 384592
                  APR_FINFO_NORM, ptemp)) != APR_SUCCESS) {
Packit Service 384592
        return;
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if ((wrapper.protection & APR_USETID) && wrapper.user == 0) {
Packit Service 384592
        unixd_config.suexec_enabled = 1;
Packit Service 384592
    }*/
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
/* XXX move to APR and externalize (but implement differently :) ) */
Packit Service 384592
static apr_lockmech_e proc_mutex_mech(apr_proc_mutex_t *pmutex)
Packit Service 384592
{
Packit Service 384592
    const char *mechname = apr_proc_mutex_name(pmutex);
Packit Service 384592
Packit Service 384592
    if (!strcmp(mechname, "sysvsem")) {
Packit Service 384592
        return APR_LOCK_SYSVSEM;
Packit Service 384592
    }
Packit Service 384592
    else if (!strcmp(mechname, "flock")) {
Packit Service 384592
        return APR_LOCK_FLOCK;
Packit Service 384592
    }
Packit Service 384592
    return APR_LOCK_DEFAULT;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER < 3
Packit Service 384592
AP_DECLARE(apr_status_t) unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex)
Packit Service 384592
{
Packit Service 384592
////////////////
Packit Service 384592
    if (unixd_config.user_name == NULL)
Packit Service 384592
    {
Packit Service 384592
        unixd_pre_config(NULL);
Packit Service 384592
    }
Packit Service 384592
////////////////
Packit Service 384592
    if (!geteuid()) {
Packit Service 384592
        apr_lockmech_e mech = proc_mutex_mech(pmutex);
Packit Service 384592
Packit Service 384592
        switch(mech) {
Packit Service 384592
#if APR_HAS_SYSVSEM_SERIALIZE
Packit Service 384592
        case APR_LOCK_SYSVSEM:
Packit Service 384592
        {
Packit Service 384592
            apr_os_proc_mutex_t ospmutex;
Packit Service 384592
#if !APR_HAVE_UNION_SEMUN
Packit Service 384592
            union semun {
Packit Service 384592
                long val;
Packit Service 384592
                struct semid_ds *buf;
Packit Service 384592
                unsigned short *array;
Packit Service 384592
            };
Packit Service 384592
#endif
Packit Service 384592
            union semun ick;
Packit Service 384592
            struct semid_ds buf;
Packit Service 384592
            memset(&buf,0,sizeof(buf));
Packit Service 384592
Packit Service 384592
            apr_os_proc_mutex_get(&ospmutex, pmutex);
Packit Service 384592
            buf.sem_perm.uid = unixd_config.user_id;
Packit Service 384592
            buf.sem_perm.gid = unixd_config.group_id;
Packit Service 384592
            buf.sem_perm.mode = 0600;
Packit Service 384592
            ick.buf = &buf;
Packit Service 384592
            if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) {
Packit Service 384592
                return errno;
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
        break;
Packit Service 384592
#endif
Packit Service 384592
#if APR_HAS_FLOCK_SERIALIZE
Packit Service 384592
        case APR_LOCK_FLOCK:
Packit Service 384592
        {
Packit Service 384592
            const char *lockfile = apr_proc_mutex_lockfile(pmutex);
Packit Service 384592
Packit Service 384592
            if (lockfile) {
Packit Service 384592
                if (chown(lockfile, unixd_config.user_id,
Packit Service 384592
                          -1 /* no gid change */) < 0) {
Packit Service 384592
                    return errno;
Packit Service 384592
                }
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
        break;
Packit Service 384592
#endif
Packit Service 384592
        default:
Packit Service 384592
            /* do nothing */
Packit Service 384592
            break;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    return APR_SUCCESS;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(apr_status_t) unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex)
Packit Service 384592
{
Packit Service 384592
#if !APR_PROC_MUTEX_IS_GLOBAL
Packit Service 384592
    apr_os_global_mutex_t osgmutex;
Packit Service 384592
    apr_os_global_mutex_get(&osgmutex, gmutex);
Packit Service 384592
    return unixd_set_proc_mutex_perms(osgmutex.proc_mutex);
Packit Service 384592
#else  /* APR_PROC_MUTEX_IS_GLOBAL */
Packit Service 384592
    /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */
Packit Service 384592
    return unixd_set_proc_mutex_perms(gmutex);
Packit Service 384592
#endif /* APR_PROC_MUTEX_IS_GLOBAL */
Packit Service 384592
}
Packit Service 384592
#else
Packit Service 384592
AP_DECLARE(apr_status_t) ap_unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex)
Packit Service 384592
{
Packit Service 384592
    if (ap_unixd_config.user_name == NULL)
Packit Service 384592
    {
Packit Service 384592
        unixd_pre_config(NULL);
Packit Service 384592
    }
Packit Service 384592
Packit Service 384592
    if (!geteuid()) {
Packit Service 384592
        apr_lockmech_e mech = proc_mutex_mech(pmutex);
Packit Service 384592
Packit Service 384592
        switch(mech) {
Packit Service 384592
#if APR_HAS_SYSVSEM_SERIALIZE
Packit Service 384592
        case APR_LOCK_SYSVSEM:
Packit Service 384592
        {
Packit Service 384592
            apr_os_proc_mutex_t ospmutex;
Packit Service 384592
#if !APR_HAVE_UNION_SEMUN
Packit Service 384592
            union semun {
Packit Service 384592
                long val;
Packit Service 384592
                struct semid_ds *buf;
Packit Service 384592
                unsigned short *array;
Packit Service 384592
            };
Packit Service 384592
#endif
Packit Service 384592
            union semun ick;
Packit Service 384592
            struct semid_ds buf;
Packit Service 384592
Packit Service 384592
            apr_os_proc_mutex_get(&ospmutex, pmutex);
Packit Service 384592
            buf.sem_perm.uid = ap_unixd_config.user_id;
Packit Service 384592
            buf.sem_perm.gid = ap_unixd_config.group_id;
Packit Service 384592
            buf.sem_perm.mode = 0600;
Packit Service 384592
            ick.buf = &buf;
Packit Service 384592
            if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) {
Packit Service 384592
                return errno;
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
        break;
Packit Service 384592
#endif
Packit Service 384592
#if APR_HAS_FLOCK_SERIALIZE
Packit Service 384592
        case APR_LOCK_FLOCK:
Packit Service 384592
        {
Packit Service 384592
            const char *lockfile = apr_proc_mutex_lockfile(pmutex);
Packit Service 384592
Packit Service 384592
            if (lockfile) {
Packit Service 384592
                if (chown(lockfile, ap_unixd_config.user_id,
Packit Service 384592
                          -1 /* no gid change */) < 0) {
Packit Service 384592
                    return errno;
Packit Service 384592
                }
Packit Service 384592
            }
Packit Service 384592
        }
Packit Service 384592
        break;
Packit Service 384592
#endif
Packit Service 384592
        default:
Packit Service 384592
            /* do nothing */
Packit Service 384592
            break;
Packit Service 384592
        }
Packit Service 384592
    }
Packit Service 384592
    return APR_SUCCESS;
Packit Service 384592
}
Packit Service 384592
Packit Service 384592
AP_DECLARE(apr_status_t) ap_unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex)
Packit Service 384592
{
Packit Service 384592
#if !APR_PROC_MUTEX_IS_GLOBAL
Packit Service 384592
    apr_os_global_mutex_t osgmutex;
Packit Service 384592
    apr_os_global_mutex_get(&osgmutex, gmutex);
Packit Service 384592
    return ap_unixd_set_proc_mutex_perms(osgmutex.proc_mutex);
Packit Service 384592
#else  /* APR_PROC_MUTEX_IS_GLOBAL */
Packit Service 384592
    /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */
Packit Service 384592
    return ap_unixd_set_proc_mutex_perms(gmutex);
Packit Service 384592
#endif /* APR_PROC_MUTEX_IS_GLOBAL */
Packit Service 384592
}
Packit Service 384592
#endif
Packit Service 384592
#endif