]> granicus.if.org Git - apache/commitdiff
Fix a bug in authz logic merging which caused
authorStefan Fritsch <sf@apache.org>
Sat, 8 Jan 2011 14:29:12 +0000 (14:29 +0000)
committerStefan Fritsch <sf@apache.org>
Sat, 8 Jan 2011 14:29:12 +0000 (14:29 +0000)
        section->op == AUTHZ_LOGIC_AND
        auth_result == AUTHZ_DENIED_NO_USER
        child_result == AUTHZ_GRANTED
to return AUTHZ_GRANTED instead of AUTHZ_DENIED_NO_USER.

While there, refactor the if blocks to make them a bit more readable.

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

CHANGES
modules/aaa/mod_authz_core.c

diff --git a/CHANGES b/CHANGES
index 42a65dfbc661820b424294599448df83bae82d16..66f0c0b0e29bd116b43bdbe5ce96922ce6e29d46 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.3.11
 
+  *) mod_authz_core: Fix bug in merging logic if user-based and non-user-based
+     authorization directives were mixed. [Stefan Fritsch]
+
   *) mod_authn_socache: change directive name from AuthnCacheProvider
      to AuthnCacheProvideFor.  The term "provider" is overloaded in
      this module, and we should avoid confusion between the provider
index 6d4e893634c2a4812d6774d7c6152b67b75a0688..8be3487b36c5fc11785f4f1dca596d539d0e577f 100644 (file)
@@ -730,21 +730,28 @@ static authz_status apply_authz_sections(request_rec *r,
                  * AUTHZ_DENIED_NO_USER if providing a user may change the
                  * result, AUTHZ_DENIED otherwise.
                  */
-                if (!(section->op == AUTHZ_LOGIC_AND
-                      && auth_result == AUTHZ_DENIED
-                      && child_result == AUTHZ_DENIED_NO_USER)
-                    && !(section->op == AUTHZ_LOGIC_OR
-                         && auth_result == AUTHZ_DENIED_NO_USER
-                         && child_result == AUTHZ_DENIED) )
-                {
-                    auth_result = child_result;
+                if (section->op == AUTHZ_LOGIC_AND) {
+                    if (child_result == AUTHZ_DENIED) {
+                        auth_result = child_result;
+                        break;
+                    }
+                    if ((child_result == AUTHZ_DENIED_NO_USER
+                         && auth_result != AUTHZ_DENIED)
+                        || (auth_result == AUTHZ_NEUTRAL)) {
+                        auth_result = child_result;
+                    }
                 }
-
-                if ((section->op == AUTHZ_LOGIC_AND
-                     && child_result == AUTHZ_DENIED)
-                    || (section->op == AUTHZ_LOGIC_OR
-                        && child_result == AUTHZ_GRANTED)) {
-                    break;
+                else {
+                    /* AUTHZ_LOGIC_OR */
+                    if (child_result == AUTHZ_GRANTED) {
+                        auth_result = child_result;
+                        break;
+                    }
+                    if ((child_result == AUTHZ_DENIED_NO_USER
+                         && auth_result == AUTHZ_DENIED)
+                        || (auth_result == AUTHZ_NEUTRAL)) {
+                        auth_result = child_result;
+                    }
                 }
             }