From 4b429b6c334e7d849031276f1b3f74b5d48aac1d Mon Sep 17 00:00:00 2001 From: Alasdair Kergon Date: Tue, 2 Nov 2010 19:56:33 +0000 Subject: [PATCH] Fix regex optimiser not to ignore RHS of OR nodes in _find_leftmost_common. --- WHATS_NEW | 1 + libdm/regex/parse_rx.c | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index bc0972f97..2eef41a89 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.76 - =================================== + Fix regex optimiser not to ignore RHS of OR nodes in _find_leftmost_common. Fix handling of online filesystem resize (using new fsadm return code). Add DIAGNOSTICS section to fsadm man page. Modify fsadm to return different status code for check of mounted filesystem. diff --git a/libdm/regex/parse_rx.c b/libdm/regex/parse_rx.c index 9f3e1647b..332f16dd1 100644 --- a/libdm/regex/parse_rx.c +++ b/libdm/regex/parse_rx.c @@ -473,16 +473,19 @@ static int _find_leftmost_common(struct rx_node *or, unsigned left_depth = _depth(left, leftmost); unsigned right_depth = _depth(right, leftmost); - while (left_depth > right_depth) { + while (left_depth > right_depth && left->type != OR) { left = LEFT(left); left_depth--; } - while (right_depth > left_depth) { + while (right_depth > left_depth && right->type != OR) { right = LEFT(right); right_depth--; } + if (left_depth != right_depth) + return 0; + while (left_depth) { if (left->type == CAT && right->type == CAT) { if (_nodes_equal(LEFT(left), LEFT(right))) { @@ -491,6 +494,8 @@ static int _find_leftmost_common(struct rx_node *or, return 1; } } + if (left->type == OR || right->type == OR) + break; left = LEFT(left); right = LEFT(right); left_depth--; @@ -568,7 +573,6 @@ static struct rx_node *_pass(struct dm_pool *mem, case QUEST: if (!(r->left = _pass(mem, r->left, changed))) return_NULL; - break; case OR: /* It's important we optimise sub nodes first */ @@ -577,7 +581,6 @@ static struct rx_node *_pass(struct dm_pool *mem, if (!(r->right = _pass(mem, r->right, changed))) return_NULL; - /* * If rotate_ors changes the tree, left and right are stale, * so just set 'changed' to repeat the search.