From: Stefan Fritsch
The maximum length of a line in the configuration file, after - variable substitution, joining any continued lines and removing leading - and trailing white space, is 8192 characters.
-You can check your configuration files for syntax errors
without starting the server by using apachectl
configtest
or the -t
command line
diff --git a/include/ap_mmn.h b/include/ap_mmn.h
index 565e4ea47c..b892e0e48b 100644
--- a/include/ap_mmn.h
+++ b/include/ap_mmn.h
@@ -347,6 +347,7 @@
* core_dir_config and htaccess_result
* 20110724.1 (2.3.15-dev) add NOT_IN_HTACCESS
* 20110724.2 (2.3.15-dev) retries and retry_delay in util_ldap_state_t
+ * 20110724.3 (2.3.15-dev) add util_varbuf.h / ap_varbuf API
*/
#define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
@@ -354,7 +355,7 @@
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20110724
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 2 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 3 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
diff --git a/libhttpd.dsp b/libhttpd.dsp
index 6e656d084d..d7ff1a2687 100644
--- a/libhttpd.dsp
+++ b/libhttpd.dsp
@@ -607,6 +607,10 @@ SOURCE=.\server\util_time.c
# End Source File
# Begin Source File
+SOURCE=.\include\util_varbuf.h
+# End Source File
+# Begin Source File
+
SOURCE=.\os\win32\util_win32.c
# End Source File
# Begin Source File
diff --git a/modules/aaa/mod_authz_groupfile.c b/modules/aaa/mod_authz_groupfile.c
index 7da27a455c..94128f19bc 100644
--- a/modules/aaa/mod_authz_groupfile.c
+++ b/modules/aaa/mod_authz_groupfile.c
@@ -52,6 +52,7 @@
#include "http_log.h"
#include "http_protocol.h"
#include "http_request.h"
+#include "util_varbuf.h"
#include "mod_auth.h"
@@ -90,13 +91,15 @@ static const command_rec authz_groupfile_cmds[] =
module AP_MODULE_DECLARE_DATA authz_groupfile_module;
+#define VARBUF_INIT_LEN 512
+#define VARBUF_MAX_LEN (16*1024*1024)
static apr_status_t groups_for_user(apr_pool_t *p, char *user, char *grpfile,
apr_table_t ** out)
{
ap_configfile_t *f;
apr_table_t *grps = apr_table_make(p, 15);
apr_pool_t *sp;
- char l[MAX_STRING_LEN];
+ struct ap_varbuf vb;
const char *group_name, *ll, *w;
apr_status_t status;
apr_size_t group_len;
@@ -106,12 +109,13 @@ static apr_status_t groups_for_user(apr_pool_t *p, char *user, char *grpfile,
}
apr_pool_create(&sp, p);
+ ap_varbuf_init(p, &vb, VARBUF_INIT_LEN);
- while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) {
- if ((l[0] == '#') || (!l[0])) {
+ while (!(ap_varbuf_cfg_getline(&vb, f, VARBUF_MAX_LEN))) {
+ if ((vb.buf[0] == '#') || (!vb.buf[0])) {
continue;
}
- ll = l;
+ ll = vb.buf;
apr_pool_clear(sp);
group_name = ap_getword(sp, &ll, ':');
@@ -132,6 +136,7 @@ static apr_status_t groups_for_user(apr_pool_t *p, char *user, char *grpfile,
}
ap_cfg_closefile(f);
apr_pool_destroy(sp);
+ ap_varbuf_free(&vb);
*out = grps;
return APR_SUCCESS;
diff --git a/server/config.c b/server/config.c
index 2239352576..1068b1f9a2 100644
--- a/server/config.c
+++ b/server/config.c
@@ -49,6 +49,7 @@
#include "http_main.h"
#include "http_vhost.h"
#include "util_cfgtree.h"
+#include "util_varbuf.h"
#include "mpm_common.h"
#define APLOG_UNSET (APLOG_NO_MODULE - 1)
@@ -1186,6 +1187,9 @@ static const char *ap_build_config_sub(apr_pool_t *p, apr_pool_t *temp_pool,
return retval;
}
+#define VARBUF_INIT_LEN 200
+#define VARBUF_MAX_LEN (16*1024*1024)
+
AP_DECLARE(const char *) ap_build_cont_config(apr_pool_t *p,
apr_pool_t *temp_pool,
cmd_parms *parms,
@@ -1193,27 +1197,23 @@ AP_DECLARE(const char *) ap_build_cont_config(apr_pool_t *p,
ap_directive_t **curr_parent,
char *orig_directive)
{
- char *l;
char *bracket;
const char *retval;
ap_directive_t *sub_tree = NULL;
apr_status_t rc;
-
- /* Since this function can be called recursively, allocate
- * the temporary 8k string buffer from the temp_pool rather
- * than the stack to avoid over-running a fixed length stack.
- */
- l = apr_palloc(temp_pool, MAX_STRING_LEN);
+ struct ap_varbuf vb;
bracket = apr_pstrcat(temp_pool, orig_directive + 1, ">", NULL);
- while ((rc = ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))
+ ap_varbuf_init(temp_pool, &vb, VARBUF_INIT_LEN);
+
+ while ((rc = ap_varbuf_cfg_getline(&vb, parms->config_file, VARBUF_MAX_LEN))
== APR_SUCCESS) {
- if (!memcmp(l, "", 2)
- && (strcasecmp(l + 2, bracket) == 0)
+ if (!memcmp(vb.buf, "", 2)
+ && (strcasecmp(vb.buf + 2, bracket) == 0)
&& (*curr_parent == NULL)) {
break;
}
- retval = ap_build_config_sub(p, temp_pool, l, parms, current,
+ retval = ap_build_config_sub(p, temp_pool, vb.buf, parms, current,
curr_parent, &sub_tree);
if (retval != NULL)
return retval;
@@ -1226,6 +1226,7 @@ AP_DECLARE(const char *) ap_build_cont_config(apr_pool_t *p,
sub_tree = *current;
}
}
+ ap_varbuf_free(&vb);
if (rc != APR_EOF && rc != APR_SUCCESS)
return ap_pcfg_strerror(temp_pool, parms->config_file, rc);
@@ -1319,10 +1320,12 @@ AP_DECLARE(const char *) ap_build_config(cmd_parms *parms,
{
ap_directive_t *current = *conftree;
ap_directive_t *curr_parent = NULL;
- char *l = apr_palloc (temp_pool, MAX_STRING_LEN);
const char *errmsg;
ap_directive_t **last_ptr = NULL;
apr_status_t rc;
+ struct ap_varbuf vb;
+
+ ap_varbuf_init(temp_pool, &vb, VARBUF_INIT_LEN);
if (current != NULL) {
/* If we have to traverse the whole tree again for every included
@@ -1346,9 +1349,9 @@ AP_DECLARE(const char *) ap_build_config(cmd_parms *parms,
}
}
- while ((rc = ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))
+ while ((rc = ap_varbuf_cfg_getline(&vb, parms->config_file, VARBUF_MAX_LEN))
== APR_SUCCESS) {
- errmsg = ap_build_config_sub(p, temp_pool, l, parms,
+ errmsg = ap_build_config_sub(p, temp_pool, vb.buf, parms,
¤t, &curr_parent, conftree);
if (errmsg != NULL)
return errmsg;
@@ -1361,6 +1364,7 @@ AP_DECLARE(const char *) ap_build_config(cmd_parms *parms,
*conftree = current;
}
}
+ ap_varbuf_free(&vb);
if (rc != APR_EOF && rc != APR_SUCCESS)
return ap_pcfg_strerror(temp_pool, parms->config_file, rc);
@@ -1532,17 +1536,19 @@ AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *file)
AP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive)
{
- char l[MAX_STRING_LEN];
+ struct ap_varbuf vb;
const char *args;
char *cmd_name;
apr_status_t rc;
- while((rc = ap_cfg_getline(l, MAX_STRING_LEN, cmd->config_file))
+ ap_varbuf_init(cmd->temp_pool, &vb, VARBUF_INIT_LEN);
+
+ while((rc = ap_varbuf_cfg_getline(&vb, cmd->config_file, VARBUF_MAX_LEN))
== APR_SUCCESS) {
#if RESOLVE_ENV_PER_TOKEN
- args = l;
+ args = vb.buf;
#else
- args = ap_resolve_env(cmd->temp_pool, l);
+ args = ap_resolve_env(cmd->temp_pool, vb.buf);
#endif
cmd_name = ap_getword_conf(cmd->temp_pool, &args);
@@ -1556,6 +1562,7 @@ AP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive)
cmd_name, ">", NULL);
}
+ ap_varbuf_free(&vb);
return NULL; /* found end of container */
}
else {
diff --git a/server/util.c b/server/util.c
index 8e1a6209ae..9e20d37bba 100644
--- a/server/util.c
+++ b/server/util.c
@@ -54,6 +54,7 @@
#include "http_config.h"
#include "http_core.h"
#include "util_ebcdic.h"
+#include "util_varbuf.h"
#ifdef HAVE_PWD_H
#include