dgaudet 98/02/03 01:30:49
Modified: src/modules/standard mod_include.c
Log:
Here is a more faithful fix for the mod_include/table_xxxn API problem.
We preserve all the original functionality at the expense of some extra
memory because we don't clean up subrequests.
Plus a bug is fixed -- if mod_include is not the only module using
run_sub_request() then it was possible that add_xxx_vars() wouldn't be
done, and the environment would be incorrect.
Revision Changes Path
1.71 +34 -10 apache-1.3/src/modules/standard/mod_include.c
Index: mod_include.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/modules/standard/mod_include.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -r1.70 -r1.71
--- mod_include.c 1998/01/29 20:36:12 1.70
+++ mod_include.c 1998/02/03 09:30:48 1.71
@@ -101,6 +101,11 @@
#define RAW_ASCII_CHAR(ch) (ch)
#endif /*CHARSET_EBCDIC*/
+module MODULE_VAR_EXPORT includes_module;
+
+/* just need some arbitrary non-NULL pointer which can't also be a
request_rec */
+#define NESTED_INCLUDE_MAGIC (&includes_module)
+
/* ------------------------ Environment function --------------------------
*/
static void add_include_vars(request_rec *r, char *timefmt)
@@ -680,6 +685,9 @@
}
}
+ /* see the Kludge in send_parsed_file for why */
+ set_module_config(rr->request_config, &includes_module, r);
+
#ifdef CHARSET_EBCDIC
bsetflag(rr->connection->client, B_EBCDIC2ASCII, 0);
#endif
@@ -694,8 +702,11 @@
rputs(error, r);
}
- if (rr != NULL) {
- destroy_sub_req(rr);
+ /* destroy the sub request if it's not a nested include */
+ if (rr != NULL
+ && get_module_config(rr->request_config, &includes_module)
+ != NESTED_INCLUDE_MAGIC) {
+ destroy_sub_req(rr);
}
}
else if (!strcmp(tag, "done")) {
@@ -2236,6 +2247,7 @@
enum xbithack *state =
(enum xbithack *) get_module_config(r->per_dir_config, &includes_module);
int errstatus;
+ request_rec *parent;
if (!(allow_options(r) & OPT_INCLUDES)) {
return DECLINED;
@@ -2279,16 +2291,22 @@
return OK;
}
- if (r->main) {
+ if ((parent = get_module_config(r->request_config, &includes_module))) {
/* Kludge --- for nested includes, we want to keep the subprocess
- * environment of the base document (for compatibility). This is only
- * necessary when there has been an internal redirect somewhere along
- * the way. When that happens the original environment has been
- * renamed REDIRECT_foobar for each foobar.
- */
- r->subprocess_env = copy_table(r->pool, r->main->subprocess_env);
+ * environment of the base document (for compatibility); that means
+ * torquing our own last_modified date as well so that the
+ * LAST_MODIFIED variable gets reset to the proper value if the
+ * nested document resets <!--#config timefmt-->.
+ * We also insist that the memory for this subrequest not be
+ * destroyed, that's dealt with in handle_include().
+ */
+ r->subprocess_env = parent->subprocess_env;
+ pool_join(parent->pool, r->pool);
+ r->finfo.st_mtime = parent->finfo.st_mtime;
}
else {
+ /* we're not a nested include, so we create an initial
+ * environment */
add_common_vars(r);
add_cgi_vars(r);
add_include_vars(r, DEFAULT_TIME_FORMAT);
@@ -2302,6 +2320,12 @@
send_parsed_content(f, r);
+ if (parent) {
+ /* signify that the sub request should not be killed */
+ set_module_config(r->request_config, &includes_module,
+ NESTED_INCLUDE_MAGIC);
+ }
+
kill_timeout(r);
return OK;
}
@@ -2349,7 +2373,7 @@
{NULL}
};
-module includes_module =
+module MODULE_VAR_EXPORT includes_module =
{
STANDARD_MODULE_STUFF,
NULL, /* initializer */