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