From: Willy Tarreau Date: Sun, 5 Nov 2017 17:06:22 +0000 (+0100) Subject: MINOR: ebtree: update the eb32sc parent node's scope on delete X-Git-Tag: v1.8-rc3~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef8d0dcefdf00b043697df971533daf01290811a;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/ebtree/eb32sctree.c b/ebtree/eb32sctree.c index c1b3535b8e..96281cf849 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);