diff options
author | Joe Orton <jorton@apache.org> | 2008-12-12 21:20:40 +0100 |
---|---|---|
committer | Joe Orton <jorton@apache.org> | 2008-12-12 21:20:40 +0100 |
commit | b06785833f78974a93c6cdbce7a5ea5e02d6c939 (patch) | |
tree | f6129e9503c7a5176416912d4698a50bd6e34f06 /modules | |
parent | silence compiler warning (diff) | |
download | apache2-b06785833f78974a93c6cdbce7a5ea5e02d6c939.tar.xz apache2-b06785833f78974a93c6cdbce7a5ea5e02d6c939.zip |
mod_ssl: Make the size of the per-dir-reneg request-body buffer
configurable, by popular demand:
* modules/ssl/ssl_private.h: Define DEFAULT_RENEG_BUFFER_SIZE.
(SSLDirConfigRec): Add nRenegBufferSize field.
* modules/ssl/ssl_engine_config.c (ssl_cmd_SSLRenegBufferSize): New
function.
(ssl_config_perdir_create, ssl_config_perdir_merge): Handle
nRenegBufferSize.
* modules/ssl/ssl_engine_io.c (ssl_io_buffer_fill): Take max buffer
size as an argument rather than compile-time constant.
* modules/ssl/ssl_engine_kernel.c (ssl_hook_Access): Pass
nRenegBufferSize to ssl_io_buffer_fill.
* modules/ssl/mod_ssl.c (ssl_config_cmds): Add SSLRenegBufferSize.
PR: 39243
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@726109 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules')
-rw-r--r-- | modules/ssl/mod_ssl.c | 4 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_config.c | 17 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_io.c | 15 | ||||
-rw-r--r-- | modules/ssl/ssl_engine_kernel.c | 10 | ||||
-rw-r--r-- | modules/ssl/ssl_private.h | 9 |
5 files changed, 43 insertions, 12 deletions
diff --git a/modules/ssl/mod_ssl.c b/modules/ssl/mod_ssl.c index 3fcf96508d..ee6615a31f 100644 --- a/modules/ssl/mod_ssl.c +++ b/modules/ssl/mod_ssl.c @@ -179,6 +179,10 @@ static const command_rec ssl_config_cmds[] = { SSL_CMD_DIR(Require, AUTHCFG, RAW_ARGS, "Require a boolean expression to evaluate to true for granting access" "(arbitrary complex boolean expression - see manual)") + SSL_CMD_DIR(RenegBufferSize, AUTHCFG, TAKE1, + "Configure the amount of memory that will be used for buffering the " + "request body if a per-location SSL renegotiation is required due to " + "changed access control requirements") SSL_CMD_SRV(OCSPEnable, FLAG, "Enable use of OCSP to verify certificate revocation (`on', `off')") diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c index e062de8cd5..624e29befc 100644 --- a/modules/ssl/ssl_engine_config.c +++ b/modules/ssl/ssl_engine_config.c @@ -295,6 +295,8 @@ void *ssl_config_perdir_create(apr_pool_t *p, char *dir) dc->szCACertificateFile = NULL; dc->szUserName = NULL; + dc->nRenegBufferSize = DEFAULT_RENEG_BUFFER_SIZE; + return dc; } @@ -332,6 +334,8 @@ void *ssl_config_perdir_merge(apr_pool_t *p, void *basev, void *addv) cfgMergeString(szCACertificateFile); cfgMergeString(szUserName); + cfgMergeInt(nRenegBufferSize); + return mrg; } @@ -1148,6 +1152,19 @@ const char *ssl_cmd_SSLRequire(cmd_parms *cmd, return NULL; } +const char *ssl_cmd_SSLRenegBufferSize(cmd_parms *cmd, void *dcfg, const char *arg) +{ + SSLDirConfigRec *dc = dcfg; + + dc->nRenegBufferSize = atoi(arg); + if (dc->nRenegBufferSize < 0) { + return apr_pstrcat(cmd->pool, "Invalid size for SSLRenegBufferSize: ", + arg, NULL); + } + + return NULL; +} + static const char *ssl_cmd_protocol_parse(cmd_parms *parms, const char *arg, ssl_proto_t *options) diff --git a/modules/ssl/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c index befc53ad07..bd5ff896a2 100644 --- a/modules/ssl/ssl_engine_io.c +++ b/modules/ssl/ssl_engine_io.c @@ -1411,16 +1411,11 @@ static apr_status_t ssl_io_filter_output(ap_filter_t *f, return status; } -/* 128K maximum buffer size by default. */ -#ifndef SSL_MAX_IO_BUFFER -#define SSL_MAX_IO_BUFFER (128 * 1024) -#endif - struct modssl_buffer_ctx { apr_bucket_brigade *bb; }; -int ssl_io_buffer_fill(request_rec *r) +int ssl_io_buffer_fill(request_rec *r, apr_size_t maxlen) { conn_rec *c = r->connection; struct modssl_buffer_ctx *ctx; @@ -1437,7 +1432,8 @@ int ssl_io_buffer_fill(request_rec *r) /* ... and a temporary brigade. */ tempb = apr_brigade_create(r->pool, c->bucket_alloc); - ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, "filling buffer"); + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, "filling buffer, max size " + "%" APR_SIZE_T_FMT " bytes", maxlen); do { apr_status_t rv; @@ -1493,9 +1489,10 @@ int ssl_io_buffer_fill(request_rec *r) total, eos); /* Fail if this exceeds the maximum buffer size. */ - if (total > SSL_MAX_IO_BUFFER) { + if (total > maxlen) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, - "request body exceeds maximum size for SSL buffer"); + "request body exceeds maximum size (%" APR_SIZE_T_FMT + ") for SSL buffer", maxlen); return HTTP_REQUEST_ENTITY_TOO_LARGE; } diff --git a/modules/ssl/ssl_engine_kernel.c b/modules/ssl/ssl_engine_kernel.c index 88b664ffff..052051f723 100644 --- a/modules/ssl/ssl_engine_kernel.c +++ b/modules/ssl/ssl_engine_kernel.c @@ -601,8 +601,14 @@ int ssl_hook_Access(request_rec *r) && !r->expecting_100) { int rv; - /* Fill the I/O buffer with the request body if possible. */ - rv = ssl_io_buffer_fill(r); + if (dc->nRenegBufferSize > 0) { + /* Fill the I/O buffer with the request body if possible. */ + rv = ssl_io_buffer_fill(r, dc->nRenegBufferSize); + } + else { + /* If the reneg buffer size is set to zero, just fail. */ + rv = HTTP_REQUEST_ENTITY_TOO_LARGE; + } if (rv) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, diff --git a/modules/ssl/ssl_private.h b/modules/ssl/ssl_private.h index 8c77695e1e..d8ded93750 100644 --- a/modules/ssl/ssl_private.h +++ b/modules/ssl/ssl_private.h @@ -139,6 +139,11 @@ ap_set_module_config(c->conn_config, &ssl_module, val) #define SSL_SESSION_CACHE_TIMEOUT 300 #endif +/* Default setting for per-dir reneg buffer. */ +#ifndef DEFAULT_RENEG_BUFFER_SIZE +#define DEFAULT_RENEG_BUFFER_SIZE (128 * 1024) +#endif + /** * Define the per-server SSLLogLevel constants which provide * finer-than-debug resolution to decide if logs are to be @@ -488,6 +493,7 @@ typedef struct { const char *szCACertificatePath; const char *szCACertificateFile; const char *szUserName; + apr_size_t nRenegBufferSize; } SSLDirConfigRec; /** @@ -532,6 +538,7 @@ const char *ssl_cmd_SSLRequireSSL(cmd_parms *, void *); const char *ssl_cmd_SSLRequire(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLUserName(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLLogLevelDebugDump(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLRenegBufferSize(cmd_parms *cmd, void *dcfg, const char *arg); const char *ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag); const char *ssl_cmd_SSLProxyProtocol(cmd_parms *, void *, const char *); @@ -603,7 +610,7 @@ long ssl_io_data_cb(BIO *, int, MODSSL_BIO_CB_ARG_TYPE *, int, long, lon /* ssl_io_buffer_fill fills the setaside buffering of the HTTP request * to allow an SSL renegotiation to take place. */ -int ssl_io_buffer_fill(request_rec *r); +int ssl_io_buffer_fill(request_rec *r, apr_size_t maxlen); /** PRNG */ int ssl_rand_seed(server_rec *, apr_pool_t *, ssl_rsctx_t, char *); |