[apparmor] [PATCH 1/2] Fix an error in tree normalization that can result in an infinite loop

John Johansen john.johansen at canonical.com
Thu Feb 16 16:26:09 UTC 2012


Tree normailization tries to reshape expr tree into a normal from like

               |1               |1
              / \              / \
             |2  T     ->     a   |2
            / \                  / \
           |3  c                b   |3
          / \                      / \
         a   b                    c   T

which requires rotating the alt and cat nodes, at the same time it
also tries to rotate epsnods to the same side as alt and cat nodes.

However there is a bug that results in the epsnode flipping and
node rotation reverting each others work.  If the tree is of the
follow form this will result in an infinite loop.

               |1
              / \
             e2  |3
                / \
               e3  C

epsnode flipping is not supposed to take precedence over node rotation
and there is even a test to check for an alt or cat node, unfortunately
it is wrong resulting in unnecessary swapping and the possibility for
the above infinite loop

Signed-off-by: John Johansen <john.johansen at canonical.com>
---
 parser/libapparmor_re/expr-tree.cc |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/parser/libapparmor_re/expr-tree.cc b/parser/libapparmor_re/expr-tree.cc
index e9a1275..b502d54 100644
--- a/parser/libapparmor_re/expr-tree.cc
+++ b/parser/libapparmor_re/expr-tree.cc
@@ -189,7 +189,7 @@ void normalize_tree(Node *t, int dir)
 	for (;;) {
 		if ((&epsnode == t->child[dir]) &&
 		    (&epsnode != t->child[!dir]) &&
-		    dynamic_cast<TwoChildNode *>(t)) {
+		    !dynamic_cast<TwoChildNode *>(t->child[!dir])) {
 			// (E | a) -> (a | E)
 			// Ea -> aE
 			Node *c = t->child[dir];
-- 
1.7.9




More information about the AppArmor mailing list