dgaudet     98/02/02 11:46:55

  Modified:    src/main http_core.c
               src/include http_core.h
  Log:
  Aha.  This is the way to fix the options + / options - problems such as:
  
  Options -indexes
  <VirtualHost 127.0.0.1>
  Options +indexes
  </VirtualHost>
  
  No longer do -'ves have priority over +'ves.  We just record the last
  change to each bit.
  
  Revision  Changes    Path
  1.155     +17 -6     apache-1.3/src/main/http_core.c
  
  Index: http_core.c
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/main/http_core.c,v
  retrieving revision 1.154
  retrieving revision 1.155
  diff -u -r1.154 -r1.155
  --- http_core.c       1998/02/01 22:05:36     1.154
  +++ http_core.c       1998/02/02 19:46:53     1.155
  @@ -160,13 +160,21 @@
       conf->d_components = new->d_components;
       conf->r = new->r;
       
  -    if (!(new->opts & OPT_UNSET)) conf->opts = new->opts;
  -    if (new->opts_add) {
  -     conf->opts |= new->opts_add;
  -     conf->opts &= ~OPT_UNSET;
  +    if (new->opts & OPT_UNSET) {
  +     /* there was no explicit setting of new->opts, so we merge
  +      * preserve the invariant (opts_add & opts_remove) == 0
  +      */
  +     conf->opts_add = (conf->opts_add & ~new->opts_remove) | new->opts_add;
  +     conf->opts_remove = (conf->opts_remove & ~new->opts_add) | 
new->opts_remove;
  +     conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add;
       }
  -    if (new->opts_remove) {
  -     conf->opts &= ~(new->opts_remove | OPT_UNSET);
  +    else {
  +     /* otherwise we just copy, because an explicit opts setting
  +      * overrides all earlier +/- modifiers
  +      */
  +     conf->opts = new->opts;
  +     conf->opts_add = new->opts_add;
  +     conf->opts_remove = new->opts_remove;
       }
   
       if (!(new->override & OR_UNSET)) conf->override = new->override;
  @@ -801,12 +809,15 @@
        else 
            return pstrcat (cmd->pool, "Illegal option ", w, NULL);
   
  +     /* we ensure the invariant (d->opts_add & d->opts_remove) == 0 */
        if (action == '-') {
            d->opts_remove |= opt;
  +         d->opts_add &= ~opt;
            d->opts &= ~opt;
        }
        else if (action == '+') {
            d->opts_add |= opt;
  +         d->opts_remove &= ~opt;
            d->opts |= opt;
        }
        else {
  
  
  
  1.35      +7 -0      apache-1.3/src/include/http_core.h
  
  Index: http_core.h
  ===================================================================
  RCS file: /export/home/cvs/apache-1.3/src/include/http_core.h,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- http_core.h       1998/02/01 22:05:34     1.34
  +++ http_core.h       1998/02/02 19:46:55     1.35
  @@ -145,6 +145,13 @@
       /* the number of slashes in d */
       unsigned d_components;
   
  +    /* If (opts & OPT_UNSET) then no absolute assignment to options has
  +     * been made.
  +     * invariant: (opts_add & opts_remove) == 0
  +     * Which said another way means that the last relative (options + or -)
  +     * assignment made to each bit is recorded in exactly one of opts_add
  +     * or opts_remove.
  +     */
       allow_options_t opts;
       allow_options_t opts_add;
       allow_options_t opts_remove;
  
  
  

Reply via email to