From 75264fe5f1ceb73a33bcc8e1adb3ad9aad57237d Mon Sep 17 00:00:00 2001 From: Jarno Rajahalme Date: Sun, 11 May 2014 23:38:44 -0700 Subject: [PATCH] lib/classifier: Fix array splicing. Array splicing was broken when multiple elements were being moved, resulting in the priority order being mixed. This came up when the highest priority rule from a subtable was removed and the subtable needed to be moved down the priority list by more than one position. Signed-off-by: Jarno Rajahalme Acked-by: Ben Pfaff --- lib/classifier.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/classifier.c b/lib/classifier.c index a9046cdcf..aef57bb8e 100644 --- a/lib/classifier.c +++ b/lib/classifier.c @@ -224,12 +224,14 @@ cls_subtable_cache_splice(struct cls_subtable_entry *to, to = start; start = end; end = temp; } if (to < start) { + /* Move elements [start, end) to (to) one by one. */ while (start != end) { struct cls_subtable_entry temp = *start; + /* Shift array by one, making space for the element at 'temp'. */ memmove(to + 1, to, (start - to) * sizeof *to); *to = temp; - start++; + start++; to++; } } /* Else nothing to be done. */ }