On Thu, Feb 16, 2012 at 08:26:09AM -0800, John Johansen wrote: > 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 <[email protected]> > --- > 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];
I don't understand this area well enough to be comfortable to ACK it, but if you say it's needed, that's good enough for me. ;) That said, is there a simple test-case that can be used to show the before/after of this change? -Kees -- Kees Cook -- AppArmor mailing list [email protected] Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor
