On Wed, Oct 11, 2017 at 10:49 PM, Yann Ylavic <[email protected]> wrote:
> On Wed, Oct 11, 2017 at 10:38 PM, Yann Ylavic <[email protected]> wrote:
>>
>> Thus, how about if there, for 2.4.x only (i.e. backport patch), we'd
>> instead check for:
>>> + || (((forbidden & NOT_IN_PROXY)
>>> + || (forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE
>>> + || (forbidden & GLOBAL_ONLY) == GLOBAL_ONLY)
>>> + && ((found = ...)
>>> + || ...)))
>> ?
>
> Looks like there are other usages of NOT_IN_DIR_LOC_FILE we should
> hack in ap_check_cmd_context() too, but you probably see the idea...
Actually, I think the correct fix, even for 2.5/trunk, is something
for the attached patch.
WDYT?
Index: include/http_config.h
===================================================================
--- include/http_config.h (revision 1811703)
+++ include/http_config.h (working copy)
@@ -950,10 +950,12 @@ AP_DECLARE(const char *) ap_check_cmd_context(cmd_
#define NOT_IN_FILES 0x10 /**< Forbidden in <Files> or <If>*/
#define NOT_IN_HTACCESS 0x20 /**< Forbidden in .htaccess files */
#define NOT_IN_PROXY 0x40 /**< Forbidden in <Proxy> */
+/** Forbidden in <Directory>/<Location>/<Files><If>*/
+#define NOT_IN_DIR_LOC_FILE (NOT_IN_DIRECTORY|NOT_IN_LOCATION|NOT_IN_FILES)
/** Forbidden in <Directory>/<Location>/<Files><If><Proxy>*/
-#define NOT_IN_DIR_LOC_FILE (NOT_IN_DIRECTORY|NOT_IN_LOCATION|NOT_IN_FILES|NOT_IN_PROXY)
+#define NOT_IN_DIR_LOC_FILE_PROXY (NOT_IN_DIR_LOC_FILE|NOT_IN_PROXY)
/** Forbidden in <VirtualHost>/<Limit>/<Directory>/<Location>/<Files>/<If><Proxy>*/
-#define GLOBAL_ONLY (NOT_IN_VIRTUALHOST|NOT_IN_LIMIT|NOT_IN_DIR_LOC_FILE)
+#define GLOBAL_ONLY (NOT_IN_VIRTUALHOST|NOT_IN_LIMIT|NOT_IN_DIR_LOC_FILE_PROXY)
/** @} */
Index: server/core.c
===================================================================
--- server/core.c (revision 1811703)
+++ server/core.c (working copy)
@@ -1323,7 +1323,9 @@ AP_DECLARE(const char *) ap_check_cmd_context(cmd_
|| (found = find_parent(cmd->directive, "<If"))
|| (found = find_parent(cmd->directive, "<ElseIf"))
|| (found = find_parent(cmd->directive, "<Else"))))
- || ((forbidden & NOT_IN_PROXY)
+ || (((forbidden & NOT_IN_PROXY)
+ || (forbidden & GLOBAL_ONLY) == GLOBAL_ONLY
+ || (forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE)
&& ((found = find_parent(cmd->directive, "<Proxy"))
|| (found = find_parent(cmd->directive, "<ProxyMatch"))))) {
return apr_pstrcat(cmd->pool, cmd->cmd->name, gt,