[dm-devel] [PATCH 06/11] Break out loop in factorize_hwtable()
Hannes Reinecke
hare at suse.de
Thu Jan 17 14:59:28 UTC 2013
We need to break out of the loop in factorize_hwtable() as
soon as we have removed a duplicate. Otherwise we might run
onto an deleted element in the outer loop.
Also we should declare factorize_hwtable() as 'void'
as it doesn't return anything.
Signed-off-by: Hannes Reinecke <hare at suse.de>
---
libmultipath/config.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/libmultipath/config.c b/libmultipath/config.c
index 2d88226..25d3e3d 100644
--- a/libmultipath/config.c
+++ b/libmultipath/config.c
@@ -418,12 +418,13 @@ out:
return 1;
}
-static int
+static void
factorize_hwtable (vector hw, int n)
{
struct hwentry *hwe1, *hwe2;
int i, j;
+restart:
vector_foreach_slot(hw, hwe1, i) {
if (i == n)
break;
@@ -435,14 +436,17 @@ factorize_hwtable (vector hw, int n)
merge_hwe(hwe2, hwe1);
if (hwe_strmatch(hwe2, hwe1) == 0) {
vector_del_slot(hw, i);
- free_hwe(hwe1);
- n -= 1;
- i -= 1;
- break;
+ /*
+ * Play safe here; we have modified
+ * the original vector so the outer
+ * vector_foreach_slot() might
+ * become confused.
+ */
+ goto restart;
}
}
}
- return 0;
+ return;
}
struct config *
--
1.7.10.4
More information about the dm-devel
mailing list