From ef8d0dcefdf00b043697df971533daf01290811a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 5 Nov 2017 18:06:22 +0100 Subject: [PATCH] MINOR: ebtree: update the eb32sc parent node's scope on delete During a delete operation, if the deleted node is above its leaf's parent, this parent will replace the node and then go up. In this case it is important to update the new parent's scope to reflect the presence of other branches. It's worth noting that in theory we should precisely recompute the exact node value, but it seems that it's not worth it for the rare cases there is a mismatch. --- ebtree/eb32sctree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ebtree/eb32sctree.c b/ebtree/eb32sctree.c index c1b3535b8..96281cf84 100644 --- a/ebtree/eb32sctree.c +++ b/ebtree/eb32sctree.c @@ -370,12 +370,14 @@ void eb32sc_delete(struct eb32sc_node *eb32) /* From now on, and are necessarily different, and the * 's node part is in use. By definition, is at least - * below , so keeping its key for the bit string is OK. + * below , so keeping its key for the bit string is OK. However + * its scope must be enlarged to cover the new branch it absorbs. */ parent->node_p = node->node_p; parent->branches = node->branches; parent->bit = node->bit; + container_of(parent, struct eb32sc_node, node)->node_s |= eb32->node_s; /* We must now update the new node's parent... */ gpside = eb_gettag(parent->node_p);