From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VqYDX-00039G-2K for qemu-devel@nongnu.org; Tue, 10 Dec 2013 20:04:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VqYDS-0008PZ-13 for qemu-devel@nongnu.org; Tue, 10 Dec 2013 20:03:58 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59854) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VqYDR-0008PR-Ou for qemu-devel@nongnu.org; Tue, 10 Dec 2013 20:03:53 -0500 From: Igor Mammedov Date: Wed, 11 Dec 2013 02:01:17 +0100 Message-Id: <1386723686-26831-3-git-send-email-imammedo@redhat.com> In-Reply-To: <1386723686-26831-1-git-send-email-imammedo@redhat.com> References: <1386723686-26831-1-git-send-email-imammedo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 02/11] qom: detect bad reentrance during object_class_foreach List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, peter.maydell@linaro.org, peter.crosthwaite@xilinx.com, ehabkost@redhat.com, mst@redhat.com, marcel.a@redhat.com, blauwirbel@gmail.com, alex.williamson@redhat.com, kraxel@redhat.com, anthony@codemonkey.ws, pbonzini@redhat.com, dkoch@verizon.co, afaerber@suse.de From: Herv=C3=A9 Poussineau We should not modify the type hash table while it is being iterated on. Assert that it does not happen. Signed-off-by: Herv=C3=A9 Poussineau Signed-off-by: Paolo Bonzini Signed-off-by: Igor Mammedov --- v2: * make ver more descriptinve s/enumerating/enumerating_classes/ [asked-by: Peter Crosthwaite] --- qom/object.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/qom/object.c b/qom/object.c index 3a43186..4a0fb86 100644 --- a/qom/object.c +++ b/qom/object.c @@ -78,8 +78,10 @@ static GHashTable *type_table_get(void) return type_table; } =20 +static bool enumerating_classes =3D false; static void type_table_add(TypeImpl *ti) { + assert(!enumerating_classes); g_hash_table_insert(type_table_get(), (void *)ti->name, ti); } =20 @@ -666,7 +668,9 @@ void object_class_foreach(void (*fn)(ObjectClass *kla= ss, void *opaque), { OCFData data =3D { fn, implements_type, include_abstract, opaque }; =20 + enumerating_classes =3D true; g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &= data); + enumerating_classes =3D false; } =20 int object_child_foreach(Object *obj, int (*fn)(Object *child, void *opa= que), --=20 1.7.1