From: John Snow Date: Mon, 29 Jul 2019 20:35:53 +0000 (-0400) Subject: hbitmap: Fix merge when b is empty, and result is not an alias of a X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=3bde4b010e7510061dd8055b336c0148610a7dff;p=qemu.git hbitmap: Fix merge when b is empty, and result is not an alias of a Nobody calls the function like this currently, but we neither prohibit or cope with this behavior. I decided to make the function cope with it. Signed-off-by: John Snow Reviewed-by: Max Reitz Message-id: 20190709232550.10724-8-jsnow@redhat.com Signed-off-by: John Snow --- diff --git a/util/hbitmap.c b/util/hbitmap.c index bcc0acdc6a..83927f3c08 100644 --- a/util/hbitmap.c +++ b/util/hbitmap.c @@ -785,8 +785,9 @@ bool hbitmap_can_merge(const HBitmap *a, const HBitmap *b) } /** - * Given HBitmaps A and B, let A := A (BITOR) B. - * Bitmap B will not be modified. + * Given HBitmaps A and B, let R := A (BITOR) B. + * Bitmaps A and B will not be modified, + * except when bitmap R is an alias of A or B. * * @return true if the merge was successful, * false if it was not attempted. @@ -801,7 +802,13 @@ bool hbitmap_merge(const HBitmap *a, const HBitmap *b, HBitmap *result) } assert(hbitmap_can_merge(b, result)); - if (hbitmap_count(b) == 0) { + if ((!hbitmap_count(a) && result == b) || + (!hbitmap_count(b) && result == a)) { + return true; + } + + if (!hbitmap_count(a) && !hbitmap_count(b)) { + hbitmap_reset_all(result); return true; }