[Remove entries to the current 2.0 section below, when backported]
+ *) Fix memory corruption problem with ap_custom_response() function.
+ The core per-dir config would later point to request pool data
+ that would be reused for different purposes on different requests.
+ [Jeff Trawick, based on an old 1.3 patch submitted by Will Lowe]
+
*) work around MSIE Digest auth bug - if AuthDigestEnableQueryStringHack
is set in r->subprocess_env allow mismatched query strings to pass.
PR 27758. [Paul Querna <chip force-elite.com>, Geoffrey Young]
* won't actually be delivered as the response for the non-GET method.
*/
int deliver_script;
+
+ /* Custom response strings registered via ap_custom_response(),
+ * or NULL; check per-dir config if nothing found here
+ */
+ char **response_code_strings; /* from ap_custom_response(), not from
+ * ErrorDocument
+ */
} core_request_config;
/* Standard entries that are guaranteed to be accessible via
* This lets us do quick merges in merge_core_dir_configs().
*/
- char **response_code_strings;
+ char **response_code_strings; /* from ErrorDocument, not from
+ * ap_custom_response() */
/* Hostname resolution etc */
#define HOSTNAME_LOOKUP_OFF 0
char *ap_response_code_string(request_rec *r, int error_index)
{
- core_dir_config *conf;
+ core_dir_config *dirconf;
+ core_request_config *reqconf;
- conf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
- &core_module);
+ /* check for string registered via ap_custom_response() first */
+ reqconf = (core_request_config *)ap_get_module_config(r->request_config,
+ &core_module);
+ if (reqconf->response_code_strings != NULL &&
+ reqconf->response_code_strings[error_index] != NULL) {
+ return reqconf->response_code_strings[error_index];
+ }
- if (conf->response_code_strings == NULL) {
- return NULL;
+ /* check for string specified via ErrorDocument */
+ dirconf = (core_dir_config *)ap_get_module_config(r->per_dir_config,
+ &core_module);
+
+ if (dirconf->response_code_strings == NULL) {
+ return NULL;
}
- return conf->response_code_strings[error_index];
+ return dirconf->response_code_strings[error_index];
}
AP_DECLARE(void) ap_custom_response(request_rec *r, int status,
const char *string)
{
- core_dir_config *conf =
- ap_get_module_config(r->per_dir_config, &core_module);
+ core_request_config *conf =
+ ap_get_module_config(r->request_config, &core_module);
int idx;
- if(conf->response_code_strings == NULL) {
+ if (conf->response_code_strings == NULL) {
conf->response_code_strings =
apr_pcalloc(r->pool,
sizeof(*conf->response_code_strings) * RESPONSE_CODES);