You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by sf...@apache.org on 2011/05/27 21:28:11 UTC

svn commit: r1128430 - in /httpd/httpd/trunk: CHANGES docs/manual/upgrading.xml modules/filters/mod_include.c

Author: sf
Date: Fri May 27 19:28:11 2011
New Revision: 1128430

URL: http://svn.apache.org/viewvc?rev=1128430&view=rev
Log:
properly merge directory configs in mod_include

Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/docs/manual/upgrading.xml
    httpd/httpd/trunk/modules/filters/mod_include.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1128430&r1=1128429&r2=1128430&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Fri May 27 19:28:11 2011
@@ -2,6 +2,10 @@
 
 Changes with Apache 2.3.13
 
+  *) mod_include: Merge directory configs instead of one SSI* config directive
+     causing all other per-directory SSI* config directives to be reset.
+     [Stefan Fritsch]
+
   *) mod_charset_lite: Remove DebugLevel option in favour of per-module
      loglevel. [Stefan Fritsch]
 

Modified: httpd/httpd/trunk/docs/manual/upgrading.xml
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/upgrading.xml?rev=1128430&r1=1128429&r2=1128430&view=diff
==============================================================================
--- httpd/httpd/trunk/docs/manual/upgrading.xml (original)
+++ httpd/httpd/trunk/docs/manual/upgrading.xml Fri May 27 19:28:11 2011
@@ -225,6 +225,11 @@
         module="filter">FilterProvider</directive> syntax has changed and
         now uses a boolean expression to determine if a filter is applied.
         </li>
+
+        <li><module>mod_include</module>: An SSI* config directive in directory
+        scope no longer causes all other per-directory SSI* directives to be
+        reset to their default values.
+        </li>
       </ul>
     </section>
   </section>
@@ -233,7 +238,7 @@
     <title>Misc Changes</title>
 
     <ul>
-      <li><module>mod_auto_index</module>: will now extract titles and
+      <li><module>mod_autoindex</module>: will now extract titles and
       display descriptions for .xhtml files, which were previously
       ignored.</li>
 

Modified: httpd/httpd/trunk/modules/filters/mod_include.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/filters/mod_include.c?rev=1128430&r1=1128429&r2=1128430&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/filters/mod_include.c (original)
+++ httpd/httpd/trunk/modules/filters/mod_include.c Fri May 27 19:28:11 2011
@@ -107,7 +107,8 @@ typedef struct parse_node {
 typedef enum {
     XBITHACK_OFF,
     XBITHACK_ON,
-    XBITHACK_FULL
+    XBITHACK_FULL,
+    XBITHACK_UNSET
 } xbithack_t;
 
 typedef struct {
@@ -115,9 +116,9 @@ typedef struct {
     const char *default_time_fmt;
     const char *undefined_echo;
     xbithack_t  xbithack;
-    int accessenable;
-    int lastmodified;
-    int etag;
+    signed char accessenable;
+    signed char lastmodified;
+    signed char etag;
 } include_dir_config;
 
 typedef struct {
@@ -462,9 +463,8 @@ static const char lazy_eval_sentinel;
 #define DEFAULT_ERROR_MSG "[an error occurred while processing this directive]"
 #define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
 #define DEFAULT_UNDEFINED_ECHO "(none)"
-#define DEFAULT_ACCESSENABLE 0
-#define DEFAULT_LASTMODIFIED 0
-#define DEFAULT_ETAG 0
+
+#define UNSET -1
 
 #ifdef XBITHACK
 #define DEFAULT_XBITHACK XBITHACK_FULL
@@ -3686,7 +3686,7 @@ static int includes_setup(ap_filter_t *f
      * We don't know if we are going to be including a file or executing
      * a program - in either case a strong ETag header will likely be invalid.
      */
-    if (!conf->etag) {
+    if (conf->etag <= 0) {
         apr_table_setn(f->r->notes, "no-etag", "");
     }
 
@@ -3730,20 +3730,23 @@ static apr_status_t includes_filter(ap_f
         if ((ap_allow_options(r) & OPT_INC_WITH_EXEC) == 0) {
             ctx->flags |= SSI_FLAG_NO_EXEC;
         }
-        intern->accessenable = conf->accessenable;
+        intern->accessenable = (conf->accessenable > 0);
 
         ctx->if_nesting_level = 0;
         intern->re = NULL;
 
-        ctx->error_str = conf->default_error_msg;
-        ctx->time_str = conf->default_time_fmt;
+        ctx->error_str = conf->default_error_msg ? conf->default_error_msg :
+                         DEFAULT_ERROR_MSG;
+        ctx->time_str = conf->default_time_fmt ? conf->default_time_fmt :
+                        DEFAULT_TIME_FORMAT;
         intern->start_seq  = sconf->default_start_tag;
         intern->start_seq_pat = bndm_compile(ctx->pool, intern->start_seq,
                                              strlen(intern->start_seq));
         intern->end_seq = sconf->default_end_tag;
         intern->end_seq_len = strlen(intern->end_seq);
-        intern->undefined_echo = conf->undefined_echo;
-        intern->undefined_echo_len = strlen(conf->undefined_echo);
+        intern->undefined_echo = conf->undefined_echo ? conf->undefined_echo :
+                                 DEFAULT_UNDEFINED_ECHO;
+        intern->undefined_echo_len = strlen(intern->undefined_echo);
     }
 
     if ((parent = ap_get_module_config(r->request_config, &include_module))) {
@@ -3787,7 +3790,7 @@ static apr_status_t includes_filter(ap_f
      */
 
     /* Must we respect the last modified header? By default, no */
-    if (conf->lastmodified) {
+    if (conf->lastmodified > 0) {
 
         /* update the last modified if we have a valid time, and only if
          * we don't already have a valid last modified.
@@ -3801,7 +3804,9 @@ static apr_status_t includes_filter(ap_f
     }
 
     /* Assure the platform supports Group protections */
-    else if (((conf->xbithack == XBITHACK_FULL)
+    else if (((conf->xbithack == XBITHACK_FULL ||
+               (conf->xbithack == XBITHACK_UNSET &&
+                DEFAULT_XBITHACK == XBITHACK_FULL))
         && (r->finfo.valid & APR_FINFO_GPROT)
         && (r->finfo.protection & APR_GEXECUTE))) {
         ap_update_mtime(r, r->finfo.mtime);
@@ -3844,7 +3849,10 @@ static int include_fixup(request_rec *r)
         include_dir_config *conf = ap_get_module_config(r->per_dir_config,
                                                         &include_module);
 
-        if (conf->xbithack == XBITHACK_OFF) {
+        if (conf->xbithack == XBITHACK_OFF ||
+            (DEFAULT_XBITHACK == XBITHACK_OFF &&
+             conf->xbithack == XBITHACK_UNSET))
+        {
             return DECLINED;
         }
 
@@ -3876,19 +3884,32 @@ static int include_fixup(request_rec *r)
 
 static void *create_includes_dir_config(apr_pool_t *p, char *dummy)
 {
-    include_dir_config *result = apr_palloc(p, sizeof(include_dir_config));
+    include_dir_config *result = apr_pcalloc(p, sizeof(include_dir_config));
 
-    result->default_error_msg = DEFAULT_ERROR_MSG;
-    result->default_time_fmt  = DEFAULT_TIME_FORMAT;
-    result->undefined_echo    = DEFAULT_UNDEFINED_ECHO;
-    result->xbithack          = DEFAULT_XBITHACK;
-    result->accessenable      = DEFAULT_ACCESSENABLE;
-    result->lastmodified      = DEFAULT_LASTMODIFIED;
-    result->etag              = DEFAULT_ETAG;
+    result->xbithack          = XBITHACK_UNSET;
+    result->accessenable      = UNSET;
+    result->lastmodified      = UNSET;
+    result->etag              = UNSET;
 
     return result;
 }
 
+#define MERGE(b,o,n,val,unset) n->val = o->val != unset  ? o->val : b->val
+static void *merge_includes_dir_config(apr_pool_t *p, void *basev, void *overridesv)
+{
+    include_dir_config *base = (include_dir_config *)basev,
+                       *over = (include_dir_config *)overridesv,
+                       *new  = apr_palloc(p, sizeof(include_dir_config));
+    MERGE(base, over, new, default_error_msg, NULL);
+    MERGE(base, over, new, default_time_fmt,  NULL);
+    MERGE(base, over, new, undefined_echo,    NULL);
+    MERGE(base, over, new, xbithack,          XBITHACK_UNSET);
+    MERGE(base, over, new, accessenable,      UNSET);
+    MERGE(base, over, new, lastmodified,      UNSET);
+    MERGE(base, over, new, etag,              UNSET);
+    return new;
+}
+
 static void *create_includes_server_config(apr_pool_t *p, server_rec *server)
 {
     include_server_config *result;
@@ -4068,7 +4089,7 @@ AP_DECLARE_MODULE(include) =
 {
     STANDARD20_MODULE_STUFF,
     create_includes_dir_config,   /* dir config creater */
-    NULL,                         /* dir merger --- default is to override */
+    merge_includes_dir_config,    /* dir config merger */
     create_includes_server_config,/* server config */
     NULL,                         /* merge server config */
     includes_cmds,                /* command apr_table_t */