]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
PR50349: Honor 'AcceptPathInfo OFF' during internal redirects,
authorEric Covener <covener@apache.org>
Tue, 7 Dec 2010 13:06:22 +0000 (13:06 +0000)
committerEric Covener <covener@apache.org>
Tue, 7 Dec 2010 13:06:22 +0000 (13:06 +0000)
such as per-directory mod_rewrite substitutions.   This would be left floating
around in the request_rec with a pcalloc'ed value, so the core fixup
hook thought some module had overridden it.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1043023 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/http/http_request.c
server/core.c

diff --git a/CHANGES b/CHANGES
index 48fc211f2605c19140d4b7030bdba7c33065f37a..8fbbcba7b4ca084a66c895263a19c7947b4c4158 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@
 
 Changes with Apache 2.3.10
 
+  *) core: Honor 'AcceptPathInfo OFF' during internal redirects,
+     such as per-directory mod_rewrite substitutions.  PR 50349.
+     [Eric Covener]
+
   *) mod_rewrite: Add 'RewriteOptions InheritBefore' to put the base 
      rules/conditions before the overridden rules/conditions.  PR 39313.
      [Jérôme Grandjanny <jerome.grandjanny cea.fr>]
index a2d224effd33f34ae4892a9f67ef4881a1703208..852b3e110bd704597b07fa4d7af7ea85e7ea8fb5 100644 (file)
@@ -521,6 +521,11 @@ static request_rec *internal_internal_redirect(const char *new_uri,
     apr_table_setn(new->subprocess_env, "REDIRECT_STATUS",
                    apr_itoa(r->pool, r->status));
 
+    /* Begin by presuming any module can make its own path_info assumptions,
+     * until some module interjects and changes the value.
+     */
+    new->used_path_info = AP_REQ_DEFAULT_PATH_INFO;
+
     /*
      * XXX: hmm.  This is because mod_setenvif and mod_unique_id really need
      * to do their thing on internal redirects as well.  Perhaps this is a
index c9a74c178502b445a7151901e7ca81466ff6e2a8..a67a0633d3a6eb82adaa7ae3d274d788c018dcf1 100644 (file)
@@ -73,6 +73,9 @@
 #define AP_MAX_INCLUDE_DEPTH            (128)
 #endif
 
+/* valid in core-conf, but not in runtime r->used_path_info */
+#define AP_ACCEPT_PATHINFO_UNSET 3 
+
 APR_HOOK_STRUCT(
     APR_HOOK_LINK(get_mgmt_items)
 )
@@ -120,7 +123,7 @@ static void *create_core_dir_config(apr_pool_t *a, char *dir)
     conf->override_opts = OPT_UNSET | OPT_ALL | OPT_SYM_OWNER | OPT_MULTI;
 
     conf->content_md5 = 2;
-    conf->accept_path_info = 3;
+    conf->accept_path_info = AP_ACCEPT_PATHINFO_UNSET;
 
     conf->use_canonical_name = USE_CANONICAL_NAME_UNSET;
     conf->use_canonical_phys_port = USE_CANONICAL_PHYS_PORT_UNSET;
@@ -3759,15 +3762,17 @@ static int core_override_type(request_rec *r)
     /* Deal with the poor soul who is trying to force path_info to be
      * accepted within the core_handler, where they will let the subreq
      * address its contents.  This is toggled by the user in the very
-     * beginning of the fixup phase, so modules should override the user's
+     * beginning of the fixup phase (here!), so modules should override the user's
      * discretion in their own module fixup phase.  It is tristate, if
-     * the user doesn't specify, the result is 2 (which the module may
-     * interpret to its own customary behavior.)  It won't be touched
-     * if the value is no longer undefined (2), so any module changing
-     * the value prior to the fixup phase OVERRIDES the user's choice.
+     * the user doesn't specify, the result is AP_REQ_DEFAULT_PATH_INFO.
+     * (which the module may interpret to its own customary behavior.)  
+     * It won't be touched if the value is no longer AP_ACCEPT_PATHINFO_UNSET,
+     * so any module changing the value prior to the fixup phase 
+     * OVERRIDES the user's choice.
      */
     if ((r->used_path_info == AP_REQ_DEFAULT_PATH_INFO)
-        && (conf->accept_path_info != 3)) {
+        && (conf->accept_path_info != AP_ACCEPT_PATHINFO_UNSET)) {
+        /* No module knew better, and the user coded AcceptPathInfo */
         r->used_path_info = conf->accept_path_info;
     }